10.1 ์ค์ฒฉ ๋ณ์์ ํจ์
๋ ๋ณต์กํ๊ณ ๋์ ์ธ ์คํ์ผ์ ๊ตฌํํ๊ธฐ ์ํด CSS ๋ณ์์ ํจ์์ ์กฐํฉ์ ์ฌ์ฉํ์ฌ ์ค์ฒฉ ๋ณ์, JavaScript๋ฅผ ํตํ ๋์ ๊ฐ ๋ณ๊ฒฝ, ๋ณต์กํ ๊ทธ๋ผ๋ฐ์ด์ ๊ณผ ๊ฐ์ ๊ณ ๊ธ ๊ธฐ์ ์ ํ์ฉํ ์ ์์ด. ๋ ๋ณต์กํ ์์ ์ ๊ธฐ์ ์ ์ดํด๋ณด์.
1. ์ค์ฒฉ ๋ณ์์ ํจ์
์ด ์์ ์์๋ ์์ ํฌ๊ธฐ๋ฅผ ๋์ ์ผ๋ก ๋ณ๊ฒฝํ๊ธฐ ์ํด ๋ณ์ ์ค์ฒฉ์ ์ฌ์ฉํด ๋ดค์ด:
:root {
--base-size: 16px;
--scale-factor: 1.5;
--scaled-size: calc(var(--base-size) * var(--scale-factor));
}
.container {
font-size: var(--scaled-size);
padding: calc(var(--scaled-size) / 2);
margin: calc(var(--scaled-size) / 4);
}
2. ๋์ ์์กฐ ๋ณ๊ฒฝ ํ ๋งํ
CSS ๋ณ์์ JavaScript๋ฅผ ํตํด hsl()
์ ์ฌ์ฉํ์ฌ ํ
๋ง๋ฅผ ๋ง๋ค๊ณ ๋์ ์ผ๋ก ์์กฐ๋ฅผ ๋ณ๊ฒฝํ ์ ์์ด.
๋ฒํผ์ ํด๋ฆญํ๋ฉด --base-hue
๊ฐ์ด ๋ณ๊ฒฝ๋์ด ๋ฐฐ๊ฒฝ์์ด ๋์ ์ผ๋ก ๋ณ๊ฒฝ๋ผ:
:root {
--base-hue: 200;
--saturation: 70%;
--lightness: 50%;
--primary-color: hsl(var(--base-hue), var(--saturation), var(--lightness));
}
body {
background-color: var(--primary-color);
transition: background-color 0.3s;
}
<button id="change-color">Change Color</button>
// "change-color" id๊ฐ ์๋ ์์๋ฅผ ๊ฐ์ ธ์ด
document.getElementById('change-color').addEventListener('click', () => {
// ๋ฌธ์์ ๋ฃจํธ ์์ ๊ฐ์ ธ์ด (HTML)
const root = document.documentElement;
// HSL ํ์์ ์์ ์์กฐ๋ฅผ ์ํ 0๋ถํฐ 359๊น์ง์ ๋ฌด์์ ์ซ์ ์์ฑ
const newHue = Math.floor(Math.random() * 360);
// ์ฌ์ฉ์ ์ง์ CSS ๋ณ์ --base-hue์ ๋ํ ์๋ก์ด ๊ฐ ์ค์
// ์ด ๋ณ์๋ ์๋ง๋ ์คํ์ผ์์ ๊ธฐ๋ณธ ์์์ ์ ์ํ๋ ๋ฐ ์ฌ์ฉ๋จ
root.style.setProperty('--base-hue', newHue);
});
10.2 ๋ณต์กํ ๊ทธ๋ผ๋ฐ์ด์
3. ๋ณต์กํ ๋ค๋จ๊ณ ๊ทธ๋ผ๋ฐ์ด์
์ด ์์ ์์๋ ์ฌ๋ฌ ์์ ์คํ์ ์ฌ์ฉํ์ฌ ๋ณต์กํ ๋ฐฐ๊ฒฝ์ ์์ฑํ๋ ๋ค๋จ๊ณ ์ ํ ๊ทธ๋ผ๋ฐ์ด์ ์ ์ฌ์ฉํ์ด:
:root {
--color-stop1: hsla(200, 100%, 50%, 0.8);
--color-stop2: hsla(340, 100%, 50%, 0.8);
--color-stop3: hsla(120, 100%, 50%, 0.8);
--color-stop4: hsla(60, 100%, 50%, 0.8);
}
.complex-gradient {
background: linear-gradient(
45deg,
var(--color-stop1) 25%,
var(--color-stop2) 25%,
var(--color-stop2) 50%,
var(--color-stop3) 50%,
var(--color-stop3) 75%,
var(--color-stop4) 75%
);
}
4. ๋์ ์ ์ํ ์ปดํฌ๋ํธ ์์ฑ
์คํฌ๋ฆฐ ํฌ๊ธฐ ๋ฐ ๊ธฐํ ์์ธ์ ๋ฐ๋ผ ์์ฑ์ ๋ณ๊ฒฝํ๋ ์ ์ํ ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ๊ธฐ ์ํด CSS ๋ณ์ ๋ฐ ํจ์๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด์ผ.
์ ์ํ ์ปดํฌ๋ํธ๋ ์คํฌ๋ฆฐ ํฌ๊ธฐ์ ๋ฐ๋ผ ํจ๋ฉ๊ณผ ๋ฐฐ๊ฒฝ์์ ๋ณ๊ฒฝํด:
<div class="dynamic-component">๋์ ์ปดํฌ๋ํธ</div>
:root {
--base-padding: 20px;
--scale-factor: 1.5;
--dynamic-padding: calc(var(--base-padding) * var(--scale-factor));
}
@media (max-width: 600px) {
:root {
--scale-factor: 1;
}
}
.dynamic-component {
padding: var(--dynamic-padding);
background-color: hsl(calc(100 + var(--scale-factor) * 50), 100%, 50%);
}
5. JavaScript ๋ฐ CSS ๋ณ์๋ฅผ ์ฌ์ฉํ ๊ทธ๋ผ๋ฐ์ด์ ์์ฑ
JavaScript๋ก ์ป์ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋์ ์ผ๋ก ๊ทธ๋ผ๋ฐ์ด์ ์ ์์ฑํ๋ ๋ฐฉ๋ฒ์ด์ผ.
๋ฒํผ์ ํด๋ฆญํ๋ฉด ๋ฌด์์๋ก ์๋ก์ด ์์๊ณผ ๊ทธ๋ผ๋ฐ์ด์ ๊ฐ๋๊ฐ ์์ฑ๋ผ:
:root {
--color1: hsl(200, 100%, 50%);
--color2: hsl(340, 100%, 50%);
--angle: 45deg;
}
.dynamic-gradient {
background: linear-gradient(var(--angle), var(--color1), var(--color2));
}
<button id="generate-gradient">Generate Gradient</button>
<div class="dynamic-gradient">Content</div>
// "generate-gradient" id๊ฐ ์๋ ์์๋ฅผ ๊ฐ์ ธ์ด
document.getElementById('generate-gradient').addEventListener('click', () => {
// ๋ฌธ์์ ๋ฃจํธ ์์ ๊ฐ์ ธ์ด (HTML)
const root = document.documentElement;
// HSL ํ์์ผ๋ก ์ต๋ ์ฑ๋ ๋ฐ ์ค๊ฐ ๋ฐ๊ธฐ์ ๋ ๊ฐ์ง ๋ฌด์์ ์์ ์์ฑ
const newColor1 = `hsl(${Math.floor(Math.random() * 360)}, 100%, 50%)`;
const newColor2 = `hsl(${Math.floor(Math.random() * 360)}, 100%, 50%)`;
// ๊ทธ๋ผ๋ฐ์ด์
์ ๋ํ ๋ฌด์์ ๊ฐ๋ ์์ฑ
const newAngle = `${Math.floor(Math.random() * 360)}deg`;
// ์ฌ์ฉ์ ์ง์ CSS ๋ณ์์ ๋ํ ์๋ก์ด ๊ฐ ์ค์
root.style.setProperty('--color1', newColor1);
root.style.setProperty('--color2', newColor2);
root.style.setProperty('--angle', newAngle);
});
10.3 CSS ๋ณ์๋ฅผ ์ฌ์ฉํ ๋์ ํ ๋ง
์์ 1: CSS ๋ณ์์ JavaScript๋ฅผ ์ฌ์ฉํ ๋์ ํ ๋ง ๋ณ๊ฒฝ
์ ํํ ํ ๋ง์ ๋ฐ๋ผ CSS ๋ณ์๊ฐ ๋ณ๊ฒฝ๋๋ ๋์ ํ ๋ง ์์คํ ์ ์์ฑํ ๊ฑฐ์ผ:
:root {
--background-color: #ffffff;
--text-color: #000000;
--primary-color: #3498db;
--secondary-color: #2ecc71;
}
body {
background-color: var(--background-color);
color: var(--text-color);
transition: background-color 0.3s, color 0.3s;
}
.container {
padding: 20px;
}
button {
background-color: var(--primary-color);
color: white;
border: none;
padding: 10px 20px;
cursor: pointer;
transition: background-color 0.3s;
}
button:hover {
background-color: var(--secondary-color);
}
.content {
margin-top: 20px;
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>๋์ ํ
๋ง ๋ณ๊ฒฝ</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<div class="container">
<button onclick="switchTheme()">ํ
๋ง ๋ณ๊ฒฝ</button>
<div class="content">
<h1>์ ๋ชฉ</h1>
<p>๋์ ํ
๋ง ๋ณ๊ฒฝ ์์ ํ
์คํธ.</p>
</div>
</div>
<script src="script.js"></script>
</body>
</html>
// ํ
๋ง ๊ฐ์ฒด๋ฅผ ์ ์
const themes = {
light: {
// ๋ผ์ดํธ ํ
๋ง ์์
'--background-color': '#ffffff', // ๋ฐฐ๊ฒฝ์
'--text-color': '#000000', // ํ
์คํธ ์์
'--primary-color': '#3498db', // ๊ธฐ๋ณธ ์์
'--secondary-color': '#2ecc71' // ๋ณด์กฐ ์์
},
dark: {
// ๋คํฌ ํ
๋ง ์์
'--background-color': '#2c3e50', // ๋ฐฐ๊ฒฝ์
'--text-color': '#ecf0f1', // ํ
์คํธ ์์
'--primary-color': '#e74c3c', // ๊ธฐ๋ณธ ์์
'--secondary-color': '#8e44ad' // ๋ณด์กฐ ์์
}
};
// ํ์ฌ ์ ํ๋ ํ
๋ง
let currentTheme = 'light';
// ํ
๋ง๋ฅผ ์ ํํ๋ ํจ์
function switchTheme() {
// currentTheme์ ๊ฐ์ ๋ฐ์ ํจ (๋ผ์ดํธ -> ๋คํฌ, ๋คํฌ -> ๋ผ์ดํธ)
currentTheme = currentTheme === 'light' ? 'dark' : 'light';
// ํ์ฌ ํ
๋ง์ ์์ ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์ด
const theme = themes[currentTheme];
// ํ
๋ง ๊ฐ์ฒด์ ๋ชจ๋ ํค-๊ฐ ์์ ์ํ
for (let [variable, value] of Object.entries(theme)) {
// CSS ๋ณ์ ๊ฐ ์ค์
document.documentElement.style.setProperty(variable, value);
}
}
์์ 2: calc(), min(), max() ๋ฐ clamp()๋ฅผ ์ฌ์ฉํ์ฌ ํฐํธ ํฌ๊ธฐ์ ํจ๋ฉ์ ์กฐ์ ํ๋ ๋ฐ์ํ ๋์์ธ
๋ณด๊ธฐ ์ฐฝ ๋๋น์ ๋ฐ๋ผ ํฐํธ ํฌ๊ธฐ ๋ฐ ํจ๋ฉ์ด ๋ณ๊ฒฝ๋๋ ๋ฐ์ํ ๋ ์ด์์์ ๋ง๋ค์ด๋ณผ ๊ฑฐ์ผ:
:root {
--base-font-size: 16px;
--base-padding: 10px;
--min-font-size: 14px;
--max-font-size: 24px;
--preferred-font-size: 2vw;
--min-padding: 8px;
--max-padding: 20px;
--preferred-padding: 1.5vw;
}
body {
font-size: clamp(var(--min-font-size), var(--preferred-font-size), var(--max-font-size));
padding: clamp(var(--min-padding), var(--preferred-padding), var(--max-padding));
transition: font-size 0.3s, padding 0.3s;
}
.responsive-container {
margin: 0 auto;
max-width: 800px;
padding: calc(var(--base-padding) * 2);
text-align: center;
}
h1 {
font-size: clamp(calc(var(--base-font-size) * 1.5), 3vw, 36px);
}
p {
font-size: clamp(var(--base-font-size), 2vw, 24px);
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>๋์ ํฌ๊ธฐ๋ฅผ ๊ฐ์ง ๋ฐ์ํ ๋์์ธ</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<div class="responsive-container">
<h1>๋ฐ์ํ ์ ๋ชฉ</h1>
<p>์ด ํ
์คํธ๋ ๋ณด๊ธฐ ์ฐฝ ํฌ๊ธฐ์ ๋ง์ถฐ ํฐํธ ํฌ๊ธฐ์ ํจ๋ฉ์ ์กฐ์ ํด.</p>
</div>
</body>
</html>
GO TO FULL VERSION