Float배우는 이유는?

Block요소들을 가로배치 하기위함

Block은 자기 다음에 오는 녀석들이 자신의 영역을 침범하지 않게 '길막'에 특화되어있었다.
그렇게되면 가로배치가 굉장히 어려워지는데 Block의 길막을 해결해주는 것이 바로!
Float

 

 

 

float
사전적의미 : (물 위나 공중에서)떠가다, 뜨다

 

 


오늘 알아야하는 목표 : 

What happens 

Float를 사용하면 무슨일이 일어나는지 그에 대한 변화와 현상들에 대해서 꼼꼼히 살펴보자 

 

How to fix it

Flat로 망가진 Layout을 어떻게 다시 잡을 수 있을지에 대해서 공부하자

 


 

What happens (Float를 사용하면 무슨일이 일어날까?)
#1 집 나간 내 새끼, 찾을 길 없네

#2 블록으로 신분상승

#3 길막을 못해 슬픈 블록아!

#4 플로트, 나만 볼 수 있어요(feat.인라인)

 

 

#1 집 나간 내 새끼, 찾을 길 없네

만약 어떤 요소가 float가 돼서 붕~떠버렸다.

그럼 float를 가지고있던 부모는 자신이 가지고 있던 자식이 float가 되버리면 이 자식은 집나간 자식이된다.

 

(🖐 여기서 잠깐! block이 height를 잡을때 별도의 height값을 주지않으면 요소는 자신이 가지고있는 자식들의 

세로영역의 총 합을 자신을 height값으로 가진다 따라서 부모가 가지고있던 자식이 float가 되버리면 float가 집나간자식이된다.)

 

부모뿐만아니라 뒤에 따라오던 형제 자식들도 그 집나간 자식이 어디갔는지 알길이 없다.

빨강이한테 float: left를하게되면 노랑이가 사라졌고, 노랑이는 빨강이 밑으로 들어갔다.

그래서 부모도 알길도없고, 보여지지않고해서 부모는 스스로 자기자식은 2명밖에없구나...라고해서

노랑이 파랑이 두개의 길이로만, 높이가 600px에서 400px로 바뀐 것을 볼 수가있다. 

 

#2 블록으로 신분상승

여기서 또 한가지 신기한점은 , float를 어떤 요소한테 먹이게 된다면 float먹인 요소가  Block Box로 신분이 상승한다.

 

Inline 

Inline Block          ->    Block 

Block

 

즉, 어떤 요소가 Inline이든 Inline Block이든지간에 얘네들이 float가 되버리면 Block으로 바뀐다.

 

div를 우선 대표적으로 알려진 inline Box인 span으로 바꾼후 본다면, 

 

오른쪽같이 옆으로 흐르는 것을 볼 수 가 있는데, 

빨강이 한테 이제 float:left를 하게되면 display : inline에서 display : block으로 자동으로 바뀌게 된다는 것을 확인 할 수 있다.

 

그럼 block box가 할 수 있던 능력을 우리가 다 쓸 수 있다는 뜻일까? 맞다.


따라서 width, height, padding, border, margin 모두 다 사용 할 수 있다.

 

따라서 float를 사용해서 block이 되니까, width, height를 주어 변화되는걸 확인 할 수 있다.

 

#3 길막을 못해 슬픈 블록아!

근데 이렇게되면 Block의 특성인 길막을 하지 못한다. 즉, 약간 하자가 있는 Block이된다.

 

🖐(잠깐) 다시 한 번 살펴보자!

Block이 길막을 하는데 방법이 2가지 있었다.

 

1번, 

별도의 width값이 선언되지 않은경우, width = 부모의 content-box만큼 자동으로 100% 늘어난다.

근데 float가 되면 그렇게 되지 못한다.

 

자 이제 직접 눈으로 확인해보자!

빨강이한테 float:left를 주었더니 사이즈가 자신이 가지고있는 콘텐츠 크기만큼만 줄어든것(쉽게생각해서 붕~뜨기위해서 자기가 가지고있는것만큼 늘어나고 줄어든다고 생각하자)을 확인 할 수있다.

즉, float를 하면 실제 콘텐츠만큼 딱 붕띄게 되는것이다 

따라서 display값이 아무리 block으로 바뀐다할지라도 막 늘어나는 깡패같은 block블럭은 아니라는 의미이다.

 

2번, 

따로 width를 선언한 경우, 남은 공간은 margin으로 자동으로 채운다고 했는데, float가 되면 이또한 일어나지 않는다.

이것은 block의 기본적인 형태
float: left; 를 하니까 자동으로 생기는 margin은 사라진다.

 

이렇게 자동으로 생기는 margin이 사라져야만 옆에 빈공간이 생기게되고,

빈공간이 생겨야 다른 float된 친구들도 옆으로 나란히 배치가 가능해진다. 그냥 당연한거라고 생각하기!


와장창의 예시 : 

3개 자식 모두가 float라면, 자식 모두가 집을 나가버려서 부모는 height가 0이 되버렸다.

 

그럼 형제요소로 other을 주어서 확인을해보자.

아까 부모의 height가 0이 되버렸다. 즉, 영역차지를 아무것도 안하게된다.

그럼, other입장에서는 앞에 형 인 parent가 있는데, 형이 height가 0이다. 그럼 형이 있으나마나인 것이다.

그럼 빈공간으로 인식을해서 쭉~ 위로 올라가는 것이다.

 

#4 플로트, 나만 볼 수 있어요(feat.인라인)

float가 일어나면 block Box들은 float된 요소를 없는Box로 취급을한다.

하지만, text나 image같은 inline의 성격을 가진 애들은 집나간 float의 존재를 기가막히게안다.

 

즉, other같은경우는 형이 없다고 쭉~ 올라갔다.

근데, other안에있던 콘텐츠들은 "어? 여기 float가 됐는데?"라는것을 기가막히게 안다. 

그래서 그 피한 자리로 흐르게되는것이다.

 

우리가 float를 사용하면 다른 block요소들은 그 float된 block요소들을 잡을 수 없지만 !

그 block안에 있는 콘텐츠 들은 여전히 float된 요소들한테 영향을 받고있다.

따라서 Layout이 와창창 무너지고있다. 

 

 

float는 복잡하고 , 하자도 많은 애라서, 요즘에는 거의 안쓰는게 사실이다.

하지만 이것을 알아야 옛날 코드를 봐도 자신있게 고칠 수 있기때문이다..

알긴 알아야한다.

 


 

 

How to fix it

와장창을 어떻게 잡을 수 있을까?

이는 2가지 길이있다.

 

1번,

Honeyful Trick 꿀이 넘쳐흐르는 첫번째 쉬운 트릭부터 알자!

overflow : hidden;   /   hidden과 이어 BFC에 대해서 더 자세히 살펴보기

자식이 float를 하면 부모는 집나간 자식을 찾지 못해서 쪼그라 들게 되는데 0이 되어버린다....

근데 부모한테 overflow : hidden을 주게 된다면 부모가 집나간 자식을 그냥 찾아버린다. 

따라서 바로 위의 와장창되었던 부분에 있어 overflow : hedden을 주어 집나간 자식들을 다 찾고, 

자신이 가지고 있는 자식들의 합인 세로영역 400px까지 잘 먹은것을 확인 할 수 있다.

 

하지만 위는 잘 작동한는 법/원리를 몰라서, 그냥 사용하는것이 꺼리게되어 

 

2번,

FM방법인 2번째 방법을 사용한다.

Clearfix방법 -> 정석으로 Float문제 해결하기,

clear라는 속성이있는데 이 속성을 사용해서 fix한다는 뜻인것 같다.

얘는 오로지 float를 위해 망가진 layout을 고치기위해 탄생한 속성이다.

overflow : hidden

 

만약 2개의 A, B인 Block요소가 있다 그런데 

A한테 Float : left를 줬다고 가정하자. 그럼 집을 나가게됐다는 소리인데, 그럼 따라오는 B같은 경우에는,

A가 존재하지 않으니까 위로 올라가게된다.

근데 이런상황에서 B한테 clear : left를 주게된다면 "B야! 내가 너한테 특별한 능력을 줄꺼야. 앞으로 너 앞에 float가 된 애가 있다면 어디있는지를 파악할 수 있는 능력을줄게"라고 얘기하는 것이다.

 

그럼 B는 A의 존재를 알게되고, 다시 아래로 내려 가게된다.  

그러면 B는 A의 위치를 정확하게 아니까 B는 float되지 않았으니 B의 위치와 사이즈에 대해서는 제대로 파악할 수 있다 

그래서 부모는 별도의 height가 없는경우 자식들의 세로 영역의 합을 자식 영역의 합으로 갖는다고 했는데,

그래서 A는 집을 나가서 알지 못하지만 clear가 된 B를 기준으로해서 올바르게 전체 자식의 세로 영역을 파악할 수 있게 되는 것이다. 

 

이 Clear는 총 3가지 값을 가질 수 있다.

left | right | both

Clearfix  속성(attribute)
설명
  left 앞으로 float:left된 녀석들이 앞에 있다면 그 녀석들의 위치를 정확하게 파악해서 영향받지않을꺼야! 
  right float:right로 ... 부터 영향을 받지 않을꺼야!
  both float:right | left 둘다 ... 영향을 받지 않겠다! 

 

 


예시로 한 번 보자!

모든 요소들이 Flot가 돼서 맨 뒤 부모는 영역을 다 잡지 못하고,길을 잃은 상태이다.

그래서 레이아웃이 붕괴되기 일보직전인데, 이 붕괴를 막기위해서 새로운 요소를 임의로 만들어서 

가령 div같은거를 만들어서 clear속성을주어 잡아야한다. 

근데 만약 상황상 의미없는 html요소

예)<div style="clear:left"></div> 와같이 html마크업을 더럽히는건,

프론트엔드 개발자로 굉장히 자존심이 상하는 문제이다.

 

 

이때 바로 나오는것이 CSS로만 처리할 수 있는 다른방법이있다.

CSS의가상요소 Pseudo-Element 로 해결하기!

float를 잡아줄 임의의 HTML요소를 만드는 대신에 CSS로 fake요소를 만드는 것이다.

HTML에는 존재하지않는 가상요소 + clear:left 

CSS로  fake요소를 만들다 라고 하는것을 우리는 흔히 CSS로 가상요소를 만든다 라는 표현을 한다.

가상요소를 만드는 것은 각 요소당 2개씩 만들 수 있다.

calss명 뒤에 ::before 혹은 ::after을 적어준다 

그리고 가상요소를 사용할때 반드시 작성해야하는 css속성이 있는데, 바로 content 이다.

(display : inline으로 설정되어있음)

 

그럼 일반 요소처럼 다 쓸 수 있다. 

 

따라서 앞으로 우리가 작업해야하는 방향은, 

::after을 사용하여 float된 자식을 가지고있는 부모의 가장 마지막 요소를 가상요소 ::after를 추가해준후 

float에 의해 붕괴된 Layout을 잡아줄 수 있도록 clear속성을 주는 것이다.

 

참고로 clear는 display가 block 한테만 사용가능하다.

 

clear: left를 한 이유는,  지금 child는 모두 다 float:left로된 애들밖에 없으니까  both를 사용할 필요는 없다.

 

 

그럼 자기가 원래 있어야 할 자리에 잘 CSS가 먹은것을 알 수가있다.  이것이 바로 clearfix이다! 

 

결론 : float를 사용할때 중요한점,1. 내가 가로배치를 할 녀석이 누구인가를 먼저 파악하자 그리고 그 친구들한테 float를 줄것! 그리고 그 친구를 감싸고 있는 부모한테 clearfix를 해준다! 
clearfix 대하여 더 알아보기


참고자료 : 

김버그 - CSS

 

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기