@property륌 ì¬ì©íì¬ ê³ êž CSS êž°ë¥ì ì êž íŽì íìžì. ì€íìŒ ë° ì ëë©ìŽì ì ìŽë¥Œ ê°ì íë ë° íì©íë ë°©ë²ì ìì볎ìžì.
CSS ë§ì€í°íêž°: @property륌 ì¬ì©í ì¬ì©ì ì ì ìì± ë±ë¡
ì¬ì©ì ì ì ìì±(CSS ë³ìëŒê³ ë íš)ì CSS륌 ìì±íê³ ì ì§ êŽëЬíë ë°©ìì íì íìµëë€. ì¬ì¬ì© ê°ë¥í ê°ì ì ìíì¬ ì€íìŒìížë¥Œ ëì± ì ì°íê³ ì ì§ êŽëЬí ì ìê² íŽì€ëë€. ê·žë¬ë ëšìí ê°ì ì ìíë ê² ìŽìì í ì ìë€ë©Ž ìŽëšê¹ì? ì¬ì©ì ì ì ìì±ìŽ ë³Žì íë ê°ì ì í, ìŽêž° ê° ë° ìì ëì곌 íšê» ì ìí ì ìë€ë©Ž ìŽëšê¹ì? ë°ë¡ @propertyê° ê·ž ìí ì í©ëë€.
@propertyë 묎ììžê°ì?
@propertyë ëžëŒì°ì ì ì¬ì©ì ì ì ìì±ì ëª
ìì ìŒë¡ ë±ë¡í ì ìëë¡ íŽì£Œë CSS ê·ì¹ì
ëë€. ìŽ ë±ë¡ íë¡ìžì€ë ìì±ì ìì ì í, ìŽêž° ê° ë° ë¶ëªš ìììì ììíŽìŒ íëì§ ì¬ë¶ì ëí ì 볎륌 ëžëŒì°ì ì ì ê³µí©ëë€. ìŽë¥Œ íµíŽ ë€ì곌 ê°ì ëª ê°ì§ ê³ êž êž°ë¥ì ì¬ì©í ì ììµëë€.
- ì í ê²ì¬: ì¬ì©ì ì ì ìì±ì ì¬ë°ë¥ž ì íì ê°ìŽ í ë¹ëìëì§ íìží©ëë€.
- ì ëë©ìŽì : ì«ì ëë ìì곌 ê°ì í¹ì ì íì ì¬ì©ì ì ì ìì±ì ëíŽ ë¶ëë¬ìŽ ì í ë° ì ëë©ìŽì ì íì±íí©ëë€.
- Ʞ볞ê°: ì¬ì©ì ì ì ìì±ìŽ ëª ìì ìŒë¡ ì ìëì§ ìì ê²œì° ë첎 ê°ì ì ê³µí©ëë€.
- ìì ì ìŽ: ì¬ì©ì ì ì ìì±ìŽ ë¶ëªš ìììì ê°ì ììí ì§ ì¬ë¶ë¥Œ ê²°ì í©ëë€.
CSS ë³ìì ì í ìì ì±ì ì¶ê°íë ê²ìŒë¡ ìê°íìžì. ëì± ê°ë ¥íê³ ììž¡ ê°ë¥í ì€íìŒìížë¥Œ ë§ë€ ì ììµëë€.
@propertyì 구묞
@property ê·ì¹ì ë€ì곌 ê°ì Ʞ볞 구묞ì ë°ëŠ
ëë€.
@property --property-name {
syntax: '';
inherits: true | false;
initial-value: ;
}
ê° ë¶ë¶ì ììží ìŽíŽë³Žê² ìµëë€.
--property-name: ë±ë¡íë €ë ì¬ì©ì ì ì ìì±ì ìŽëŠì ëë€. ë ê°ì íìŽí(--)ìŒë¡ ììíŽìŒ í©ëë€.syntax: ìì±ì ììëë ê°ì ì íì ì ìí©ëë€. ìŽë ì í ê²ì¬ ë° ì ëë©ìŽì ì ë§€ì° ì€ìí©ëë€. ìëìì ì¬ì© ê°ë¥í 구묞 ê°ì ììží ìŽíŽë³Žê² ìµëë€.inherits: ìì±ìŽ ë¶ëªš ìììì ììíŽìŒ íëì§ ì¬ë¶ë¥Œ ëíëŽë ë¶ìž ê°ì ëë€. ì§ì íì§ ììŒë©Ž Ʞ볞ê°ìfalseì ëë€.initial-value: ìììì ëª ìì ìŒë¡ ì€ì ëì§ ìì ê²œì° ìì±ì Ʞ볞ê°ì ëë€. ìŽë ê² í멎 íì ë첎 ê°ì ì¬ì©í ì ììµëë€.
syntax ì€ëª
ì ìŽíŽ
syntax ì€ëª
ìë @property ê·ì¹ìì ê°ì¥ ì€ìí ë¶ë¶ì
ëë€. ì¬ì©ì ì ì ìì±ì ìŽë€ ì¢
ë¥ì ê°ì ììí ì§ ëžëŒì°ì ì ìë €ì€ëë€. ë€ìì ëª ê°ì§ ìŒë°ì ìž êµ¬ë¬ž ê°ì
ëë€.
*: 몚ë ê°ì íì©í©ëë€. ìŽë ê°ì¥ íì©ì ìž êµ¬ë¬žìŽë©° Ʞ볞ì ìŒë¡ ë±ë¡ ììŽ íì€ CSS ë³ìì ëìì ë³µì í©ëë€. ìŽ êž°ë¥ì ì ì€íê² ì¬ì©íìžì.<length>: êžžìŽ ê°(ì:10px,2em,50%)ì ììí©ëë€. ìŽë ìë¡ ë€ë¥ž êžžìŽ ê° ì¬ìŽì ë¶ëë¬ìŽ ì ëë©ìŽì ì ê°ë¥íê² í©ëë€.<number>: ì«ì ê°(ì:1,3.14,-5)ì ììí©ëë€. ë¶í¬ëª ë ëë í¬êž°ì ê°ì ì«ì ìì±ì ì ëë©ìŽì ì ì ì©íë ë° ì ì©í©ëë€.<percentage>: ë°±ë¶ìš ê°(ì:25%,100%)ì ììí©ëë€.<color>: ìì ê°(ì:#f00,rgb(255, 0, 0),hsl(0, 100%, 50%))ì ììí©ëë€. ë¶ëë¬ìŽ ìì ì í ë° ì ëë©ìŽì ì ì¬ì©íëë¡ ì€ì í©ëë€.<image>: ìŽë¯žì§ ê°(ì:url(image.jpg),linear-gradient(...))ì ììí©ëë€.<integer>: ì ì ê°(ì:1,-10,0)ì ììí©ëë€.<angle>: ê°ë ê°(ì:45deg,0.5rad,200grad)ì ììí©ëë€. íì ì ì ëë©ìŽì ì ì ì©íë ë° ì ì©í©ëë€.<time>: ìê° ê°(ì:1s,500ms)ì ììí©ëë€. ì¬ì©ì ì ì ìì±ì íµíŽ ì ëë©ìŽì ì§ì ìê° ëë ì§ì°ì ì ìŽíë ë° ì ì©í©ëë€.<resolution>: íŽìë ê°(ì:300dpi,96dpi)ì ììí©ëë€.<transform-list>: ë³í íšì 목ë¡(ì:translateX(10px) rotate(45deg))ì ììí©ëë€. ë³µì¡í ë³íì ì ëë©ìŽì ì ì ì©í ì ììµëë€.<custom-ident>: ì¬ì©ì ì§ì ìë³ì(묞ììŽ)륌 ììí©ëë€.enum곌 ì ì¬í©ëë€.<string>: 묞ììŽ ê°(ì:"Hello World")ì ììí©ëë€. 묞ììŽì ì ëë©ìŽì ì ì ì©íë ê²ì ìŒë°ì ìŒë¡ ì§ìëì§ ììŒë¯ë¡ 죌ìíììì€.- ì¬ì©ì ì ì 구묞: ìì ì°ì°ìì
|(ëë),[](귞룹í),+(íë ìŽì),*(0ê° ìŽì) ë°?(0ê° ëë 1ê°)ì ì¡°í©ì ì¬ì©íì¬ ë ë³µì¡í 구묞ì ë§ë€ ì ììµëë€. ì륌 ë€ìŽ<length> | <percentage>ë êžžìŽ ëë ë°±ë¶ìš ê°ì íì©í©ëë€.
ì¬ë°ë¥ž syntax륌 ì ííë ê²ì @propertyì 몚ë êž°ë¥ì íì©íë ë° íìì ì
ëë€.
@propertyì ì€ì ì
CSSìì @property륌 ì¬ì©íë ëª ê°ì§ ì€ì ì륌 ìŽíŽë³Žê² ìµëë€.
ìì 1: 배겜ì ì ëë©ìŽì
ë²íŒì 배겜ìì ì ëë©ìŽì
ì ì ì©íë€ê³ ê°ì íŽ ë³Žê² ìµëë€. @property륌 ì¬ì©íì¬ ë°°ê²œìì ëí ì¬ì©ì ì ì ìì±ì ë±ë¡í ë€ì CSS ì íì ì¬ì©íì¬ ì ëë©ìŽì
ì ì ì©í ì ììµëë€.
@property --bg-color {
syntax: '<color>';
inherits: false;
initial-value: #fff;
}
.button {
background-color: var(--bg-color);
transition: --bg-color 0.3s ease;
}
.button:hover {
--bg-color: #f00; /* Red */
}
ìŽ ìììë --bg-color ì¬ì©ì ì ì ìì±ì <color> 구묞ìŒë¡ ë±ë¡í©ëë€. ìŠ, ìì ê°ì ììí©ëë€. initial-valueë í°ì(#fff)ìŒë¡ ì€ì ë©ëë€. ë²íŒ ìë¡ ë§ì°ì€ë¥Œ ê°ì žê°ë©Ž --bg-colorê° ë¹šê°ì(#f00)ìŒë¡ ë³ê²œëê³ ì íì 배겜ì ë³ê²œì ë¶ëëœê² ì ëë©ìŽì
ì ì ì©í©ëë€.
ìì 2: ì«ìë¡ í ë늬 ë°ê²œ ì ìŽ
@property륌 ì¬ì©íì¬ ììì í
ë늬 ë°ê²œì ì ìŽíê³ ì ëë©ìŽì
ì ì ì©í ì ììµëë€.
@property --border-radius {
syntax: '<length>';
inherits: false;
initial-value: 0px;
}
.rounded-box {
border-radius: var(--border-radius);
transition: --border-radius 0.5s ease;
}
.rounded-box:hover {
--border-radius: 20px;
}
ì¬êž°ìë --border-radius륌 <length>ë¡ ë±ë¡íì¬ px, em ëë %ì ê°ì êžžìŽ ê°ì íì©í©ëë€. ìŽêž° ê°ì 0pxì
ëë€. .rounded-box ìë¡ ë§ì°ì€ë¥Œ ê°ì žê°ë©Ž í
ë늬 ë°ê²œìŽ 20pxë¡ ì ëë©ìŽì
ë©ëë€.
ìì 3: 귞늌ì ì€íì ì ì ëë©ìŽì ì ì©
ìì 귞늌ìì ê°ë¡ ì€íì ì ì ëë©ìŽì ì ì ì©íë€ê³ ê°ì íŽ ë³Žê² ìµëë€.
@property --shadow-offset-x {
syntax: '<length>';
inherits: false;
initial-value: 0px;
}
.shadowed-box {
box-shadow: var(--shadow-offset-x) 5px 10px rgba(0, 0, 0, 0.5);
transition: --shadow-offset-x 0.3s ease;
}
.shadowed-box:hover {
--shadow-offset-x: 10px;
}
ìŽ ê²œì° --shadow-offset-xë <length>ë¡ ë±ë¡ëê³ ìŽêž° ê°ì 0pxì
ëë€. box-shadow ìì±ì ê°ë¡ ì€íì
ì ìŽ ì¬ì©ì ì ì ìì±ì ì¬ì©í©ëë€. ë§ì°ì€ë¥Œ ê°ì žê°ë©Ž ì€íì
ìŽ 10pxë¡ ì ëë©ìŽì
ë©ëë€.
ìì 4: í
ë§ ì§ì ì ìí <custom-ident> ì¬ì©
<custom-ident> 구묞ì ì¬ì©í멎 믞늬 ì ìë 묞ììŽ ê° ì§í©ì ì ìíì¬ CSS ë³ìì ëí enumì íšê³Œì ìŒë¡ ë§ë€ ì ììµëë€. ìŽë í
ë§ ì§ì ëë ê°ë³ ìí륌 ì ìŽíë ë° ì ì©í©ëë€.
@property --theme {
syntax: '<custom-ident>';
inherits: true;
initial-value: light;
}
:root {
--theme: light; /* Default Theme */
}
body {
background-color: var(--theme) == light ? #fff : #333;
color: var(--theme) == light ? #000 : #fff;
}
.dark-theme {
--theme: dark;
}
ì¬êž°ìì --themeì <custom-ident> 구묞ìŒë¡ ë±ë¡ë©ëë€. @property ê·ì¹ ì첎ìì íì©ëë ìë³ì륌 ëª
ìì ìŒë¡ ëìŽíì§ë ìì§ë§ ìœëë lightì darkìì ì믞í©ëë€. ê·žë° ë€ì CSSë ì¡°ê±Žë¶ ë
ŒëЬ(var(--theme) == light ? ... : ...)륌 ì¬ì©íì¬ íì¬ í
ë§ì ë°ëŒ ë€ë¥ž ì€íìŒì ì ì©í©ëë€. íŽëì€ dark-themeì ììì ì¶ê°í멎 í
ë§ê° ìŽë¡ê² ì íë©ëë€. var()륌 ì¬ì©í ì¡°ê±Žë¶ ë
ŒëЬë íì€ CSSê° ìëë©° ì¢
ì¢
ì ì²ëŠ¬êž° ëë JavaScriptê° íìí©ëë€. ë íì€ì ìž ì ê·Œ ë°©ìì CSS íŽëì€ì ê³ëšì ì¬ì©íë ê²ì
ëë€.
@property --theme {
syntax: '<custom-ident>';
inherits: true;
initial-value: light;
}
:root {
--theme: light;
}
body {
background-color: #fff;
color: #000;
}
body[data-theme="dark"] {
background-color: #333;
color: #fff;
}
/* JavaScript to toggle the theme */
/* document.body.setAttribute('data-theme', 'dark'); */
ìŽ ìì ë ìì ììë body ììì data-theme í¹ì±ì ì¬ì©íì¬ í
ë§ë¥Œ ì ìŽí©ëë€. JavaScript(죌ì ì²ëЬëš)ë í¹ì±ì lightì dark ì¬ìŽìì ì ííë ë° ì¬ì©ë©ëë€. ìŽë CSS ë³ì륌 ì¬ì©í í
ë§ ì§ì ì ëí ëì± ê°ë ¥íê³ íì€ì ìž ì ê·Œ ë°©ìì
ëë€.
@property ì¬ì©ì ìŽì
@property륌 ì¬ì©í멎 ëª ê°ì§ ìŽì ìŽ ììµëë€.
- ìœë ê°ë ì± ë° ì ì§ êŽëŠ¬ì± í¥ì: ì¬ì©ì ì ì ìì±ì ëí ììëë ê°ì ì íì ëª ìì ìŒë¡ ì ìí멎 ìœë륌 ë ìŽíŽíêž° ìœê³ ì€ë¥ê° ë°ìíêž° ìœì§ ìëë¡ í ì ììµëë€.
- ì ëë©ìŽì
êž°ë¥ í¥ì:
@property륌 ì¬ì©í멎 ì¬ì©ì ì ì ìì±ì ëíŽ ë¶ëë¬ìŽ ì í곌 ì ëë©ìŽì ì ì¬ì©í ì ììŒë¯ë¡ ëì ìŽê³ ë§€ë ¥ì ìž ì¬ì©ì ìží°íìŽì€ë¥Œ ë§ë€ ì ìë ìë¡ìŽ ê°ë¥ì±ìŽ ìŽëŠœëë€. - ë ëì ì±ë¥: ëžëŒì°ì ë ë±ë¡ë ì¬ì©ì ì ì ìì±ì ì¬ì©íì¬ ììì ë ëë§ì ìµì ííì¬ ì±ë¥ì í¥ììí¬ ì ììµëë€.
- ì í ìì ì±: ëžëŒì°ì ë í ë¹ë ê°ìŽ ì ìžë 구묞곌 ìŒì¹íëì§ íìžíì¬ ìêž°ì¹ ìì ëìì ë°©ì§íê³ ëë²ê¹ ì ë ìœê² ë§ëëë€. ìŽë ë§ì ê°ë°ìê° ìœëë² ìŽì€ì êž°ì¬íë ëê·ëªš íë¡ì ížìì í¹í ì ì©í©ëë€.
- Ʞ볞ê°: ì¬ì©ì ì ì ìì±ìŽ ëª ìì ìŒë¡ ì€ì ëì§ ìì 겜ì°ìë íì ì íší ê°ì ê°ëë¡ íì¬ ì€ë¥ë¥Œ ë°©ì§íê³ CSSì ê²¬ê³ ì±ì í¥ììíµëë€.
ëžëŒì°ì ížíì±
2023ë
ë§ íì¬ @propertyë ìížíì§ë§ 볎ížì ìŽì§ ìì ëžëŒì°ì ì§ìì ì ê³µí©ëë€. Chrome, Firefox, Safari ë° Edge륌 ë¹ë¡¯í ëë¶ë¶ì ìµì ëžëŒì°ì ìì ì§ìë©ëë€. ê·žë¬ë ìŽì ëžëŒì°ì ë ì§ìíì§ ìì ì ììµëë€. íë¡ëì
ìì @property륌 ì¬ì©íêž° ì ì Can I use...ì ê°ì ì¹ì¬ìŽížìì ìµì ëžëŒì°ì ížíì± ì 볎륌 íì íìžíìžì.
ìŽì ëžëŒì°ì 륌 ì²ëЬíë €ë©Ž êž°ë¥ ì¿ŒëŠ¬(@supports)륌 ì¬ì©íì¬ ë첎 ì€íìŒì ì ê³µí ì ììµëë€.
@supports (--property: value) {
/* Styles that use @property */
}
@supports not (--property: value) {
/* Fallback styles for browsers that don't support @property */
}
--property ë° value륌 ì€ì ì¬ì©ì ì ì ìì± ë° íŽë¹ ê°ìŒë¡ ë°ê¿ëë€.
@property륌 ì¬ì©íŽìŒ íë 겜ì°
ë€ì곌 ê°ì ìë늬ì€ìì @property ì¬ì©ì ê³ ë €íìžì.
- ì¬ì©ì ì ì ìì±ì ì ëë©ìŽì
ì ì ì©íŽìŒ íë 겜ì°: ìŽë
@propertyì 죌ì ì¬ì© ì¬ë¡ì ëë€. ì¬ë°ë¥ž 구묞ìŒë¡ ìì±ì ë±ë¡í멎 ë¶ëë¬ìŽ ì ëë©ìŽì ìŽ ê°ë¥íŽì§ëë€. - ì¬ì©ì ì ì ìì±ì ëí ì í ìì ì±ì ì ì©íë €ë 겜ì°: ì¬ì©ì ì ì ìì±ìŽ íì í¹ì ì íì ê°ì ì ì§íëë¡ íë €ë©Ž
@property륌 ì¬ì©íì¬ ë±ë¡í©ëë€. - ì¬ì©ì ì ì ìì±ì ëí Ʞ볞ê°ì ì ê³µíë €ë 겜ì°:
initial-valueì€ëª ì륌 ì¬ì©í멎 ë첎 ê°ì ì§ì í ì ììµëë€. - ëê·ëªš íë¡ì ížìì:
@propertyë ìœë ì ì§ êŽëЬì±ì í¥ììí€ê³ ì€ë¥ë¥Œ ë°©ì§íë¯ë¡ ì¬ë¬ ê°ë°ìê° ìë ëê·ëªš íë¡ì ížì í¹í ì ì©í©ëë€. - ì¬ì¬ì© ê°ë¥í êµ¬ì± ìì ëë ëììž ìì€í
ì ë§ë€ ë:
@propertyë êµ¬ì± ìì ê°ì ìŒêŽì± ë° ììž¡ ê°ë¥ì±ì 볎ì¥íë ë° ëììŽ ë ì ììµëë€.
íŒíŽìŒ í ìŒë°ì ìž ì€ì
syntaxì€ëª ì륌 ììŽë²ëа 겜ì°:syntaxì€ëª ìê° ììŒë©Ž ëžëŒì°ì ë ììëë ê° ì íì ì ì ììŒë©° ì ëë©ìŽì ìŽ ì ëë¡ ìëíì§ ììµëë€.- ì못ë
syntaxê°ì ì¬ì©íë 겜ì°: ì못ë 구묞ì ì íí멎 ìêž°ì¹ ìì ëììŽ ë°ìí ì ììµëë€. ê°ì ìì ì íì ì ííê² ë°ìíë 구묞ì ì ííŽìŒ í©ëë€. initial-value륌 ì ê³µíì§ ìë 겜ì°: ìŽêž° ê°ìŽ ììŒë©Ž ì¬ì©ì ì ì ìì±ìŽ ì ìëì§ ìì ì€ë¥ê° ë°ìí ì ììµëë€. íì ì ì í Ʞ볞ê°ì ì ê³µíìžì.*륌 구묞ìŒë¡ 곌ëíê² ì¬ì©íë 겜ì°: ížëЬíì§ë§*륌 ì¬ì©í멎 ì í ê²ì¬ ë° ì ëë©ìŽì ì ìŽì ìŽ ë¬Žíšíë©ëë€. ì€ì ë¡ ëªšë ì íì ê°ì íì©íŽìŒ íë 겜ì°ìë§ ì¬ì©íìžì.- ëžëŒì°ì ížíì±ì 묎ìíë 겜ì°: íì ëžëŒì°ì ížíì±ì íìžíê³ ìŽì ëžëŒì°ì ì ëí ë첎 ì€íìŒì ì ê³µíìžì.
@property ë° CSS Houdini
@propertyë CSS HoudiniëŒê³ íë ë í° API ì§í©ì ìŒë¶ì
ëë€. Houdini륌 ì¬ì©í멎 ê°ë°ìê° ëžëŒì°ì ì ë ëë§ ìì§ì íì©íì¬ ì€íìŒ ì§ì ë° ë ìŽìì íë¡ìžì€ë¥Œ ì ë¡ ììŽ ì ìŽí ì ììµëë€. ë€ë¥ž Houdini APIë ë€ì곌 ê°ìµëë€.
- Paint API: ì¬ì©ì ì§ì 배겜 ìŽë¯žì§ì í ë늬륌 ì ìí ì ììµëë€.
- Animation Worklet API: ëžëŒì°ì ì 컎í¬ì§í° ì€ë ëìì ì§ì ì€íëë ê³ ì±ë¥ ì ëë©ìŽì ì ë§ëë ë°©ë²ì ì ê³µí©ëë€.
- Layout API: ì¬ì©ì ì§ì ë ìŽìì ìê³ ëŠ¬ìŠì ì ìí ì ììµëë€.
- Parser API: ëžëŒì°ì ì CSS íìì ëí ì¡ìžì€ë¥Œ ì ê³µí©ëë€.
@propertyë ë°°ì°êž° ë¹êµì ê°ëší Houdini APIìŽì§ë§ ë ë°ì ë Houdini êž°ë¥ì íìí ì ìë êž°í륌 ì ê³µí©ëë€.
ê²°ë¡
@propertyë ì¬ì©ì ì ì ìì±ì ëí ê³ êž êž°ë¥ì ì êž íŽì íë ê°ë ¥í CSS ê·ì¹ì
ëë€. ëžëŒì°ì ì ì¬ì©ì ì ì ìì±ì ë±ë¡í멎 ì í ìì ì±ì ì ì©íê³ ë¶ëë¬ìŽ ì ëë©ìŽì
ì íì±ííë©° CSS ìœëì ì ë°ì ìž ê²¬ê³ ì±ì í¥ììí¬ ì ììµëë€. ëžëŒì°ì ì§ììŽ ë³Žížì ìŽì§ë ìì§ë§ í¹í ëê·ëªš íë¡ì íž ë° ëììž ìì€í
ìì @property륌 ì¬ì©í멎 íë ì¹ ê°ë°ì ê·ì€í ëêµ¬ê° ë©ëë€. @property륌 íì©íì¬ CSS êž°ì ì í ëšê³ ë ë°ì ìí€ìžì!