Hex vs RGB vs HSLïŒåãã©ãŒãããã衚ããã®
Hexã»RGBã»HSLã®è°è«ã¯ãã©ãããåªããŠããããã§ã¯ãããŸãããåãè²ã3éãã§æžããŠããã ãã§ãã#FF6B35 ãš rgb(255, 107, 53) ãš hsl(16, 100%, 60%) ã¯åäžã®è²ã§ããéãã¯è²ãã©ã®ããã«æåã«åè§£ãããã§ããããããã°ã©ã ã§è²ãèªã¿åãã倿Žããçæããéã®å®¹æãã«åœ±é¿ããŸãã
HexïŒ#RRGGBBïŒã¯èµ€ã»ç·ã»éã6æ¡ã®16鲿°ã«ããã¯ããŸããåãã¢ã¯00ïŒãªãïŒããFFïŒæå€§ïŒã®ç¯å²ã§ããã³ã³ãã¯ãã§æ®éçââãã¹ãŠã®ãã©ãŠã¶ããã¶ã€ã³ããŒã«ãAPIãHexãçè§£ããŸããæ¬ ç¹ã¯äººéãèªã¿ã«ããããšã#2E86ABãäžçšåºŠã®éã ãšèŠãã ãã§ããããŸããïŒã»ãšãã©ã®äººã«ã¯ããããŸãããHexã¯ä¿åãšéä¿¡ã®ããã®ãã®ã§ãè²ã«ã€ããŠèããããã®ãã®ã§ã¯ãããŸããã
RGBïŒèµ€ãç·ãéïŒã¯Hexãšåãã§ãã10鲿°ïŒåãã£ã³ãã«0-255ïŒã§ããrgb(46, 134, 171)ã¯#2E86ABããããèªã¿ãããââéïŒ171ïŒãæ¯é çã§ãç·ïŒ134ïŒãäžçšåºŠãèµ€ïŒ46ïŒãäœãããšãããããŸããããããããã20%æããããŠããããªã¬ã³ãžå¯ãã«ããŠããšãã£ã質åã«çããã®ã¯é£ããã§ããæåºŠãè²çžãRGBã§ã¯æç€ºçã§ãªãããã§ãã
HSLïŒè²çžã圩床ãæåºŠïŒã¯è²ã3ã€ã®çŽæçãªæ¬¡å ã«åé¢ããŸããè²çžã¯è²çžç°äžã®äœçœ®ïŒ0°=èµ€ã120°=ç·ã240°=éïŒã圩床ã¯é®®ãããïŒ0%=ã°ã¬ãŒã100%=é®®æïŒãæåºŠã¯æããïŒ0%=é»ã50%=çŽè²ã100%=çœïŒãæãããããïŒLãäžãããèœã¡çããè²ã«ãããïŒSãäžãããè£è²ã欲ããïŒHã«180°足ãããããHSLãããã°ã©ã ã«ããè²æäœã§åãçç±ã§ãã
åãã©ãŒãããã®äœ¿ãåãïŒå®è·µã«ãŒã«ïŒ
Hexã䜿ãå Žé¢ïŒCSS倿°ããã¶ã€ã³ããŒã¯ã³ããã©ã³ãã«ã©ãŒå®çŸ©ãAPIã¬ã¹ãã³ã¹ãããŒã¿ããŒã¹ä¿åãæãã³ã³ãã¯ããªããã¹ã衚çŸïŒ6-8æåïŒã§ãæ®éçã«ãµããŒããããŠããŸãããã¶ã€ããŒããã«ã©ãŒã¹ããã¯ãåãåããšããHexã§æ¥ãŸããèšå®ãã¡ã€ã«ã«è²ãä¿åãããšããHexã䜿ããŸãããã
RGBã䜿ãå Žé¢ïŒCanvasæäœãWebGLãç»ååŠçãåå¥ã®ã«ã©ãŒãã£ã³ãã«ãæäœããããããå Žé¢ãCanvas APIã¯RGBã§åäœããŸãã2è²ã®ãã¬ã³ãã¯RGBã§ç°¡åïŒåãã£ã³ãã«ã®å¹³åïŒãã¢ã«ãã¡åæã®å ¬åŒã¯RGBå€ã䜿ããŸãããã¯ã»ã«ã¬ãã«ã®äœæ¥ããããªããRGBã§èããŸãããã
HSLã䜿ãå Žé¢ïŒã«ã©ãŒãã¬ããã®çæããããŒ/ã¢ã¯ãã£ãç¶æ ã®äœæãããŒãæ§ç¯ããŠãŒã¶ãŒãè²ãéžã¶UIãã10%æããã¯HSLãªãç°¡åïŒLãã10åŒãïŒããåãè²ã§èœã¡çããæãããç°¡åïŒSãäžããïŒã5è²ãåçã«çæããã®ãç°¡åïŒ360°ã5ã§å²ã£ãŠãã®è²çžã䜿ãïŒãcolor-pickerããŒã«ã¯3ã€ã®ãã©ãŒããããåæã«è¡šç€ºããã®ã§ãé¢ä¿æ§ãèŠããŸãã
OKLCHã䜿ãå Žé¢ïŒç¥èŠçã«åäžãªè²æäœïŒCSS Color Level 4ã§æ°ç»å ŽïŒãHSLã«ã¯æ¬ ç¹ããããŸãââhsl(60, 100%, 50%)ïŒé»è²ïŒã¯hsl(240, 100%, 50%)ïŒéïŒããé¥ãã«æããèŠããŸãããLå€ã¯åãã§ããOKLCHã¯ç¥èŠçã«åäžãªæåºŠã§ãããä¿®æ£ããŸãã2026幎ã«ãã¶ã€ã³ã·ã¹ãã ãæ§ç¯ããŠããŠãè²çžéã§äžè²«ããç¥èŠçæãããå¿ èŠãªããOKLCHãæ£ããéžæã§ããæ§æã¯oklch(lightness chroma hue)ã§ãlightnessã¯0-1ãchromaã¯0-0.4ïŒããããïŒãhueã¯0-360°ã§ãã
/* Same color in different formats */
.button {
/* All identical: a warm orange */
color: #FF6B35;
color: rgb(255, 107, 53);
color: hsl(16, 100%, 60%);
color: oklch(0.7 0.18 45);
}
/* HSL makes variations trivial */
.button:hover {
/* 10% darker: just reduce lightness */
background: hsl(16, 100%, 50%);
}
.button:active {
/* 20% darker */
background: hsl(16, 100%, 40%);
}
.button--muted {
/* Same hue, less saturated */
background: hsl(16, 40%, 60%);
}
/* Generating a palette with HSL */
:root {
--primary: hsl(220, 70%, 50%);
--primary-light: hsl(220, 70%, 70%);
--primary-dark: hsl(220, 70%, 30%);
--complement: hsl(40, 70%, 50%); /* +180° hue */
}ã³ãŒãã§ã®è²æäœ
æã/æããïŒHSLã§ã¯Lå€ãæžãã/å¢ããã ãã§ããhsl(200, 80%, 50%)ã20%æããããšhsl(200, 80%, 30%)ã«ãªããŸããHex/RGBã§ã¯ããŸãHSLã«å€æãã倿ŽããŠããæ»ãå¿ èŠããããŸããããããã¹ãŠã®CSS-in-JSã©ã€ãã©ãªïŒstyled-componentsãemotionïŒãå éšçã«HSLã§åäœããdarken()ãlighten()ãã«ããŒãæäŸããçç±ã§ãã
äžéæåºŠ/éæåºŠïŒã¢ã«ãã¡ãã£ã³ãã«ã远å ããŸããHexã¯8æ¡ã䜿ããŸãïŒ#FF6B3580 = 50%äžéæåºŠïŒãRGBã¯rgba(255, 107, 53, 0.5)ã«ãªããŸããHSLã¯hsla(16, 100%, 60%, 0.5)ã«ãªããŸããã¢ã«ãã¡å€ã¯0ïŒå®å šéæïŒãã1ïŒå®å šäžéæïŒã®ç¯å²ã§ããæ³šæïŒ8æ¡Hexã¯IE11ã§ãµããŒããããŠããŸããïŒãŸã æ°ã«ãããªãïŒããrgba()ã¯ã©ãã§ãåããŸãã
è²ã®æ··åïŒæãã·ã³ãã«ãªã¢ãããŒãã¯RGBã§ã®ç·åœ¢è£éã§ããèµ€50%ãšé50%ãæ··ããïŒr=(255+0)/2=128, g=(0+0)/2=0, b=(0+255)/2=128 â rgb(128, 0, 128) = 玫ãCSSã«ã¯color-mix()ããããŸãïŒcolor-mix(in srgb, red 50%, blue)ãããããã€ãã£ãã«è¡ããŸããç¥èŠçã«ããè¯ãæ··åã«ã¯OKLCH空éã§è£éããŸãââRGBæ··åã¯æ¿ã£ãäžéè²ãçãããšããããŸãã
ã¢ã¯ã»ã·ãã«ãªè²ãã¢ã®çæïŒåæ¯ãšèæ¯ã®WCAGã³ã³ãã©ã¹ãæ¯ãèšç®ããŸããå ¬åŒã¯çžå¯ŸèŒåºŠã䜿ããŸãïŒL = 0.2126ÃR + 0.7152ÃG + 0.0722ÃBïŒR, G, Bã¯sRGBããç·åœ¢åïŒãã³ã³ãã©ã¹ãæ¯ = (L1 + 0.05) / (L2 + 0.05)ãL1 > L2ãWCAG AAã¯éåžžããã¹ãã§4.5:1ã倧ããªããã¹ãã§3:1ãèŠæ±ããŸããcolor-pickerããŒã«ã¯ãããèªåèšç®ããŸãã
CSSã«ã©ãŒé¢æ°ïŒã¢ãã³ãªã¢ãããŒãïŒ
CSSçžå¯Ÿã«ã©ãŒïŒ2024幎以éïŒïŒcolor: hsl(from var(--brand) h s calc(l - 20%))ã§JavaScriptãªãã«ãã©ã³ãã«ã©ãŒã®æãããŒãžã§ã³ãäœããŸãã"from"ããŒã¯ãŒãããœãŒã¹ã«ã©ãŒãæåã«åè§£ããcalc()ã§å€æŽã§ããŸããããã«ããå€ãã®å Žåãããªããã»ããµã®ã«ã©ãŒé¢æ°ãäžèŠã«ãªããŸãã
color-mix()ïŒ2023幎ãããµããŒãïŒïŒcolor-mix(in oklch, var(--primary) 70%, white)ã¯ãã©ã€ããªã«ã©ãŒã®70%ãšçœã®30%ãæ··ããŠãã£ã³ããçæããŸãã"in oklch"ã®éšåã¯è£éã®ã«ã©ãŒã¹ããŒã¹ãæå®ããŸãââoklchã¯ã»ãšãã©ã®è²ã®çµã¿åããã§srgbããèªç¶ãªæ··åãçã¿ãŸãã
oklch()颿°ïŒoklch(0.7 0.15 250)ã¯æåºŠïŒ0-1ïŒã圩床ïŒ0-0.4çšåºŠãã©ãã ãã«ã©ãã«ãïŒãè²çžïŒ0-360°ïŒãæå®ããŸããHSLãšéããOKLCHã®çããæåºŠå€ã¯äººéã®ç®ã«å®éã«åãæããã«èŠããŸããããã¯ããŒã¿ããžã¥ã¢ã©ã€ãŒãŒã·ã§ã³ã§éèŠã§ãââåãç®ç«ã¡æ¹ã®5è²ãå¿ èŠãªããåãLå€ã®OKLCHã§å®çŸã§ããŸãããHSLã§ã¯ã§ããŸããã
å®è·µçãªãã³ãïŒãã¶ã€ã³ããŒã¯ã³ã¯Hexã§å®çŸ©ãïŒäºææ§ãšãã¶ã€ããŒãžã®åŒãæž¡ãã®ããïŒã掟çè²ïŒãããŒç¶æ ãç¡å¹ç¶æ ããã©ãŒã«ã¹ãªã³ã°ïŒã«ã¯CSSã§HSLãŸãã¯OKLCHã䜿ããŸããããããã§äž¡æ¹ã®è¯ããšãããåŸãããŸãïŒãã¶ã€ããŒãèªèããå®å®ããåç §è²ãšãJavaScriptãªãã®ç°¡åãªããã°ã©ã çããªãšãŒã·ã§ã³ã§ãã
ã¢ã¯ã»ã·ããªãã£ãšã³ã³ãã©ã¹ãæ¯
WCAG 2.1ã®ã³ã³ãã©ã¹ãèŠä»¶ïŒéåžžããã¹ãïŒ18pxæªæºãŸãã¯14pxå€ªåæªæºïŒã§4.5:1ã倧ããªããã¹ãïŒ18px以äžãŸãã¯14px倪å以äžïŒã§3:1ãUIã³ã³ããŒãã³ããšã°ã©ãã£ã«ã«ãªããžã§ã¯ãã§3:1ãããã¯ææ¡ã§ã¯ãªããå€ãã®æ³åã§æ³çèŠä»¶ã§ãïŒç±³åœã®ADAãEUã®EN 301 549ïŒãã³ã³ãã©ã¹ãäžè¶³ã¯äžéšã®ãŠãŒã¶ãŒãæåéãã³ã³ãã³ããèªããªãããšãæå³ããŸãã
ãããã倱æïŒçœèæ¯ã«èãã°ã¬ãŒã®ããã¹ãïŒ#999 on #fff = 2.85:1ãAAäžåæ ŒïŒãèããããã¬ãŒã¹ãã«ããŒããã¹ããèªããªãç¡å¹ãã¿ã³ããã¹ããåšå²ã®ããã¹ããšã³ã³ãã©ã¹ããåããŠããªãã«ã©ãŒãªã³ã¯ãä¿®æ£ã¯éåžžã·ã³ãã«ã§ãââããã¹ããæããããèæ¯ãæããããŠ4.5:1ã«éãããŸã§èª¿æŽããŸããcolor-pickerããŒã«ã¯è²ã調æŽããªããã³ã³ãã©ã¹ãæ¯ã衚瀺ããŸãã
ããŒã¯ã¢ãŒãã®çœ ïŒè²ãå転ããŠãã³ã³ãã©ã¹ãæ¯ã¯ä¿æãããŸããã#333 on #fffïŒ12.6:1ïŒãå転ããŠ#ccc on #000ã¯13.1:1ââåé¡ãªããããã#666 on #fffïŒ5.7:1ïŒãå転ããŠ#999 on #000ã¯5.1:1ââãŸã åæ Œã§ããã®ãªã®ãªãã©ã€ãã¢ãŒãã§åæ Œããè²ã®çµã¿åããããå転åŸã®ããŒã¯ã¢ãŒãã§äžåæ Œã«ãªãããšããããŸããåã¢ãŒãã§åå¥ã«ã³ã³ãã©ã¹ãæ¯ã確èªããŠãã ããã
WCAGãè¶ ããŠïŒç·æ§ã®çŽ8%ã女æ§ã®çŽ0.5%ãäœããã®è²èŠç°åžžãæã£ãŠããŸããæ å ±ãäŒããã®ã«è²ã ãã«é Œããªãã§ãã ããïŒãšã©ãŒ/æåã«èµ€/ç·ã䜿ãã®ãå žåçãªå€±æïŒãè²ãšäžç·ã«ã¢ã€ã³ã³ããã¿ãŒã³ãããã¹ãã©ãã«ã䜿ããŸããããè²èŠç°åžžã·ãã¥ã¬ãŒã¿ãŒã§UIããã¹ãããŠãã ããââChrome DevToolsã«å èµãããŠããŸãïŒã¬ã³ããªã³ã°ããã« â èŠèŠé害ã®ãšãã¥ã¬ãŒãïŒã
sRGBãè¶ ããã«ã©ãŒã¹ããŒã¹
sRGBã¯Webã®ããã©ã«ãã«ã©ãŒã¹ããŒã¹ã§ããå¯èŠè²ã®çŽ35%ãã«ããŒããŸããã¢ãã³ãªãã£ã¹ãã¬ã€ïŒP3ã2016幎以éã®iPhoneãš2015幎以éã®MacBookã§äœ¿çšïŒã¯sRGBããçŽ25%å€ãã®è²ã衚瀺ã§ããŸããHex/RGBã ãã䜿ã£ãŠãããªããsRGBã«å¶éãããŠããŸããããåºãè²åã«ã¢ã¯ã»ã¹ããã«ã¯ãCSSã§color(display-p3 1 0.5 0)ã䜿ããŸãã
åºè²åãéèŠãªå Žé¢ïŒé®®ãããªåçãsRGBã§ã¯ãå¹³åŠãã«èŠãããã©ã³ãã«ã©ãŒïŒç¹ã«åœ©åºŠã®é«ãèµ€ãšç·ïŒãè²ããéç«ããããããã¶ã€ã³ãéèŠã§ãªãå Žé¢ïŒããã¹ããUIã¯ããŒã ãèæ¯ã埮åŠãªè²ã®éããéèŠã§ãªããã®ã
ãã©ãŒã«ããã¯æŠç¥ïŒ@supports (color: color(display-p3 1 0 0))ã§P3ãµããŒããæ€åºããsRGBãã©ãŒã«ããã¯ãæäŸããŸãããŸãã¯color()颿°ã§ãã©ãŒã«ããã¯ïŒcolor: #ff6b35; color: color(display-p3 1 0.45 0.2); ââdisplay-p3ãçè§£ããªããã©ãŠã¶ã¯2çªç®ã®å®£èšãç¡èŠããŠHexå€ã䜿ããŸãã
ãã¶ã€ããŒã§ã¯ãªãéçºè ãžïŒåºè²åã«ã©ãŒã«ã€ããŠèããå¿ èŠã¯ãããããããŸãããsRGBã¯äžè¬çãªUIãã¶ã€ã³ã®ãã¹ãŠã®è²ãã«ããŒããŸããåºè²åã¯åçãµã€ããECã®ååç»åããã©ã³ãéèŠã®ããŒã±ãã£ã³ã°ããŒãžã«é¢é£ããŸãããã¶ã€ããŒãP3ã«ã©ãŒã«ã€ããŠèšåããŠããªããã°ãsRGBã®Hex/RGB/HSLã䜿ã£ãŠã³ã³ãã©ã¹ãæ¯ãæ£ããèšå®ããããšã«éäžããŸããããåºè²åã®ããã©ãŒãã³ã¹ã³ã¹ãã¯ãŒãã§ãââCSSã§ã®ã«ã©ãŒã¹ããŒã¹å®£èšãéãã ãã§ãã¬ã³ããªã³ã°ã®ãªãŒããŒãããã§ã¯ãããŸããã
Webéçºã§ããããè²ã®ééã
ééã1ïŒCSSã«ã¹ã¿ã ããããã£ã䜿ããã«è²ãããŒãã³ãŒãã£ã³ã°ããã©ã³ãã®éã47ç®æã«åºçŸããŠããŠãã¶ã€ããŒã倿Žãããã47åã®æ€çŽ¢çœ®æã§ããè²ã¯äžåºŠã ã--color-primary: hsl(220, 70%, 50%)ãšããŠå®çŸ©ããã©ãã§ãåç §ããŸããããããã§ããŒã¯ã¢ãŒããç°¡åã«ãªããŸãââ.darkã¯ã©ã¹ãã¡ãã£ã¢ã¯ãšãªã®äžã§ã«ã¹ã¿ã ããããã£ãåå®çŸ©ããã ãã§ãã
ééã2ïŒãããŒç¶æ ã«HSLæåºŠã§ã¯ãªãopacityã䜿ããè²ä»ããã¿ã³ã«opacity: 0.8ãèšå®ãããšèæ¯ãéããŠãäºæž¬äžèœãªè²ã«ãªããŸãã代ããã«åãè²ã®ããæã/æããããŒãžã§ã³ã䜿ããŸãããïŒãããŒã«background: hsl(220, 70%, 45%)ïŒ5%æãïŒãããã§èŠçŽ ã®èåŸã«äœããã£ãŠãäžè²«ããçµæãåŸãããŸãã
ééã3ïŒç°ãªãã¢ãã¿ãŒã§è²ããã¹ãããªããMacBook ProïŒP3è²åãé«èŒåºŠïŒã§é®®ããã«èŠããè²ããå®äŸ¡ãªãªãã£ã¹ã¢ãã¿ãŒïŒsRGBãäœã³ã³ãã©ã¹ãïŒã§ã¯è²ãããŠèŠãããããããŸãããå°ãªããšã1å°ã®ãã¬ãã¢ã ã§ãªããã£ã¹ãã¬ã€ã§ãã¹ãããŸãããããã®ãã¹ããçãæ®ãè²ãããŠãŒã¶ãŒãå®éã«èŠãè²ã§ãã
ééã4ïŒããŒã¯ã¢ãŒãã§è²ãç¡èŠãããåã«è²ãå転ãããçœé»ã®èæ¯ãå ¥ãæ¿ããããããšãç®ã«å³ããã€ã³ã¿ãŒãã§ãŒã¹ã«ãªããŸããè¯ãããŒã¯ã¢ãŒãã¯ãã圩床ãèœãšããè²ïŒHSLã§Sã10-20%äžããïŒã埮åŠãªã°ã¬ãŒã®éãã§è¡šé¢ãæã¡äžãïŒçŽç²ãªé»ã§ã¯ãªãïŒã倧ããªããã¹ãé åã®ã³ã³ãã©ã¹ããäžããŸãïŒçŽçœonçŽé»ã¯å³ããããââ代ããã«#e0e0e0 on #1a1a1aã䜿ããŸãããïŒã