2020-8-27 CSS 기초
CSS
-
CSS란, Cascading Style Sheet의 약자, cascading은 연속적인 흐름을 의미.
-
기본적으로 브라우저가 HTML파일을 로드할때, 스타일링이 있나 없나 물어본다. Style Sheet에 정의된 내용이 있으면 적용하고, 없으면 브라우저 기본 스타일을 적용한다.
-
Cascading : 스타일링은 Author Style(우리가 정의), User Style(사용자가 지정), Browser(브라우저 기본)로 나눌 수 있다.
- Author Style => User Style => Browser순으로 스타일이 적용된다.
- important 키워드를 사용하면 우선순위가 무시. 되도록 사용하지 말자.
Selector
- Selector란 HTML 태그들중에서 어떤 태그들을 고를지 결정하는 문법이다.
- Universal : *
- type : tag ex) div {…}하면 모든 div태그를 선택한다.
- id : #id
- class : .class
- status :
- attribute : []
// 사용법
selector {
property: value;
}
// universal selector. 모든 태그들에 적용
* {
color: green;
}
// type selector
li {
color: blue;
}
// id selecor
#special { // id=special인 태그에 pink적용
color: pink;
}
li #special { // li태그중에 id가 special인 것만 적용
color: pink;
}
// class selector
.box {
width: 200px;
height: 200px;
}
// status selector
button:hover {
color: red;
}
// attribute selector
a[href] { // a태그중에 href를 가지고 있는 태그들만 선택
color: purple
}
- css는 페이지 위에서 어떤 요소들을 선택할지 결정하는 selector와 어떤 속성을 결정하는 property, 그 값을 결정하는 values로 이루어져있다.
- universal selector에서 색상을 설정하고, li에서도 색상을 정의했다. li에서는 color: blue가 적용되는데, 태그에 최대한 가까운 selector가 적용되기 때문이다.
- button:hover과 같이 tag의 속성에 대해서도 선택할 수 있다.
Box Model
- padding : 컨텐츠 안에 들어가는 공간
- padding-top, padding-right와 같이 각각 4방향에 지정도 가능.
- padding: 20px 30px 20px 20px;와 같이 top right bottom left 시계방향으로 값을 설정할수도 있다.
- padding: 20px 0px; 위아래 좌우 함께 설정도 가능
- margin : 컨텐츠 밖에 들어가는 공간
- border도 border-width, border-style, border-color로 분리할 수 있지만, border : 2px dashed red;처럼 width-style-color순으로 적용할 수 있다.
- 가능한 속성들은 CSS Reference를 참조하자. 더보기
Layout
**Inline : 컨텐츠 자체만을 꾸며준다. **
**block : 상자, 한줄에 하나
Inline-block : 상자인데, 한줄에 여러개가 가능
- div : Block Level,
- block level이기때문에 한줄에 1개가 나온다.
- display : inline-block으로 바꾸면 한줄에 여러개가 표시
- 안에 내용을 넣고 display inline으로 하면 한줄에 여러개가 표시
- span : Inline Level, 안에 내용이 있어야 보인다.
- Inline레벨이라 한줄에 여러개가 나온다.
- display: inline => block으로 바꾸면 div처럼 한줄에 1개로 변경.
Position
- CSS는 기본적으로 static이 default position.
- static은 HTML에 정의된 순서대로 브라우저에 보여지는것을 의미
- 컨테이너의 위치를 변경하기 위해서는 position을 relative로 바꾼다. 기존 static의 경우 원래 있어야되는 자리가 고정적으로 있는데, relative로 변경하면 상대적인 위치로 변경
- absolute : 내 아이템이 담겨져 있는 박스안에서 위치변경이 된다. 나를 담고 있는 컨테이너의 위치에서 이동.
- fixed : 상자가 아닌 window(웹페이지)안에서 움직여서 위치가 정해진다.
- sticky : 원래 있는 자리에 있지만, 스크롤링이 되어도 원래있는 위치에 존재하게 된다.
Flex Box
- float은 이미지와 텍스트를 어떻게 나타낼지 정의하기 위해 등장. flexbox의 등장으로 float은 텍스트, 이미지를 배치하는데 집중.
- float:left, center, right이 존재.
- flexbox는 container에 적용되는 속성과 box안에 적용되는 속성이 각각 존재한다.
- container에 적용 가능한 속성들 : display, flex-direction, flex-wrap, flex-flow, justify-content, alight-items, align-content…
- item에 지정되는 속성 : order, flex-grow, flex-shrink, flex, align-self…
- flexbox는 main axis(중심축), cross axis(반대축)이 존재. 아이템들이 어떤 방향으로 정렬되느냐에 따라 main axis가 결정
Container속성
-
flex를 사용하기 위해서는 container에 display:flex로 flex라는것을 명시
-
.container { display: flex; flex-direction: row; default : row; flex-warap : nowrap; flex-flow : row wrap; }
-
flex-direction : flex방향. 기본값은 row. row-reverse, column, column-reverse로 설정할 수 있다.
-
flex-wrap : 기본값 nowrap. 아이템들이 많아져도 아이템들이 한줄에 빼곡히 있다. wrap으로 설정하면 아이템이 한줄에 꽉 찼을경우, 자동으로 줄바꿈을 한다. wrap-reverse옵션도 존재.
-
flex-flow : wrap과 direction을 한번에 할 수 있다. direction wrap으로 하면된다.
-
justify-content: 중심축(main axis)에서 item들을 어떻게 배치할지 결정. 기본값은 flex-start(왼쪽에서 오른쪽으로),
- flex-end(아이템 순서는 유지하되 오른쪽으로 붙는다). 메인축이 column이냐 row냐에 따라 다르지만 축시작에서 가까이 있느냐 축끝에서 붙어있느냐의 차이정도로 이해하면 된다.
- center : 가운데로 정렬
- space-around : box 주변에 공간을 넣어준다. around의 경우 첫번째 마지막박스에서 공간이 약간 좁지만 space-even으로 하면 모든 간격이 동일해진다.
-
align-items : 반대축(cross axis)에서 아이템들을 어떻게 배치할지. baseline : text에 맞춰서 균등하게 맞춘다.
- align-content : 반대축의 아이템을 지정한다. cross axis 축을 기반으로 배치.
-
Item 속성들
-
.item { flex-grow: 0; default is 0 flex-shrink: 0; default is 0 flex-basis: auto; default is auto order: number; }
-
order 순서에 맞춰서 사용할 수는 있지만 안쓴다.
-
flex-grow: 기본값은 0. 0인 경우 페이지가 커질경우 아이템의 크기는 그대로이다. 1에 가까울수록 화면을 많이 채우지만 item의 flow-grow를 1로하면 같은 비율로 화면을 표시하게 된다. container가 작아질때는 효과가 나타나지 않는다. 이때는 flow-shrink를 사용한다.
-
.item1 { flex-grow: 2; } .item2 { flex-grow: 1; } .item3 { flex-grow: 1; }
- flex-grow를 2:1:1비율로 설정하면 페이지가 커질때 50% 25% 25%씩 비율을 차지하게 된다.
-
-
flex-shrink : container가 작아질때 비율설정. 기본값 0
-
.item1 { flex-shrink: 2; } .item2 { flex-shrink: 1; } .item3 { flex-shrink: 1; }
- container가 줄어들때 item1이 2배로 더 빨리 작아진다.
-
-
flex-basis : container의 크기에 따라 비율을 차지한다. %로 표시한다.
- align-self: item별로 item을 정렬할 수 있다. 반면 conatiner에 있는 algn-items의 경우 아이템 전체를 어떻게 배치할지 결정.
크기
-
크기를 표현할때 절대적인 값들(px, pt, cm, m)과 상대적인 값들이 있다.
- 웹에서는 절대적인 값들은 px을 쓴다. 픽셀은 모니터 위에서 화면에 나타내는 가장 작은 단위를 의미
- 픽셀의 사용하면 컨테이너의 사이즈가 변경될때도 컨텐츠가 고정된 값으로 유지되는 것을 볼 수 있다.
- 80px보다는 80%와 같이 부모의 몇퍼센트를 표기할지 많이 쓴다.
-
상대적인 크기 => em, rem, vw, vh를 가장 많이쓴다.
-
em : 현재 폰트사이즈를 나타낸다. 선택된 폰트 패밀리에 상관없이, 고정된 폰트사이즈를 가지고 있다.
- 현재 폰트가 16px이면 1em == 16px이 되는거다. 브라우저에서 HTML에 할당되는 폰트사이즈가 16px
- 부모자식의 관계에서. 부모의 폰트는 8em, 자식의 em은 0.5em. 부모는 128px로 표기가 된다. 자식은 부모의 0.5em인 64px가 된다.
- em과 %는 비슷하다. 8em이 800%과 동일
- 정리 : em은 부모의 폰트 사이즈를 곱한값
-
rem : em에 r이 더해진걸로 root를 의미. 부모에 따라 사이즈가 결정되는 것이 아닌 root에 따라 결정된다.
-
parent 8rem이고 child : 0.5rem이면, parent는 16*8=128px가 되고, child는 16*0.5=8px가 된다. root의 기본 사이즈가 16px이기 때문
-
html { font-size: 100%; }
- 폰트사이즈를 따로 지정하지 않으면 기본적으로 100%로 지정된다. 브라우저가 지정된 폰트사이즈를 따라간다는 의미다. rem, em을 쓰면 브라우저의 크기가 변경되더라도 반응형으로 변경되는 것을 확인할 수 있다.
-
-
v* : viewport width로서 viewport너비의 몇%를 쓰겠다라고 정의. 100vw는 100%사용. 50vw는 50%사용. vh는 높이에 대해서
-
vmin, vmax : 브라우저의 높이나 너비중에 작은값의 몇퍼센트를 사용하겠다.
느낀점
- 평소 퍼블리싱에 대한 부담으로 인해 프론트엔드와 퍼블리싱에 대해서 접근을 못하고 있었다. 핑계를 하나 더 되면 디자인에 대한 감각이 없어서 안한것도 있었다. 이번에 프로젝트를 하면서 명확하게 제플린으로 디자인된 웹디가 있어서. 프론트엔드 개발을 위해 CSS공부를 해보았다. Flex모델을 기반으로 잘 해봐야겠다. 부디 퍼블리싱이 잘되길..