é¢å¿ã¤ã³ãã¼ã«ã¼ã®ä½¿ç¨
é¢å¿ã¤ã³ãã¼ã«ã¼ã¯ãã¦ã¼ã¶ã¼ãè¦ç´ ã«å¯¾ãã¦ãé¢å¿ã示ããæä½ããé¢å¿ã失ããæä½ï¼ä¾ãã°ããã¦ã¹ãã¤ã³ã¿ã¼ãå½ã¦ããå¤ãããããæä½ï¼ãããéã«ãã¤ã³ã¿ã¼ãã§ã¤ã¹ã®æ´æ°ãç¬èªã®ã³ã¼ãã®å®è¡ãå¯è½ã«ããä»çµã¿ã§ããæãä¸è¬çãªç¨éã¯ãããããªã¼ãã¼ã®è¡¨ç¤ºã¨é表示ã§ãããã®ã¬ã¤ãã§ã¯ãé¢å¿ã¤ã³ãã¼ã«ã¼ã®æ¦å¿µã使ç¨å¯è½ãªå ´åãããã³ä½¿ç¨æ¹æ³ã«ã¤ãã¦èª¬æãã¾ãã
æ¦å¿µ
ããããªã¼ãã¼ API ã¯ãé¢é£ããå¶å¾¡è¦ç´ ï¼ã¤ã³ãã¼ã«ã¼ï¼ãã¢ã¯ãã£ãåãããã¨ããä¾ãã°ã¯ãªãã¯ãããã¨ãã«ãããããªã¼ãã¼ã表示ããæ©è½ãæä¾ãã¾ãããã®æ©è½ã¯ãã¢ã¼ãã«ãæ
å ±ããã«ãªã©ã® UIã®è¦ç´ ã表示ããã®ã«ä¾¿å©ã§ãã
ããããªã¼ãã¼ã宣è¨çã«çæããã«ã¯ã
popover 屿§ã¨ãpopovertarget ã¾ã㯠commandfor ã®ãããããçµã¿åããã¦ä½¿ç¨ãããã¨ã§å®ç¾ã§ãã¾ãã
ãããã®ã¢ã¯ãã£ãã¼ã·ã§ã³ãã¼ã¹ã®ããããªã¼ãã¼ã«å ããã¦ã¼ã¶ã¼ã®é¢å¿ã示ãæä½ã§ãããå¶å¾¡è¦ç´ ã«ããã¼ã¾ãã¯ãã©ã¼ã«ã¹ããéã«ããããªã¼ãã¼ã表示ããå¿ è¦ãããã¨ãããã¼ãºãè¯ãããã¾ããä¾ãã°ãå¤ãã®ã½ã¼ã·ã£ã«ãµã¤ããã³ãã¥ããã£ãµã¤ãã§ã¯ãã¦ã¼ã¶ã¼ãå人ãã°ã«ã¼ãã®ãããã£ã¼ã«ãã¼ã¸ã¸ã®ãªã³ã¯ã«ã«ã¼ã½ã«ãåãããã¨ã詳細æ å ±ã表示ããããããªã¼ãã¼ã表示ããã¾ãããã®ã¯ã¤ãã¯ãã¬ãã¥ã¼ã«ãããã¦ã¼ã¶ã¼ã¯å®å ¨ãªãã¼ã¸ã訪åãããã©ããã夿ãããããªãã¾ãããã®ãããªããããªã¼ãã¼ã«ã¯ããã©ãã¼ãããã°ã«ã¼ããè³¼èªãã¨ãã£ãã¯ã¤ãã¯ã¢ã¯ã·ã§ã³ãåæã«å«ã¾ãããã¨ããããã¦ã¼ã¶ã¼ã¯ç¾å¨ã®ã³ã³ããã¹ããé¢ãããã¨ãªãæä½ãå®è¡ã§ãã¾ãã
é¢å¿ã¤ã³ãã¼ã«ã¼ã¯ãJavaScript ãå¿ è¦ã¨ããã«ãä¸è²«æ§ã¨ã¢ã¯ã»ã·ããªãã£ãåããæ¹æ³ã§ãé¢å¿ã«åºããããããªã¼ãã¼åä½ããã©ã¦ã¶ã¼ãæå®ãããæ¹æ³ã§æä¾ãããããããã¨ãã§ãã¾ãããã©ã¦ã¶ã¼ã¯ãã¦ã¼ã¶ã¼ãè¦ç´ ã«é¢å¿ã示ããã¿ã¤ãã³ã°ãã¤ã¾ãåä½ãæªç½®ãã¹ãã¿ã¤ãã³ã°ã夿ãã¾ãããé¢å¿ãã示ãåä½ã¯é常ãã¦ã¼ã¶ã¼ãè¦ç´ ã«ããã¼ããã©ã¼ã«ã¹ãã¾ãã¯é·æ¼ãããéã«ç¾ãã¾ãï¼ãé¢å¿ãã®å ·ä½çãªå®ç¾©ã¯ãã©ã¦ã¶ã¼ã«ãã£ã¦ç°ãªããã¨ãããã¾ãï¼ã䏿¹ããé¢å¿ã失ããåä½ã¯ãã¦ã¼ã¶ã¼ãè¦ç´ ã«å¯¾ãã¦ä½ç¨ããã®ããããæã«çºçãã¾ãã
ãã©ã¦ã¶ã¼ã¯é¢å¿ãå¾ãããæã失ãããæã«ãã¤ãã³ããçºçããããããããã«å¿ãã¦ç¬èªã®ã³ã¼ããå®è¡ã§ãã¾ããããã«ããã®æ©è½ã«ã¯é¢å¿ãåºã«è¦ç´ ãã¹ã¿ã¤ã«è¨å®ããããã® CSS ããããã£ã¨ã»ã¬ã¯ã¿ã¼ãå«ã¾ãã¦ãã¾ãã
ã¡ã¢: Escãã¼ãå©ç¨ã§ãã端æ«ã§ã¯ããããæ¼ãã¨ãã¹ã¦ã®æä½ãåãæ¶ãããå¯è½æ§ããããããã«ãããæä½ããããããããã®ã«ãªã£ããä¸è¦ã«ãªã£ããããå ´åã®ä¸è¬çãªã¨ã¹ã±ã¼ãææ®µãæå®ããã¾ãã
åæã«ãããããªã¼ãã¼ä»¥å¤ã®å ´åã§ã¯ãé¢å¿ã¤ã³ãã¼ã«ã¼ã使ç¨ãã¦ç¬èªã®ã³ã¼ããå®è¡ãããã¨ãã§ãã¾ãããã ãããã®ã¬ã¤ãã§ã¯ä¸»ã«ããããªã¼ãã¼ã«ç¦ç¹ãå½ã¦ã¦ãã¾ããããããªã¼ãã¼ã¯é¢å¿ã¤ã³ãã¼ã«ã¼ã®æãä¸è¬çãªç¨éã§ããããã§ãã
é¢å¿ã¤ã³ãã¼ã«ã¼ã®ä½æ
宣è¨çã«é¢å¿ã¤ã³ãã¼ã«ã¼ã使ããã«ããããæ¬¡ã® 2 ã¤ã®è¦ä»¶ãããã¾ãã
-
ã¤ã³ãã¼ã«ã¼è¦ç´ : ãã®è¦ç´ ã¯ãã¦ã¼ã¶ã¼ãé¢å¿ã示ããããããªã¼ãã¼ã®è¡¨ç¤ºãé表示ãªã©ã®ã¢ã¯ã·ã§ã³ãèµ·åããããã«ä½ç¨ããè¦ç´ ã§ããã¤ã³ãã¼ã«ã¼è¦ç´ ã«ã¯ã
interestfor屿§ãå¿ é ã§ããã対象è¦ç´ ã®idãå¤ã¨ãã¾ããã¤ã³ãã¼ã«ã¼è¦ç´ ã¯ãHTML ã®<a>ã<button>ã<area>è¦ç´ ãããã㯠SVG ã®<a>è¦ç´ ããªããã¨ãã§ãã¾ãã -
対象è¦ç´ ï¼ããã¯ãé¢å¿ãå¾ãã失ã£ããããéã«å½±é¿ãåãããå¶å¾¡ããããããè¦ç´ ã§ãã対象è¦ç´ ã«ã¯
id屿§ãå¿ é ã§ãããã»ã¼ãããã種é¡ã®è¦ç´ ã対象ã¨ãªãã¾ãããã®è¦ç´ ã«popover屿§ãä»ããã¨ãããããªã¼ãã¼ã«å¤æããã¾ããã¡ã¢: 対象è¦ç´ ã¯ãã¤ã³ãã¼ã«ã¼è¦ç´ ã® DOM ã®
interestForElementããããã£ãã¿ã¼ã²ããè¦ç´ ã¸ã®åç §ã«è¨å®ãããã¨ã§ãããã°ã©ã ããè¨å®ãããã¨ãã§ãã¾ãã詳細ã«ã¤ãã¦ã¯ããã®ã¬ã¤ãã®å¾åã«ããé¢å¿ã¤ã³ãã¼ã«ã¼ã®ããã® JavaScript API ã®ç¯ãåç §ãã¦ãã ããã
åç´ãªä¾ãè¦ã¦ããã¾ããããããã§ã¯ãã¤ã³ãã¼ã«ã¼è¦ç´ ããªã³ã¯ã§ããã対象è¦ç´ 㯠popover é¢é£ä»ããä»ãã¦ããæ®µè½ã§ãã
<p><a href="#" interestfor="mypopover">ãªã³ã¯</a>ã®ã¤ããããã¹ã</p>
<p id="mypopover" popover>ç°¡åãªæ
å ±ã®ä»ããçããã¬ãã¥ã¼</p>
対象è¦ç´ ã« popover 屿§ãè¨å®ããã¨ããã®è¦ç´ ã¯ï¼display: none ã«ãã£ã¦ï¼é表示ã«ãªããç»é¢ä¸å¤®ã«é
ç½®ããã¾ããå¼ã³åºãå
è¦ç´ ï¼ãªã³ã¯ï¼ã«é¢å¿ã表示ãããã¨ãããããªã¼ãã¼ãç¾ãã¾ãã
ããã¯æ¬¡ã®ãã表示ããã¾ãããªã³ã¯ã«è§¦ãã¦ã¿ã¦ãã ããã
ãªã³ã¯ã«ãã¦ã¹ãå½ã¦ããããã©ã¼ã«ã¹ããããé·æ¼ããããããã¨ããããªã¼ãã¼ãç¾ããæä½ããããã¨æ¶ããç¹ã«æ³¨ç®ãã¦ãã ãããå¯¾ç §çã«ããã¦ã¹ã¯ãªãã¯ãªã©ã§ãªã³ã¯ãã¢ã¯ãã£ãåãããå ´åã¯ãé常ã®ãªã³ã¯ã¨åæ§ã«åä½ãããã ããã®ä¾ã§ã¯ãªã³ã¯å ã¯åå¨ãã¾ããã
ãã®ä¾ã§ã¯ãpopover 屿§ã®å¤ã¯ããããªã¼ãã¼ã®åä½ã«å½±é¿ãã¾ããããã ããæ¬¡ã®ç¯ã§ç¤ºãããã«ãã¤ã³ã¿ã¬ã¹ãã¤ã³ãã¼ã«ã¼ã®ããããªã¼ãã¼ã¨é常ã®ããããªã¼ãã¼ãçµã¿åãããå ´åã«ã¯éè¦ã«ãªãã¾ãã
é¢å¿ã¤ã³ãã¼ã«ã¼ã¨ã¢ã¯ã·ã§ã³ãã¼ã¹ã®ããããªã¼ãã¼ã®çµã¿åãã
åãå¶å¾¡è¦ç´ ä¸ã§ãé¢å¿ã¤ã³ãã¼ã«ã¼ã¨é常ã®ããããªã¼ãã¼ãçµã¿åããããã¨ãã§ãã¾ããæ¬¡ã®ä¾ã§ã¯ã<button> è¦ç´ ã interestfor 屿§ã使ç¨ãã¦é¢å¿ã¤ã³ãã¼ã«ã¼ã¨ãã¦è¨å®ããã¦ãã¾ããããã¯ãã¦ã¼ã¶ã¼ãããã«é¢å¿ã示ããã¨ãã«ãã¼ã«ãããã表示ããã¨ããæå³ã§ãããã¿ã³ãã¯ãªãã¯ãããã¨ãcommandfor 屿§ã§åç
§ãããå¥ã®ããããªã¼ãã¼ã表示ã¾ãã¯é表示ã«ãªãã¾ããcommand 屿§ã¯ toggle-popover ã«è¨å®ããã¦ããããã¿ã³ãè¤æ°åæ¼ããã¨ã§ããããªã¼ãã¼ã®è¡¨ç¤ºç¶æ
ã¨éè¡¨ç¤ºç¶æ
ãåãæ¿ãããã¨ãã§ããããã«ãªã£ã¦ãã¾ãã
<p>
ã³ã³ãã³ãã«å«ã¾ãã
<button
interestfor="my-tooltip"
commandfor="my-infobox"
command="toggle-popover">
ãã¿ã³
</button>
</p>
<p id="my-tooltip" popover="hint">ããã¼æã®ãã¼ã«ããã</p>
<p id="my-infobox" popover>
æä½ãã¿ã³ãå«ã¾ãã¦ããæ
å ±ããã¯ã¹<br />
<button>ãã¿ã³ 1</button> <button>ãã¿ã³ 2</button>
</p>
ããã¯æ¬¡ã®ããã«è¡¨ç¤ºããã¾ãã
ãã¿ã³ã«å¯¾ãã¦é¢å¿ã示ãã¦ãã¼ã«ãããã表示ããããã¿ã³ãã¯ãªãã¯ããã¨æ
å ±ããã¯ã¹ãéããã¨ãã§ãã¾ããããã§éè¦ãªã®ã¯ popover ã®å¤ã§ãããã¼ã«ãããã®ããããªã¼ãã¼ã¯ popover="hint" ã«è¨å®ããã¦ããã®ã«å¯¾ããæ
å ±ããã¯ã¹ã¯åã« popover ï¼popover="auto" ã¨åçï¼ã«è¨å®ãã¾ããããã«ãããæ
å ±ããã¯ã¹ã示ããã¦ãã¦ãããã¼ã«ãããã¯è¡¨ç¤ºãããã¾ã¾ã«ãªããã¨ãã§ãã¾ãã両æ¹ã®ããããªã¼ãã¼ã auto ã«è¨å®ããã¦ããå ´åããã¼ã«ãããã¨æ
å ±ããã¯ã¹ãåæã«è¡¨ç¤ºãããã¨ã¯ã§ãã¾ãããUI ã§ã¯ãæ¢ã«éãããã® UI ã®ä¸é¨ãé表示ã«ãããã¨ãªããè¤æ°ã®ãã¼ã«ãããã表示ã§ãããã¨ãæçã§ãã
é¢å¿ã¤ã³ãã¼ã«ã¼ã®ã¹ã¿ã¤ã«è¨å®
é¢å¿ã¤ã³ãã¼ã«ã¼ã§ä½¿ç¨ãããããããªã¼ãã¼ã®ã¹ã¿ã¤ã«è¨å®ã§ã¯ãä»ã®ããããªã¼ãã¼ã¨åæ§ã®ã¹ã¿ã¤ã«è¨å®æ¹æ³ãé©ç¨ã§ãã¾ãï¼ããããªã¼ãã¼ã®ã¹ã¿ã¤ã«è¨å®ã«ããã¤ã³ãã¼ã«ã¼ã«å¯¾ããç¸å¯¾é ç½®ããããããªã¼ãã¼ã®ã¢ãã¡ã¼ã·ã§ã³ãªã©ãå«ã¿ã¾ãã
ã¤ã¾ããé¢å¿ã¤ã³ãã¼ã«ã¼ã«ç¹æã® CSS æ©è½ãããã¤ãããã¾ãã
interest-delay䏿¬æå®ããããã£ããã³é¢é£ããinterest-delay-startããã³interest-delay-endã®å奿å®ããããã£ï¼ãããã¯ãã¦ã¼ã¶ã¼ãé¢å¿ãå¾ãã失ã£ãããã¦ããããã©ã¦ã¶ã¼ããã®å¤åã«åºã¥ãã¦åä½ããã¾ã§ã®é å»¶ã追å ããããã«ä½¿ç¨ã§ããããããã£ã§ããä¾ãã°ãããããªã¼ãã¼ã®è¡¨ç¤ºã¾ãã¯é表示ãªã©ãæãããã¾ãã:interest-sourceããã³:interest-targetæ¬ä¼¼ã¯ã©ã¹: ãããã¯ãé¢å¿ã示ãããå ´åã«ã®ã¿ãããããé¢å¿ã¤ã³ãã¼ã«ã¼ã¨ãã®é¢é£ä»ãããã対象è¦ç´ ã«ã¹ã¿ã¤ã«ãé©ç¨ããããã«ä½¿ç¨ã§ãã¾ãã
ãããã®æ©è½ãã©ã®ããã«åä½ããã®ãã示ãç°¡åãªä¾ãè¦ã¦ããã¾ãããã
ããã§ã¯ 2 ã¤ã®ãã¿ã³ã¨ãã¼ã«ããããå®ç¾©ãã¦ãã¾ãããã¼ã«ãããã¯ãã¦ã¼ã¶ã¼ãããããã®ãã¿ã³ã«é¢å¿ã示ããã失ã£ããããã¨ãã«è¡¨ç¤ºããããé表示ã«ãªã£ãããã¾ãã
<p>
<button interestfor="my-tooltip">ãã¿ã³ 1</button>
<button interestfor="my-tooltip">ãã¿ã³ 2</button>
</p>
<p id="my-tooltip" popover="hint">ããã¼ã®ãã¼ã«ããã</p>
CSS ã§ã¯ãinterest-delay ã 1s 2s ã¨ã㦠<button> è¦ç´ ã«è¨å®ãã¦ããããã®è¨å®ã«ãããã¦ã¼ã¶ã¼ãé¢å¿ã示ãã¦ãã¼ã«ããããç¾ããã¾ã§ 1 ç§å¾
ã¤ããã«ãªããèå³ã失ã£ãéã«ãã¼ã«ããããæ¶ããã¾ã§ 2 ç§å¾
ã¤ããã«ãã¦ãã¾ããåæã«ãbutton:interest-source ã»ã¬ã¯ã¿ã¼ã使ç¨ãã¦ãé¢å¿ã示ããéã«ãã¿ã³ã® background-color ã orange ã«å¤æ´ãã¦ãã¾ãã
button {
interest-delay: 1s 2s;
}
button:interest-source {
background-color: orange;
}
次ã«ã:interest-source æ¬ä¼¼ã¯ã©ã¹ã¨ :has() æ¬ä¼¼ã¯ã©ã¹ãçµã¿åããã¦ã段è½å
ã®ãã¹ã¦ã®ãã¿ã³ã« interest-delay-start: 0s ãé©ç¨ãã¾ãããæ®µè½ã«é¢å¿ã示ããããã¿ã³ï¼ã¤ã¾ã button:interest-source ã«ä¸è´ãããã¿ã³ï¼ãå«ã¾ãã¦ããå ´åã«ã®ã¿æå¹ã§ããããã¯æç¨ãªææ³ã§ããããããã®ãã¿ã³ã«é¢å¿ã示ãããæç¹ã§ããããªã¼ãã¼ãç¾ããããã«ããæè¡ã¯ãã¦ã¼ã¶ã¼ä½é¨ãç
©ããããªãã¾ãããã¦ã¼ã¶ã¼ãç¹å®ã®ãã¿ã³ã«é¢å¿ã示ããå¾ã§ããã°ãç°ãªãããããªã¼ãã¼éããã°ããç§»åã§ããã®ã¯ä¾¿å©ã§ãã
p:has(button:interest-source) button {
interest-delay-start: 0s;
}
åæã«ããã¼ã«ãããããã¿ã³ã®ä¸ã«ç¾ããããã position-area ã bottom ã«è¨å®ãã¦ãã¾ããããã¯ãããããªã¼ãã¼ã¨ãã®é¢å¿å¯¾è±¡ã®ã¤ã³ãã¼ã«ã¼ãé¢é£ä»ãããã¨ã§ã両è
ã®éã«æé»ã®ã¢ã³ã«ã¼åç
§ãçæãããããã§ãã¾ãï¼è©³ç´°ã¯ããããªã¼ãã¼ã®ã¢ã³ã«ã¼ä½ç½®æå®ãåç
§ï¼ã
#my-tooltip {
position-area: bottom;
}
æå¾ã«ã#my-tooltip:interest-target ã»ã¬ã¯ã¿ã¼ã使ç¨ãã¦ãé¢å¿ã示ãããã¨ãã«ããããªã¼ãã¼ã«ç ´ç·ã®å¢çãè¨å®ãã¾ãã
#my-tooltip:interest-target {
border-style: dashed;
}
ããã¯æ¬¡ã®ããã«ã¬ã³ããªã³ã°ããã¾ãã
ãã¿ã³ã«é¢å¿ ã示ãã¦ï¼ä¾ãã°ãã«ã¼ã½ã«ãä¹ããããã©ã¼ã«ã¹ãå½ã¦ãããã¦ï¼ãå ã«èª¬æããåä½ã確èªãã¦ã¿ã¦ãã ããã
é¢å¿ã¤ã³ãã¼ã«ã¼ã®ããã® JavaScript API
é¢å¿ã¤ã³ãã¼ã«ã¼ã«ã¯é¢é£ä»ããããJavaScript APIããããé¢å¿ã¤ã³ãã¼ã«ã¼ã対象ã¨ããè¦ç´ ãåãåãããããé¢å¿ã示ãããæã失ãããæã«ç¬èªã®ã³ã¼ããå®è¡ãããã§ãã¾ãããã® API ã®æ©è½ã¯ä»¥ä¸ã®éãã§ãã
interestForElementããããã£ãããã¯HTMLButtonElementãHTMLAnchorElementãHTMLAreaElementãSVGAElementã®åã¤ã³ã¿ã¼ãã§ã¤ã¹ã§å©ç¨ã§ãã¾ãã ããã¯ãé¢å¿ã¤ã³ãã¼ã«ã¼ã®å¯¾è±¡è¦ç´ ã¸ã®åç §ãè¿ãã¾ããããã¯ã対å¿ãã HTML ã¾ã㯠SVG ã®é¢å¿ã¤ã³ãã¼ã«ã¼ã®interestfor屿§ã§åç §ãã¦ããidãæã¤è¦ç´ ã§ããinterestããã³loseinterestã¤ãã³ããããããé¢å¿ã¤ã³ãã¼ã«ã¼ã®å¯¾è±¡è¦ç´ ã§ãé¢å¿ã示ãããæã¨å¤±ãããæã«çºçãã¾ãããããã®ã¤ãã³ããç£è¦ãããã¨ã§ãã¬ã¹ãã³ã¹ã¨ãã¦ç¬èªã®ã³ã¼ããå®è¡ãããã¨ãå¯è½ã«ãªãã¾ããInterestEventã¤ã³ã¿ã¼ãã§ã¤ã¹ã¯ãinterestããã³loseinterestã¤ãã³ãã®ã¤ãã³ããªãã¸ã§ã¯ãã§ãããã®ã¤ã³ã¿ã¼ãã§ã¤ã¹ã¯ãé¢é£ä»ããããé¢å¿ã¤ã³ãã¼ã«ã¼è¦ç´ ã¸ã®åç §ãå«ãsourceããããã£ãå«ã¿ã¾ãã
é¢å¿ã¤ã³ãã¼ã«ã¼ã®å¯¾å¿ã®æ¤åº
API ã®ç¨éã®ä¸ã¤ã¯æ©è½æ¤åºã§ããé¢å¿ã¤ã³ãã¼ã«ã¼ã対å¿ãã¦ãããã確èªããæãç°¡åãªæ¹æ³ã¯ãã¤ã³ã¿ã¼ãã§ã¤ã¹åã®ããããã« Object.hasOwn() ã¡ã½ãããé©ç¨ããinterestForElement ããããã£ãå©ç¨ã§ããå ´åã調ã¹ããã¨ã§ãã
ä¾ã示ãã¾ãã
const supported = Object.hasOwn(
HTMLButtonElement.prototype,
"interestForElement",
);
ãã®ã¬ã¤ãã®ãã¹ã¦ã®ä¾ã§ã¯ã対å¿ãæ¤åºããããã«ãã®ææ³ã使ç¨ãã¦ãã¾ããè¿å¤ã falseï¼æ©è½ã対å¿ãã¦ããªããã¨ã示ãï¼å ´åã<html> è¦ç´ ã«ã¯ã©ã¹ã追å ãã¾ãã
if (!supported) {
document.querySelector("html").classList.add("no-interest-invokers");
}
次ã«ããã®ã¯ã©ã¹ã CSS ã§ä½¿ç¨ãã対å¿ãã¦ãã¾ããããã¼ã表示ããã¾ãã
.no-interest-invokers body::before {
content: "ãã®ãã©ã¦ã¶ã¼ã¯é¢å¿ã¤ã³ãã¼ã«ã¼ã«å¯¾å¿ãã¦ãã¾ããã";
background-color: wheat;
display: block;
padding: 10px 0;
width: 100%;
text-align: center;
}
é¢å¿ã¤ã³ãã¼ã«ã¼ API ã®å®ä¾
API ã®æ©è½ãå®éã«ç¤ºãã¦åä½ãããåºæ¬çãªä¾ãè¦ã¦ããã¾ãããããã®ä¾ã§ã¯ã3 ã¤ã®ãªã³ã¯ã¨æ®µè½ãããããªã¼ãã¼ã¨ãã¦è¨å®ããã¦ãã¾ãã
<p>
ãªã³ã¯ã¯ãã¡ãã§ã:
<a href="#">ãªã³ã¯ 1</a>
<a href="#">ãªã³ã¯ 2</a>
<a href="#">ãªã³ã¯ 3</a>
</p>
<p id="my-tooltip" popover="hint">ããã¼æã®ãã¼ã«ããã</p>
JavaScript ã§ã¯ãããããªã¼ãã¼ã¨ 3 ã¤ã®ãªã³ã¯ã¸ã®åç
§ãåå¾ãã¾ãããã®å¾ããªã³ã¯ãã«ã¼ãå¦çããããããã®ãªã³ã¯ã® interestForElement ããããã£ãããããªã¼ãã¼è¦ç´ ãåç
§ããããã«è¨å®ãã¾ããããã«ãããããããªã¼ãã¼ã¨åãªã³ã¯éã®é¢å¿ã¤ã³ãã¼ã«ã¼ã¨å¯¾è±¡ã®é¢ä¿ãããã°ã©ã ã§è¨å®ãã¾ãã
const tooltip = document.getElementById("my-tooltip");
const links = document.querySelectorAll("a");
links.forEach((link) => (link.interestForElement = tooltip));
次ã«ãããããªã¼ãã¼ã« interest 㨠loseinterest ã¤ãã³ããã³ãã©ã¼ãæ·»ä»ãã¾ãããªã³ã¯ã®ããããã§é¢å¿ã示ãããå ´åãããããªã¼ãã¼ã®ããã¹ãã³ã³ãã³ããæ´æ°ããããããªã¼ãã¼ã表示ããããªã³ã¯ã®ããã¹ãã³ã³ãã³ãï¼ã¤ãã³ããªãã¸ã§ã¯ãã® source ããããã£çµç±ã§åå¾ï¼ãè¨è¼ããããã«ãã¾ããé¢å¿ã失ãããå ´åãsource è¦ç´ ã®ããã¹ãã³ã³ãã³ãã«ã¢ã¹ã¿ãªã¹ã¯ã追å ãããã®è¦ç´ ã«å¯¾ãã¦é¢å¿ã表示ãããåæ°ã確èªã§ããããã«ãã¾ãã
tooltip.addEventListener("interest", (e) => {
tooltip.textContent = `é¢å¿ã${e.source.textContent}ã§ç¤ºããã¾ãã`;
});
tooltip.addEventListener("loseinterest", (e) => {
e.source.textContent += "*";
});
ããã¯æ¬¡ã®ããã«è¡¨ç¤ºããã¾ãã
é¢å¿ã¤ã³ãã¼ã«ã¼ã使ç¨ãã¦ãã¬ãã¥ã¼ããããªã¼ãã¼ã®ä½æ
åè¿°ã®ããã«ãã¤ã³ã¿ã¬ã¹ãã¤ã³ãã¼ã«ã¼ã®ã¨ã¦ãä¸è¬çãªä½¿ç¨ä¾ã¯ããªã³ã¯å ã«é¢ãããã¬ãã¥ã¼æ å ±ãç¨ãã¦ãªã³ã¯ã段éçã«å¼·èª¿ãã¦è¡¨ç¤ºãããã¨ã§ããããã«ã¯ããããã£ã¼ã«ãã¼ã¸ã¸ã®ãªã³ã¯ã«è¡¨ç¤ºããã人ç©åãçµæ´ãæå¨å°ãªã©ã®è©³ç´°æ å ±ãããã¼ã ãã¼ã¸ã¸ã®ãªã³ã¯ã«æå®ãããã°ã«ã¼ãã¸ã®åå ç»é²ã¨ãã£ãã¯ã¤ãã¯ã¢ã¯ã·ã§ã³ãå«ãããã¨ãã§ãã¾ãããããã®ãã¬ãã¥ã¼ããããªã¼ãã¼ã¯ãã¦ã¼ã¶ã¼ãæèãè¦å¤±ããã¨ãªãå¿ è¦ãªæ å ±ãå¾ããããã便å©ã§ãã
ã¤ã³ã¿ã¬ã¹ãã¤ã³ãã¼ã«ã¼ã使ç¨ãã¦ããã¬ãã¥ã¼ããããªã¼ãã¼ãå®è£ ããæ¹æ³ãè¦ã¦ããã¾ãããã
HTML
ãã¼ã¯ã¢ããã«ã¯ãçãæ®µè½å
ã« GitHub ãããã£ã¼ã«ã¸ã®ãªã³ã¯ã¨ãæ¬ä¼¼çãªããã©ãã¼ããã¿ã³ãåããå¶éã¦ã¼ã¶ã¼ãããã£ã¼ã«ãå«ã <div> ãå«ã¾ãã¦ãã¾ãããªã³ã¯ã® interestfor 屿§ã¯ã¦ã¼ã¶ã¼ãããã£ã¼ã«ã® id ãæãã¦ãã¾ããããã«ãã¦ã¼ã¶ã¼ãããã£ã¼ã«ã«ã¯ popover 屿§ãè¨å®ããã¦ãããããã«ããããããªã¼ãã¼è¦ç´ ã¨ãã¦æ©è½ããããã©ã«ãã§ã¯é表示ã«ãªãã¾ãã
<p>
I think
<a
href="https://github.com/chrisdavidmills/"
interestfor="user-info"
target="_blank">
@chrisdavidmills
</a>
should know about this.
</p>
<div id="user-info" popover="hint">
<div class="wrapper">
<img src="chris-mills.jpg" alt="chris mills" />
<section>
<p><strong>Chris Mills</strong></p>
<p>
Independent tech writer and web technology tinkerer, working on MDN on
behalf of Google and Mozilla. A11y and open standards advocate. Heavy
metal drummer. <button>Follow</button>
</p>
<p>ð Greenfield, UK</p>
</section>
</div>
</div>
CSS
ãªã³ã¯ã« interest-delay-start ã®å¤ 1s ãè¨å®ãããã¨ããå§ãã¾ãï¼a[interestfor] ã»ã¬ã¯ã¿ã¼ã¯ãèå³ã¤ã³ãã¼ã«ã¼ã§ãããªã³ã¯ã®ã¿ã鏿ããã®ã«ä¾¿å©ã§ãï¼ãããã«ããããã¬ãã¥ã¼ããããªã¼ãã¼ã表示ãããåã«ããããªé
å»¶ã使ããã¾ãããªã³ã¯ãå¯éãããã¼ã¸ã§ããããªã¼ãã¼ããã°ããç¾ããå ´åããã®ãããªå ´åã«ãã®ææ³ã¯æç¨ã§ãã
a[interestfor] {
interest-delay-start: 1s;
}
次ã«ãé¢å¿ã表示ãããéã«ãªã³ã¯ã®å³ä¸è§ã«ç¾ãããããããããªã¼ãã¼ã« position-area å¤ã¨ã㦠bottom right ãè¨å®ãã¾ããï¼ç°¡æ½åã®ãããããããªã¼ãã¼ã®ãã®ä»ã®ã¹ã¿ã¤ã«è¨å®ã¯ããã§ã¯çç¥ãã¦ãã¾ããï¼
#user-info {
position-area: bottom right;
}
æå¾ã® CSS ãããã¯ã§ã¯ãããããªã¼ãã¼ã® opacity ããããã£ãã¢ãã¡ã¼ã·ã§ã³ããã¦ã¦ãèå³ã示ãããã¨ãï¼:interest-target æ¬ä¼¼ã¯ã©ã¹ã«ä¸è´ããå ´åï¼ã«ããããªã¼ãã¼ãæ»ããã«ãã§ã¼ãã¤ã³ããããã«ãã¾ããããããªã¼ãã¼ã¯ï¼display: none ã«ããï¼éè¡¨ç¤ºç¶æ
ã§éå§ããããããæ£ããã¢ãã¡ã¼ã·ã§ã³ãããã«ã¯ããã¤ãã®è¿½å ã«ã¼ã«ãå¿
è¦ã§ãã颿£ã¢ãã¡ã¼ã·ã§ã³ãæå¹ã«ããã«ã¯ãtransition-behavior: allow-discrete ã overlay ããã³ display ããããã£ã«è¨å®ããå¿
è¦ãããã¾ããåæã«ãããããªã¼ãã¼ã¯ã¾ã ã¬ã³ããªã³ã°ããã¦ããªãããã@starting-style ãããã¯ã使ç¨ãã¦ãinterest-target ç¶æ
ã«ãããåæç¶æ
ãå®ç¾©ããå¿
è¦ãããã¾ãã
çµæ
ããã¯æ¬¡ã®ããã«ã¬ã³ããªã³ã°ããã¾ãã
ãªã³ã¯ã«ã«ã¼ã½ã«ãåãããããã©ã¼ã«ã¹ãããããã¨ããã¬ãã¥ã¼ã®ããããªã¼ãã¼ã表示ããã¾ãããã®ä¾ã§ã¯ãåæã«ããã°ã¬ãã·ãã¨ã³ãã³ã¹ã¡ã³ãã«ããªã£ã¦ãã¾ããé対å¿ãã©ã¦ã¶ã¼ã§ã¯ããªã³ã¯ã¯æå¾ éãã«åä½ãã¾ãã
ããããªã¼ãã¼ãªãã®é¢å¿ã¤ã³ãã¼ã«ã¼ã®ä½¿ç¨
ããããªã¼ãã¼ã使ç¨ããªãé¢å¿ã¤ã³ãã¼ã«ã¼ã®ä¾ãè¦ã¦ã¿ã¾ãããããã®ä¾ã§ã¯ãã¹ã¿ã¤ã«ãã¬ãã¥ã¼ããã«ãçæãã¾ãããã¾ãã¾ãªé è²ãã¿ã³ãã¢ã¯ãã£ãã«ãã¦ãããã«ã«ç°ãªãã¹ã¿ã¤ã«ãé©ç¨ã§ãã¾ããé¢å¿ã¤ã³ãã¼ã«ã¼ã使ç¨ãã¦æä½ã段éçã«å¼·åãã¦ãããããã¹ã¿ã¤ã«ã鏿ããåã«ãã¬ãã¥ã¼ã§ãã¾ãããã¿ã³ã«é¢å¿ã示ãããã¨ããã®é è²ãããã«ã«é©ç¨ãããé¢å¿ã失ãããã¨ããã«ã¯ååã«é©ç¨ããã¦ããã¹ã¿ã¤ã«ã«æ»ãã¾ãã
HTML
ãã® HTML ã¯ã5 ã¤ã® <button> è¦ç´ ã¨ãã¹ã¿ã¤ã«ãã¬ãã¥ã¼ããã«ã表ã <article> è¦ç´ ãå«ã¾ãã¦ãã¾ããåãã¿ã³ã¯åã interestfor å¤ãæã¡ã<article> ã® id ãåç
§ãã¦ãã¾ããã¾ããããããã®ç°ãªãé
è²ã表ã class ãæã£ã¦ãã¾ãããªãã<article> 㯠popover 屿§ãæã£ã¦ãã¾ããï¼ããããªã¼ãã¼ã¯ãé¢å¿ã¤ã³ãã¼ã«ã¼ã®ä½¿ç¨ã«å¿
é ã§ã¯ããã¾ããï¼ã
<div>
<button interestfor="style-panel" class="black-white">ç½é»</button>
<button interestfor="style-panel" class="bubblegum">風è¹ã¬ã </button>
<button interestfor="style-panel" class="purple-haze">ç´«ã®é</button>
<button interestfor="style-panel" class="blaze">ç</button>
<button interestfor="style-panel" class="mint-brown">ãã³ããã©ã¦ã³</button>
</div>
<article id="style-panel" class="black-white">
<h2>ã¹ã¿ã¤ã«ãã¬ãã¥ã¼ããã«</h2>
<p>ããã¯é¢ç½ããã§ãããï¼</p>
</article>
CSS
ã¾ãã<button> è¦ç´ ã«é©ç¨ãããããããã® class ã®ã¹ã¿ã¤ã«ãå®ç¾©ãã¾ãã
.black-white {
color: black;
background-color: white;
border: 2px solid black;
}
.bubblegum {
color: #fff8f0;
background-color: #ef476f;
border: 2px solid #fff8f0;
box-shadow: 0 0 2px #ef476f;
}
.purple-haze {
color: #8a1c7c;
background-color: #f0bcd4;
border: 2px solid #8a1c7c;
}
.blaze {
color: #f2e94e;
background-color: #7e6b8f;
border: 2px solid #f2e94e;
}
.mint-brown {
color: #41463d;
background-color: #1cfeba;
border: 2px solid #41463d;
}
次ã«ã:interest-source æ¬ä¼¼ã¯ã©ã¹ã使ç¨ãã¦ãèå³ã示ããããã¿ã³ã«ã¹ã¿ã¤ã«ãé©ç¨ãã¾ããããã«ãããã¦ã¼ã¶ã¼ã¯ç¾å¨ã©ã®ãã¿ã³ã注ç®ãéãã¦ããããç°¡åã«ç¢ºèªãããã¨ãã§ãã¾ãã
button:interest-source {
background-color: black;
color: white;
border: 2px solid black;
}
æå¾ã«ãã¹ã¿ã¤ã«ããã«ã« transition ãé©ç¨ãã¾ããããã«ãããè¦ç´ ä¸ã§å¤æ´ããã all ããããã£ã®å¤ãã0.7s ã«ããã£ã¦æ»ããã«ã¢ãã¡ã¼ã·ã§ã³è¡¨ç¤ºããã¾ããã¤ã¾ããããã«ã«é©ç¨ããããã¹ã¦ã®é
è²ã®å¤æ´ãã¢ãã¡ã¼ã·ã§ã³è¡¨ç¤ºãããã¨ãããã¨ã§ãã
#style-panel {
transition: all 0.7s;
}
JavaScript
ãã®ã³ã¼ãé¨åã§ã¯ãã¾ãã¹ã¿ã¤ã«ããã«ã¨ãã¹ã¦ã®ãã¿ã³ã®åç
§ãåå¾ãã¾ããã¾ã prevStyle ã¨ãã夿°ã使ããblack-white ã«è¨å®ãã¾ããããã¯ããã«ã«é©ç¨ãããåæé
è²ã§ãããèå³ã失ãããéã«ããã«ãè¿ãã¹ã¿ã¤ã«ã§ãããã¾ãã
const stylePanel = document.getElementById("style-panel");
const buttons = document.querySelectorAll("button");
let prevStyle = "black-white";
次ã«ãã¹ã¿ã¤ã«ããã«ã« interest 㨠loseinterest ã®ã¤ãã³ããªã¹ãã¼ãè¨å®ãã¦ããããã®ã¤ãã³ãããã¿ã³ã¸ã®èå³ã示ãããã¨ãã¨å¤±ãããã¨ãã«ããããã sampleStyle() 颿°ã¨ revertStyle() 颿°ãå¼ã³åºãããã«è¨å®ãã¾ããåæã«ãbuttons ã® NodeList ãã«ã¼ãå¦çããããããã®ãã¿ã³ã« click ã¤ãã³ããªã¹ãã¼ã追å ãã¾ããããã«ããããã¿ã³ãæ¼ãããéã« setStyle() 颿°ãå®è¡ãããããã«ãã¾ãã
stylePanel.addEventListener("interest", sampleStyle);
stylePanel.addEventListener("loseinterest", revertStyle);
buttons.forEach((button) => button.addEventListener("click", setStyle));
æå¾ã«ãåã®é¢æ°ãå®ç¾©ãã¾ãã
sampleStyle(): ãã¿ã³ã«å¯¾ãã¦é¢å¿ã示ãããå ´åããã®classã¯e.source.classNameããåå¾ããï¼InterestEvent.sourceã¯é¢å¿ã示ãããã¨ãã®é¢å¿ã¤ã³ãã¼ã«ã¼ãåç §ãã¦ããï¼ãe.target.classNameãä»ãã¦ã¹ã¿ã¤ã«ããã«ã«é©ç¨ããã¾ããrevertStyle(): é¢å¿ããªãå ´åãã¹ã¿ã¤ã«ããã«ã¯prevStyleã«æ ¼ç´ãããååã®ã¹ã¿ã¤ã«ã«æ»ãã¾ããsetStyle(): ãã¿ã³ãã¯ãªãã¯ãããã¨ããã®classNameãã¹ã¿ã¤ã«ããã«ã«é©ç¨ããã¾ããåæã«ã次ã«ã¹ã¿ã¤ã«ããã¬ãã¥ã¼ãããæç¹ã«ããã¦ããã«ãæ°ããååè¨å®ãããã¹ã¿ã¤ã«ã«æ»ãå¯è½ã確ä¿ãããããprevStyleãã¯ãªãã¯ããããã¿ã³ã®classNameã«æ´æ°ãã¾ãã
function sampleStyle(e) {
e.target.className = e.source.className;
}
function revertStyle(e) {
e.target.className = prevStyle;
}
function setStyle(e) {
stylePanel.className = e.target.className;
prevStyle = e.target.className;
}
çµæ
ããã¯æ¬¡ã®ããã«è¡¨ç¤ºããã¾ãã
ãã¿ã³ã«ã«ã¼ã½ã«ãåãããããã©ã¼ã«ã¹ãå½ã¦ããããã¨ãããã«ã§ãã®ã¹ã¿ã¤ã«ããã¬ãã¥ã¼ã§ãã¾ãããã¿ã³ãã¯ãªãã¯ããã¨ã¹ã¿ã¤ã«ãæ°¸ç¶çã«é©ç¨ããã¾ãã ãªããé¢å¿ã¤ã³ãã¼ã«ã¼ã«å¯¾å¿ãã¦ããªããã©ã¦ã¶ã¼ã§ãã£ã¦ããããã¬ãã¥ã¼ãæ©è½ã¯åä½ããªããã®ã®ãã¹ã¿ã¤ã«ã®è¨å®èªä½ã¯åä½ãã¾ãã