퍼블리싱의 기본은 정렬
아직도 느낌만으로 정렬을 하거나 수 틀리면 플렉스 박스로 만들어버리고 있나요?
이제는 요소를 분석하여 정렬되는 원리와 구조를 이해해봅시다.
요소의 부모 요소에 text-align: center;
를 지정한다.
.container {
text-align: center;
}
요소에 너비를 명시적으로 지정하고 { margin : 0 auto }
를 지정한다.
정렬 대상 요소에 너비를 명시적으로 지정하지 않으면 너비는 full width가 되므로 중앙 정렬이 필요없다.
.item {
width: 200px;
margin: 0 auto;
}
복수의 block
요소는 기본적으로 수직 정렬되므로 수평정렬하기 위해서는 정렬 대상 block
요소를 inline-block
요소로 변경한 후 부모 요소에 text-align: center;
를 지정한다.
정렬 대상 요소에 width를 지정하지 않으면 콘텐츠에 너비에 맞추어 너비가 결정되므로 명시적으로 너비를 지정한다.
.container {
text-align: center;
}
.item {
width: 150px;
display: inline-block;
}
정렬 대상의 부모 요소에 padding-top과 padding-bottom 프로퍼티값을 동일하게 적용한다.
.container {
padding: 50px;
}
패딩을 사용할 수 없는 경우 height와 line-height 프로퍼티값을 동일하게 적용한다.
단 이 방법은 행간이 지나치게 넓어지거나 Click Dead Zone 이슈가 발생하는 등 여러 줄의 텍스트에는 사용할 수 없다.
.container {
padding: 50px;
}
.item {
line-height: 50px
}
여러 줄의 텍스트의 경우, padding-top
과 padding-bottom
프로퍼티값을 동일하게 적용하는 방법도 가능하다.
또 다른 방법으로 vertical-align
프로퍼티를 사용한 방법도 가능하다. 이 방법은 table
속성을 사용하여야 한다.
.parent {
display: table;
height: 100px;
}
.child {
display: table-cell;
vertical-align: middle;
}
부모 요소를 기준으로 절대 위치를 지정하여 50%으로 이동한 뒤 margin
으로 요소의 높이(100px)의 반 만큼 위로 밀어낸다.
.parent {
position: relative;
}
.child {
position: absolute;
top: 50%;
height: 100px;
margin-top: -50px;
}
부모 요소를 기준으로 절대 위치를 지정한다. transformY
로 요소의 높이(100px)의 반 만큼 이동한다.
.parent {
position: relative;
}
.child {
position: absolute;
top: 50%;
transform: translateY(-50%);
}
요소의 너비와 높이가 고정되어 있는 경우, 요소의 너비와 높이가 불확정 상태의 경우 모두 사용 가능한 방법이다
.parent {
position: relative;
}
.child {
position: absolute;
top: 50%;
left: 50%;
/*요소의 높이 , 너비의 반(50%)만큼 위/왼쪽으로 이동*/
transform: translate(-50%, -50%);
}
float
을 사용하면 block 요소 안에 들어 있는 텍스트나 컨텐츠의 크기만큼 늘어났던 높이 값이 사라지는 (height:0) 현상이 일어난다. 다른 말로 하면 영역 사라지는 현상이 나타난다.
이를 해결하기 위한 5가지 방법이 있다.
clear:both
를 넣어준다.태그를 만들어 클래스에 clear: both; height: 0; overflow: hidden;
을 적용해, 높이가 0인 보이지 않는 태그를 만들어 clear: both float를 해제하는 방법이다. 그러나 의미없는 태그를 만들어 사용하는 것이므로 추천하지 않는다.
위치 자체는 잡을 수 있으나 다음 컨텐츠로 하여금 margin을 줘도 영역이 없다고 판단하는 현상이 발생한다. 레이아웃이 복잡할 때에는 어디가 깨지는 지 알 수 없어 사용이 힘들기도 하다.
display:inline-block
을 준다.
overflow:hidden
을 사용한다.
clearfix
라는 css를 만들어 사용한다./* clearfix */
.clearfix {*zoom:1;}
.clearfix:before, .clearfix:after {display:block; content: ''; line-height: 0;}
.clearfix:after {clear: both;}
flexbox를 이용해 main axis와 cross axis를 기준으로 정렬하면 반응형에 대응하는 정렬을 쉽게 만들 수 있지만, 비교적 새로운 개념인 만큼 IE9 이하 브라우저에서 적용되지 않는 크로스브라우징 문제를 겪을 수 있다.
Can I use에서 flex에 대응하는 브라우저를 검색하면 결과는 위와 같다.
결과적으로 IE에도 Flexbox를 지원한다. IE10에서는 일부 스펙만 지원하고 IE11에서는 대부분 지원한다. 그러나 Notes를 보다싶이 많은 버그이슈가 보고되고있으므로 flex를 사용할 때는 크로스 브라우징을 항상 고려하자!
[참고]
https://css-tricks.com/centering-css-complete-guide/
https://caniuse.com/?search=flex