3.HTML과CSS를 이용한 연습 세번째

9 minute read

Grid 형태 사이트

;

코드 비교

  • HTML 구성(1)

    • Expert code
    <div class="header">
      <div class="l_wrapper">
        Header
      </div>
    </div>
    <div class="contents">
      <div class="l_wrapper">Contents</div>
    </div>
    
    <div class="footer">
      <div class="l_wrapper">
        Footer
      </div>
    </div>
    
    .l_wrapper {
      max-width: 1300px;
      margin: 0 auto;
    }
    
    • Yosup code : html 코드에는 별 차이가 없으나, 나는 화면의 중앙을 맞추기 위해 body에다가 margin : 0 auto를 주었다. 하지만 body에다가 이것을 줄경우 이 화면에서 사용되는 모든 페이지는 중앙으로 맞춰져 버릴것이기 때문에 body에다가 margin을 주는 방법은 좋지 못한것 같다. 또한 body에다가 width를 주는것 역시 마찬가지일것 같다.
    <body>
      <header><div class="l_wrapper"></header>
      <main><div class="l_wrapper"></main>
      <footer><div class="l_wrapper"></footer>
    </body>
    
    body {
      background-image: url(/assets/images/practice/grid/bg.png);
      max-width: 1280px;
      margin: 0 auto;
      color: white;
    }
    
  • HTML 구성(2)

    • Expert code : 범용적인 애들 , 즉 활용도가 높은 테그들은 그 용도 파악하기 쉽게 접두어를 붙인다. 또한 이런애들은 뼈대의 역할을 할뿐이어서 디자인 서식을 준다거나 하지 않는다. 따라서 새로운 class명이 item인 테그를 만들어 그 테그에다가 디자인 서식을 준다.
    <ul class="l_row clearfix">
      <li
        class="l_col l_col_4_12 l_col_tablet_6_12 l_col_mobile_12_12 l_col_ld_2_12 "
      >
        <div class="item"></div>
      </li>
    </ul>
    
  • Yosup code : 마찬가지로 뼈대의 역할과 디자인서식을 줄 역할을 따로 분리하여 HTML을 구성함

    <ul class="l_row clearfix wd_20">
      <li class="l_col"><div class="item"></div></li>
    </ul>
    
  • Font-size의 중요성

    • 화면을 줄일때 왜 font가 밑으로 내려가는 것일까? 바로 px인 고정단위로 font-size를 지정했기 때문이다.

    • 그렇다면 화면을 줄일때 font-size도 같이 줄어들면 안되나??

    • 해결방법 : font-size를 % 로 주면된다. 그렇다고 모든 요소요소마다 font-size를 %로 주면 부모에 따른 %가 적용되므로 그 기준이 명확하지 않으므로 body에 font-size를 %로 주고 자식들은 rem 단위 요소를 사용하여 이 문제를 해결한다.(font-size는 일반적으로 html에 적용하는데, px이라는 고정값을 주는것은 별로 좋지 못하다. 그 이유는 작은 화면일때도 그 폰트사이즈가 유지되기 때문이다.)

    • Expert code : html에 font-size % 로 주고 그 하위 요소에 rem을 주었다. 하지만 %이기 때문에 화면이 줄어들면 font-size도 같이 줄어들어 버리게 되어 작은 화면에서는 font-size를 확인 할 수 없게 되어버린다. 그렇기에 작은 화면일때 미디어 쿼리를 써서 font-size를 크게 해줬다.

    html {
      font-size: 62.5%;
      /* 62.5% == 10px */
    }
    body {
      font-size: 2rem;
      /* 20px */
    }
    
    @media screen and (max-width: 480px) {
      html {
        font-size: 80%;
      }
    }
    
    • Yosup code : font-size를 px로 주었기 때문에 화면이 작아져도 font-size가 줄지 않음..
    .contents .contents-title {
      font-weight: 900;
      font-size: 20px;
      padding-bottom: 10px;
    }
    
    .contents .content {
      color: gray;
      padding-bottom: 20px;
      font-size: 15px;
    }
    
  • 이미지의 중요성

    • 이미지의 경우 inline이기 때문에 생기는 하단의 공간이 있다.

    • 해결방법 : display: block이나 vertical-align : top을 사용한다

    • Expert code : 이미지의 하단공간을 방지하기 위해 vertical-align: top;을 사용했고, 이미지는 width를 잡을때 max-width 를 사용한다고 한다. 그 이유는이미지는 max-width : 100%로 잡는게 일반적이다.

    • 이미지에 max-width를 쓰는 이유 : width 100%로 잡을경우 예를들어 부모가 너비가 100px인데 너비가 50px짜리인 이미지가 들어온다 하자 그러면 그 이미지는 width : 100%에 의해 100px짜리가 되려고 너비가 커지기 때문에 깨지고 만다. 따라서 max-width : 100%로 잡을경우 큰 이미지 즉 부모의 너비가 100px인데 이미지가 300px짜리의 경우 100px짜리가 되고 50px짜리는 50px을 그대로 유지하게 된다.그 이유는 max-width:100% 면 자기가 가진너비보다 작아질순 있으나 더 커질수 없기 때문이다.따라서 이미지를 받을때 큰 이미지를 준비하는게 편하다. 난 부모의 100px을 채우고 싶은데 작은 이미지를 사용하고 max-width를 사용하면 채우지 못하기 때문이다.

    img {
      max-width: 100%;
      vertical-align: top;
    }
    
    • Yosup code : 이미지에 width를 썻다는 문제점과 전체 이미지가 하단공간이 발생하는 문제가 발생할텐데 특정 이미지만 선택자로 사용했다는 문제점이 발견되었다.
    .item img {
      width: 100%;
      display: block;
    }
    
  • Float로 Grid를 만들때(1) : 클래스가 길어지는걸 두려워 하지 마라

    • Expert code : 전문가는 다양한 선택자를 사용하여 언제라도 쉽게 Grid가 5단 3단 1단 등 으로 변할수 있게 만들었다.
    <ul class="l_row clearfix">
      <li class="l_col l_col_4_12">
        <div class="item"></div>
      </li>
    </ul>
    
    .l_wrapper {
      max-width: 1300px;
      margin: 0 auto;
    }
    
    .l_row {
      margin: 0 -10px;
    }
    
    .l_col {
      float: left;
      width: 20%;
      padding: 0 10px;
      box-sizing: border-box;
      margin-bottom: 20px;
    }
    
    .l_col_12_12 {
      width: 100%;
    }
    .l_col_11_12 {
      width: 91.66666667%;
    }
    .l_col_10_12 {
      width: 83.33333333%;
    }
    .l_col_9_12 {
      width: 75%;
    }
    .l_col_8_12 {
      width: 66.66666667%;
    }
    .l_col_7_12 {
      width: 58.33333333%;
    }
    .l_col_6_12 {
      width: 50%;
    }
    .l_col_5_12 {
      width: 41.66666667%;
    }
    .l_col_4_12 {
      width: 33.33333333%;
    }
    .l_col_3_12 {
      width: 25%;
    }
    .l_col_2_12 {
      width: 16.66666667%;
    }
    .l_col_1_12 {
      width: 8.33333333%;
    }
    
    .l_col_3_15 {
      width: 20%;
    }
    
    • Yosup code : 나도 강의를 보기전에 이런방식으로 하는게 좋을것 같다라고 생각했지만 클래스가 늘어난다는 두려움에 하위요소를 사용했다. 또다른 특징은 어차피 wd_20이 적용될거라 생각하여 .l_col에 width를 지정하지 않았는데, 이럴경우 어떠한 문제가 발생하지 않을까 생각한다. 그리고 자식요소를 많이 사용했다는것이다. CSS 방법론에 의하면 하위요소를 많이 사용하는것은 좋지 못하다고 했다.
    <ul class="l_row clearfix wd_20">
      <li class="l_col"><div class="item"></div></li>
    </ul>
    
    .l_col {
      float: left;
      padding: 0 10px;
      box-sizing: border-box;
    }
    .wd_50 > li {
      width: 50%;
    }
    .wd_33 > li {
      width: 33.33333%;
    }
    .wd_25 > li {
      width: 25%;
    }
    .wd_20 > li {
      width: 20%;
    }
    
  • Float로 Grid를 만들때(2) : 클래스가 길어지는걸 두려워 하지 마라

    • Expert code : 다양한 선택자를 이용하여서 언제라도 쉽게 Grid가 5단 3단 1단 등 으로 변할수 있게 만들었다면, 반응형 웹으로 바뀔때도 다음과 같이 코딩을 해야한다.
    
    <ul class="l_row clearfix wd_20">
      <li class="class="l_col l_col_4_12 l_col_tablet_6_12 l_col_mobile_12_12 l_col_ld_2_12"><div class="item"></div></li>
    </ul>
    
    
    /* tablet */
    @media screen and (max-width: 760px) {
      .l_col_tablet_12_12 {
        width: 100%;
      }
      .l_col_tablet_11_12 {
        width: 91.66666667%;
      }
      .l_col_tablet_10_12 {
        width: 83.33333333%;
      }
      .l_col_tablet_9_12 {
        width: 75%;
      }
      .l_col_tablet_8_12 {
        width: 66.66666667%;
      }
      .l_col_tablet_7_12 {
        width: 58.33333333%;
      }
      .l_col_tablet_6_12 {
        width: 50%;
      }
      .l_col_tablet_5_12 {
        width: 41.66666667%;
      }
      .l_col_tablet_4_12 {
        width: 33.33333333%;
      }
      .l_col_tablet_3_12 {
        width: 25%;
      }
      .l_col_tablet_2_12 {
        width: 16.66666667%;
      }
      .l_col_tablet_1_12 {
        width: 8.33333333%;
      }
    }
    
    /* mobile*/
    
    @media screen and (max-width: 480px) {
      .l_col_mobile_12_12 {
        width: 100%;
      }
      .l_col_mobile_11_12 {
        width: 91.66666667%;
      }
      .l_col_mobile_10_12 {
        width: 83.33333333%;
      }
      .l_col_mobile_9_12 {
        width: 75%;
      }
      .l_col_mobile_8_12 {
        width: 66.66666667%;
      }
      .l_col_mobile_7_12 {
        width: 58.33333333%;
      }
      .l_col_mobile_6_12 {
        width: 50%;
      }
      .l_col_mobile_5_12 {
        width: 41.66666667%;
      }
      .l_col_mobile_4_12 {
        width: 33.33333333%;
      }
      .l_col_mobile_3_12 {
        width: 25%;
      }
      .l_col_mobile_2_12 {
        width: 16.66666667%;
      }
      .l_col_mobile_1_12 {
        width: 8.33333333%;
      }
    }
    
  • Yosup code : l_col의 class가 복잡해지는걸 두려워해 하위 요소 전체 width 에 영향을 줌, 하지만 이렇게 width를 줄경우 전체에 영향을 미치기 때문에 5단 3단이 섞인 grid를 만들기가 어렵다

    <ul class="l_row clearfix wd_20">
      <li class="l_col"><div class="item"></div></li>
    </ul>
    
    @media screen and (max-width: 990px) {
      .l_row > li {
        width: 50%;
      }
    }
    

꿀 팁~

  • 1.이미지는 max-width : 100%로 잡는게 일반적이다. width 100%로 잡을경우 예를들어 부모가 너비가 100px인데 너비가 50px짜리인 이미지가 들어온다 하자 그러면 그 이미지는 width : 100%에 의해 100px짜리가 되려고 너비가 커지기 때문에 깨지고 만다. 따라서 max-width : 100%로 잡을경우 큰 이미지 즉 부모의 너비가 100px인데 이미지가 300px짜리의 경우 100px짜리가 되고 50px짜리는 50px을 그대로 유지하게 된다. 그 이유는 max-width:100% 면 자기가 가진너비보다 작아질순 있으나 더 커질수 없기 때문이다. 따라서 이미지를 받을때 큰 이미지를 준비하는게 편하다. 부모의 100px을 채우고 싶은데 작은 이미지를 사용하고 max-width를 사용하면 채우지 못하기 때문이다.

    img {
      max-width: 100%;
    }
    
  • 2.float 기반으로 grid를 잡는 방식은 옛날 방식이고 요즘에는 flex와 grid를 사용한다. 또한 float의 목적과도 어긋나는 방식이다.

  • 3.float 기반으로 만든 grid는 width가 %로 만들어진 다는게 핵심이다.

  • 4.float기반의 grid를 잡을때, grid의 모습이 변화할수 있는 부분의 layout은 하나로만 grid의 너비를 잡는것이 아니라 클래스를 추가시키면, 언제라도 다른 grid의 모습으로 변화할수 있게 만들어야한다.

    • 첫째, 미리 그리드의 비율을 만들어 놓는다.
    .l_col_12_12 {
      width: 100%;
    }
    .l_col_11_12 {
      width: 91.66666667%;
    }
    .l_col_10_12 {
      width: 83.33333333%;
    }
    .l_col_9_12 {
      width: 75%;
    }
    .l_col_8_12 {
      width: 66.66666667%;
    }
    .l_col_7_12 {
      width: 58.33333333%;
    }
    .l_col_6_12 {
      width: 50%;
    }
    .l_col_5_12 {
      width: 41.66666667%;
    }
    .l_col_4_12 {
      width: 33.33333333%;
    }
    .l_col_3_12 {
      width: 25%;
    }
    .l_col_2_12 {
      width: 16.66666667%;
    }
    .l_col_1_12 {
      width: 8.33333333%;
    }
    
    • 둘째, 만들어놓은 그리드를 class에 추가시킨다. (기존에 너비가 정해졌더라도 클래스가 추가되면 그 너비가 변화할수 있게)

      <li class="l_col l_col_4_12"></li>
      
    • 셋째, 이렇게 함으로써 layout을 재활용하면서 각기 다른 비율을 가진 grid를 손쉽게 만들수 있다는것이다.

      • bad example

        우리는 l_col을 재활용 해야하는데 재활용하지 못하는 경우가 발생

      <ul class="l_row">
        <li class="l_col">1</li>
        <li class="l_col">2</li>
        <li class="l_col">3</li>
      </ul>
      
      <ul class="l_row">
        <li class="l_col2">4</li>
        <li class="l_col2">5</li>
        <li class="l_col2">6</li>
        <li class="l_col2">7</li>
      </ul>
      
      .l_col {
        width: 33.3333%;
      }
      
      .l_col2 {
        width: 25%;
      }
      

      또는 class를 더 늘리기 싫어서 자식 선택자를 사용함(내가 햇던것처럼..)

      <ul class="l_row wd_33">
        <li class="l_col">1</li>
        <li class="l_col">2</li>
        <li class="l_col">3</li>
      </ul>
      
      <ul class="l_row wd_25">
        <li class="l_col">4</li>
        <li class="l_col">5</li>
        <li class="l_col">6</li>
        <li class="l_col">7</li>
      </ul>
      
      .l_col {
        width: 33.3333%;
      }
      
      .wd_25 li{
        width:25%;
      }
      
      
      • good example
      <ul class="l_row">
        <li class="l_col wd_33">1</li>
        <li class="l_col wd_33">2</li>
        <li class="l_col wd_33">3</li>
      </ul>
      
      <ul class="l_row">
        <li class="l_col wd_25">4</li>
        <li class="l_col wd_25">5</li>
        <li class="l_col wd_25">6</li>
        <li class="l_col wd_25">7</li>
      </ul>
      
      
      .wd_25{
        width:25%
      }
      .wd_33{
        width:33%
      }
      
      

      결론 : 클래스의 길이가 늘어나는 것에 걱정을 하지말자 !!

  • 5.Media queries의 경우도 크기에 따른 변화를 주기 위해 미리 만들어 놓고 사용한다.

    /* Mediaqueries */
    
    @media screen and (min-width: 1400px) {
      .l_row {
        max-width: 1400px;
      }
    
      .l_col_ld_12_12 {
        width: 100%;
      }
      .l_col_ld_11_12 {
        width: 91.66666667%;
      }
      .l_col_ld_10_12 {
        width: 83.33333333%;
      }
      .l_col_ld_9_12 {
        width: 75%;
      }
      .l_col_ld_8_12 {
        width: 66.66666667%;
      }
      .l_col_ld_7_12 {
        width: 58.33333333%;
      }
      .l_col_ld_6_12 {
        width: 50%;
      }
      .l_col_ld_5_12 {
        width: 41.66666667%;
      }
      .l_col_ld_4_12 {
        width: 33.33333333%;
      }
      .l_col_ld_3_12 {
        width: 25%;
      }
      .l_col_ld_2_12 {
        width: 16.66666667%;
      }
      .l_col_ld_1_12 {
        width: 8.33333333%;
      }
    }
    
    /* tablet */
    @media screen and (max-width: 760px) {
      /* .l_col{
        width: 50%
    }
      
    /* 내가 5단이었던 화면을 화면이 줄었을때
      2단으로 바꾸고 싶다.
      그런데 .l_col에 직접 width를 주는것은 결과는 만족스럽지만 좋지 못한 방법이다.
      왜냐하면 내가 원지않아도 모든 l_col이 변하기 때문이다. 만약 내가 상단에는 3개를 유지시키고 싶어도 이 코드에 의해 다 2개로 바뀌기 떄문이다.*/
    
      .l_col_tablet_12_12 {
        width: 100%;
      }
      .l_col_tablet_11_12 {
        width: 91.66666667%;
      }
      .l_col_tablet_10_12 {
        width: 83.33333333%;
      }
      .l_col_tablet_9_12 {
        width: 75%;
      }
      .l_col_tablet_8_12 {
        width: 66.66666667%;
      }
      .l_col_tablet_7_12 {
        width: 58.33333333%;
      }
      .l_col_tablet_6_12 {
        width: 50%;
      }
      .l_col_tablet_5_12 {
        width: 41.66666667%;
      }
      .l_col_tablet_4_12 {
        width: 33.33333333%;
      }
      .l_col_tablet_3_12 {
        width: 25%;
      }
      .l_col_tablet_2_12 {
        width: 16.66666667%;
      }
      .l_col_tablet_1_12 {
        width: 8.33333333%;
      }
    
      /*그렇다면 어떻게 해결할까?
      3단으로 바뀔거에다가 l_col_tablet_4_12 클래스를 추가 시켜준다.
      이렇듯 다양한 변화를 하기 위해서는 직접 width를 하는것이 아니라. 적용할 곳에 새로운 클래스를 추가시켜주는것이다.
      이렇게 계속하다보면 HTML의 클래스가 길어질텐데??
      차라리 마크업이 복잡해지는것보다 클래스가 길어지는게 낫다. */
    }
    
    @media screen and (max-width: 480px) {
      .l_col_mobile_12_12 {
        width: 100%;
      }
      .l_col_mobile_11_12 {
        width: 91.66666667%;
      }
      .l_col_mobile_10_12 {
        width: 83.33333333%;
      }
      .l_col_mobile_9_12 {
        width: 75%;
      }
      .l_col_mobile_8_12 {
        width: 66.66666667%;
      }
      .l_col_mobile_7_12 {
        width: 58.33333333%;
      }
      .l_col_mobile_6_12 {
        width: 50%;
      }
      .l_col_mobile_5_12 {
        width: 41.66666667%;
      }
      .l_col_mobile_4_12 {
        width: 33.33333333%;
      }
      .l_col_mobile_3_12 {
        width: 25%;
      }
      .l_col_mobile_2_12 {
        width: 16.66666667%;
      }
      .l_col_mobile_1_12 {
        width: 8.33333333%;
      }
    }
    
  • 6.4번 5번처럼 하면 클래스가 길어질텐데??? 마크업이 복잡해지는것보다 클래스가 길어지는게 낫다.

  • 7.나는 body에게 margin : 0 auto 를 주어 가운데 정렬을 했는데, 전문가는 각 부분부분을 wrapper클래스로 묶어서 css로 .wrapper 에 margin : 0 auto를 주어 가운데 정렬을 했다. 이렇게 할경우의 장점은??? 진짜 이렇게 헀는데 영상 다시봐부자

  • yosup’s code

    body {
      background-image: url(/assets/images/practice/grid/bg.png);
      max-width: 1280px;
      margin: 0 auto;
      color: white;
    }
    
  • expert’s code

    <div class="header">
      <div class="l_wrapper">
        Header
      </div>
    </div>
    
    <div class="contents">
      <div class="l_wrapper">
        Contents
      </div>
    </div>
    
    <div class="footer">
      <div class="l_wrapper">
        Footer
      </div>
    </div>
    
    .l_wrapper {
      max-width: 1300px;
      margin: 0 auto;
    }
    
  • 8.float로 만든 Grid의 한계

    • 1)float를 이용해 내가 원하는 한줄을 만들기가 생각보다 까다롭다

    float도 이용해야하고 그로인해 발생하는 문제를 해결하기위해 clear도 해줘야하고 negarive margin도 해줘야하고

    • 2)콘텐츠의 양이 달라질때, px값으로 높이를 정한것이 아니기 때문에 높이가 고정되어 있지 않는다.

    • 제목의 문제를 해결하기위해 양을 늘더라도 다 보이는게 아니라 … 으로 보이게끔 만들었다.
    .item-contents h2 {
      white-space: nowrap;
      /* 줄바꿈 X*/
      overflow: hidden;
      /* 화면을 빠져나와버린 h2내용을 숨김 */
      text-overflow: ellipsis;
      /* 숨겨진 내용을 ... 으로 만듬 but 이 속성은 한줄일경우에만 가능하다. 여러줄 불가능*/
    }
    
  • 안의 내용 역시 양이 늘경우 틀을 빠져나오는 경우가 발생한다. 이걸 해결하기 위해 5줄만 보이게끔 하고, 나머지는 … 으로 나타나개 했다. 즉 높이를 같게 함으로써 이러한 문제를 해결

    .item-contetns p {
      line-height: 1.6;
      /* 줄과 줄간격을 조절함, 1이라 하면 줄간격이 콘텐츠 높이만큼 됨 */
      height: 8em;
    
      overflow: hidden;
    }
    
  • 9.font-size는 일반적으로 html에 적용하는데, px이라는 고정값을 주는것은 별로 좋지 못하다. 그 이유는 만약 눈이 침침한 사람이 사용자 지정으로 폰트사이즈의 크기를 정할수 있는데, px로 할경우 고정된 값으로 밖에 볼수 없기 때문이다. 따라서 font-size는 %로 지정을 많이 해놓는다. 하지만 font-size: 100%는 16px인데 너무 크기 때문에 일반적으로 font-size :62.5%(==10px)로 해놓는다.

  • 10.(9번)처럼 할경우 생기는 문제는 바로 휴대폰에서 발생한다.

    html {
      font-size: 62.5%;
      /* 62.5% == 10px */
    }
    body {
      font-size: 2rem;
      /* 20px */
    }
    

이라고 할경우 font-size가 %이기 때문에 이 말인즉슨 화면이 줄어들면 font-size도 점점 작아질수 밖에 없다는것이다. 그럴경우 발생할수 있는 문제는 휴대폰에서 화면에서는 font-size가 많이 작아질수 밖에 없다는 것이다. 이를 해결하기위해 핸드폰사이즈 미디어쿼리에 font-size의 %를 늘리는 방법이 있다.

@media screen and (max-width: 480px) {
  html {
    font-size: 80%;
  }
}

Leave a comment