CSS ๋ฐฉ๋ฒ๋ก (BEM/OOCSS/SMACSS)
CSS ์ค๊ณ์ ์ค์์ฑ
- ์ฝ๋์ ์ฌ์ฌ์ฉ์ฑ์ ์ํด
- ์ฝ๊ฒ ์ ์ง๋ณด์ ํ๊ธฐ ์ํด
- ํ์ฅ์ ๊ฐ๋ฅํ๊ฒ ํ๊ธฐ ์ํด
- ํด๋์ค๋ช ์ผ๋ก๋ ๋ฌด์จ ์๋ฏธ์ธ์ง ์์ธก ๊ฐ๋ฅํ๋๋ก ํ๊ธฐ ์ํด
BEM (Block Element Modifier)
- Block, Element, Modifier ๋ก ๋๋์ด ์ปดํฌ๋ํธ ๊ธฐ๋ฐ์ ์น ๊ฐ๋ฐ ์ ๊ทผ๋ฒ ์ค ํ๋.
- ์ ์ ์ธํฐํ์ด์ค๋ฅผ ๋ ๋ฆฝ๋ ์ฌ๋ฌ ๊ฐ์ ๋ธ๋ก์ผ๋ก ๋ถ๋ฆฌํ์๋ ๊ฒ์ด ๋ชฉํ
- ๋ณต์กํ UI๋ฅผ ๊ฐ์ง ํ์ด์ง์ ์ธํฐํ์ด์ค ๊ฐ๋ฐ ํ๊ฒฝ์ ์ฝ๊ณ ๋น ๋ฅด๊ฒ ํ๋ฉฐ, ์ฝ๋์ ์ฌํ์ฉ์ ๋์ผ ์ ์๋ค.
- ํด๋์ค๋ช ์ด ์ฉ๋, ํํ๋ฅผ ์๋ฏธํ๋ฏ๋ก ์ง๊ด์ ์ด๋ ๊ธธ๊ณ ๋ณต์กํด์ง๋ ๊ฒ์ด ๋จ์ .
1) Block
- ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ปดํฌ๋ํธ. (์ฝ๋์ ๊ตฌ์กฐ์ ๋ฉ์ด๋ฆฌ)
ํด๋์ค๋ช ์ ํ๋์ ๋จ์ด ์ฌ์ฉ, ๊ธธ์ด์ง ๊ฒฝ์ฐ ๋จ์ผ ํ์ดํ(
-
)์ผ๋ก ๊ตฌ๋ถ๋ธ๋ก์ ๋ชฉ์ ์ผ๋ก ๊ธฐ์ ๋๋ฉฐ, ์ํ๋ฅผ ๋ํ๋ด์ง ์๋๋ค.
<!-- Correct :: ๋ฌด์์ธ์ง ์ ํํ ๊ธฐ์ . --> <div class="error"></div> <!-- Incorrect :: ์ด๋ป๊ฒ ํํ ๋๋ ์ํ๋ฅผ ๋ํ๋ด์ง ์๋๋ค. --> <div class="red-text"></div>
2) Element
- ๋ธ๋ก ์ธ๋ถ์์ ์ฌ์ฉํ ์ ์๋ ๋ธ๋ก ๋ด์ ์์๋ฅผ ๋ปํ๋ค.
- ๋ธ๋ก ๋งฅ๋ฝ์์๋ง ์๋ฏธ๊ฐ ์์ด์ผ ํจ
<form class="search-form">
<input class="search-form__input">
<button class="search-form__button"></button>
</form>
/* Good */
.search-form__input {...}
.search-form__button {...}
/* Bad */
.search-form .search-form__input {...}
button.search-form__button {...}
- ํ ์์๋ ํญ์ ๋ธ๋ก์ ๋ถ๋ถ์ด์ด์ผ ํ๋ฉฐ, ๋ธ๋ก์ผ๋ก๋ถํฐ ๋ถ๋ฆฌ๋์ด ์ฌ์ฉํ ์ ์๋ค.
<!-- Correct -->
<form class="search-form">
<input class="search-form__input">
<button class="search-form__button">Search</button>
</form>
<!-- Incorrect -->
<form class="search-form">
</form>
<!-- 'input'์ผ๋ก ๊ถํ๋ค. -->
<input class="search-form__input">
<!-- 'button'์ผ๋ก ๊ถํ๋ค. -->
<button class="search-form__button">Search</button>
- ํ ๋ธ๋ก์ DOM tree ์์ ์ฌ๋ฌ ๊ฐ๋ก ์ค์ฒฉ๋ ์์๋ค์ ๊ฐ์ง ์ ์๋ค.
<!-- (1) -->
<div class="block">
<div class="block__elem1">
<div class="block__elem2">
<div class="block__elem3"></div>
</div>
</div>
</div>
<!-- (2) -->
<div class="block">
<div class="block__elem1">
<div class="block__elem2"></div>
</div>
<div class="block__elem3"></div>
</div>
- ์์ ๋ธ๋ก ๊ตฌ์กฐ๋ค์ BEM ๋ฐฉ๋ฒ๋ก ์์ ์์๋ค์ ๋ชฉ๋ก๋ค๋ก ํํ. :: ๋ธ๋ก ๊ตฌ์กฐ๊ฐ ๋ณํ๋๋ผ๋((1)์์ (2)๋ก ๋ณ๊ฒฝ) ์์๋ค์ ๊ท์น๊ณผ ์ด๋ฆ์ ๋๊ฐ์ด ์ ์ง๋์ด์ผ ํ๋ฏ๋ก.
.block {...}
.block__elem1 {...}
.block__elem2 {...}
.block__elem3 {...}
3) Modifier
- ๋ธ๋ก์ด๋ ์์์ ๋ชจ์ (color, size) / ์ํ (disabled, checked)๋ฅผ ์ ์.
block__elem--modifier
,block--modifier
ํํ๋ก ์ฌ์ฉ.
block__elem1__elem2
์ ์๋ชป๋ ๋ฐฉ๋ฒ.
<!-- Correct -->
<form class="search-form">
<div class="search-form__content">
<input class="search-form__input">
<button class="search-form__button">Search</button>
</div>
</form>
<!-- Incorrect -->
<form class="search-form">
<div class="search-form__content">
<!-- 'search-form__input' or 'search-form__content-input' ์ผ๋ก ๊ถํ๋ค. -->
<input class="search-form__content__input">
<!-- 'search-form__button' or 'search-form__content-button' ์ผ๋ก ๊ถํ๋ค. -->
<button class="search-form__content__button">Search</button>
</div>
</form>
modifier์ ์ด๋ฆ์ ๋ธ๋ก์ด๋ ์์ ์ด๋ฆ์ผ๋ก๋ถํฐ ์ฑ๊ธ ์ธ๋์ค์ฝ์ด(
_
)๋ก ๋ถ๋ฆฌ๋๋ค.block-name_modifier-name
block-name__element-name_modifier-name
block-name_modifier-name_modifier-value
block-name__element-name_modifier-name_modifier-value
<!-- 'search-form' :: block / 'theme' :: modifier / 'islands' :: value --> <form class="search-form search-form_theme_islands"> <input class="search-form__input"> <button class="search-form__button search-form__button_size_m">Search</button> </form> <!-- ๋ ๊ฐ์ ๊ฐ์ modifiers๋ ๋ค๋ฅธ value๋ฅผ ๊ฐ์ง๋ค. --> <form class="search-form search-form_theme_islands search-form_theme_lite"> <input class="search-form__input"> <button class="search-form__button search-form__button_size_s search-form__button_size_m"> Search </button> </form>
OOCSS (Object Oriented CSS)
OOCSS๋ ๊ฐ์ฒด ์งํฅ์ ๋ฐ๋ผ ๊ณ ์๋ ์ค๊ณ ๋ฐฉ์
- ๊ตฌ์กฐ์ ์ธํ์ ๋ถ๋ฆฌ (Separate Structure and skin)
- ์ปจํ ์ด๋์ ๋ด์ฉ ๋ถ๋ฆฌ (Separate container and content)
- OOCSS style
1) ๊ตฌ์กฐ์ ์ธํ์ ๋ถ๋ฆฌ
๊ธฐ๋ณธ์ ์ธ ๊ตฌ์กฐ์ ๋ฐ๋ณต ์ ์๋๋ ์ธํ์ ๋ฐ๋ก ์ ์. (๊ณตํต ์คํ์ผ ์ถ์ํ)
- ๊ตฌ์กฐ : width, height, border, padding, margin
- ์ธํ : color, border-color, font-color, background-color
2) ์ปจํ ์ด๋์ ๋ด์ฉ ๋ถ๋ฆฌ
์์น์ ์์กดํ์ง ์๋ ์คํ์ผ ์ ์ :: ๊ตฌ์กฐ์ ์ํฉ์ ๊ด๊ณ์์ด ๋ฌธ์ ์ด๋ ๊ณณ์์๋ ์ฌ์ฌ์ฉ ๊ฐ๋ฅ.
ํ๊ทธ์ ์คํ์ผ์ ์ง์ ํ๋ ๊ฒ์ด ์๋ ํด๋์ค๋ช ์ ๋ถ์ฌํ๊ณ ์คํ์ผ์ ์ง์ ํ๋ค. :: ํ๊ทธ๊ฐ ๋ณ๊ฒฝ๋์ด๋ CSS ๋ฐ๊ฟ ํ์ ์์.
<!-- Bad --> <h2>...</h2> h2 { font-size: 16px } <!-- Good --> <h3 class="subtitle">...</h3> <span class="subtitle">...</span> .subtitle { font-size: 16px }
์ด๋์์๋ ์ฌ์ฌ์ฉ์ด ๊ฐ๋ฅํ ํด๋์ค ๊ธฐ๋ฐ์ ๋ชจ๋ ๊ตฌ์ถ
3) OOCSS Style
๊ธฐ๋ณธ ๊ตฌ์กฐ๊ฐ ๋ ๋ฆฝ์ ์ผ๋ก ์ง์ ๋์ด ์๊ธฐ ๋๋ฌธ์ ํฅํ ๋ค๋ฅธ ์์ ๋ฒํผ์ด ์ถ๊ฐ๋๋๋ผ๋ ์ธํ ใ กํ์ผ๋ง ์ถ๊ฐ๋ก ์ ์ํ๋ฉด ๋๋ค.
<a href="#" class="btnbase cart">์ฅ๋ฐ๊ตฌ๋</a>
<a href="#" class="btnbase buy">๋ฐ๋ก๊ตฌ๋งค</a>
/* ๋ฒํผ ๊ตฌ์กฐ ; ๊ณตํต์ ์ธ ๊ตฌ์กฐ์ง์ */
.btnbase {...}
/* ๋ฒํผ ์ธํ */
.cart {...}
.buy {...}
SMACSS (Scalable and Modular Architecture for CSS)
1) ์คํ์ผ์ ๋ค์ฏ๊ฐ์ง ์ ํ
SMACSS๋ ์คํ์ผ์ ๋ค์ฏ๊ฐ์ง๋ก ๋ถ๋ฅ, ๊ฐ ์ ํ์ ๋ง๋ ์ ํ์(Selector)์ ์๋ช ๋ฒ(naming convention), ์ฝ๋ฉ๊ธฐ๋ฒ์ ์ ์ํ๋ค.
- Base - ๊ธฐ๋ณธ๊ท์น
- Layout - ๋ ์ด์์ ๊ท์น
- Module - ๋ชจ๋ ๊ท์น
- States - ์ํ ๊ท์น
- Theme - ํ ๋ง ๊ท์น
1-1) Base - ๊ธฐ๋ณธ๊ท์น
- ๊ฐ ๋ธ๋ผ์ฐ์ ์ ์คํ์ผ์ ์ด๊ธฐํ ์ํค๋ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉ.
- ์์(elements) ์คํ์ผ์ ๊ธฐ๋ณธ๊ฐ ์ง์ (reset.css , normalize.css)
1-2) Layout - ๋ ์ด์์ ๊ท์น
ํฐ ํ์ ๋ ์ด์์, ํ์ด์ง์ ๋ค์ํ ์์๋ฅผ ๋ฐฐ์น, ๊ตฌ๋ณํ๋๋ฐ ์ฌ์ฉ
์ฃผ์ ์ปดํฌ๋ํธ :
header
,footer
,content
,aside
.. etcํ์ ์ปดํฌ๋ํธ : ์ฃผ์ ์ปดํฌ๋ํธ ๋ด์ ์๋ ์ปดํฌ๋ํธ (
nav
,item list
,form
.. etc)์ฃผ์ ์ปดํฌ๋ํธ๋
id
์ ๋ ํฐ / ํ์ ์ปดํฌ๋ํธ๋class
์ ๋ ํฐ๋ก ์คํ์ผ ์์ฑํด๋์ค๋ช ์ ์ ๋์ฌ๋ก
l-
,laylout-
๋ช ์- ex.
l-fixed
์ ๋ฌด์ ๋ฐ๋ผ ๊ฐ๋ณํญ์ผ๋ก ํ ์ง ๊ณ ์ ํญ์ผ๋ก ํ ์ง ๊ฒฐ์ ํ๋ ๋ ์ด์์
- ex.
#cotent {...}
#aside {...}
.l-fixed #content {...}
.l-fixed #aside {...}
1-3) Module - ๋ชจ๋ ๊ท์น
- ํ์ด์ง์์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๊ตฌ์ฑ์์ (๋ฒํผ, ์์ ฏ, ๋ฐฐ๋.. ๋ฑ)
- ๋ชจ๋์ ๋ ์ด์์ ๊ตฌ์ฑ์์ ์์ ์กด์ฌํ๋ ๋ค๋ฅธ ๋ชจ๋์์๋ ์กด์ฌํ ์ ์์
- ๊ฐ ๋ชจ๋์ ๋ ๋ฆฝํ์ผ๋ก ์กด์ฌํ๋๋ก ์ค๊ณ
- ์ฌ์ฌ์ฉ์ ์ํด CSS์ ํ์๋ก
id
ํ๊ทธ ์ฌ์ฉํ์ง ์์
<div class="box">
<span class="box-name">...</span>
<span class="box-items">...</span>
</div>
<!-- CSS -->
.box {...}
.box-name {...}
.box-items {...}
1-4) State - ์ํ ๊ท์น
- ์์์ ์ํ๋ณํ๋ฅผ ํํํ๋ ์คํ์ผ
- ์ฃผ๋ก JavaScript๋ก ์กฐ์๋๋ ํด๋์ค ์ง์
- ํด๋์ค๋ช
์ ์ ๋์ฌ๋ก
is-
๋ฑ์ ๋ช ์ (is-hidden
,is-collapsed
) - ๋ชจ๋๊ณผ ๋ ์ด์์ ๋ ๋ค ์ ์ฉ
<!-- ๋ ์ด์์ ์์, ์ ํ ์ํ -->
<div id="header" class="is-collapsed">
<form>
<!-- ๋ชจ๋, ์ค๋ฅ ์ํ -->
<div class="msg is-error">
There is an error!
</div>
<!-- ์ฐ๊ด๋ ๋ผ๋ฒจ์ด ์จ๊ฒจ์ง ์ํ -->
<label for="search" class="is-hidden">Search</label>
<input type="text" id="search">
</form>
</div>
1-5) Theme - ํ ๋ง ๊ท์น
- ์ฌ์ฉ์๊ฐ ํ ๋ง๋ฅผ ์ ํํ ์ ์๋ ๊ฒฝ์ฐ ์ฌ์ฉ
- ์์, ์ด๋ฏธ์ง๋ฅผ ๋ถ๋ณํ๋ ์คํ์ผ๊ณผ ๋ถ๋ฆฌ (background, color, border..)
- ๋ฉ์ธ ์คํ์ผ ๋ค์ ์ฝ์ด ๋ค์ด๊ฒ ํ๊ณ ๋ฎ์ด์ฐ๊ธฐ๋ฅผ ํ๊ฑฐ๋ ๊ธฐ์กด ์คํ์ผ์ ์ฌ์ ์ธํ์ฌ ์ฌ์ฉ
theme-
๋ฑ์ ์ ๋์ด๋ฅผ ๋ช ์ ๋๋ theme/ ์ ๊ฐ์ ๋๋ ํ ๋ฆฌ๋ก ๊ณ์ธต ๋ถ๋ฆฌ- ์์ฃผ ์ฌ์ฉ๋์ง๋ ์์
/* main.css */
.box { border: 1px solid; }
/* theme.css - main.css ๋ค์์ ์ฝ๋๋ก */
.box { border-color: blue; }
Reference
https://velog.io/@yesdoing/BEM-Block-Element-Modifier-Quick-start
https://github.com/hohoya33/css-methodologies
https://chlolisher.tistory.com/11
'๐ฉ๐ปโ๐ปSTUDY > CSS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[CSS] flexbox๋ก ๋ง๋ค ์ ์๋ 10๊ฐ์ง ๋ ์ด์์ (0) | 2021.01.22 |
---|---|
[CSS] Flexible Box (0) | 2020.11.19 |
[CSS] padding position ์์ญ (0) | 2020.07.07 |
[CSS] height: 100% VS height: auto (0) | 2020.07.02 |
[CSS] opacity / visibility / display ์ฐจ์ด์ (0) | 2020.03.31 |