flexbox는 display
속성을 사용하여 구현한다. display: flex
를 줌으로써 해당 컨테이너의 첫번째 자식요소들에 flex를 적용할 수 있다.
display: inline-flex
를 사용할 수도 있다. display: flex
와 다른 점은, inline-flex
를 주게 되면 block
요소가 아닌 inline-block
요소로 기능하게 된다. 즉, width
가 반드시 100%가 아니라 요소의 width만큼 block 지정이 되는 것이다.
block - 부모 컨테이너 만큼 width 차지
inline-block - 컨텐트 크기가 필요로하는 만큼 width 차지
위와 같은 메뉴를 만들기 위해서는 어떤 요소들을 flex 컨테이너로 묶을 지 생각해야 한다. flex 컨테이너는 <ul>
요소가 되고 자식 요소들은 <li>
이 되어야 한다.
1) site-nave
list => flex container
2) list items (flex items)
3) anchor tags (the links)
Vender prefixes
CSS Vendor prefixes (or browser prefixes) are a way for browsers to give access to new CSS features not yet considered stable..site-nav { display: -webkit-flex; display: flex; }
IE 구버전이나 Safari 구 버전을 쓰는 경우 flexbox가 적용되지 않는 경우가 있는데 이는 구 버전이 flexbox 사ㅏ용을 위해서 vendor prefixes를 필요로 하기 때문이다. 새로나온 CSS 속성이 안정되기 전까지 취한 방법이다.
이 경우 Autoprefixer
라는 라이브러리를 설치하면 여러분이 지원하려고 하는 브라우저를 위한 vendor prefixes를 자동으로 생성해준다.
예시 - 내가 친 코드
.example {
display: flex;
}
예시 - Autoprefixer
가 고친 코드
.example {
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
}
<li>
가 아닌 <a>
에 padding을 줘야한다.
<a>
요소에 적용코드)
.site-nav > li {
margin-top: 0;
}
.site-nav > li > a {
display: block;
padding: 0.5em 1em;
background-color: #cc6b5a;
color: white;
text-decoration: none;
}
결과)
<li
> 요소에 적용 .site-nav > li {
display: block;
padding: 0.5em 1em;
margin-top: 0;
}
.site-nav > li > a {
background-color: #cc6b5a;
color: white;
text-decoration: none;
}
결과)
.site-nav > li + li {
margin-left: 1.5em;
}
.site-nav > .nav-right {
margin-left: auto;
}
<li>
자식 다음으로 오는 <li>
자식들에 margin-left: 1.5em
을 적용한다.nav-right
클래스에 margin-left
요소를 주어 마지막 버튼을 오른쪽에 붙이고 나머지 공간을 margin으로 채우도록 처리한다. 만약 마지막 요소 하나가 아닌 두 번째 요소(About 메뉴)부터 오른쪽으로 밀어버리고 싶다면 두 번째 요소에 margin-left: 1.5em
을 적용하면 된다.
특정 요소에 다른 spacing을 원하는 경우 margin
으로 조정하면 되지만 모든 요소에 동일한 spacing을 주고 싶은 경우 justify-content
를 사용하면 된다.
flexbox를 이용하면 margin
, width
, height
속성을 이용한 것보다 더 많은 옵션을 활용할 수 있다.
display: flex
를 적용했더니 아래와 같은 결과가 나온다.
이 상태에서 아직 두 columns에 width값을 주지 않았으므로 안의 content 크기에 맞게 설정되며 전체 공간을 차지하지 않고 여백이 생기게 된다.
flex
속성을 사용하게 되면 자동 계산을 해준다.
.column-main {
flex: 2;
}
.column-sidebar {
flex: 1;
}
위 값을 넣는 순간 두 columns가 여백을 채우게 되면서 nav
와 동일한 width를 갖게 된다.
위 코드는 아래값과 동일한 의미를 지닌다.
flex: flex-grow flex-shrink flex-basis
flex-grow: 2;
flex-shrink: 1;
flex-basis: 0%;
flex-basis는 요소 크기에 대한 일종의 시작점(초기 "기본 크기")을 정의한다. flex-basis 속성은 px, ems 또는 백분율 값을 포함하여 너비에 적용되는 모든 값으로 설정할 수 있다. 초기 값은 auto이며 이는 브라우저가 해당 요소에 선언된 너비가 있는지 확인한다는 뜻이며 이 경우 브라우저는 해당 크기를 사용한다. 그렇지 않은 경우 내용에 따라 요소의 크기를 자연스럽게 설정한다.
여기까지 정한 후 각 item들이 커질지(grow) 작아질지(shrink)를 설정한다
flex-basis까지 설정했더라도 전체 크기를 채우는 것은 아니기때문에 여백이 남기 마련이다.
이 여백을 채우는 용으로 flex-grow가 등장한다.
flex-grow가 0인 경우 flex-basis로 설정된 width에서 변동이 없다.
5.10 예제가 위의 예제와 동일하다. flex:2
와 flex:1
는 flex-basis가 0%이므로 여백이 100%에서 시작한다는 차이점이 있으며 그 공간을 flex-grow로 채우는 개념이라고 보면 된다.
flex-shrink는 flex-grow와 동일한 원칙을 따른다. 초기 메인 사이즈가 설정되었을때 overflow가 생기는 경우가 있다. 이 경우 flex-shrink를 통해 overvflow를 막을 수 있다.
flex-shrink:0
이면 사이즈가 줄지 않는다. 큰 숫자를 입력할 수록 더 많이 줄어든다.