calc()ãmin()ãmax()ãclamp()ãround()ãmod()ãrem()ãhypot()ãªã©ã®CSSæ°åŠé¢æ°ã®åãæ¢ããã¬ã¹ãã³ã·ãã§åçããã€èŠèŠçã«é åçãªWebãã¶ã€ã³ãäœæããŸããã¢ãã³Webéçºã®ããã®å®è·µçãªå¿çšãšé«åºŠãªãã¯ããã¯ãåŠã³ãŸãããã
CSSæ°åŠé¢æ°ïŒåçãã¶ã€ã³ãå®çŸããé«åºŠãªèšç®æ©èœ
CSSã¯ãåçŽãªã¹ã¿ã€ãªã³ã°ã«ãŒã«ãã¯ããã«è¶
ããŠé²åããŸãããçŸä»£ã®CSSã¯ãéçºè
ã«ããŸããŸãªæ°åŠé¢æ°ãéããé«åºŠãªèšç®æ©èœãæäŸããŸãããããã®é¢æ°ã«ã¯ãcalc()
ãmin()
ãmax()
ãclamp()
ãround()
ãmod()
ãrem()
ãhypot()
ãªã©ããããã¬ã¹ãã³ã·ãã§åçããã€èŠèŠçã«èª¬åŸåã®ãããŠã§ããã¶ã€ã³ã®äœæãå¯èœã«ããŸãããã®å
æ¬çãªã¬ã€ãã§ã¯ããããã®é¢æ°ãæ¢æ±ãããããžã§ã¯ãã§ãã®åãæŽ»çšããããã®å®è·µçãªäŸãšé«åºŠãªãã¯ããã¯ãæäŸããŸãã
ãªãCSSæ°åŠé¢æ°ã䜿çšããã®ãïŒ
åŸæ¥ã®CSSã¯ãç°ãªãç»é¢ãµã€ãºããŠãŒã¶ãŒã€ã³ã¿ã©ã¯ã·ã§ã³ã«é©å¿ããããã«ãåºå®å€ãäºåå®çŸ©ãããã¡ãã£ã¢ã¯ãšãªã«äŸåããããšããããããŸãããCSSæ°åŠé¢æ°ã¯ãããæè»ã§åçãªã¢ãããŒããæäŸãã以äžã®ããšãå¯èœã«ããŸãïŒ
- çã«ã¬ã¹ãã³ã·ããªã¬ã€ã¢ãŠããäœæïŒ ãã¥ãŒããŒãã®å¯žæ³ããã®ä»ã®èŠå ã«åºã¥ããŠãèŠçŽ ã®ãµã€ãºãäœçœ®ãééãåçã«èª¿æŽããŸãã
- ãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã®åäžïŒ ãŠãŒã¶ãŒã®å¥œã¿ãããã€ã¹ã®èœåã«åãããŠUIèŠçŽ ãé©å¿ãããŸãã
- è€éãªèšç®ã®ç°¡çŽ åïŒ CSSå ã§çŽæ¥èšç®ãå®è¡ããå€ãã®å Žåã§JavaScriptã®å¿ èŠæ§ãæé€ããŸãã
- ã³ãŒãã®ä¿å®æ§ã®åäžïŒ èšç®ãCSSã«éçŽããããšã§ãã³ãŒãã®çè§£ãšä¿®æ£ã容æã«ãªããŸãã
äž»èŠãªæ°åŠé¢æ°
1. calc()
ïŒCSSèšç®ã®åºç€
calc()
颿°ã䜿çšãããšãCSSå
ã§çŽæ¥ãåºæ¬çãªç®è¡æŒç®ïŒå ç®ãæžç®ãä¹ç®ãé€ç®ïŒãå®è¡ã§ããŸããããã¯CSSæ°åŠé¢æ°ã®åºç€ã§ãããå¹
åºãåçãªã¹ã¿ã€ãªã³ã°ã®å¯èœæ§ãå¯èœã«ããŸãã
æ§æïŒ
property: calc(expression);
äŸïŒåºå®ããŒãžã³ãæã€å šå¹ èŠçŽ ã®äœæ
äž¡åŽã«åºå®ããŒãžã³ãæã€å
šå¹
ã®èŠçŽ ãäœæããããšããŸããcalc()
ã䜿çšãããšããããç°¡åã«å®çŸã§ããŸãïŒ
.element {
width: calc(100% - 40px); /* 20px margin on each side */
margin: 0 20px;
}
ãã®ã³ãŒãã¯ã芪ã³ã³ããã®å šå¹ ãã40ãã¯ã»ã«ïŒäž¡åŽã«20pxã®ããŒãžã³ïŒãåŒãããšã§èŠçŽ ã®å¹ ãèšç®ããŸããããã«ãããèŠçŽ ã¯åžžã«å©çšå¯èœãªã¹ããŒã¹ãåãã€ã€ãåžæã®ããŒãžã³ãç¶æããŸãã
äŸïŒãã¥ãŒããŒãå¹ ã«åºã¥ãåçãªãã©ã³ããµã€ãº
ãŸããcalc()
ã䜿çšããŠããã¥ãŒããŒãå¹
ã«å¿ããŠã¹ã±ãŒã«ããåçãªãã©ã³ããµã€ãºãäœæããããšãã§ããŸããããã«ãããç°ãªãç»é¢ãµã€ãºã§ããå¿«é©ãªèªæžäœéšãæäŸãããŸãïŒ
body {
font-size: calc(16px + (24 - 16) * ((100vw - 400px) / (1200 - 400)));
}
ãã®ã³ãŒãã¯ããã¥ãŒããŒãå¹
ïŒ100vw
ïŒã«åºã¥ããŠãã©ã³ããµã€ãºãèšç®ããŸãããã©ã³ããµã€ãºã¯ã16pxïŒãã¥ãŒããŒãå¹
400pxæïŒãã24pxïŒãã¥ãŒããŒãå¹
1200pxæïŒã®ç¯å²ã§ããã®éã¯ç·åœ¢ã«ã¹ã±ãŒã«ããŸãããã®ãã¯ããã¯ã¯ããã°ãã°æµåçãªã¿ã€ãã°ã©ãã£ïŒfluid typographyïŒãšåŒã°ããŸãã
2. min()
ãš max()
ïŒäžéãšäžéã®èšå®
min()
颿°ãšmax()
颿°ã䜿çšãããšãCSSããããã£ã®æå°å€ãŸãã¯æå€§å€ãæå®ã§ããŸãããããã®é¢æ°ã¯ãç»é¢ãµã€ãºã倧ãããããå°ãããããããããšãªããããŸããŸãªç»é¢ãµã€ãºã«é©å¿ããã¬ã¹ãã³ã·ããã¶ã€ã³ãäœæããã®ã«ç¹ã«åœ¹ç«ã¡ãŸãã
æ§æïŒ
property: min(value1, value2, ...);
property: max(value1, value2, ...);
äŸïŒç»åã®å¹ ãå¶éãã
ç»åãèªç¶ãªãµã€ãºã§è¡šç€ºããããã倧ããªç»é¢ã§å¹
ãåºããªããããã®ãé²ããããšããŸããmax()
ã䜿çšããŠãã®å¹
ãå¶éã§ããŸãïŒ
img {
width: max(300px, 100%);
}
ãã®ã³ãŒãã¯ãç»åã®å¹ ã300pxãŸãã¯100%ã®å€§ããæ¹ã«èšå®ããŸããã€ãŸããç»åã300pxããå°ããå Žåã¯300pxã§è¡šç€ºãããŸããç»åã300pxãã倧ãããã³ã³ããã®å¹ ããå°ããå Žåã¯ãèªç¶ãªãµã€ãºã§è¡šç€ºãããŸããç»åãã³ã³ããã®å¹ ãã倧ããå Žåã¯ãã³ã³ããå ã«åãŸãããã«çž®å°ãããŸãã
äŸïŒæå°ãã©ã³ããµã€ãºã確ä¿ãã
åæ§ã«ãmin()
ã䜿çšããŠãã©ã³ããµã€ãºãç¹å®ã®ãããå€ãäžåããªãããã«ããå°ããªç»é¢ã§ã®å¯èªæ§ãåäžãããããšãã§ããŸãïŒ
p {
font-size: min(16px, 4vw);
}
ãã®ã³ãŒãã¯ã段èœã®ãã©ã³ããµã€ãºã16pxãŸãã¯4vwïŒãã¥ãŒããŒãå¹ ã®4%ïŒã®å°ããæ¹ã«èšå®ããŸããããã«ãããéåžžã«å°ããªç»é¢ã§ããã©ã³ããµã€ãºã¯åžžã«å°ãªããšã16pxã«ãªããŸãã
3. clamp()
ïŒå€ãç¯å²å
ã«å¶çŽãã
clamp()
颿°ã¯ãmin()
ãšmax()
ã®æ©èœãçµã¿åãããCSSããããã£ã®æå°å€ãæšå¥šå€ãæå€§å€ãæå®ã§ããŸããããã¯ãå®çŸ©æžã¿ã®å¢çå
ã«çãŸããªãããããŸããŸãªç»é¢ãµã€ãºã«ã¹ã ãŒãºã«é©å¿ããæµåçãªãã¶ã€ã³ãäœæããã®ã«éåžžã«äŸ¿å©ã§ãã
æ§æïŒ
property: clamp(min, preferred, max);
äŸïŒå¢çä»ãã®æµåçãªãã©ã³ããµã€ãº
calc()
ã»ã¯ã·ã§ã³ã®åçãªãã©ã³ããµã€ãºã®äŸãããäžåºŠèŠãŠã¿ãŸããããclamp()
ã䜿çšãããšãã³ãŒããç°¡çŽ åããããèªã¿ãããããããšãã§ããŸãïŒ
body {
font-size: clamp(16px, calc(16px + (24 - 16) * ((100vw - 400px) / (1200 - 400))), 24px);
}
ãã®ã³ãŒãã¯åã®äŸãšåã广ãå®çŸããŸãããããç°¡æœã§çè§£ãããããªã£ãŠããŸããclamp()
颿°ã¯ããã©ã³ããµã€ãºãåžžã«16pxãš24pxã®éã«ããããšãä¿èšŒãããã¥ãŒããŒãå¹
ã400pxãã1200pxã®éã§ç·åœ¢ã«ã¹ã±ãŒã«ããŸãã
äŸïŒã³ã³ãã³ããããã¯ã®å¹ ãå¶éãã
clamp()
ã䜿çšããŠãå¿«é©ãªèªæžå¹
ãç¶æããªãããããŸããŸãªç»é¢ãµã€ãºã«é©å¿ããã³ã³ãã³ããããã¯ãäœæã§ããŸãïŒ
.content {
width: clamp(300px, 80%, 800px);
margin: 0 auto;
}
ãã®ã³ãŒãã¯ã.content
èŠçŽ ã®å¹
ã300pxãã800pxã®éã®å€ã«èšå®ããæšå¥šå¹
ããã¥ãŒããŒãã®80%ãšããŸããããã«ãããã³ã³ãã³ãã¯å€§å°ã©ã¡ãã®ç»é¢ã§ãåžžã«èªã¿ããããå¹
ãçããããåºããããããã®ãé²ããŸãã
4. round()
ïŒå€ãç¹å®ã®åºåãã«äžžãã
round()
颿°ã¯ãäžããããå€ãå¥ã®å€ã®æãè¿ãåæ°ã«äžžããŸããããã¯ãç¹ã«å°æ°å€ãæ±ãéã«ããã¶ã€ã³å
šäœã§äžè²«ããééãšé
眮ãäœæããã®ã«åœ¹ç«ã¡ãŸãã
æ§æïŒ
round(rounding-strategy, value);
ããã§ãrounding-strategy
ã¯ä»¥äžã®ããããã§ãïŒ
nearest
ïŒæãè¿ãæŽæ°ã«äžžããŸããup
ïŒæ£ã®ç¡é倧æ¹åã«äžžããŸããdown
ïŒè² ã®ç¡é倧æ¹åã«äžžããŸãã
äŸïŒããŒãžã³ã8ã®åæ°ã«äžžãã
ãã¶ã€ã³å šäœã§äžè²«ããééã確ä¿ããããã«ãããŒãžã³ã8ãã¯ã»ã«ã®åæ°ã«äžžãããå ŽåããããŸãïŒ
.element {
margin: round(nearest, 10px / 8) * 8;
}
ãã®ã³ãŒãã¯ã10pxã8ã§å²ããçµæãæãè¿ãæŽæ°ã«äžžãããã®åŸ8ãæããããšã§ããŒãžã³ãèšç®ããŸããããã«ãããããŒãžã³ã¯åžžã«8ãã¯ã»ã«ã®åæ°ã«ãªããŸãïŒãã®å Žåã¯8pxïŒã
5. mod()
ïŒCSSã®å°äœæŒç®å
mod()
颿°ã¯ã2ã€ã®å€ã®å°äœïŒé€ç®ã®äœãïŒãè¿ããŸããããã¯ãç¹°ãè¿ããã¿ãŒã³ãã¢ãã¡ãŒã·ã§ã³ãäœæããã®ã«åœ¹ç«ã¡ãŸãã
æ§æïŒ
property: mod(dividend, divisor);
äŸïŒã¹ãã©ã€ãèæ¯ã®äœæ
mod()
ã䜿çšããŠãã¹ãã©ã€ãã®èæ¯ãã¿ãŒã³ãäœæã§ããŸãïŒ
.element {
background-image: linear-gradient(
to right,
rgba(0, 0, 0, 0.1) 50%,
transparent 0
);
background-size: calc(mod(100%, 20px)) 100%;
}
ãã®ã³ãŒãã¯ã20ãã¯ã»ã«ããšã«ç¹°ãè¿ãã¹ãã©ã€ãã®èæ¯ãäœæããŸããmod()
颿°ã¯ãèŠçŽ ã®å¹
ã«é¢ä¿ãªããã¹ãã©ã€ããåžžã«èŠçŽ ã®å
é ããå§ãŸãããšãä¿èšŒããŸãã
6. rem()
ïŒCSSã®å°äœé¢æ°
rem()
颿°ã¯ãé€ç®ã®äœããè¿ããŸããããã¯mod()
ã«äŒŒãŠããŸãããè¢«é€æ°ã®ç¬Šå·ãä¿æããŸãã
æ§æïŒ
property: rem(dividend, divisor);
7. hypot()
ïŒæèŸºã®èšç®
hypot()
颿°ã¯ãçŽè§äžè§åœ¢ã®æèŸºã®é·ããèšç®ããŸããããã¯ã察è§ç·ã®è·é¢ãå«ãã¢ãã¡ãŒã·ã§ã³ãã¬ã€ã¢ãŠããäœæããã®ã«åœ¹ç«ã¡ãŸãã
æ§æïŒ
property: hypot(side1, side2, ...);
äŸïŒèŠçŽ ã察è§ç·äžã«é 眮ãã
hypot()
ã䜿çšããŠãèŠçŽ ã察è§ç·äžã«é
眮ã§ããŸãïŒ
.element {
position: absolute;
left: calc(50% - hypot(50px, 50px) / 2);
top: calc(50% - hypot(50px, 50px) / 2);
}
ãã®ã³ãŒãã¯ã芪ã³ã³ããå ã§èŠçŽ ã察è§ç·æ¹åã«äžå€®æãããŸãã
é«åºŠãªãã¯ããã¯ãšäœ¿çšäŸ
1. æ°åŠé¢æ°ãšCSS倿°ã®çµã¿åãã
CSSæ°åŠé¢æ°ã®ç䟡ã¯ãCSS倿°ïŒã«ã¹ã¿ã ããããã£ïŒãšçµã¿åãããããšã§çºæ®ãããŸããããã«ãããJavaScriptããŠãŒã¶ãŒã®æäœãéããŠç°¡åã«èª¿æŽã§ãããé«åºŠã«ã«ã¹ã¿ãã€ãºå¯èœã§åçãªãã¶ã€ã³ãäœæã§ããŸãã
äŸïŒã«ã¹ã¿ãã€ãºå¯èœãªããŒãã«ã©ãŒ
ããŒãã«ã©ãŒã®CSS倿°ãå®çŸ©ããæ°åŠé¢æ°ã䜿çšããŠãããã®è²ã®ããªãšãŒã·ã§ã³ãå°ãåºãããšãã§ããŸããäŸãã°ããã©ã€ããªã«ã©ãŒã®æåºŠå€ã«ããŒã»ã³ããŒãžãå ããããšã§ãããæããè²åããäœæã§ããŸãïŒ
:root {
--primary-color: #007bff;
--primary-color-light: color-mix(in srgb, var(--primary-color) 80%, white);
}
.button {
background-color: var(--primary-color);
color: white;
}
.button:hover {
background-color: var(--primary-color-light);
}
ãã®äŸã§ã¯ãcolor-mix
ã䜿çšããŠããã©ã€ããªã«ã©ãŒãçœãšæ··åããããšã§æããããŒãžã§ã³ãäœæããŠããŸããããã«ããããã©ã€ããªã«ã©ãŒãç°¡åã«å€æŽã§ããæããè²åããèªåçã«æŽæ°ãããŸãã
2. CSS Gridãšæ°åŠé¢æ°ã«ããè€éãªã¬ã€ã¢ãŠãã®äœæ
CSS Gridã¯åŒ·åãªã¬ã€ã¢ãŠãã·ã¹ãã ãæäŸãããããCSSæ°åŠé¢æ°ãšçµã¿åãããããšã§ãè€éã§ã¬ã¹ãã³ã·ããªã°ãªããæ§é ãäœæã§ããŸãã
äŸïŒåçãªã°ãªãããã©ãã¯ãµã€ãº
calc()
ã䜿çšããŠããã¥ãŒããŒãã®å¯žæ³ããã®ä»ã®èŠå ã«åºã¥ããŠã°ãªãããã©ãã¯ãµã€ãºãå®çŸ©ã§ããŸãïŒ
.grid-container {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(calc(200px + 2vw), 1fr));
gap: 1rem;
}
ãã®ã³ãŒãã¯ãåã®å¹
ãå°ãªããšã200pxã«ãã¥ãŒããŒãå¹
ã®2%ãå ãããã®ã§ãå©çšå¯èœãªã¹ããŒã¹ãåããããã«æ¡å€§ã§ããã°ãªãããäœæããŸããauto-fit
ããŒã¯ãŒãã¯ã1è¡ã«åãŸããªãå Žåã«ã°ãªããã®åãæ¬¡ã®è¡ã«æãè¿ãããããšãä¿èšŒããŸãã
3. æ°åŠé¢æ°ã«ããã¢ãã¡ãŒã·ã§ã³ã®åŒ·å
CSSã¢ãã¡ãŒã·ã§ã³ã¯ãæ°åŠé¢æ°ã䜿çšããŠåçã§é åçãªå¹æãäœæããããšã§ãå€§å¹ ã«åŒ·åã§ããŸãã
äŸïŒã«ã¹ã¿ã ã€ãŒãžã³ã°é¢æ°ã䜿çšããã¹ã±ãŒãªã³ã°ã¢ãã¡ãŒã·ã§ã³
calc()
ã䜿çšããŠãã¹ã±ãŒãªã³ã°ã¢ãã¡ãŒã·ã§ã³çšã®ã«ã¹ã¿ã ã€ãŒãžã³ã°é¢æ°ãäœæã§ããŸãïŒ
.element {
animation: scale 2s ease-in-out infinite;
}
@keyframes scale {
0% {
transform: scale(1);
}
50% {
transform: scale(calc(1.2 + sin(time * 360deg) * 0.1));
}
100% {
transform: scale(1);
}
}
ãã®ã³ãŒãã¯ã1ãš1.3ã®éã§æ¯åããã¹ã±ãŒãªã³ã°ã¢ãã¡ãŒã·ã§ã³ãäœæããŸããsin()
颿°ã¯ãæ»ããã§èªç¶ãªã€ãŒãžã³ã°å¹æãçã¿åºãããã«äœ¿çšãããŸãã
ãã©ãŠã¶äºææ§ãšèæ ®äºé
CSSæ°åŠé¢æ°ã¯ãChromeãFirefoxãSafariãEdgeã®ææ°ããŒãžã§ã³ãå«ãå¹ åºããã©ãŠã¶ã§ãµããŒããããŠããŸãããã ããææ°ã®äºææ§æ å ±ã«ã€ããŠã¯Can I useãŠã§ããµã€ãã§ç¢ºèªããå¿ èŠã«å¿ããŠå€ããã©ãŠã¶çšã®ãã©ãŒã«ããã¯ãœãªã¥ãŒã·ã§ã³ãæäŸããããšãåžžã«è¯ãç¿æ £ã§ãã
CSSæ°åŠé¢æ°ã䜿çšããéã¯ã以äžã®èæ ®äºé ã«çæããŠãã ããïŒ
- å¯èªæ§ïŒ æ°åŠé¢æ°ã¯å€§ããªæè»æ§ãæäŸããŸãããè€éãªèšç®ã¯CSSãèªã¿ã«ãããçè§£ãã«ããããå¯èœæ§ããããŸããã³ãŒãã®æçæ§ãåäžãããããã«ãã³ã¡ã³ããCSS倿°ã䜿çšããŠãã ããã
- ããã©ãŒãã³ã¹ïŒ è€éãªèšç®ãé床ã«äœ¿çšãããšãç¹ã«æ§èœã®äœãããã€ã¹ã§ããã©ãŒãã³ã¹ã«åœ±é¿ãäžããå¯èœæ§ããããŸããã¹ã ãŒãºãªããã©ãŒãã³ã¹ã確ä¿ããããã«ãã³ãŒãã培åºçã«ãã¹ãããŠãã ããã
- åäœïŒ èšç®ãå®è¡ããéã¯åäœã«æ³šæããŠãã ãããäºææ§ã®ããåäœã䜿çšããèšç®ãè«ççã«æå³ããªãããšã確èªããŠãã ããã
ã°ããŒãã«ãªèŠç¹ãšäŸ
CSSæ°åŠé¢æ°ã®çŸããã¯ããã®æ®éæ§ã«ãããŸããå°åãèšèªãæåçãªæèã«é¢ä¿ãªãããããã®é¢æ°ã¯éçºè ãäžè²«æ§ã®ããé©å¿å¯èœãªãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ãäœæããããšãå¯èœã«ããŸãã
- ç°ãªãæžåæ¹åã«é©å¿ïŒ CSSæ°åŠé¢æ°ã¯ãæžåæ¹åïŒäŸïŒå·Šããå³ãå³ããå·ŠïŒã«åºã¥ããŠã¬ã€ã¢ãŠãèŠçŽ ãåçã«èª¿æŽããããã«äœ¿çšã§ããŸãã
- ã¬ã¹ãã³ã·ããªããŒãã«ã®äœæïŒ æ°åŠé¢æ°ã¯ãããŸããŸãªç»é¢ãµã€ãºãããŒã¿å¯åºŠã«é©å¿ããããŒãã«ã®äœæã«åœ¹ç«ã¡ã倿§ãªããã€ã¹ã§ã®å¯èªæ§ã確ä¿ããŸãã
- ã¢ã¯ã»ã·ãã«ãªã³ã³ããŒãã³ãã®èšèšïŒ æ°åŠé¢æ°ã¯ãé害ãæã€ãŠãŒã¶ãŒã®ããã«ååãªã³ã³ãã©ã¹ããšééã確ä¿ããããšã«ãããUIã³ã³ããŒãã³ãã®ã¢ã¯ã»ã·ããªãã£ãåäžãããããã«äœ¿çšã§ããŸãã
çµè«
CSSæ°åŠé¢æ°ã¯ãã¬ã¹ãã³ã·ãã§åçããã€èŠèŠçã«é åçãªãŠã§ããã¶ã€ã³ãäœæããããã®åŒ·åãªããŒã«ã§ãããããã®é¢æ°ããã¹ã¿ãŒããCSS倿°ããã®ä»ã®é«åºŠãªãã¯ããã¯ãšçµã¿åãããããšã§ããŠã§ããããžã§ã¯ãã«å¯Ÿããåµé æ§ãšå¶åŸ¡ã®æ°ããªã¬ãã«ãè§£ãæŸã€ããšãã§ããŸããCSSæ°åŠé¢æ°ã®åãæŽ»çšãããŠã§ãéçºã¹ãã«ã次ã®ã¬ãã«ã«åŒãäžããŸãããã