æšå¹Žãç§ã¯
Smashing Magazineã«
Houdiniã«ã€ããŠã®
èšäºãæžã
ã ãèããããšã®ãªãæãçŽ æŽãããCSSãããžã§ã¯ãããšåŒã³ãŸããã ãã®èšäºã§ã¯ãHoudini APIã¹ã€ãŒãã䜿çšãããšãä»æ¥ã§ã¯äžå¯èœãªæ¹æ³ã§ããªãã£ã«ãä»ããŠCSSæ©èœãæ¡åŒµã§ããããšã説æããŸãã
ãã®èšäºã¯äžè¬ã«å¥œè©ã§ããããåã質åãæçŽãšTwitterã§ç§ã«çµ¶ããå°ããããŸããã 質åã®èŠç¹ïŒ
CSSããªãã£ã«ã®äœããããªã«è€éãªã®ã§ããïŒ ç§ã¯å€ãã®ããªãã£ã«CSSã䜿çšããŠããŸãããç§ã«ãšã£ãŠã¯ããŸãæ©èœããŸãã
ãããŠãç§ã¯æ°ä»ããŸãã-ãã¡ããã人ã
ã¯ãã®ãããªè³ªåãæã£ãŠããŸãã CSSããªãã£ã«ãèªåã§äœæããããšããªãå Žåã¯ããããããã®çã¿ãçµéšããããšã¯ãªãã§ãããã
ãããã£ãŠããã®è³ªåã«çããæè¯ã®æ¹æ³-ãããŠHoudiniãç§ãåã°ããçç±ã説æãã-ã¯ããªãCSSããªãã£ã«ã䜿çšããããšãããã»ã©é£ããã®ãã瀺ãããšã§ãã
ãããŠãããè¡ãæè¯ã®æ¹æ³ã¯ãããªãã£ã«ãèªåã§æžãããšã§ãã
泚ïŒãã®èšäºã¯ã2016幎12æ2æ¥ã«dotCSSã§èªãã
è¬çŸ©ã®ããã¹ãçã§ãã ãã®èšäºã§ã¯ããå°ã詳ãã説æããŸããããããªãèŠããå Žåã¯ããã«ãæ¿å
¥ããŸããã
ã©ã³ãã ããŒã¯ãŒã
ããªãã£ã«ãäœæããé¢æ°ã¯ãïŒJavaScriptã®
Math.random()
ããã«ïŒ
Math.random()
æ°å€ãè¿ãæ°ããïŒæ°ãããšä»®å®ããïŒããŒã¯ãŒã
random
ã§ãã
ã©ã³ãã ã®äœ¿çšäŸã次ã«ç€ºããŸãã
.foo { color: hsl(calc(random * 360), 50%, 50%); opacity: random; width: calc(random * 100%); }
ã芧ã®ãšããã
random
ã¯ç¡æ¬¡å
ã®æ°å€ãè¿ãããã
calc()
䜿çšããŠã»ãšãã©ãã¹ãŠã®å€ã«å€æã§ããŸãã ãŸããä»»æã®å€ãæã€ããšãã§ãããããä»»æã®ããããã£ïŒ
color
ã
opacity
ã
width
ãªã©ïŒã§é©çšã§ããŸãã
èšäºã®æ®ãã®éšåã§ã¯ãè¬çŸ©ã§ç€ºãã
ãã¢ããŒãžã䜿çšã
ãŸã ã ããã¯æ¬¡ã®ãããªãã®ã§ãã

random
ããŒã¯ãŒãã䜿çšãããµã€ãã®è¡šç€ºäŸããã¯ã4ã€ã®
.progress-bar
èŠçŽ ãã³ã³ãã³ãé åã®äžéšã«è¿œå ããããBootstrapã¹ã¿ãŒã¿ãŒãã³ãã¬ãŒãã®ãHello WorldãããŒã ããŒãžã§ãã
bootstrap.css
ã«å ããŠã次ã®ã«ãŒã«ãæã€å¥ã®CSSãã¡ã€ã«ãå«ãŸããŠããŸãã
.progress-bar { width: calc(random * 100%); }
é²è¡ç¶æ³ããŒã®å¹
ã®å€ã¯ãã¢ããŒãžã§æ確ã«ç€ºãããŠããŸãããã¢ã€ãã¢ã¯ãããŒãžãããŒãããããã³ã«ããªãã£ã«ã䜿çšããå Žåããããã®ã€ã³ãžã±ãŒã¿ãŒã¯ç°ãªãã©ã³ãã ãªå¹
ãæã€ããšã§ãã
ããªãã£ã«ã®ä»çµã¿
JavaScriptã§ã¯ãèšèªãéåžžã«åçã§ãããåã蟌ã¿ãªããžã§ã¯ãããªã¢ã«ã¿ã€ã ã§å€æŽã§ãããããããªãã£ã«ã®èšè¿°ã¯æ¯èŒçç°¡åã§ãã
ããšãã°ã
Math.random()
ãã
Math.random()
ãäœæããå Žåã¯ã次ã®ããã«èšè¿°ããŸãã
if (typeof Math.random != 'function') { Math.random = function() {
äžæ¹ãCSSã¯ããã»ã©åçã§ã¯ãããŸããã ïŒå°ãªããšãä»ã®ãšããïŒãã€ãã£ãã«ãµããŒããããŠããªãæ°ããé¢æ°ã«ã€ããŠãã©ãŠã¶ã«éç¥ãããããªæ¹æ³ã§ã©ã³ã¿ã€ã ãå€æŽããããšã¯äžå¯èœã§ãã
ã€ãŸãããã©ãŠã¶ãŒ
ããµããŒã
ããŠããªã CSSã®é¢æ°ã«ããªãã£ã«ãé©çšããã«ã¯ããã©ãŠã¶ãŒ
ããµããŒãããŠããCSSé¢æ°ã䜿çšããŠãCSSãåçã«å€æŽããŠé¢æ°ã®åäœãåœé ããå¿
èŠããã
ãŸã ã
ã€ãŸãããããæå¹ã«ããå¿
èŠããããŸãã
.foo { width: calc(random * 100%); }
ãã©ãŠã¶ã§ã®ã³ãŒãå®è¡äžã«ã©ã³ãã ã«çæããããããªãã®ã«ïŒ
.foo { width: calc(0.35746 * 100%); }
CSSã®å€æŽ
ããã§ãæ¢åã®CSSãå€æŽããããªãã£ã«é¢æ°ã®åäœãæš¡å£ããæ°ããã¹ã¿ã€ã«ã«ãŒã«ãè¿œå ããå¿
èŠãããããšãããããŸããã
ãã®ãããªã¢ã¯ã·ã§ã³ã®å¯èœæ§ã瀺åããæãèªç¶ãªå Žæã¯ã
document.styleSheets
ããå©çšå¯èœãªCSS Object ModelïŒCSSOMïŒã§ãã ã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
for (const stylesheet of document.styleSheets) { // Flatten nested rules (@media blocks, etc.) into a single array. const rules = [...stylesheet.rules].reduce((prev, next) => { return prev.concat(next.cssRules ? [...next.cssRules] : [next]); }, []); // Loop through each of the flattened rules and replace the // keyword `random` with a random number. for (const rule of rules) { for (const property of Object.keys(rule.style)) { const value = rule.style[property]; if (value.includes('random')) { rule.style[property] = value.replace('random', Math.random()); } } } }
泚ïŒãã®ããªãã£ã«ã§ã¯ãããŒã¯ãŒãïŒURLãããããã£åãããããã£å
ã®åŒçšããã¹ããªã©ïŒã ãã§ãªããããŸããŸãªåœ¢åŒã§ååšããå¯èœæ§ããããããåèª
random
æ€çŽ¢ãšçœ®æã®åçŽãªæ©èœã¯äœ¿çšããŸããã
content
ãªã©ïŒã ãã¢ã®æçµããŒãžã§ã³ã®å®éã®ã³ãŒãã¯ãããä¿¡é Œæ§ã®é«ã眮æã¡ã«ããºã ã䜿çšããŠããŸãããç°¡åã«ããããã«ãããã§ã¯ç°¡ç¥ããŒãžã§ã³ã䜿çšããŠããŸãã
ãã¢çªå·2ãããŠã³ããŒãããäžèšã®ã³ãŒããJavaScriptã³ã³ãœãŒã«ã«è²Œãä»ããŠå®è¡ãããšãå®éã«å®è¡ãããã¯ãã§ãããå®è¡åŸã¯ã©ã³ãã ãªå¹
ã®é²è¡ç¶æ³ã€ã³ãžã±ãŒã¿ãŒã¯è¡šç€ºãããŸããã
ãã®çç±ã¯ãCSSOMã«ã¯
random
ããŒã¯ãŒãã䜿çšããã«ãŒã«ã
ãªãããã§ãïŒ
ããããæ¢ã«ãåç¥ã®ãšããããã©ãŠã¶ãŒãç解ã§ããªãCSSã«ãŒã«ã«ééããå Žåããã©ãŠã¶ãŒã¯ãããåã«ç¡èŠããŸãã ã»ãšãã©ã®å Žåããã®æ¹æ³ã§ããŒãžãå£ãããšãªãå€ããã©ãŠã¶ãŒã«CSSãããŒãã§ãããããããã¯è¯ãããšã§ãã æ®å¿µãªãããããã¯ãå€æŽãããŠããªãå
ã®CSSã«ã¢ã¯ã»ã¹ããå¿
èŠãããå Žåã¯ãèªåã§ååŸããå¿
èŠãããããšãæå³ããŸãã
ããŒãžã¹ã¿ã€ã«ãæåã§æœåºãã
<style>
ãŸãã¯
<link rel="stylesheet">
èŠçŽ ã®ããããã䜿çšããŠCSSã«ãŒã«ãããŒãžã«è¿œå ã§ãããããå
ã®å€æŽãããŠããªãCSSãååŸããã«ã¯ãããã¥ã¡ã³ãã«
querySelectorAll()
ãé©çšãã
<style>
ã³ã³ãã³ããæåã§æœåºãããã
fetch()
ãé©çšããŠããã¹ãŠã®
<link rel="stylesheet">
ã¿ã°ã®ãªãœãŒã¹URLãååŸããŸãã
次ã®ã³ãŒãã¯ããã¹ãŠã®ããŒãžã¹ã¿ã€ã«ã®å®å
šãªCSSã³ãŒããè¿ã
getPageStyles
é¢æ°ãå®çŸ©ããŸãã
const getPageStyles = () => {
ãã¢çªå·3ãéããäžèšã®ã³ãŒããJavaScriptã³ã³ãœãŒã«ã«è²Œãä»ããŠ
getPageStyles()
é¢æ°ãèšå®ãããšã以äžã®ã³ãŒããå®è¡ããŠå®å
šãªCSSããã¹ããã°ãååŸã§ããŸãã
getPageStyles().then((cssText) => { console.log(cssText); });
æœåºãããã¹ã¿ã€ã«ã®è§£æ
å
ã®CSSããã¹ããååŸãããã解æããå¿
èŠããããŸãã
ãã©ãŠã¶ã«ãã§ã«ããŒãµãŒãçµã¿èŸŒãŸããŠããå Žåã¯ãäœããã®é¢æ°ãåŒã³åºããŠCSSã解æã§ãããšèãããããããŸããã æ®å¿µãªãããããã¯æ©èœããŸããã ãã©ãŠã¶ãŒã
parseCSS()
é¢æ°ãžã®ã¢ã¯ã»ã¹ãèš±å¯ãã
parseCSS()
ãããã©ãŠã¶ãŒã
random
ããŒã¯ãŒããç解ããªããšããäºå®ãåŠå®ããªãããããããã
parseCSS()
é¢æ°ã¯ããããåäœããŸããïŒå°æ¥ã®è§£æä»æ§ã§èš±å¯ãããããšãæåŸ
ããŠããŸãïŒæ¢åã®æ§æãšäºææ§ã®ãªããªãã¿ã®ãªãããŒã¯ãŒããåŠçããïŒã
ããã€ãã®åªãããªãŒãã³ãœãŒã¹CSSããŒãµãŒããããŸãããã®ãã¢ã®ç®çã®ããã«ã
PostCSSã䜿çšã
ãŸã ïŒãã©ãŠã¶ãŒãšããŠæ©èœããåŸã§åœ¹ç«ã€ãã©ã°ã€ã³ã·ã¹ãã ããµããŒãããããïŒã
次ã®CSSããã¹ãã§
postcss.parse()
ãå®è¡ããå ŽåïŒ
.progress-bar { width: calc(random * 100%); }
次ã®ããã«ãªããŸãïŒ
{ "type": "root", "nodes": [ { "type": "rule", "selector": ".progress-bar", "nodes": [ { "type": "decl", "prop": "width", "value": "calc(random * 100%)" } ] } ] }
ããã¯ã
Abstract Syntax Tree ïŒASDïŒãšåŒã°ãããã®ã§ãããç¬èªã®ããŒãžã§ã³ã®CSSOMãšããŠæ³åã§ããŸãã
ããã§ãCSSã®å
šæãååŸããããã®ãŠãŒãã£ãªãã£é¢æ°ãšãããã解æããããã®é¢æ°ãã§ããŸããã次ã«ãçŸæç¹ã§ã®ããªãã£ã«ã®å€èŠ³ã次ã«ç€ºããŸãã
import postcss from 'postcss'; import getPageStyles from './get-page-styles'; getPageStyles() .then((css) => postcss.parse(css)) .then((ast) => console.log(ast));
ãã¢çªå·4ãéããŠJavaScriptã³ã³ãœãŒã«ãèŠããšãããŒãžäžã®ãã¹ãŠã®ã¹ã¿ã€ã«ã®PostCSSã®å®å
šãªADCãå«ããªããžã§ã¯ããã°ã衚瀺ãããŸãã
ããªãã£ã«æ³šå
¥
ãããŸã§ã«å€ãã®ã³ãŒããäœæããŸãããããããããªãã£ã«ã®å®éã®æ©èœãšã¯ãŸã£ããç¡é¢ä¿ã§ããããšã¯é©ãã¹ãããšã§ãã ãã©ãŠã¶ãç§ãã¡ã®ããã«ãããªããã°ãªããªãã£ãå€ãã®ããšãæåã§è¡ãããã«å¿
èŠãªãã©ãããã©ãŒã ã§ããã
ããªãã£ã«ããžãã¯ã®å®éã®å®è£
ã«ã¯ã次ã®ãã®ãå¿
èŠã§ãã
- CSS SDAãå€æŽãã
random
ä¹±æ°ã«çœ®ãæããŸãã - å€æŽãããSDAãæåå圢åŒã§CSSã«è²Œãä»ããŸãã
- æ¢åã®ããŒãžã¹ã¿ã€ã«ãå€æŽãããã¹ã¿ã€ã«ã«çœ®ãæããŸãã
CSSæœè±¡æ§æããªãŒã®å€æŽ
PostCSSã«ã¯ãCSSæœè±¡æ§æããªãŒãå€æŽããå€ãã®ãã«ããŒé¢æ°ãåããåªãããã©ã°ã€ã³ã·ã¹ãã ãä»å±ããŠããŸãã ãããã®é¢æ°ã䜿çšããŠã
random
é¢æ°ã
random
ã«çœ®ãæããããšãã§ããŸãã
const randomKeywordPlugin = postcss.plugin('random-keyword', () => { return (css) => { css.walkRules((rule) => { rule.walkDecls((decl, i) => { if (decl.value.includes('random')) { decl.value = decl.value.replace('random', Math.random()); } }); }); }; });
SDAãæåå圢åŒã§CSSã«æ¿å
¥ããŸã
PostCSSãã©ã°ã€ã³ã䜿çšãããã1ã€ã®äŸ¿å©ãªæ©èœã¯ãASDãæåå圢åŒã§CSSã«æ¿å
¥ããããã®ããžãã¯ãæ¢ã«çµã¿èŸŒãŸããŠããããšã§ãã å¿
èŠãªã®ã¯ãPostCSSã€ã³ã¹ã¿ã³ã¹ãäœæãã䜿çšãããã©ã°ã€ã³ã«æž¡ãã
process()
ãå®è¡ããããšã§ããããã«ãããæåå圢åŒã®CSSã§ãªããžã§ã¯ããè¿ãããŸãã
postcss([randomKeywordPlugin]).process(css).then((result) => { console.log(result.css); });
ããŒãžã¹ã¿ã€ã«ã®çœ®æ
ããŒãžã¹ã¿ã€ã«ã眮ãæããããã«ããã¹ãŠã®
<style>
ããã³
<link rel="stylesheet">
èŠçŽ ãèŠã€ããŠ
getPageStyles()
ãããŠãŒãã£ãªãã£é¢æ°ïŒ
getPageStyles()
é¡äŒŒïŒã
getPageStyles()
ã§ããŸãã ãŸããæ°ãã
<style>
ãäœæããã¹ã¿ã€ã«ã³ã³ãã³ãããé¢æ°ã«æž¡ãããCSSããã¹ãã«èšå®ããŸãã
const replacePageStyles = (css) => {
ãã¹ãŠããŸãšãã
CSS CSSãå€æŽããããã®PostCSSãã©ã°ã€ã³ãšãããŒãžã¹ã¿ã€ã«ãæœåºããã³æŽæ°ããããã®2ã€ã®ãŠãŒãã£ãªãã£é¢æ°ãåããpolyfillã³ãŒãã¯ã次ã®ããã«ãªããŸãã
import postcss from 'postcss'; import getPageStyles from './get-page-styles'; import randomKeywordPlugin from './random-keyword-plugin'; import replacePageStyles from './replace-page-styles'; getPageStyles() .then((css) => postcss([randomKeywordPlugin]).process(css)) .then((result) => replacePageStyles(result.css));
ãã¢çªå·5ãéããšãå®éã®
ãã¢ãèŠãããšãã§ããŸãã ããŒãžãæ°åæŽæ°ããŠãæ¬åœã®å¶ç¶ãæããŠãã ããïŒ
...ããŒããæåŸ
éãã§ã¯ãããŸãããïŒ
äœãæªãã£ã
ãã©ã°ã€ã³ã¯æè¡çã«ã¯æ©èœããŸããã眮ææ©èœã«å¯Ÿå¿ããåèŠçŽ ã«åãã©ã³ãã å€ãæ¿å
¥ããŸãã
ç§ãã¡ãäœãããããèãããšãããã¯å®å
šã«è«ççã§ã-å¯äžã®ããããã£ãå¯äžã®ã«ãŒã«ã«çœ®ãæããŸããã
çå®ã¯ãæãåçŽãªããªãã£ã«CSSã§ãããåã
ã®ããããã£å€ã®æžãæã以äžã®ãã®ãå¿
èŠãšãããšããããšã§ãã ãããã®ã»ãšãã©ã¯ãDOMã®ç¥èã ãã§ãªããèŠä»¶ãæºããåã
ã®èŠçŽ ã®ç¹å®ã®è©³çŽ°ïŒãµã€ãºãå
容ãé åºãªã©ïŒãå¿
èŠãšããŸãã ãã®ããããã®åé¡ã®ããªããã»ããµãšãµãŒããŒãœãªã¥ãŒã·ã§ã³ã ãã§ã¯ååã§ã¯ãããŸããã
ããããéèŠãªè³ªåã¯
ãåã
ã®èŠçŽ ãèå¥ããããã«ããªãã£ã«ãã©ã®ããã«æŽæ°ãããã§ãã ã
åã
ã®é¢é£èŠçŽ ã®ç¹å®
ç§ã®çµéšã§ã¯ãåã
ã®DOMèŠçŽ ãå®çŸ©ããããã®3ã€ã®ãªãã·ã§ã³ããããŸããããããã¯ãã¹ãŠååã§ã¯ãããŸããã
ãªãã·ã§ã³ïŒ1ïŒã€ã³ã©ã€ã³ã¹ã¿ã€ã«
å®è·µã瀺ãããã«ãã»ãšãã©ã®å Žåãããªãã£ã«äœæè
ã¯ãCSSã«ãŒã«ã»ã¬ã¯ã¿ãŒã䜿çšããŠåã
ã®èŠçŽ ãå®çŸ©ããåé¡ã解決ããããŒãžäžã®é©åãªèŠçŽ ãèŠã€ããŠã€ã³ã©ã€ã³ã¹ã¿ã€ã«ãçŽæ¥é©çšããŸãã
ãã®ããã«ããŠPostCSSãã©ã°ã€ã³ãå€æŽããæ¹æ³ã¯æ¬¡ã®ãšããã§ãã
ãã¢çªå·6ã¯ããã®ã³ãŒãã®åäœã瀺ããŠããŸãã
æåã¯ããŸãåäœããããã«èŠããŸãããæ®å¿µãªããç°¡åã«ããã¯ããŠã³ã§ããŸãã CSSãæŽæ°ãã
.progress-bar
ã«ãŒã«ã®åŸã«å¥ã®ã«ãŒã«ãè¿œå ãããšã
.progress-bar
ã
.progress-bar { width: calc(random * 100%); } #some-container .progress-bar { width: auto; }
äžèšã®ã³ãŒãã¯ãããŒãžäžã®ãã¹ãŠã®èªã¿èŸŒã¿ã€ã³ãžã±ãŒã¿ãŒã®èŠçŽ ãã©ã³ãã ãªå¹
ãæã€å¿
èŠãããããšã宣èšããŠããŸãããã ããèå¥å
#some-container
æã€èŠçŽ ã«äŸåããèªã¿èŸŒã¿ã€ã³ãžã±ãŒã¿ãŒèŠçŽ ã¯é€ããŸãã ãã®å Žåãå¹
ã¯ã©ã³ãã ã«ã
ãªãã§ãã ããã
ãã¡ãããã€ã³ã©ã€ã³ã¹ã¿ã€ã«ãèŠçŽ ã«çŽæ¥é©çšãããããããã¯æ©èœããŸããã ãããã£ãŠããããã®ã¹ã¿ã€ã«ã¯ã
#some-container .progress-bar
å®çŸ©ãããŠããã¹ã¿ã€ã«ãããå
·äœçã§ãã
ããã¯ãããªãã£ã«ãCSSã®æäœã«é¢ããããã€ãã®åºæ¬çãªåææ¡ä»¶ãæºãããªãããšãæå³ããŸãïŒãããã£ãŠãå人çã«ã¯ããã®æ¹æ³ã¯åãå
¥ããããŸããïŒã
ãªãã·ã§ã³çªå·2ïŒã€ã³ã©ã€ã³ã¹ã¿ã€ã«
2çªç®ã®ãªãã·ã§ã³ã¯ãå®éã®ã¢ããªã±ãŒã·ã§ã³ã®å€ãã®å Žåãæåã®ãªãã·ã§ã³ãæ©èœããªãããšãåæãšããŠãããããç¶æ³ãä¿®æ£ããããšããŠããŸãã ç¹ã«ã2çªç®ã®ãªãã·ã§ã³ã§ã¯ã次ã®ããã«å®è£
ãæŽæ°ããŸãã
- CSSã®æ®ãã®éšåã§é©åãªã«ãŒã«ã確èªããrandomããŒã¯ãŒããä¹±æ°ã«çœ®ãæããŠããããæåŸã®äžèŽã«ãŒã«ã§ããå Žåã«ã®ã¿ããããã®å®£èšãã€ã³ã©ã€ã³ã¹ã¿ã€ã«ãšããŠé©çšããŸãã
- åŸ
ã£ãŠãã ãããããã¯æ©èœããŸããããªããªããç¹ç°æ§ãèæ
®ããå¿
èŠããããããèšç®ã®ããã«åã»ã¬ã¯ã¿ãŒãæåã§è§£æããå¿
èŠãããããã§ãã 次ã«ã察å¿ããã«ãŒã«ãç¹ç°æ§ã®æé ã§ãœãŒãããæãå
·äœçãªã»ã¬ã¯ã¿ãŒããã®ã¿å®£èšãé©çšã§ããŸãã
- ããã
@media
èŠçŽ ãããã®ã§ãããã§ãã³ã³ãã©ã€ã¢ã³ã¹ãæåã§ç¢ºèªããå¿
èŠããããŸãã
- ãããŠãã«ãŒã«ã®éåãã€ãŸã
@supports
ã«ã€ããŠè©±ãå Žåããããå¿ããªãã§ãããã
- æåŸã«ãããããã£ã®ç¶æ¿ãèæ
®ããå¿
èŠããããŸãããããã£ãŠãåèŠçŽ ã«ã€ããŠãDOMããªãŒã調ã¹ãŠãã¹ãŠã®èŠªèŠçŽ ããã§ãã¯ããèšç®ãããããããã£ã®å®å
šãªã»ãããååŸããå¿
èŠããããŸãã
- ãããç³ãèš³ãããŸãããããã1ã€ãã«ãŒã«ããšã§ã¯ãªãããããã£ããšã«èšç®ããã
!important
宣èšãèæ
®ããå¿
èŠããããŸãã ãããã£ãŠãæçµçã«ã©ã®å®£èšãåã€ããç¥ãããã«ã圌ãã®ããã«å¥ã®ã«ãŒããä¿æããå¿
èŠããããŸãã
ã¯ããç解ã§ããªãå Žåã¯ãã«ã¹ã±ãŒãã®å®è£
ã«ã€ããŠèª¬æããŸãããããã®å®è£
ã«ã¯ãã©ãŠã¶ãžã®äŸåãå«ãŸããŸãã
JavaScriptã§ãã®ãããªã«ã¹ã±ãŒã
ãåå®è£
ããããšã¯ç¢ºãã«
å¯èœã§ãããããã§ã¯å€ãã®äœæ¥ãè¡ãããã®ã§ããªãã·ã§ã³çªå·3ã®å
容ãå¿
ã確èªããŸãã
ãªãã·ã§ã³ïŒ3ïŒã«ã¹ã±ãŒãã®é åºãç¶æããªãããCSSãæžãæããŠåã
ã®äžèŽããèŠçŽ ãå®çŸ©ãã
3çªç®ã®ãªãã·ã§ã³-ç§ã¯ææªã®äžã§æé«ã ãšæã-ã¯ãCSSãæžãçŽããå€ãã®èŠçŽ ã«äžèŽãã1ã€ã®ã»ã¬ã¯ã¿ãŒã§ã«ãŒã«ãè€æ°ã®ã«ãŒã«ã«å€æããããšã§ããããããã®ã«ãŒã«ã¯ãèŠçŽ ã®æçµã»ãããå€æŽããã«ã1ã€ã®èŠçŽ ã®ã¿ã«å¯Ÿå¿ããŸãã
æåŸã®æã¯å®å
šã«æå³ããªãããã«èŠããã®ã§ãäŸãæããŠèª¬æããŸãã ããŒãžã«å«ãŸãã3ã€ã®æ®µèœèŠçŽ ãå«ãCSSãã¡ã€ã«ãèããŸãã
* { box-sizing: border-box; } p { opacity: random; } .foo { opacity: initial; }
DOMã®å段èœã«äžæã®ããŒã¿å±æ§ãè¿œå ããå ŽåãCSSã次ã®ããã«æžãæããŠãç¬èªã®åå¥ã®ã«ãŒã«ã§å段èœãå®çŸ©ã§ããŸãã
* { box-sizing: border-box; } p[data-pid="1"] { opacity: .23421; } p[data-pid="2"] { opacity: .82305; } p[data-pid="3"] { opacity: .31178; } .foo { opacity: initial; }
ãã¡ãããæ°ä»ããå Žåããã®ãªãã·ã§ã³ã¯ãããã®ã»ã¬ã¯ã¿ã®ç¹ç°æ§ã«åœ±é¿ããæå³ããªãå¯äœçšã«ã€ãªããå¯èœæ§ãé«ããããäŸç¶ãšããŠããŸãæ©èœããŸããã
ãã ã ããã®ãããªã¹ããŒãããã¯ã䜿çšããŠãããŒãžäžã®
ä»ã®
ãã¹ãŠã®ã»ã¬ã¯ã¿ãŒã®ç¹ç°æ§ãåãéã ãå¢ããããšã«ãããæ£ããã«ã¹ã±ãŒãé åºãç¶æãããããã«ããããšãã§ããŸãã
*â:not(.z) { box-sizing: border-box; } p[data-pid="1"] { opacity: .23421; } p[data-pid="2"] { opacity: .82305; } p[data-pid="3"] { opacity: .31178; } .foo:not(.z) { opacity: initial; }
äžèšã®å€æŽã¯ãæ¬äŒŒã¯ã©ã¹ã®æ©èœã»ã¬ã¯ã¿ãŒ
:not()
ãé©çšããDOMã«ã¯çµ¶å¯Ÿã«ãªãã¯ã©ã¹ã®ååãæž¡ããŸãïŒãã®å Žåã
.z;
ãéžæã
.z;
ãããã£ãŠãDOMã§
.z;
ã¯ã©ã¹ã䜿çšããå Žåã¯ãå¥ã®ååãéžæããå¿
èŠããããŸãïŒã ãããŠ
:not()
ã¯ååšããªãèŠçŽ ã«åžžã«å¯Ÿå¿ããããã察å¿ãå€æŽããã«ã»ã¬ã¯ã¿ã®ç¹ç°æ§ãé«ããããã«äœ¿çšã§ããŸãã
ãã¢çªå·7ã¯ããã®ãããªæŠç¥ãå®è£
ããçµæã瀺ããŠããŸãã
ãã¢ã®ãœãŒã¹ã³ãŒãã調ã¹ãŠã
random-keyword
ãã©ã°ã€ã³ã®ãã¹ãŠã®å€æŽã調ã¹ãããšãã§ããŸãã
3çªç®ã®ãªãã·ã§ã³ã®æ倧ã®å©ç¹ã¯ããã©ãŠã¶ãã«ã¹ã±ãŒããåŠçãç¶ããããšã§ããããã©ãŠã¶ã¯æ¬åœã«åªããŠããŸãã ããã¯ãã¡ãã£ã¢ã¯ãšãªã䜿çšã§ããããšãæå³ããŸã
@support
宣èšãéæšæºã®ããããã£ã
@support
ã«ãŒã«ããŸãã¯ä»»æã®CSSé¢æ°ãããã³ãã¹ãŠãæ£åžžã«æ©èœããŸãã
çæ
3çªç®ã®æ¹æ³ã§ãCSSããªãã£ã«ã®ãã¹ãŠã®åé¡ã解決ããããã«æãããããããŸããããããã¯çå®ãšã¯ã»ã©é ããã®ã§ãã ãŸã å€ãã®åé¡ãããããã®ãã¡ã®ããã€ãã¯è§£æ±ºã§ããŸãïŒå€ãã®äœåãªæéãè²»ãããŸãïŒããä»ã®åé¡ã¯äžå¯èœã§ãããããé¿ããããŸããã
æªè§£æ±ºã®åé¡
ãŸããããŒãžã«ååšããå¯èœæ§ã®ããCSSã®äžéšãæå³çã«ç¡èŠããŸãããã
<style>
ããã³
<link rel="stylesheet">
ã¿ã°ã®DOMãªã¯ãšã¹ãã«ã¯äœ¿çšã§ããŸããã
- ã€ã³ã©ã€ã³ã¹ã¿ã€ã«
- ã·ã£ããŠããã¥ã¡ã³ãã¢ãã«ïŒã·ã£ããŠDOMïŒ
ãããã®ã±ãŒã¹ã®ããªãã£ã«ãæŽæ°
ã§ããŸãããããã«ã¯å€ãã®è¿œå äœæ¥ãå¿
èŠã«ãªãããããã®èšäºã§ã¯èª¬æããŸããã
ãŸããDOMãå€æŽããããšãã«äœãèµ·ãããã«ã€ããŠãèæ
®ããŸããã§ããã æåŸã«ãDOMã®æ§é ã«åŸã£ãŠCSSãæžãæããŸãã ããã¯ãDOMãå€æŽããããã³ã«æžãæããå¿
èŠãããããšãæå³ããŸãã
é¿ããããªãåé¡
äžèšã®åé¡ïŒé£ããã解決ã§ããïŒã«å ããŠãåé¿ã§ããªãåé¡ãããã€ããããŸãã
- èšå€§ãªéã®è¿œå ã³ãŒããå¿
èŠã§ãã
- ãã®ã¡ãœããã¯ãã¯ãã¹ãªãªãžã³ã¹ã¿ã€ã«ã·ãŒãïŒCORS以å€ïŒã§ã¯æ©èœããŸããã
- ããªãã£ã«ã¯ãå€æŽãå¿
èŠãªå ŽåïŒDOMã®å€æŽãã¹ã¯ããŒã«/ãµã€ãºå€æŽãã³ãã©ãŒãªã©ïŒã«ã²ã©ãæ©èœããŸãã
random
ããŒã¯ãŒãã®ããªãã£ã«ã¯ãããªãåçŽãªäŸã§ãã ãããã
position: sticky
ãããªããªãã£ã«ãç°¡åã«æ³åã§ãããšç¢ºä¿¡ããŠããŸãããŠãŒã¶ãŒãããŒãžãã¹ã¯ããŒã«ãããã³ã«ãããã§èª¬æãããã¹ãŠã®ããžãã¯ãåèµ·åããå¿
èŠããããŸãã
æ¹åã®æ©äŒ
ïŒéãããæéã®ããã«ïŒè¬çŸ©ã§ã¹ããããã1ã€ã®è§£æ±ºçã¯ãäžèšã®3ã€ã®åé¡ã®æåã®2ã€ã軜æžããå¯èœæ§ããããŸãã ããã¯ããã«ããã§ãŒãºäžã«ãµãŒããŒåŽã§CSSã解æããã³ååŸããŸãã
次ã«ãã¹ã¿ã€ã«ãæã€CSSãã¡ã€ã«ãããŒããã代ããã«ãSDAãå«ãJavaScriptãã¡ã€ã«ãããŒãããŸãã 次ã«ãæåã«è¡ãããšã¯ãADSãæååãã¥ãŒã«å€æããããŒãžã«ã¹ã¿ã€ã«ãè¿œå ããããšã§ãã ãŠãŒã¶ãŒãJavaScriptãç¡å¹ã«ããŠããå Žåãå
ã®CSSãã¡ã€ã«ãåç
§ãã
<noscript>
å«ããããšãã§ããŸãã
ããšãã°ãããã®ä»£ããã«ïŒ
<link ref="stylesheet" href="styles.css">
ããããããŸãïŒ
<script src="styles.css.js"></script> <noscript><link ref="stylesheet" href="styles.css"></noscript>
åè¿°ããããã«ãããã«ãããå®å
šãªCSSããŒãµãŒãJavaScriptãã³ãã«ã«å«ããå¿
èŠããããšããåé¡ã解決ãããäºåã«CSS解æãå¯èœã«ãªããŸããããã¹ãŠã®ããã©ãŒãã³ã¹ã®åé¡ã解決ãããããã§ã¯ãããŸããã
ãã ãããããã«ããŠããå€æŽãå¿
èŠã«ãªã£ããããã«CSSãæžãæããå¿
èŠããããŸãã
ããã©ãŒãã³ã¹ãžã®åœ±é¿ãç解ãã
ããªãã£ã«ã®ããã©ãŒãã³ã¹ãéåžžã«äœãçç±ãç解ããã«ã¯ããã©ãŠã¶ãŒã®ã¬ã³ããªã³ã°ãã€ãã©ã€ã³ãç¹ã«éçºè
ãšããŠã¢ã¯ã»ã¹ã§ããã¬ã³ããªã³ã°æé ãç解ããå¿
èŠããããŸãã
ãã©ãŠã¶ãŒã®ã¬ã³ããªã³ã°ãã€ãã©ã€ã³ãžã®JavaScriptã¢ã¯ã»ã¹ã芧ã®ãšãããå¯äžã®å®éã®ãšã³ããªãã€ã³ãã¯DOM <style>
ã§ãããããããã©ãŠã¶ãŒã®ã¬ã³ããªã³ã°ãã€ãã©ã€ã³ãžã®JavaScriptã¢ã¯ã»ã¹ã®çŸåšã®ã¡ã«ããºã ãèæ
®ãããšããããããªãã£ã«ã®éžææ¹æ³ã§ãã
ãã©ãŠã¶ã¬ã³ããªã³ã°ãã€ãã©ã€ã³ãžã®ããªãã£ã«ãšã³ããªãã€ã³ãã芧ã®ãšãããJavaScriptã¯DOMãäœæããåŸãå
ã®ã¬ã³ããªã³ã°ãã€ãã©ã€ã³ã劚ããããšãã§ããªããããããªãã£ã«ã«ãã£ãŠå ããããå€æŽã«ããã¬ã³ããªã³ã°ããã»ã¹ãåã³éå§ãããŸããããã¯ããã¹ãŠã®æŽæ°ãåŸç¶ã®ã¬ã³ããªã³ã°ã«ããããã£ãŠåŸç¶ã®ãã¬ãŒã ã«ã€ãªãããããCSSããªãã£ã«ã¯60 fpsã§ã¯æ©èœããŸããããŸãšã
ãã®èšäºãããCSSã§ããªãã£ã«ãäœæããããšã¯ç¹ã«é£ããããšãç解ããŠãã ãããéçºè
ãšããŠã®ç§ãã¡ã®ä»äºã¯ãã¹ãŠãçŸä»£ã®Webã®ã¹ã¿ã€ã«ãšã¬ã€ã¢ãŠãã®å¶éãåé¿ããããšã§ãã以äžã¯ãããªãã£ã«ãåç¬ã§è¡ãã¹ãããšã®ãªã¹ãã§ã-ãããã¯ãã©ãŠã¶ãæ¢ã«è¡ãããšã§ãããéçºè
ãšããŠãããã®æ©èœã«ã¢ã¯ã»ã¹ããããšã¯ã§ããŸããã- CSSãã§ãã
- CSS解æ
- CSSOMã®äœæ
- ã«ã¹ã±ãŒãåŠç
- ã¹ã¿ã€ã«ã®ç¡å¹å
- ã¹ã¿ã€ã«ã®åæ€èšŒ
ãããŠããããããHoudiniã§ç§ãåã°ããŠããããšã§ããHoudiniãœãããŠã§ã¢ã€ã³ã¿ãŒãã§ãŒã¹ããªããã°ãéçºè
ã¯ãããã³ã°ãåé¿çã«é Œããªããã°ãªãããããã©ãŒãã³ã¹ãšãŠãŒã¶ãŒã®å©äŸ¿æ§ãäœäžããŸãããããŠããã¯ãããªãã£ã©ã¹ãå¿
ã次ã®ããããã«ãªãããšãæå³ããŸãã- 倧ãããã
- é
ããã
- ééã£ãŠãã
æ®å¿µãªããã3ã€ã®æ¬ ç¹ãã¹ãŠãåãé€ãããšã¯ã§ããŸãããç§ã¯éžæããªããã°ãªããŸãããäœã¬ãã«ã®ã¹ã¿ã€ãªã³ã°ããªããã£ãããªããã°ãã€ãããŒã·ã§ã³ã¯æãé
ããã©ãŠã¶ãŒã®é床ã§åããŸããJavaScriptéçºè
ã¯ãã€ãããŒã·ã§ã³ã®é床ã«ã€ããŠäžæºãè¿°ã¹ãŠããŸããããããCSSã§ãããèãããšã¯æ±ºããŠãªãã§ãããããŸããäžéšã¯èšäºã«èšèŒãããŠããå¶éã«ãããã®ã§ããç§ãã¡ã¯ãããå€ããå¿
èŠããããšæããŸãã#makecssfatigueathingãå¿
èŠã ãšæããŸãã