TIL # 23 HTML / CSS : 레이아웃

채록·2021년 1월 11일
0

HTML & CSS + JS

목록 보기
13/14
post-thumbnail

HTML / CSS part를 공부하면서 배우게된 레이아웃에 대한 내용을 정리.
배움 출처 : https://ko.learnlayout.com/box-model.html

Index

  • display 속성
  • box model
  • position 속성 : relative, absolute, fixed
  • inline, inline-block, block
  • float



I. display

display 는 css에서 레이아웃을 제어하기 위해 필요한 가장 중요한 property이다.

1. display 값

  • block
  • inline
  • none
  • inline-block
  • flex (21.01.13 추가 내용)

사용자가 임의로 설정하지 않았을 경우 기본적으로 사용된 tag의 성질을 따른다.

block이 기본 설정인 tags

  • div
  • p
  • form
    ..

inline이 기본 설정인 tags

  • span
  • a
  • img
    ..

2. 그 외 다른 display 값

  • list-item
  • table
    ..

3. display 유의점

display: none
visibility: hidden

이 두가지 코드의 결과는 모두 "보이지 않게 하기" 이다.
단!
display: none은 해당 element가 아예 없는 존재가 되도록 하지만,
visibility: hidden 의 경우 해당 element가 존재하되, 보이지 않아 공간은 그대로 차지한다.


또한 기본이 block 성질인 div를 inline요소로 사용하는것은 그리 효율적이다 라고는 못하지만.. 이를 이용해 _li요소를 inline 형태로 바꿀순 있다!_ (목적에 따라 사용하는것이 좋을때도, 의미없을 때도 있다는걸 항상 기억하자!)

4. inline-block

inline element와 비슷하지만 너비를 지정할 수 있다.
예제로 보면 이해하기가 더 쉽다!

예제1: 박스 그리드 활용

float과 clear를 사용하여 박스그리드와 그리드에 포함되지 않는 컨테이너 구분

.box {
  float: left;
  width: 200px;
  height: 100px;
  margin: 1em;
}
.after-box {
  clear: left;
}

inline-block을 사용

.box {
  display: inline-block;
  width: 200px;
  height: 100px;
  margin: 1em;
}

두가지 방법의 공통된 결과


예제2: 레이아웃에 활용

주의할 점이 있다.
1. inline-element는 vertical-align property의 영향을 받는다. (기본적으로 top으로 설정하려는 경향이 있다.)
2. 각 column의 너비를 설정해 주어야 한다.
3. HTML 각 column 사이에 공백이 있으면 column 간에 틈이 생긴다.

nav {
  display: inline-block;
  vertical-align: top;
  width: 25%;
}
.column {
  display: inline-block;
  vertical-align: top;
  width: 75%;
}


5. flex (21.01.13 추가 내용)

도움 받은 정보 출처 : https://heropy.blog/2018/11/24/css-flexible-box/
이에 대한 내용은 실습하면서 내가 실제 사용한 부분에 대해서만 되내이려 한다. (내용이 너무 많기 때문)
display 값에는 flex 값도 있다.
flex를 사용하기 위해선 containeritem 두가지 요소가 있어야 한다.

container와 item

container를 display: flex 로 지정해줌으로써 안에 속한 item들의 정렬이 바뀐다.
여러가지 설정법 중 두가지를 되내이면

  1. display: flex;
    • container들이 block 요소처럼 (수직) 쌓인다.
  2. display: inline-flex;
    • container들이 inline 요소처럼 (수평) 쌓인다.

위 설정은 item이 아닌 container 양상에 해당하는 것임을 헷갈리지 말자!

flex 사이 간격

크게 두가지만 살펴보면

  1. justify-content: space-between;
    - item들 사이 간격을 일저하게 한다.
  2. justify-content: space-around;
    - item들 둘레의 간격을 일정하게 한다.

1번을 쓰면 사이간격만 조절되고 / 2번을 쓰면 첫번째와 마지막 child를 포함하여 모든 item의 테두리 간격이 조절된다.




II. box sizing

새롭게 탄생한 CSS property!

위 그림은 놀랍게도 width 값이 같다!! 단, padding값이 서로 다르게 설정되어 있다.

.simple {
  width: 500px;
  margin: 20px auto;
}

.fancy {
  width: 500px;
  margin: 20px auto;
  padding: 50px;
  border-width: 10px;
}

이런 현상때문에 실제 일할때 많은 어려움이 있었다고 한다.

1. box sizing 적용 효과

다음과 같이 box-sizing을 적용하였다.

.simple {
  width: 500px;
  margin: 20px auto;
  -webkit-box-sizing: border-box;
     -moz-box-sizing: border-box;
          box-sizing: border-box;
}

.fancy {
  width: 500px;
  margin: 20px auto;
  padding: 50px;
  border: solid blue 10px;
  -webkit-box-sizing: border-box;
     -moz-box-sizing: border-box;
          box-sizing: border-box;
}


그 결과 더이상 padding과 테두리가 너비를 늘리지 않는다.

webkit ? moz ?

위에서 말했듯 box-sizing은 새로게 도입된 css property다. 실험적인 요소이기 때문에 이를 활성화 하기 위해선 아직까지 위와 같은 코드를 붙여주어야 한다.

  1. 모든 요소에 다음과 같이 box-sizing을 적용하려면
    css 에서 선택자를 해당 태그가 아닌 * 로하여 모든 대상으로 지정하면 된다.
  2. 위 property는 IE8+ 에서만 적용된다.



III. position

좀 더 복잡한 레이아웃!

1. position 값

position: ###;
  • static = 가장 기본 값 (위치가 지정됐다고 취급하지 않는다.)
  • relative = 별도의 property가 필요하다. (top, right, bottom, left)
    .relative1 {
      position: relative;
    }
    .relative2 {
      position: relative;
      top: -20px;
      left: 20px;
      background-color: white;
      width: 500px;
    }
위 코드와 같을때, relative2 요소는 relative1 요소에 대해 윗부분은 20px만큼 겹치고, 왼쪽에서부터 20px 떨어져 있는 위치에 존재하게 된다.
  • fixed = viewport에 상대적으로 위치가 지정되며 스크롤에 상관없이 고정된 위치에 존재한다. / property 가 필요하다. (top, right, bottom, left)
  • absolute = "fixed"와 달리 가장 가까운 곳에 위치한 조상 element에 상대적으로 위치가 지정된다. (만약 해당되는 조상 element가 없으면 document body를 기준으로 삼아 스크롤에 따라 움직인다.)
.relative {
  position: relative;
  width: 600px;
  height: 400px;
}
.absolute {
  position: absolute;
  top: 120px;
  right: 0;
  width: 300px;
  height: 200px;
}




IV. float

레이아웃을 잡는 데 사용하는 또 하나의 css property
이미지 주위를 텍스트로 감싸기 위해 만들어 졌다.

예시)
이미지에 float: right;를 설정하면 이미지는 화면 오른쪽에, 글은 이미지공간을 비켜선채로 왼쪽 부분으로 보인다.


1. clear

float의 동작 방식을 제어하는데 중요한 property

어떤 element가 float: left로 지정되어 있지만, margin으로 인해 공간이 띄어졌을때 그 다음 element가 그 element를 포함시켜 출력될 수 있다.
실제 section 부분은 div 다음에 있는 것이지만 화면 상 이렇게 나오는 것이다.
이를 해결하기 위해 section에 clear를 넣어준다!

clear: left;

그러면 left로 지정된 float 값을 무시하여 다음과 같이 나오게 된다. (left, right, both)


clearfix

이미지가 그것을 담고있는 element보다 더 높을 경우 element밖으로 삐져나올때 사용하는 개념.
요즘 나온 개념!

.clearfix {
  overflow: auto;
}

주의 : 요즘 나온 브라우저에만 적용된다. (IE6은 추가 코드 작성해야 한다.)

2. float으로 전체 레이아웃 조정

position처럼 작동하기

position을 이용했을 때

.container {
  position: relative;
}
nav {
  position: absolute;
  left: 0px;
  width: 200px;
}
section {
  /* position is static by default */
  margin-left: 200px;
}

floatd을 이용했을 때

nav {
  float: left;
  width: 200px;
}
section {
  margin-left: 200px;
}



끝맺음

CSS는 아직도 최신 기술이 계속 개발되고 있다. 당장 지금만 해도 flexbox같은 개념들로 더 멋진 column을 설정할 수 있다고 한다! 아직 완전히 상용화는 되지 않아 모든 브라우저에서 활성화할수 있는건 아닌거 같지만...
일단 이정도 까지 되새기며 공부를 마치고, 앞으로 개발하면서 꾸준히 새로운 개념들을 찾아 공부해야 함을 다시한번 느꼈다.

profile
🍎 🍊 🍋 🍏 🍇

0개의 댓글