CSS :anchor-validã®åãæ¢æ±ããåçã§æèã«å¿ããUIãäœæããŸããã¢ã³ã«ãŒã¿ãŒã²ããã®æå¹æ§ã«åºã¥ããã¹ã¿ã€ãªã³ã°ã§ãã¢ã¯ã»ã·ããªãã£ãšUXãåäžãããæ¹æ³ãåŠã³ãŸãããã
CSS :anchor-valid: åçUIãå®çŸããæ¡ä»¶ä»ãã¢ã³ã«ãŒã¹ã¿ã€ãªã³ã°ã®æŽ»çš
çŸä»£ã®Webéçºã¯ãåçã§ã¬ã¹ãã³ã·ããªãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ã®äžã«æãç«ã£ãŠããŸããWebããŒãžãã¹ã¿ã€ãªã³ã°ããèšèªã§ããCSSã¯ãéçºè
ããããéæããããã®ãã匷åãªããŒã«ãæäŸããããã«ãçµ¶ããé²åããŠããŸãããã®ãããªããŒã«ã®äžã€ã :anchor-valid
ç䌌ã¯ã©ã¹ã»ã¬ã¯ã¿ãŒã§ããCSS仿§ã«æ¯èŒçæ°ãã远å ããããã®æ©èœã«ãããã¢ã³ã«ãŒã¿ãŒã²ããã®æå¹æ§ã«åºã¥ããŠèŠçŽ ãã¹ã¿ã€ãªã³ã°ããããšãå¯èœã«ãªããæèã«å¿ããã¢ã¯ã»ã·ãã«ãªWebäœéšãåµé ããããã®ãšããµã€ãã£ã³ã°ãªå¯èœæ§ãåºãããŸãã
CSSã® :anchor-valid
ãš :anchor-invalid
ãšã¯ïŒ
æ¬è³ªçã«ã:anchor-valid
ãš :anchor-invalid
ã¯ãé¢é£ããã¢ã³ã«ãŒã¿ãŒã²ãããååšããæå¹ãšèŠãªããããã©ããã«å¿ããŠèŠçŽ ãæ¡ä»¶ä»ãã§ã¹ã¿ã€ãªã³ã°ã§ããCSSç䌌ã¯ã©ã¹ã§ããã¢ã³ã«ãŒã¿ãŒã²ãããšã¯ãéåžžãã¢ã³ã«ãŒïŒ<a>
ã¿ã°ïŒããã® href
屿§ïŒäŸïŒ<a href="#section1">
ïŒã䜿ã£ãŠæã瀺ãããŒãžäžã®ç¹å®ã®èŠçŽ ã§ããIDã section1
ã®èŠçŽ ãååšããã°ããã®ã¢ã³ã«ãŒã¯æå¹ãšèŠãªãããååšããªããã°ç¡å¹ãšãªããŸãã
ãããã®ç䌌ã¯ã©ã¹ã¯ãã¢ã³ã«ãŒãªã³ã¯ã®ç¶æ ãèŠèŠçã«è¡šçŸããã¡ã«ããºã ãæäŸãããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãšã¢ã¯ã»ã·ããªãã£ãåäžãããŸãããããã¯ãã³ã³ãã³ããåçã«èªã¿èŸŒãŸãããæŽæ°ããããããŠãæ¢åã®ãªã³ã¯ãç¡å¹ã«ãªãå¯èœæ§ãããã·ããªãªã§ç¹ã«åœ¹ç«ã¡ãŸãã
ã©ã®ããã«æ©èœããã®ãïŒ
:anchor-valid
ããã³ :anchor-invalid
ç䌌ã¯ã©ã¹ã¯ãã¢ã³ã«ãŒã¿ã°ã® href
屿§ãšé£æºããŠæ©èœããŸãããã©ãŠã¶ã¯ href
ã®ã¿ãŒã²ãããããŒãžäžã«ååšãããã©ãããèªåçã«ãã§ãã¯ããŸãããã®ãã§ãã¯ã«åºã¥ããŠããã©ãŠã¶ã¯å¯Ÿå¿ããç䌌ã¯ã©ã¹ã«å®çŸ©ãããã¹ã¿ã€ã«ãé©çšããŸãã
以äžã«åºæ¬çãªäŸã瀺ããŸãïŒ
a:anchor-valid {
color: green;
text-decoration: none;
}
a:anchor-invalid {
color: red;
text-decoration: line-through;
}
ãã®äŸã§ã¯ãæå¹ãªã¢ã³ã«ãŒãªã³ã¯ã¯ããã¹ãè£ é£Ÿãªãã®ç·è²ã§è¡šç€ºãããç¡å¹ãªã¢ã³ã«ãŒãªã³ã¯ã¯åãæ¶ãç·ä»ãã®èµ€è²ã§è¡šç€ºãããŸããããã«ããããŠãŒã¶ãŒã¯ãªã³ã¯ã®ç¶æ ãå³åº§ã«ç¥ãããšãã§ããŸãã
å®è·µçãªãŠãŒã¹ã±ãŒã¹
:anchor-valid
ããã³ :anchor-invalid
ç䌌ã¯ã©ã¹ã¯ãå¹
åºãå®è·µçãªå¿çšãæäŸããŸãã以äžã«äžè¬çãªã·ããªãªãããã€ã玹ä»ããŸãïŒ
1. ãªã³ã¯åãã®è¡šç€º
æãçŽæ¥çãªå¿çšã®äžã€ã¯ããªã³ã¯åããèŠèŠçã«ç€ºãããšã§ããããã¯ãã³ã³ãã³ãéãå€ããŠã§ããµã€ãããæéãšãšãã«ãªã³ã¯ãç¡å¹ã«ãªãå¯èœæ§ãããåçã«çæãããããŒãžã§ç¹ã«åœ¹ç«ã¡ãŸãã
äŸïŒ
a:anchor-invalid {
color: #888;
text-decoration: line-through;
cursor: not-allowed; /* Optional: change cursor to indicate non-clickable link */
}
2. ç®æ¬¡ã®åçæŽæ°
ç®æ¬¡ãåçã«çæããéãäžéšã®ã»ã¯ã·ã§ã³ãæ¬ ããŠãããããŸã èªã¿èŸŒãŸããŠããªãã£ããããããšããããŸãã:anchor-valid
ãš :anchor-invalid
ã䜿çšããããšã§ã察å¿ããã»ã¯ã·ã§ã³ãå©çšå¯èœã«ãªããŸã§ããããã®ãªã³ã¯ãèŠèŠçã«ç¡å¹åãããé衚瀺ã«ãããã§ããŸãã
äŸïŒ
.toc-item a:anchor-valid {
/* Style for valid table of contents links */
}
.toc-item a:anchor-invalid {
color: #aaa;
pointer-events: none; /* Disable click events */
opacity: 0.5; /* Reduce opacity to visually indicate it's disabled */
}
3. ãã©ãŒã ã®ããªããŒã·ã§ã³ãšããã²ãŒã·ã§ã³
è€éãªãã©ãŒã ã§ã¯ãå®äºããã»ã¯ã·ã§ã³ããã€ã©ã€ã衚瀺ããããšã§ããŠãŒã¶ãŒãããã»ã¹ãéããŠæ¡å
ãããå ŽåããããŸããã¢ã³ã«ãŒãªã³ã¯ã䜿çšããŠã»ã¯ã·ã§ã³éãç§»åãã:anchor-valid
ã䜿çšããŠãã©ã®ã»ã¯ã·ã§ã³ãæ£åžžã«æ€èšŒãããéä¿¡æºåãæŽã£ããã瀺ãããšãã§ããŸãã
äŸïŒJavaScriptã䜿çšããŠã¢ã³ã«ãŒã®æå¹æ§ãåãæ¿ããïŒïŒ
HTML:
<a href="#section1" id="section1-link">Section 1</a>
<a href="#section2" id="section2-link">Section 2</a>
<div id="section1">Section 1 Content</div>
<div id="section2">Section 2 Content</div>
CSS:
a {
display: inline-block;
padding: 10px;
margin-right: 10px;
background-color: #eee;
color: #333;
text-decoration: none;
}
a:anchor-valid {
background-color: #4CAF50; /* Green */
color: white;
}
a:anchor-invalid {
background-color: #f44336; /* Red */
color: white;
}
JavaScript:
function validateSection(sectionId) {
// Simulate validation logic
const isValid = Math.random() > 0.5; // Randomly determine validity
const link = document.getElementById(sectionId + "-link");
if (isValid) {
link.href = "#" + sectionId; // Make anchor valid
} else {
link.href = "#invalid-target"; // Make anchor invalid (target doesn't exist)
}
}
// Example usage:
validateSection("section1");
validateSection("section2");
ãã®äŸã§ã¯ãJavaScriptã䜿çšããŠãåã»ã¯ã·ã§ã³ã®ã·ãã¥ã¬ãŒããããæ€èšŒã«åºã¥ããŠã¢ã³ã«ãŒãªã³ã¯ã® href
屿§ãåçã«å€æŽããŸããã»ã¯ã·ã§ã³ãæå¹ãšèŠãªãããå Žåãhref
ã¯ã»ã¯ã·ã§ã³ã®IDãæããã¢ã³ã«ãŒãæå¹ã«ãªããŸãããã以å€ã®å Žåã¯ãååšããªãIDïŒ#invalid-target
ïŒãæããã¢ã³ã«ãŒã¯ç¡å¹ã«ãªããŸãããããŠãCSSãããã«å¿ããŠãªã³ã¯ãã¹ã¿ã€ãªã³ã°ããŸãã
4. ã·ã³ã°ã«ããŒãžã¢ããªã±ãŒã·ã§ã³ïŒSPAïŒã®åŒ·å
SPAã¯ãã°ãã°åçãªã³ã³ãã³ãèªã¿èŸŒã¿ã«äŸåããŸãã:anchor-valid
ã䜿çšããããšã§ããŸã èªã¿èŸŒãŸããŠããªãã»ã¯ã·ã§ã³ãžã®ãªã³ã¯ãç¡å¹åãŸãã¯èŠèŠçã«å€æŽãããŠãŒã¶ãŒããªã³ã¯åããã¯ãªãã¯ããã®ãé²ãããšã§ãããã·ãŒã ã¬ã¹ãªããã²ãŒã·ã§ã³äœéšãäœæã§ããŸãã
5. ãã³ããããã²ãŒã·ã§ã³
ãã³ããããã²ãŒã·ã§ã³ã§ã¯ã:anchor-valid
ã䜿çšããŠãããã²ãŒã·ã§ã³ãã¹ã®ã©ã®ã¹ããããçŸåšã¢ã¯ãã£ããŸãã¯ã¢ã¯ã»ã¹å¯èœã§ãããã瀺ãããšãã§ããŸãã
ãã©ãŠã¶ã®äºææ§
2024幎åŸåçŸåšã:anchor-valid
ããã³ :anchor-invalid
ã®ãã©ãŠã¶ãµããŒãã¯ãChromeãFirefoxãSafariãEdgeãªã©ã®äž»èŠãªã¢ãã³ãã©ãŠã¶ã§ããªãè¯å¥œã§ããããããå€ããã©ãŠã¶ã¯ãããã®ç䌌ã¯ã©ã¹ããµããŒãããŠããªãå¯èœæ§ããããŸããæ¬çªç°å¢ã§ãããã®æ©èœãå®è£
ããåã«ã¯ãå¿
ã Can I Use ã®ãããªãªãœãŒã¹ã§ææ°ã®ãã©ãŠã¶äºææ§æ
å ±ã確èªããŠãã ããã
å€ããã©ãŠã¶ããµããŒãããå¿ èŠãããå Žåã¯ãåçã®æ©èœãæäŸããããã«JavaScriptããŒã¹ã®ããªãã£ã«ã䜿çšããããšãæ€èšããŠãã ããããã ããããªãã£ã«ã¯ããã©ãŒãã³ã¹ã«åœ±é¿ãäžããå¯èœæ§ããããããæ éã«äœ¿çšããŠãã ããã
ã¢ã¯ã»ã·ããªãã£ã«é¢ããèæ ®äºé
:anchor-valid
ãš :anchor-invalid
ã¯ãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãåäžãããŸãããã¢ã¯ã»ã·ããªãã£ãèæ
®ããããšãäžå¯æ¬ ã§ããåã«ãªã³ã¯ã®è²ãå€èгã倿Žããã ãã§ã¯ãèŠèŠé害ã®ãããŠãŒã¶ãŒã«ã¯äžååãªå ŽåããããŸãã以äžã«ããã€ãã®ãã¹ããã©ã¯ãã£ã¹ã瀺ããŸãïŒ
- ååãªè²ã®ã³ã³ãã©ã¹ããæäŸããïŒ æå¹ãªãªã³ã¯ãšç¡å¹ãªãªã³ã¯ã®è²ã®éãããç¹ã«è²èŠç°åžžã®ãŠãŒã¶ãŒã«ãšã£ãŠå®¹æã«åºå¥ã§ããã»ã©å€§ããããšã確èªããŠãã ãããWebAIMã®ã³ã³ãã©ã¹ããã§ãã«ãŒã®ãããªããŒã«ã䜿çšããŠã³ã³ãã©ã¹ãæ¯ã確èªããŸãã
- 远å ã®èŠèŠçåå³ã䜿çšããïŒ è²ã®å€æŽããã¢ã€ã³ã³ãããã¹ãã©ãã«ããŸãã¯ããã¹ãè£ é£Ÿã®å€æŽïŒäŸïŒæå¹ãªãªã³ã¯ã«äžç·ãåŒãïŒãªã©ãä»ã®èŠèŠçåå³ã§è£å®ããŸãã
- ã¹ã¯ãªãŒã³ãªãŒããŒã«ä»£æ¿ããã¹ããæäŸããïŒ ARIA屿§ïŒäŸïŒ
aria-disabled
ïŒã䜿çšããŠãã¹ã¯ãªãŒã³ãªãŒããŒã«ãªã³ã¯ã®æå¹æ§ã«é¢ããæ å ±ãæäŸããŸãã
äŸïŒ
<a href="#section1" aria-disabled="false">Section 1</a>
<a href="#invalid-section" aria-disabled="true">Invalid Section</a>
a[aria-disabled="true"] {
color: #888;
text-decoration: line-through;
cursor: not-allowed;
}
ãã¹ããã©ã¯ãã£ã¹ãšãã³ã
- ã»ãã³ãã£ãã¯ãªHTMLã䜿çšããïŒ HTMLãé©åã«æ§é åãããæå³çã«æ£ããããšã確èªããŸããããã«ããããã©ãŠã¶ãæ¯æŽæè¡ãã³ã³ãã³ãã®æå³ãè§£éãããããªããŸãã
- 培åºçã«ãã¹ãããïŒ å®è£ ãããŸããŸãªãã©ãŠã¶ãããã€ã¹ã§ãã¹ãããäžè²«ããåäœã確èªããŸãã
- ããã©ãŒãã³ã¹ãèæ ®ããïŒ ããŒãžã®ã¬ã³ããªã³ã°ããã©ãŒãã³ã¹ã«åœ±é¿ãäžããå¯èœæ§ã®ãããé床ã«è€éãªCSSã«ãŒã«ã¯é¿ããŠãã ããã
- äžè²«ããèŠèŠèšèªã䜿çšããïŒ ãŠãŒã¶ãŒãæ··ä¹±ãããªãããã«ããŠã§ããµã€ãå šäœã§äžè²«ããèŠèŠèšèªãç¶æããŸãã
- JavaScriptãšçµã¿åãããŠåçã«æŽæ°ããïŒ ãã©ãŒã æ€èšŒã®äŸã§ç€ºããããã«ãCSSã®
:anchor-valid
ãšJavaScriptãçµã¿åãããããšã§ããŠãŒã¶ãŒã®æäœããµãŒããŒãµã€ãã®ããŒã¿ã«åºã¥ããŠã¢ã³ã«ãŒãªã³ã¯ã®ç¶æ ãåçã«æŽæ°ãã匷åãªæ¹æ³ãæäŸãããŸãã
é«åºŠãªãã¯ããã¯
CSS倿°ãšã®äœ¿çš
CSS倿°ïŒã«ã¹ã¿ã ããããã£ïŒã䜿çšãããšãããæè»ã§ä¿å®ããããã¹ã¿ã€ã«ãäœæã§ããŸããè²ããã©ã³ãããã®ä»ã®ããããã£ã«å€æ°ãå®çŸ©ããããã :anchor-valid
ããã³ :anchor-invalid
ã®ã«ãŒã«ã§äœ¿çšã§ããŸãã
äŸïŒ
:root {
--valid-link-color: green;
--invalid-link-color: red;
}
a:anchor-valid {
color: var(--valid-link-color);
}
a:anchor-invalid {
color: var(--invalid-link-color);
}
ä»ã®ã»ã¬ã¯ã¿ãŒãšã®çµã¿åãã
:anchor-valid
ãš :anchor-invalid
ãä»ã®CSSã»ã¬ã¯ã¿ãŒãšçµã¿åãããããšã§ãããå
·äœçãªã¹ã¿ã€ãªã³ã°ã«ãŒã«ãäœæã§ããŸããäŸãã°ãç¹å®ã®çš®é¡ã®ãªã³ã¯ããŠã§ããµã€ãã®ç¹å®ã®ã»ã¯ã·ã§ã³å
ã®ãªã³ã¯ãã¿ãŒã²ããã«ããããšãã§ããŸãã
äŸïŒ
/* Style only links within the navigation menu */
nav a:anchor-invalid {
color: #ccc;
}
ã°ããŒãã«ãªèæ ®äºé
:anchor-valid
ãš :anchor-invalid
ãã°ããŒãã«èŠæš¡ã§å®è£
ããå Žåã以äžãèæ
®ããããšãäžå¯æ¬ ã§ãïŒ
- ããŒã«ã©ã€ãŒãŒã·ã§ã³ïŒ èŠèŠçãªåå³ãããã¹ãã©ãã«ããããŸããŸãªèšèªãæåã«åãããŠé©åã«ããŒã«ã©ã€ãºãããŠããããšã確èªããŸãããã¹ãŠã®ãŠãŒã¶ãŒã«çè§£ãããªãå¯èœæ§ã®ãããèšèªåºæã®æ £çšå¥ãæ¯å©ã®äœ¿çšã¯é¿ããŠãã ããã
- ã¢ã¯ã»ã·ããªãã£åºæºïŒ WCAGïŒãŠã§ãã³ã³ãã³ãã¢ã¯ã»ã·ããªãã£ã¬ã€ãã©ã€ã³ïŒãªã©ã®åœéçãªã¢ã¯ã»ã·ããªãã£åºæºãéµå®ããäžçäžã®é害ãæã€ãŠãŒã¶ãŒããŠã§ããµã€ãã«ã¢ã¯ã»ã¹ã§ããããã«ããŸãã
- æåçãªæåæ§ïŒ è²ã®èªèã象城æ§ã«ãããæåçãªéãã«æ³šæããŠãã ãããäŸãã°ãèµ€è²ã¯æåã«ãã£ãŠç°ãªãæå³ãæã€ããšããããŸãã
- å³ããå·ŠãžæžãèšèªïŒRTLïŒïŒ ãŠã§ããµã€ããRTLèšèªïŒäŸïŒã¢ã©ãã¢èªãããã©ã€èªïŒããµããŒãããŠããå Žåãã¹ã¿ã€ãªã³ã°ã«ãŒã«ãRTLã¬ã€ã¢ãŠãã«é©åã«èª¿æŽãããŠããããšã確èªããŠãã ããã
å°æ¥ã®ãã¬ã³ã
:anchor-valid
ããã³ :anchor-invalid
ç䌌ã¯ã©ã¹ã¯ãWebéçºãé²åãç¶ããã«ã€ããŠãããã«éèŠã«ãªãå¯èœæ§ããããŸãã以äžã«ããã€ãã®æœåšçãªå°æ¥ã®ãã¬ã³ãã瀺ããŸãïŒ
- ãã©ãŠã¶ãµããŒãã®åäžïŒ ãããã®ç䌌ã¯ã©ã¹ã«å¯Ÿãããã©ãŠã¶ã®ãµããŒããããåºãŸãã«ã€ããŠãéçºè ãããããæ¡çšããå¯èœæ§ãé«ãŸããŸãã
- Webãã¬ãŒã ã¯ãŒã¯ãšã®çµ±åïŒ ReactãAngularãVue.jsãªã©ã®Webãã¬ãŒã ã¯ãŒã¯ã
:anchor-valid
ãš:anchor-invalid
ã®çµã¿èŸŒã¿ãµããŒããæäŸããè€éãªã¢ããªã±ãŒã·ã§ã³ã§ã®äœ¿çšã容æã«ããå¯èœæ§ããããŸãã - é«åºŠãªãŠãŒã¹ã±ãŒã¹ïŒ éçºè ã¯ããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãšã¢ã¯ã»ã·ããªãã£ãåäžãããããã«ããããã®ç䌌ã¯ã©ã¹ã䜿çšããæ°ããåµé çãªæ¹æ³ãèŠã€ãç¶ããã§ãããã
çµè«
:anchor-valid
ããã³ :anchor-invalid
ç䌌ã¯ã©ã¹ã¯ãåçã§ãæèã«å¿ãããã¢ã¯ã»ã·ãã«ãªWebã€ã³ã¿ãŒãã§ãŒã¹ãäœæããããã®åŒ·åã§å€çšéãªããŒã«ãæäŸããŸãããããã®æ©èœã掻çšããããšã§ããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãåäžãããã¢ã¯ã»ã·ããªãã£ãé«ããããé
åçãªWebã¢ããªã±ãŒã·ã§ã³ãäœæã§ããŸãããã©ãŠã¶ã®ãµããŒããåäžãç¶ããWebéçºã®å®è·µãé²åããã«ã€ããŠããããã®ç䌌ã¯ã©ã¹ã¯çŸä»£ã®Webéçºè
ã®ããŒã«ãããã®ãŸããŸãéèŠãªéšåã«ãªãã§ãããããããã®ãã¯ããã¯ã詊ããããŸããŸãªãŠãŒã¹ã±ãŒã¹ãæ¢æ±ããWebæšæºã®ç¶ç¶çãªé²åã«è²¢ç®ããŠãã ããã
åžžã«ã¢ã¯ã»ã·ããªãã£ãåªå ããå®è£ ãããŸããŸãªãã©ãŠã¶ãããã€ã¹ã§åŸ¹åºçã«ãã¹ãããŠãå Žæãèœåã«é¢ä¿ãªãããã¹ãŠã®ãŠãŒã¶ãŒã«äžè²«ããæ¥œããäœéšãä¿èšŒããããšãå¿ããªãã§ãã ããã