๐ฎ BootStrap5 SCSS ์ปค์คํฐ๋ง์ด์ง ๋ฐฉ๋ฒ
๋ถํธ์คํธ๋ฉ SCSS ์ปค์คํฐ๋ง์ด์ง
๋ณ์, ๋งต, ๋ฏน์ค์ธ ๊ทธ๋ฆฌ๊ณ ํจ์๋ฅผ ํ์ฉํ ์์ค์ Sass ํ์ผ์ ์ด์ฉํ์ฌ ํ๋ก์ ํธ ๊ตฌ์ถ์ ๊ณ ์ํํ๊ณ ์ฌ์ ์ ํ ์ ์์ต๋๋ค.
๋ถํธ์คํธ๋ฉ5๋ ๋ณ์, ๋งต, ๋ฏน์ค์ธ ๋ฑ์ ํ์ฉํ ์์ค์ Sass ํ์ผ์ ์ด์ฉํฉ๋๋ค.
'Style Sheet/Sass' ์นดํ ๊ณ ๋ฆฌ์ ๊ธ ๋ชฉ๋ก
์๋ ํ์ธ์. ์ด์ฌํ ๊ณต๋ถํ๋ ์ด๋ณด ๊ฐ๋ฐ์๋ก์ ๊ธฐ์ ๋ธ๋ก๊ทธ๋ฅผ ์ด์ํ๊ณ ์์ต๋๋ค.
inpa.tistory.com
SCSS ํ์ผ ๊ตฌ์กฐ
๊ฐ๋ฅํ ํ, Bootstrap์ ํต์ฌ ํ์ผ์ ์ง์ ์์ ํ์ง ๋ง์ธ์.
Sass์์๋ Bootstrap์ ๊ฐ์ ธ์ ์์ฒด ์คํ์ผ ์ํธ๋ฅผ ์์ฑํจ์ผ๋ก์จ ๊ฐ์ ์ ์ผ๋ก Bootstrap์ ์์ ํ๊ณ ํ์ฅํ ์ ์์ต๋๋ค.
npm๊ณผ ๊ฐ์ ํจํค์ง ๋งค๋์ ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ ํ์ผ ๊ตฌ์กฐ๊ฐ ๋ฉ๋๋ค.
your-project/
โโโ scss
โ โโโ custom.scss
โโโ node_modules/
โโโ bootstrap
โโโ js
โโโ scss
SCSS ํ ํ๋ฆฟ ์ ์ํ๊ธฐ
[SCSS] ๐ Sass(SCSS) ๋? ๐ ์ค์น ๋ฐ ์ปดํ์ผ
Sass CSS๊ฐ ๋ณต์กํ ์ธ์ด๋ ์๋์ง๋ง ์์ ์ด ํฌ๊ณ ๊ณ ๋ํ ๋ ์๋ก ๋ถํธํจ์ด ์๊ธด๋ค. โ์ด์ Sass๋ ๋ถํ์ํ ์ ํ์(Selector)์ ๊ณผ์ฉ๊ณผ ์ฐ์ฐ ๊ธฐ๋ฅ์ ํ๊ณ, ๊ตฌ๋ฌธ(Statement)์ ๋ถ์ฌ ๋ฑ ํ๋ก์ ํธ๊ฐ ์ปค์ง๋ฉด์
inpa.tistory.com
1. ์ฐ์ ๊ธฐ๋ณธ์ ์ธ index.html์ ํ์ผ์ ๋ง๋ค๊ณ package.json์ ํ ํ๋ฆฟ ์์ฑ
$ npm init -yโ
2. ์ต์ ๋ถ์คํธํธ๋ฉ๊ณผ ์์ด์ฝ์ ๋ค์ด๋ก๋๋ฅผ ํฉ๋๋ค.
$ npm install bootstrap@next
$ npm i bootstrap-iconsโ
3. ์ด์ ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ scss / main.scss ํ์ผ์ ๋ง๋ค์ด ์ค๋๋ค.
4. ๊ทธ๋ฆฌ๊ณ main.scss๋ก ๊ฐ์ ์ด๋ ๊ฒ ์์ฑํด์ฃผ๊ณ ์ปดํ์ผ ํด์ค๋๋ค.
@import "../node_modules/bootstrap/scss/bootstrap.scss";
์ปดํ์ผ์ด ์๋ฃ๋๋ฉด, ์ด๋ ๊ฒ css๊ฐ ๋จ๊ฒ ๋ฉ๋๋ค.
๋ชจ๋ ๋ถํธ์คํธ๋ฉ์ ๊ธฐ๋ฅ์ด cssํ์ผ์ ์ฑ์์ง๊ฒ ๋ฉ๋๋ค.
๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ main.scss์์ ๋ถํธ์คํธ๋ฉ css์ ์ฌ์ฉ์ css ๊ฐ๋ค์ ์กฐ์จํ์ฌ ์ฌ์ฉํ๋ฉด, ์์์ ์ต์ข ๊ฒฐ๊ณผ๋ก css๋ก ์ปดํ์ผ์ด ๋์ด ํธํ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค.
5. html์ ์ ์ฉํ๊ธฐ
index.html๋ก ๋์๊ฐ ์ด๋ ๊ฒ ๊ฒฝ๋ก๋ฅผ ๋ฐ๊ฟ์ค๋๋ค.
์ด๋ ๊ฒํ๋ฉด scss ์์ ๋ด์ฉ์ด ์ปดํ์ผํํด์ css๋ก ์ ์ฉ๋๋ฏ๋ก scss์๋ง ์ง์คํ ์ ์์ต๋๋ค.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Game information website</title>
<link rel="stylesheet" href="css/main.css"> <!-- ์ด๋ ๊ฒ css๊ฒฝ๋ก๋ก ์์ -->
</head>
<body>
<h1 class="text-primary">Bootstrap5</h1>
<!-- _variables.scssํ์ผ์์ ํ์ธ ํ ์ ์๋ ํด๋์ค์์์ ์ ์ฉ -->
</body>
</html>
๋ถํธ์คํธ๋ฉ ์ ์ฉ ํด๋์ค๋ฅผ ์ค์ ํ ์คํธ์ ์์ ์ ์ฉ์ด ๋๊ฑธ ํ์ธํ ์ ์์ต๋๋ค.
SCSS ๋ณ์ ์ปค์คํฐ๋ง์ด์ง
์์ ์์ ์์ text-primary ์์ฑ๊ฐ์ ์คฌ๋๋ ํ๋์์ผ๋ก ๋ณํ๊ฑธ ๋ณผ ์ ์์ต๋๋ค.
๋ง์ผ ํ๋์์ด ์๋ ๋ค๋ฅธ์์ผ๋ก ์ค์ ํ๊ณ ์ถ์ผ๋ฉด ์ด๋ป๊ฒ ํ ๊น์?
์๋ณธ ๋ถํธ์คํธ๋ฉ ํ์ผ์ ๋ฏ์ด์ ์์ ํด์ผ ํ ๊น์? ๊ทธ๋ด ํ์๊ฐ ์์ต๋๋ค.
main.scss์์ ๋ถํธ์คํธ๋ฉ ๋ณ์๊ฐ์ ์ ์ธํด์ฃผ๊ณ ์๋ก์ด ๊ฐ์ ๋ฃ์ผ๋ฉด ๋ฉ๋๋ค.
/* import๋ณด๋ค ์์ชฝ์ ์ ์ํด์ผ, ๋์ค์ ๋ถํธ์คํธ๋ฉ css์ !default ๊ฐ ์ ์ฉ๋์ด ๋ํ๋๋ค.*/
$primary: #401f7c; /*๋ณด๋ผ์*/
@import './node_modules/bootstrap/scss/bootstrap';
Bootstrap์ ๋ชจ๋ Sass ๋ณ์์๋ !default ํ๋๊ทธ๊ฐ ํฌํจ๋์ด ์์ผ๋ฉฐ, Bootstrap์ ์์ค ์ฝ๋๋ฅผ ์์ ํ์ง ์๊ณ ๋น์ ์ Sass์์ ๋ณ์์ ๊ธฐ๋ณธ๊ฐ์ ์ฌ์ ์ํ ์ ์์ต๋๋ค.
_variables.scss ์์ ๊ฐ๊ฐ์ ํด๋์ค๋ค์์ ์ง์ ๋ ์์์ ํ์ธํ ์ ์์ผ๋ฉฐ ์ด ์์์ ๋ฐ๊พธ๊ณ ์ถ์ผ๋ฉด ๋ณ์๋ฅผ ์ง์ ํด (์ค๋ฒ๋ผ์ดํ ) ์์ ๋ฐ๊ฟ ์ ์์ต๋๋ค.
์ ์ฉ ์์
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" href="./dist/main.css" />
<title>Bootstrap5</title>
</head>
<body>
<h1 class="text-primary">Bootstrap5</h1>
<h1 class="text-secondary">Bootstrap5</h1>
<h1 class="text-danger">Bootstrap5</h1>
<button class="btn btn-primary">๋ฒํผ</button>
</body>
</html>
$primary: #401f7c;
$secondary: blue;
$border-radius: 40px;
@import './node_modules/bootstrap/scss/bootstrap';
SCSS ํด๋์ค ์ปค์คํฐ๋ง์ด์ง
๋ฐ๋ก ์ ์์ ์์, ๋ฒํผ ํ๊ทธ์ p-5๋ผ๋ ํด๋์ค๋ฅผ ์ค๋ด ์๋ค.
p-5๋ผ๋ ๊ฑด padding 5์ ์์ฑ ํด๋์ค ์ ๋๋ค.
<button class="btn btn-primary p-5">๋ฒํผ</button>
์ฐ๋ฆฌ๋ padding 5๋ผ๋ ์ ์๋ ํฌ๊ธฐ๊ฐ ๋๋ฌด ์ปค์ ๋ฐ๊พธ๊ณ ์ถ์ต๋๋ค.
์ฆ ํด๋์ค p-5๊ฐ ์ ์๋ scss์ ๊ฐ์ ์ด ์ญ์, ์ปค์คํฐ๋ง์ด์ง ํด์ค์ผ ํฉ๋๋ค.
utilities.scss์ ๊ฐ๋ณด๋ฉด,
๋ค์ํ ์์ฑ๋ค์ด map์๋ฃํ์ผ๋ก ์ ์ ๋์ด์๋ ๊ฑธ ๋ณผ ์ ์์ต๋๋ค.
์ด์ค์์ padding์ ์ฐพ์๋ด ์๋ค.
/* Padding utilities */
"padding": (
responsive: true, /* ๋ฐ์ํ ์ค๋จ์ ์ฌ์ฉ ์ฌ๋ถ */
property: padding, /* padding์์ฑ์ ์ด์ฉ */
class: p, /* ํค์๋๋ p๋ผ ์ ์ */
values: $spacers /* p์ ๊ฐ์ผ๋ก๋ $spacers ๋ผ๋ ๋งต๋ณ์๋ฅผ ์ด์ฉ */
),
$spacer๋ณ์์๋ 0~5๊น์ง 1rem์ ๋ฐฐ์๋ก ์ค์ ๋์ด์๋๊ฑธ ๋ณผ ์ ์์ต๋๋ค.
์ด ์ ์๋ ๋ถํธ์คํธ๋ฉ ํด๋์ค ๋ณ์๋ฅผ ์ด์ฉํด์ ์๋ก์ด ํด๋์ค ๋ณ์๋ฅผ ์ฌ์ ์ ํด๋ด ์๋ค.
$utilities: () !default; /* ์ ํธ๋ฆฌํฐ ์ด๊ธฐํ */
$utilities: map-merge(
(
'button-padding': ( /* ์๋ก์ด ํด๋์ค ๋ณ์๋ฅผ ์ ์ */
responsive: true,
property: padding,
class: bp, /* ์๋ก์ด ํด๋์ค๋ช
์ ์ ์ */
values: /* $spacers๋์ ์ ์๋ก์ด ๋งต์ผ๋ก ์ ์ */
(
0: 0,
1: 0.2rem,
2: 0.4rem,
3: 0.6rem,
4: 0.8rem,
5: 1,
),
),
),
$utilities /* ๊ธฐ์กด ์ ํธ๋ฆฌํฐ์ merge */
);
@import './node_modules/bootstrap/scss/bootstrap';
์ ์๋ฅผ ํ์ผ๋ฉด, ์ด์ buttonํ๊ทธ์ ๊ฐ์ ํด๋์ค bp-5๋ฅผ ์ค ๋ด ์๋ค.
<button class="btn btn-primary bp-5">๋ฒํผ</button>
์ ์์ ์ผ๋ก ์ ์ฉ์ด ๋์์ต๋๋ค.
์ด์ ์๋กญ๊ฒ _utilities.scss๋ฅผ ๋ง๋ค๊ณ ์ ์ฝ๋๋ฅผ ๋ฃ์ด์ค์๋ค.
๊ทธ๋ฆฌ๊ณ main.scss์์ ๊ธฐ์กด ์ํฌํธ ์์ _utilities.scss๋ฅผ ์ํฌํธ ํ๋ฉด ๋ฉ๋๋ค.
์ ์ด๋ ๊ฒ ํ๋๋ฉด์, bootstrap.scss์์๋ ๋ณ์๋ค์ด !default์ฒ๋ฆฌ๊ฐ ๋์ด์๊ธฐ ๋๋ฌธ์, ๋ง์ผ ๊ฐ์ ๋ณ์๋ช ์ด ์ด๋ณด๋ค ์์ ์์๊ฒฝ์ฐ, ๊ทธ ๋ณ์์ ๋ฐ์ดํฐ์ ์์ ๋ฐ๋ผ๊ฐ๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ง์ผ ๋ถํธ์คํธ๋ฉ ๋ณ์ ๋ฐ์ดํฐ๋ฅผ ์์ ํ ๋ฎ์ด๋ฒ๋ฆฌ๊ณ ์ถ๋ค๋ฉด, bootstrap.scss ๋ค์์ ์ ์ ํ์๋ฉด ๋ฉ๋๋ค.
$utilities ํด๋์ค ๋งต ์์ฑ ์ ๋ฆฌํ
์ต์ | ํ์ | ์ค๋ช |
property | Required | ์ ์ฉ๋ css ํ๋กํผํฐ ์ง์ . |
values | Required | -์์ฑ๊ฐ์ ๋ชจ์ map๋ฆฌ์คํธ ์ง์ . |
class | Optional | ๋ถํธ์คํธ๋ฉ ํด๋์ค๋ช ์ ์ง์ |
state | Optional | :hover, :focus ๊ฐ์ ๊ฐ์ ํด๋์ค ์ง์ ์ปดํ์ผํ๋ฉด, .opacity-hover:hover๊ฐ ๋๋ค. |
responsive | Optional | ๋ฐ์ํ ์ค๋จ์ ํค์๋ ์ฌ์ฉ ์ฌ๋ถ .opacity-md-25 |
rfs | Optional | Boolean to enable fluid rescaling. Have a look at the RFS page to find out how this works. false by default. |
Optional | print ์ต์
์ ํ์ฑํํ๋ฉด ** ๋ํ ** ์ธ์์ฉ ์ ํธ๋ฆฌํฐ ํด๋์ค๊ฐ ์์ฑ๋๋ฉฐ, ์ด๋ @media print {...} ๋ฏธ๋์ด ์ฟผ๋ฆฌ ๋ด์์๋ง ์ ์ฉ |
|
rtl | Optional | Boolean indicating if utility should be kept in RTL. true by default. |
# Reference
https://velog.io/@dragoocho/%EB%B6%80%ED%8A%B8%EC%8A%A4%ED%8A%B8%EB%9E%A95-%ED%85%9C%ED%94%8C%EB%A6%BF-%EA%B5%AC%EC%B6%95
https://getbootstrap.kr/docs/5.0/customize/sass/