끈기의 힘 : 뉴비에서 풀스텍으로

[인프런/생활코딩] 섹션5. float (2) - holy grail layout 본문

프로그래밍 언어/CSS 공부

[인프런/생활코딩] 섹션5. float (2) - holy grail layout

쓰리별 2021. 3. 4. 21:59

오늘의 수업은 float란 속성을 중심으로 다음 그림과 같은 레이아웃을 만들어보자!

오늘의 목표 성배 레이아웃

다만 한계점이 있는데, 크기를 좌우로 늘리든 이 레이아웃의 크기는 변동이 없다.

물론 한계를 해결할 순 있지만 자바스크립트 등의 언어가 필요해지게 되니까 지금은 의미없다. , 화면이 고정된 상태의 성배 레이아웃을 만들어보자.

 

<!DOCTYPE html>

<html>

<head>

  <style>

 

  </style>

</head>

<body>

  <header>

   <h1>

    CSS

   </h1>

</header>

  <nav>

   <ul>

    <li>position</li>

    <li>float</li>

    <li>flex</li>

   </ul>

  </nav>

  <article>

   <h2>float</h2>

    Lorem ipsum ~~

 

  </article>

  <aside>

   ad

  </aside>

 

  <footer>

   copyleft

  </footer>

</body>

</html> 이렇게 만들면 그 값은 다음과 같다.

.

이제 여기서 css에 속성을 넣어보자.

header{

  border-bottom: 1px solid gray;

} 하고

 

nav, article, aside가 수직인데 수평으로 만들어줘야 하니까 이때 flex를 쓰지 않고 이 수업은 float니까 바로 float효과를 주면 된다. (float: 이미지가 있으면 그 이미지 옆으로 흘러가는 특성)

 

, 1강에서 float 기초를 배웠듯, 밑에 있던 <p> 태그가 이미지태그 오른쪽에 온다는 특성을 활용해서 레이아웃을 짤 때, float 효과를 많이 사용.

 

nav{

  float: left;

}

그래서 navfloat:left; 값을 주게 되면, 다음과 같이 수평처럼 표현된다.

nav{   float: left; }

그 다음에 다음과 같이 추가하면,

nav, article, aside{

  border: 1px solid gray;

}

nav, article, aside{   border: 1px solid gray; } 추가

이렇게 될텐데, 이상태에서 ad영역까지 수평으로 되게 위로 올리고 중간에 있는 article영역이 왼쪽에 있는 nav가 끝나니까 위처럼 흘러가버렸는데 이는 우리가 원했던 그림이 아니다. 그럼 우째?

 

예를 들어, float의 힘이 상당히 강하다고 생각해보자. 그러면 float가 적용된 nav영역이 아닌 article영역은 float의 눈치를 보면서 float가 끝나는 부분에서 화면 전체를 사용하는 것을 볼 수가 있다.

 

그럼 어떻게 하면 article 영역이 float의 눈치를 보지 않고 자기 화면 전체를 쓰게 할 수 있느냐?? 그럼 article에도 float효과를 주면 돼!!

article{

  float: left;

} 이렇게.

article{   float: left; }  추가

근데 마찬가지로 우리가 원했던 그림은 아니네? 그럼 우째?

article의 영역이 위에 있는 float 영역으로 들어갈 만한 크기로 만들어주면 돼!

ex) articlewidth:300px;의 값을 주면 nav영역을 제외한 나머지 영역의 크기에 들어올 수 있는 크기가 되었기에 다음과 같이 올라올 수 있게 되는 것이여!

 

article{width:300px;} 추가

ad(aside)article처럼 하려면 asidefloat:left; 값을 주면 되는디, 문제는 ad가 자신의 크기만큼만 딱 차지하니까 요런 경우엔 얘도 width값을 주면 된다!

 

nav{

  float: left;

  width: 120px;

}

article{

  float: left;

  width: 300px;

}

aside{

  float: left;

  width: 120px;

} 요렇게. 다음 그림은 그 결과값.

nav{   float: left;  width: 120px; } article{   float: left;  width: 300px; } aside{   float: left;  width: 120px; }

그럼 이제 copyleft 부분이 제일 밑으로 가게 만들어야 하는데, 요 부분은 <footer>라고 할 수 있는데 이제 <footer> 이전에 등장하는 여러 태그에 float 효과가 적용되어 있기에 <footer>영역은 이렇게 위로 올라와 있는 상태이다. 그럼 내려야 하니까 어떻게 내리냐?

 

<footer>가 더는 이전에 등장한 float 효과를 받는 영역들의 영향을 받지 않는다.라고 float 효과를 지워버려야 한다.

footer{

  clear: both;

}를 해주면, 다음과 같이 float 효과가 사라진다.

footer{   clear: both; } 추가

맨 처음 사진처럼 만드려면 copyleft에 선이 필요하다. 누구한테 선을 주든 상관은 없지만, footer에게 줘보자. 다음처럼

footer{

  clear: both;

  border-top: 1px solid gray;

  text-align: center;

  padding: 20px;

}처럼 값을 추가했다고 하자. 다음과 같이 화면 가운데에 적당한 여백을 갖도록.

footer{   clear: both;   border-top: 1px solid gray;   text-align: center;   padding: 20px; }

맨 처음 사진과 비교했을 때 nav쪽 선이 깔끔하게 떨어지지 못하고 있다. 그럼 우째?

처음에 만든 다음 값을 이제 지우자.

nav, article, aside{

  border: 1px solid gray;

}

 

그리고 nav에 줄을 그어보겠다. border-right:1px solid gray;

nav{border-right:1px solid gray;}

요렇게 선이 내려가다 말아버린다. 왜 그럴까?

그렇다고 navborder-rightariticleborder-left로 준다고 해도 그건 일시적인 효과다. 왜냐??

 

nav의 영역에 내용이 늘어나게 되면 다음 그림에서처럼 자동으로 article에 있는 border-left선이 끊기게 표현된다는 것이다. 그럼 어떻게 하라고?

nav 영역에 내용이 위와 같이 길어진다면

nav의 오른쪽에 선을 그으면 nav가 길어졌을 때, 끊기지 않을 것이고 동시에 article의 왼쪽에 선을 그어주면 article이 커졌을 때 선이 끊기지 않게 되지 않을까??

 

nav{border-right:1px solid gray;}

article{border-left:1px solid gray;}를 추가.

각자 선이 있기에 자신의 크기에 따라서 자동으로 늘어나기에 선이 끊기지 않는다!

 

근데 이래도 또 문제가 있다.. 뭔데?

아래그림에서처럼 nav의 오른쪽 선과 article의 왼쪽, 두 선이 만나면서 겹쳐보인다는 것.

반대로 밑에는 얇아보이는 그런 애매한 현상..그럼 우째?

nav와 article 사이의 선을 보면 nav 첫번째 <ul>부터 4번째 <ul>까지만 유독 선이 진하게 나타남.

article영역을 왼쪽으로 1px만큼 움직이면 nav의 오른쪽 borderarticle의 왼쪽 border오버랩되는 현상이 사라지게 된다. 그래서 article에 margin-left:-1px;값을 주게 되면 해결.

 

마찬가지로 ad부분 즉, aside에도 border-left:1px solid gray; margin-left:-1px; 추가.

이렇게만 하면 ad영역의 왼쪽 선이 또 끊기게 되는데, 이는 article영역에 border-right:1px solid gray; 값을 추가하면 해결된다.

aside{border-left:1px solid gray; margin-left:-1px;} article{border-right:1px solid gray;}

이제 여기서 화면을 줄이면 articleaside 영역은 다시 nav영역 밑으로 분리되어버린다.

화면을 줄이면 이렇게 됌. 왜??

이렇게 되는 이유는 <body>가 작아지면서 float가 기본적으로 갖고 있는 특성, 자기가 위치할 수 있는 공간이 없다면 밑으로 내려간다는 그 특성으로 인해서 그렇다.

 

그럼 어째? <body>의 크기를 고정시키면 돼. 근데, body를 고정시키는 건 좀 이상해.

그래서 <body> 바로 밑에다 container라고 하는 클래스 속성값을 가진 div 태그를 만들어 볼 것이다. 그 안에 <header>부터의 모든 내용을 옮기면 돼. 다음 그림처럼.

<body>를 고정시키지 않기 위해 하위에 class값이 "container"인 div태그 하나를 생성해서 나머질 감싸주자.

이제 여기서 container의 크기를 고정시키면 화면의 크기완 상관없이 레이아웃이 변경되는 것을 막을 수가 있지요!

 

.container{

  width: 600px;

  border: 1px solid gray;

}를 추가.

 

추가하면 화면의 크기와는 상관없이 레이아웃은 그대로!

 

근데 우리 수업의 첫 번째 사진과 비교했을 땐, aside 부분이 좀 비대한 편이다. 왜 그럴까?

이땐 크롬에서 F12를 통해 확인할 수 있다. ?

navarticle, asidewidth의 합은 540px이니까 container의 값도 540px로 바꾸자.

근데, 또 바꿔놓으면 aside값이 밑으로 내려간다. 그건 왜 그러냐?

nav, article, aside를 감싸고 있는 class의 속성값이 container540px을 가졌는데,

표시되는 값보다 실제로 nav, article, aside가 가진 값은 540px보다 크기 때문이다.

(이때 딱! 저번에 배운 ★★★ box-sizing이 떠올라야제!!)

 

F12누르고 특정 섹터보는 버튼으로 눌러보면, nav의 원래 값은 121px, article302px, aside121px로 나온다. 이건 무슨 의미냐면, 기본적으로 CSS의 박스모델은 폭을 계산할 때 테두리 값을 포함한다!!! ★★★ 그래서 각각의 폭 값을 더하면 되는데, 만약 이게 수십가지를 넘어가면 복잡하니까 예~~전에 배운 ‘box-sizing’ 있지? 그걸 활용하자!!! ★★★

box-sizing:border-box; (박스를 포함해서 측정하도록 하는 효과)★★★

 

 

근데 굳이 이걸 또 .container에 적을 이유가 없고 box-sizing 시간에 배웠던 것처럼 html에 존재하는 모든 태그에 대해 box-sizing을 하겠다는 선택자인 아스터리스크, 별표(*)CSS영역에 box-sizing:border-box;값을 추가하면 된다! ★★★ (~ 이건 무슨 소린지 알겠네)

*{

  box-sizing:border-box;

}

 

그리고 이 container를 화면 가운데에 있게 하고 싶다면, container 선택자 영역에

margin:auto;를 추가해주면, container의 왼쪽과 오른쪽의 마진 값이 공평하게 노나지면서 화면 가운데로 위치하게 된다!

 

반복해서 익숙해지는 게 답인 것 같다. 일단 이해가 잘 안 가지만 무한 복습하면 어느 정도 익숙해지겠지 뭐 ★★★

 

Comments