ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [CSS] SASS로 반응형 그리드 프레임워크 업그레이드
    Web/CSS 2020. 5. 22. 04:35

    ej 프레임워크 사용법 살펴보기

     

    - ej-spacing-xs-30: xs 이상에서 칼럼의 여백을 30px로 둔다.

    - ej-md-1-4: md 이상에서 100% 기준으로 1/4 사용하겠다.

    - ej-hidden-below-500: 500 미만의 세계에서 숨긴다.

    - ej-hidden-below-xs: xs 이하의 세계에서 숨긴다.

    - ej-clear-both-below-md: md 이하의 세계에서 clear both를 건다.

    - ej-ratio-100-50: 너비 100% 높이 50% 비율을 가진다.

    - ej-ratio-lg-100-100: lg 이상에서 너비 100% 높이 100% 비율을 가진다.

    - ej-ratio-400-100-100: 화면크기 400 이상에서 너비 100% 높이 100% 비율을 가진다.

     

    ej 프레임워크 연습

     

     

     

    ej 프레임워크 수정

     

    HTML

     

    <div class="ej-container ej-spacing-xs-3">
      <div class="ej-row ej-spacing-md-10 sj-spacing-sm-20 ej-spacing-xs-30">
        <div class="ej-col  ej-lg-4-5 ej-md-3-5 ej-sm-2-5 ej-xs-1-5"></div>
    <!--     
            lg 이상에서 4/5 사용
            md 이상에서 3/5 사용
            sm 이상에서 2/5 사용
            xs 이상에서 1/5 사용  -->
        
        <div class="ej-col ej-clear-both-below-md ej-lg-1-5 ej-md-2-5 ej-sm-3-5 ej-xs-4-5">
         
    <!--         lg 이상에서 1/5 사용
            md 이상에서 줄바꿈, 2/5 사용
            sm 이상에서 3/5 사용
            xs 이상에서 4/5 사용 -->
          
        </div>
      </div>
    </div>

     

     

     

    CSS(SCSS)

     

    // 라이브러리 시작

     

    // 기본 콘테이너 최대 너비

    $ej-container-max-width-px: 980px;

    // 한줄에 들어갈 수 있는 그리드의 최대 개수

    $ej-col-max-no: 8;

    // 화면 1000 부터 300 까지 25px 간격으로 반응형 숨김 클래스 만들기

    $ej-hidden-below-max-width: 500;

    $ej-hidden-below-interval-width: 50;

    // 칼럼의 최대 간격

    // 50으로 하면 0부터 50

    $ej-spacing-max-width: 30;

    $ej-spacing-interval-width: 1;

    $ej-ratio-max-percent_no: 250;

    // 가로세로 비율에서 세로의 최대 비율

    // 가로는 늘 100이고 세로는 40 ~ 250

    $ej-ratio-interval-percent_no: 5;

    // 가로세로 비율

     

    $ej-ratio-avobe-min-width:300;

    $ej-ratio-avobe-max-width:800;

    $ej-ratio-avobe-interval-width:10;

     

    // 화면 대역~

    $band-infos: (

        'xs': ('width': 767),

        'sm': ('width': 991),

        'md': ('width': 1199),

        'lg': ()

    );

     

    // 여기서 부터 생성기!!

    $band-codes: map-keys($band-infos);

     

    $smallest-band-code: nth($band-codes, 1);

    $biggest-band-code: nth($band-codes, length($band-codes));

     

    @function getMapCounts($map) {

        $count:length(map-values($amp));

        

        @return $count;

    }

     

    .ej-container {

        max-width: $ej-container-max-width-px;

        margin: 0 auto;

    }

     

    .ej-container-fluid {

    }

     

    .ej-row::after {

        content: "";

        display: block;

        clear: both;

    }

     

    .ej-row > .ej-col {

        float: left;

        box-sizing: border-box;

        width: 100%;

    }

     

    @function initBandInfos($band-infos) {

        $min-width: 0;

        

        @each $row in $band-infos {

            $band-code: nth($row, 1);

            $band-info: nth($row, 2);

            

            $width:map-get($band-info, 'width');

            

            $band-info:map-merge($band-info, ('min-width': $min-width));

            

            @if ( $width == null ) {

                $min-width:0;

                $band-info:map-merge($band-info, ('width': $min-width));

            }

            @else {

                $min-width:$width + 1;

            }

            

            $band-infos:map-merge($band-infos, ($band-code: $band-info));

        }

     

        @return $band-infos;

    }

     

    $band-infos: initBandInfos($band-infos);

     

    @function getBandInfoByCode($band-code) {

        $row: map-get($band-infos, $band-code);

        

        @return $row;

    }

     

    @function getBandMinWidth($band-code) {

        $band-info: getBandInfoByCode($band-code);

     

        @return map-get($band-info, 'min-width');

    }

     

    @function getBandMaxWidth($band-code) {

        $band-info: getBandInfoByCode($band-code);

     

        @return map-get($band-info, 'width');

    }

     

    @mixin makeResCols($band-code, $i) {

        $min-width: getBandMinWidth($band-code);

        $min-width-px: $min-width * 1px;

     

        @if ($min-width == 0) {

            @include makeCols($band-code, $i);

        }

        @else {

            @media (min-width: $min-width-px) {

                @include makeCols($band-code, $i);

            }

        }

    }

     

    @mixin makeResSpacing($band-code, $i) {

        $min-width: getBandMinWidth($band-code);

        $min-width-px: $min-width * 1px;

     

        @if ($min-width == 0) {

            @include makeSpacing($band-code, $i);

        }

        @else {

            @media (min-width: $min-width-px) {

                @include makeSpacing($band-code, $i);

            }

        }

    }

     

    @mixin makeSpacing($band-code, $i) {

        $padding-hor-px: $i / 2 * 1px;

        $margin-hor-px: $padding-hor-px * -1;

        .ej-spacing-#{$band-code}-#{$i} {

            & > .ej-row {

                margin-left: $margin-hor-px;

                margin-right: $margin-hor-px;

                & > .ej-col {

                    padding-left: $padding-hor-px;

                    padding-right: $padding-hor-px;

                }

            }

        }

     

        div.ej-spacing-#{$band-code}-#{$i}.ej-row {

            margin-left: $margin-hor-px;

            margin-right: $margin-hor-px;

            & > .ej-col {

                padding-left: $padding-hor-px;

                padding-right: $padding-hor-px;

            }

        }

    }

     

    @mixin makeCols($band-code, $i) {

        @for $j from 1 to $i + 1 {

            &.ej-#{$band-code}-#{$j}-#{$i} {

                width: percentage($j/$i);

            }

        }

    }

     

    @for $ii from $ej-ratio-avobe-min-width to $ej-ratio-avobe-max-width + 1 {

        @if ( $ii % $ej-ratio-avobe-interval-width == 0 ) {

            @for $i from 0 to $ej-ratio-max-percent_no + 1 {

                $min-width-px: $ii * 1px;

                $height: $i;

     

                @if ( $i % $ej-ratio-interval-percent_no == 0 ) {

                    @if ( $ej-ratio-avobe-min-width == $ii ) {

                        .ej-ratio-100-#{$height} {

                            position:relative;

                            padding-bottom:percentage($height/100) !important;

                            height:auto !important;

                        }

                    }

                    @else {

                        @media( min-width: $min-width-px ) {

                            .ej-ratio-avobe-#{$ii}-100-#{$height} {

                                position:relative;

                                padding-bottom:percentage($height/100) !important;

                                height:auto !important;

                            }

                        }

                    }

                }

            }

        }

    }

     

     

    @each $row in $band-codes {

        $band-code: nth($row, 1);

        $band-min-width: getBandMinWidth($band-code);

        $band-min-width-px: $band-min-width * 1px;

        $band-max-width: getBandMaxWidth($band-code);

        $band-max-width-px: $band-max-width * 1px;

        

        .ej-row {

            .ej-col {

                @for $i from 1 to $ej-col-max-no + 1 {

                    @include makeResCols($band-code, $i);

                }

            }

        }

     

        @for $i from 0 to $ej-spacing-max-width + 1 {

            @if ( $i % $ej-spacing-interval-width == 0 ) {

                @include makeResSpacing($band-code, $i);

            }

        }

        

        @for $i from 0 to $ej-ratio-max-percent_no + 1 {

            $height: $i;

     

            @if ( $i % $ej-ratio-interval-percent_no == 0 ) {

                @if ( $band-min-width-px != 0 ) {

                    @media( min-width: $band-min-width-px ) {

                        .ej-ratio-#{$band-code}-100-#{$height} {

                            position:relative;

                            height:auto !important;

                            padding-bottom:percentage($height/100) !important;

                        }

                    }

                }

            }

        }

        

        @if ( $band-max-width-px == 0px ) {

            .ej-hidden-below-#{$band-code} {

                display:none;

            }

     

            .ej-clear-both-below-#{$band-code} {

                clear:both;

            }

        }

        @else {

            @media( max-width: $band-max-width-px ) {

                .ej-hidden-below-#{$band-code} {

                    display:none;

                }

            }

     

            @media( max-width: $band-max-width-px ) {

                .ej-clear-both-below-#{$band-code} {

                    clear:both;

                }

            }

        }

    }

     

    @for $i from 300 to $ej-hidden-below-max-width + 1 {

        @if ( $i % $ej-hidden-below-interval-width == 0 ) {

            $width: $i;

            $width-px: $width * 1px;

     

            @media( max-width: $width-px - 1px ) {

                .ej-hidden-below-#{$i} {

                    display:none;

                }

            }

        }

    }

     

    .ej-ratio-body {

        position:absolute;

        top:0;

        left:0;

        width:100%;

        height:100%;

    }

     

    // 라이브러리 끝

    // 옵션

     

    body{

      overflow-x:hidden;

      margin: 0;

      padding: 0;

    }

    // 음수마진 때문에 스크롤바가 생깁니다.

     

    // 프레임워크 확인용 코드

    .ej-row > .ej-col::after {

      content:"";

      display:block;

      height: 100px;

      background-color: pink;

    //  div 안에 콘텐츠가 없으므로 배경색상과 높이를 지정해 주어야 함

    }

     

Designed by Tistory.