FE/HTML,CSS

[CSS] CSS 설계기법

mandelina 2022. 4. 18. 12:44

들어가기에 앞서 . .

 

css방법론을 사용하는 이유는

 

- 코드의 재사용성을 위하여

- 유지보수를 좀 더 효율적으로 하기 위해

- 확장을 가능하게 하기위해

- 클래스명으로 무슨의미인지 예측 가능하게 하기 위해

 

 


 

🚀 OOCSS (Object Oriented CSS) ?

-이름에서도 알 수 있듯이 객체지향에 따라 고안된 설계방식 ,

 레고처럼 여러가지 모듈을 만들어 조합하는 방법론이다 .

 

특징

1. 구조와 외형을 분리

- 구조 : width , height , border ,margin 등..

- 외형 : color , font-color , background-color , border 등 ..

 

<button type="button" class="btn"></button>
<button type="button" class="btn btn-close"></button>
.btn {
    width: 200px;
    height: 80px;
    font-size: 30px;
}

.btn-close {
    background: black;
    color: #fff;
    border: 3px dotted #fff;
}

 

- btn에는 구조를 정의, btn-close에는 외형을 정의 했다.

 

2. 컨테이너와 내용을 분리

 

<main id="main">
    <button type="button" class="btn general">기본 버튼</button>
    <button type="button" class="btn warning">취소 버튼</button>
</main>
/* 컨테이너에 스타일이 종속되어 있는 상태 */
#main .btn {
	width: 300px;
    padding: 20px 10px;
    margin: 10px;
    font-size: 18px;
    line-height: 1.5;
}

#main .general {
    background-color: aquamarine;
    color: black;
}

#main .warning {
    background-color: azure;
    color: blue;
}

#main이라는 컨테이너에 각 .general  .warning style이 종속되어 있는 상태

 

-> 컨텐츠의 스타일 선택자(.general / .warning )에 컨테이너의 클래스(#main)를 베제한다.

 

 

 


 

🚀SMACSS (Scalable and Modular Architecture for CSS) ?

 

- css 코드를 역할에 따라 분리한다.

- 역할의 종류

 

  베이스 | 레이아웃 | 모듈 | 스테이트 | 테마

 

베이스 

프로젝트 표준 스타일
전체 font style , reset style ,
공통스타일 등

레이아웃

헤더 ,메인영역 ,푸터 ,사이드바와 같은 큰 틀을 구성하는 모듈에 관한 규칙

모듈


레이아웃안에 배치되는 모든 요소 

비슷한 모듈안에서도 모양이 조금씩 다를 경우 서브클래스를 만듬

(btn-small, btn-long 등등)


스테이트


기본 스타일을 덮어쓰거나 확장하는데 사용

레이아웃이나 모듈에 둘 다 적용가능

js로 필요할때 넣었다 뺏다 할수 있다. (클래스 이름 앞에 is라는 접두사 사용)

테마

사용자에게 사이트의 느낌을 전달하는 이미지(background-image), 색상(background-color, color … ) 등을 의미

 

 

 

[모듈예시]

<button type="button" class="btn">그냥 버튼</button>
<button type="button" class="btn btn-small btn-long">아이디/비밀번호 찾기</button>
<button type="button" class="btn btn-small">로그인</button>

btn 이외에 모양이 서브클래스 btn-small, btn-long를 사용하여 모양을 다르게 해주었다.

 

 

 

[스테이트 예시]

<ul class="tabnav">
    <li class="is-active"><a href="">탭1</a></li>
    <li><a href="">탭2</a></li>
    <li><a href="">탭3</a></li>
    <li class="is-hidden"><a href="">탭4</a></li>
</ul>

is-active , is-hidden과같이 레이아웃,모듈에 모두 적용가능하고 , js로 넣었다 뺏다 할 수 있다.

 

 


 

🚀BEM (Block, Element , Modifier) ?

- OOCSS와 같은 모듈 기반의 방법으로 네이밍에 중점을 둔 방법론

 

1.Block

- 어디에서나 재사용 가능한 부품을 의미

- 소문자를 사용 , 여러단어가 연결되는 경우 케밥케이스 사용

- 단어를 하이픈 (-) 으로 구분

 

 

[케밥케이스 예시]

.cont-nav{}
.box-green{}
.error-red{}

 

 


 

2.Element 

 

- Block을 구성하는 요소로 ,blcok에 종속적이다.

- 따라서 block 클래스의 이름을 상속받고 , 언더바 두 개를 접두사로 하여 사용한다.

 

 

[element 네이밍 예시1]

<section class="chapter-baseball">
    <button type="button" class="chapter-baseball__btn"></button>
</section>

- chapter-baseball 이라는 Block클래스 이름을 상속받아 chapter-baseball__btn 라고 짓는다.

 

 

[element 네이밍 예시2]

<p class="txt-grey">더 많은 정보가 필요하시면
    <button class="txt-grey__btn">
        <!-- <strong  class="txt-grey__btn__bold">여기</strong> 이렇게 네이밍 하지 않습니다. -->
        <strong class="txt-grey__bold">여기</strong>
    </button>
    를 클릭하세요!
</p>

- element 안에 또 element를 사용할 경우 클래스 네이밍은 element 끼리 중첩하지 않는다.

- element끼리는 종속관계로 보지 않기 때문이다!

 


 

3.Modifier(수식어)

 

- block이나  element의 모습이나 상태 , 움직임을 결정

- 활성상태, 사이즈, 컬러 등..

- 단독으로 클래스 이름을 사용하지 않고 두번째 클래스 이름으로 사용

 

[예제1]

<!-- <nav class="nav-global--off"></nav> 잘못된 예 -->
<nav class="nav-global nav-global--off">
    <a href="" class="nav-global__link"></a>
    <a href="" class="nav-global__link"></a>
</nav>

- nav의 nav-global명을 상속받고 하이픈두개로 연결하여 nav-global--off 으로 사용한다.

 

 

[예제2]

btn-move btn-move—size-small{}

- 2개이상의 단어 사용시 block처럼 하이픈으로 연결한다.

 

 

[예제3]

<nav class="nav-global nav-global--off">
    <a href="" class="nav-global__link nav-global__link--off"></a>
    <a href="" class="nav-global__link"></a>
    <a href="" class="nav-global__link"></a>
</nav>

- Element의 Modifier이라면 element의 이름을 상속받기 때문에 언더바+하이픈이 혼용되어 사용된다.

 

- nav-global라는 block을 상속받아 nav-global__link라는 element (언더바2개) 클래스이름을 갖고 ,

  element 이름을 상속받아 nav-global__link--off라는 modifier 클래스 네이밍(언더바+하이픈)을 갖는다.

 

 

 


 

 

 

Q. 하이픈 vs 대시 차이점은?

하이픈 ( - ) 단어나 단어의 일부를 연결하는데 사용하는 구두점
대시  ( ) 하이픈보다 길며 범위를 나타내거나 쌍으로 사용해 쉼표 대신 사용

 

 

[대시 단축키]

 

Mac : Option + shift + hyphen

 

Window PC : Alt + 숫자 015

 


 

🌈그밖에

 

코드리뷰 시간에 배웠던 리뷰 상기시키기

 

- form태그를 쓸땐 label도 같이 쓰자 . . . (사용 후 label를 숨기면 된다.)

- 요소의 위치를 옮기고 싶다면 부모요소 위치를 조절 후 자식위치를 옮기자! (간격도 마찬가지!)

- form 구역을 정확히 나누자! (너무 포괄적으로 잡아버렸다 . .)

- flex를 너무 남용하지 말자

 

 

 

🔥 회고

- class 네이밍이 간단한 구현을 할 땐 몰랐는데 길어질수록 정말  . .  어려워졌었는데

  참고해서 네이밍을 지어야겠다.(제 최애 네이밍 방법은 스네이크 표기법 ^_^)

 

- 오늘 코드리뷰해주신 로그인 폼을 다시 구현해보아야겠다. 

'FE > HTML,CSS' 카테고리의 다른 글

[CSS] IR기법  (0) 2022.04.19
[CSS] grid ?  (0) 2022.04.14
[css] Flex란?  (0) 2022.04.13
[css] float  (0) 2022.04.12
[css] position  (0) 2022.04.11