HTML popover ã°ãã¼ãã«å±æ§
Baseline
2024
*
æè¿å©ç¨å¯è½
April 2024以éããã®æ©è½ã¯ææ°ã®ãã¼ã¸ã§ã³ã®ç«¯æ«ããã³ãã©ã¦ã¶ã¼ã§åä½ãã¾ããå¤ã端æ«ããã©ã¦ã¶ã¼ã§ã¯åä½ããªããã¨ãããã¾ãã
* ãã®æ©è½ã®ä¸é¨ã¯ã対å¿ã¬ãã«ãç°ãªãå ´åãããã¾ãã
popover ã¯ã°ãã¼ãã«å±æ§ã§ãè¦ç´ ãããããªã¼ãã¼è¦ç´ ã¨ãã¦ç¤ºãããã«ä½¿ããã¾ãã
å¤
popover 屿§ã¯ã次ã®ããããã®å¤ãåããã¨ãã§ãã¾ãã
"auto"-
autoããããªã¼ãã¼ã¯ãç°¡åã«éããããã¨ãã§ãã¾ããããã¯ãããããªã¼ãã¼ã®å¤å´ãã¯ãªãã¯ãããã Esc ãã¼ãæ¼ããã¨ã§ããããªã¼ãã¼ãé表示ã«ã§ããã¨ãããã¨ã§ããautoããããªã¼ãã¼ã表示ããã¨ãå ¥ãåã«ãªã£ã¦ããªãéããé常ããã§ã«è¡¨ç¤ºããã¦ããä»ã®autoããããªã¼ãã¼ã¯éãããã¾ããã¡ã¢:
popoverã«ç©ºã®å¤ãè¨å®ããï¼popoverã¾ãã¯popover=""ï¼ãã¨ã¯ãpopover="auto"ãè¨å®ãããã¨ã¨åãã§ãã "hint"-
hintããããªã¼ãã¼ã¯ã表示æã«autoããããªã¼ãã¼ã¯éãã¾ãããããã以å¤ã®ãã³ãããããªã¼ãã¼ã¯éãã¾ãã ãããã¯ç°¡åã«éãããã¨ãã§ããéãããªã¯ã¨ã¹ãã«å¿çãã¾ãã "manual"-
manualããããªã¼ãã¼ã¯ãç°¡åã«éããããã¨ã¯ã§ãããèªåçã«éãããããã¨ãããã¾ãããããããªã¼ãã¼ã¯ã宣è¨çãªè¡¨ç¤º/é表示/åãæ¿ããã¿ã³ã¾ã㯠JavaScript ã使ç¨ãã¦ãæç¤ºçã«è¡¨ç¤ºããã³éããå¿ è¦ãããã¾ããè¤æ°ã®ç¬ç«ããmanualããããªã¼ãã¼ãåæã«è¡¨ç¤ºãããã¨ãã§ãã¾ãã
解説
ããããªã¼ãã¼è¦ç´ ã¯ãå¼ã³åºã/å¶å¾¡è¦ç´ ï¼ã¤ã¾ãã<button> ã¾ã㯠<input type="button"> ã«å¯¾å¿ãã popovertarget 屿§ãæã¤) ã¾ã㯠HTMLElement.showPopover() å¼ã³åºãã«ãã£ã¦éãããã¾ã§ãé表示ã«ãªã£ã¦ãã¾ãã
éãã¨ãããããªã¼ãã¼è¦ç´ 㯠æä¸ä½ã¬ã¤ã¤ã¼ å
ã®ä»ã®ãã¹ã¦ã®è¦ç´ ã®ä¸ã«ç¾ãã親è¦ç´ ã® position ã¾ã㯠overflow ã¹ã¿ã¤ã«è¨å®ã®å½±é¿ãåãã¾ããã
auto ç¶æ
ãæã¤ããããªã¼ãã¼ã¯ãé¢é£ä»ããããã³ã³ããã¼ã«ï¼popovertarget 屿§ã§æå®ï¼ã使ç¨ãã¦è¡¨ç¤ºããã³é表示ã«ãããã¨ãã§ããããããªã¼ãã¼é åã®å¤å´ãã¯ãªãã¯ããããå¥ã®ããããªã¼ãã¼ãéãããEsc ãã¼ãªã©ã®ãã©ã¦ã¶ã¼åºæã®æ©æ§ãæ¼ããã¨ã§ãç°¡åã«éããããã¨ãã§ãã¾ãã
é常ãç»é¢ã«ã¯ä¸åº¦ã« 1 ã¤ã® auto ããããªã¼ãã¼ãã表示ã§ãã¾ããã2 ã¤ç®ã®ããããªã¼ãã¼ã表示ããã¨ãæåã®ããããªã¼ãã¼ã¯é表示ã«ãªãã¾ãããã®è¦åã®ä¾å¤ã¯ãå
¥ãåã«ãªã£ãèªåããããªã¼ãã¼ãããå ´åã§ãã詳細ã«ã¤ãã¦ã¯ãå
¥ãåã«ãªã£ãããããªã¼ãã¼ ãåç
§ãã¦ãã ããã
JavaScript ã使ç¨ãã¦å¶å¾¡ãããã¨ãã§ãã¾ããä¾ãã°ãHTMLElement.togglePopover() ã¡ã½ããã使ç¨ããã¨ãããããªã¼ãã¼ã®è¡¨ç¤ºã¨é表示ãåãæ¿ãããã¨ãã§ãã¾ãã
対ç
§çã«ãmanual ããããªã¼ãã¼ã¯ãæåã§è¡¨ç¤ºããã³é表示ã«ããå¿
è¦ãããã¾ãã表示ãã¦ãä»ã®ããããªã¼ãã¼ã¯èªåçã«éãããããç°¡åã«éãããã¨ãã§ãã¾ãããããã«ãããè¤æ°ã®ããããªã¼ãã¼ãåæã«è¡¨ç¤ºãããç¨éã«ä½¿ç¨ã§ãã¾ãã
hint ããããªã¼ãã¼ã¯ã表示ãããã¨ãã« auto ããããªã¼ãã¼ãéãã¾ãããããã以å¤ã®ãã³ãããããªã¼ãã¼ã¯éãã¾ããç°¡åã«éãããã¨ãã§ããéãããªã¯ã¨ã¹ãã«ãå¿çãã¾ãã
é常ãhint ããããªã¼ãã¼ã¯ãmouseover/mouseout ã focus/ ãªã©ã®ã¯ãªãã¯ä»¥å¤ã® JavaScript ã¤ãã³ãã«å¿ãã¦è¡¨ç¤ºããã³é表示ã«ãªãã¾ãã blur ãªã©ã®ã¯ãªãã¯ä»¥å¤ã® JavaScript ã¤ãã³ãã«å¿ãã¦è¡¨ç¤ºããã³é表示ã«ãªãã¾ãããã¿ã³ãã¯ãªãã¯ã㦠hint ããããªã¼ãã¼ãéãããã«ãéãã¦ãã auto ããããªã¼ãã¼ãç°¡åã«éãããã¨ãçºçããã¾ãã
ä½¿ãæ¹ã«ã¤ãã¦ã®è©³ããæ å ±ã¯ãããããªã¼ãã¼ API ã©ã³ãã£ã³ã°ãã¼ã¸ãåç §ãã¦ãã ããã
ä¾
>è¦ç´ ãããããªã¼ãã¼ã«ãã
以ä¸ã®ã³ã¼ãã¯ãã¯ãªãã¯ããã¨ããããªã¼ãã¼è¦ç´ ãéããã¿ã³ã表示ãã¾ãããã®åä½ã¯ãHTML ã ãã§å®ç¾ã§ãã¾ãã
<button popovertarget="my-popover">ããããªã¼ãã¼ãéã</button>
<div popover id="my-popover">ç§ããçããã¸ãããã«ã¡ã¯ï¼</div>
ããããªã¼ãã¼å ã®ããããªã¼ãã¼
ãã®ä¾ã§ã¯ããã¿ã³ãã¯ãªãã¯ããã¨ãããã«å å ãããããããªã¼ãã¼ãå«ã¾ãã¦ããããããªã¼ãã¼ãéãã¾ãããããã®å å ãããããããªã¼ãã¼ã¯ãå ã ã®ã¡ãã¥ã¼ããããªã¼ãã¼ãéãããã¨ãªãéããã¨ãã§ãã¾ãã
HTML
HTML ã®æåã®é¨åã§ã¯ãããã¤ãã®ãæ°ã«å
¥ããå«ãã¡ãã¥ã¼ã§ããã¡ã¤ã³ã®ããããªã¼ãã¼ãéãããã® <button> ã使ãã¾ãã
<header>
<button popovertarget="menu">ã¡ãã¥ã¼ãéã</button>
</header>
<main>
<!-- ãã¼ã¸ã³ã³ãã³ããããã¸é
ç½® -->
</main>
HTML ã®å¾åã§ã¯ãåå使ãããã¿ã³ã«ãã£ã¦éãããã¡ãã¥ã¼ããããªã¼ãã¼ãçæãã¾ãããã®ã¡ãã¥ã¼ããããªã¼ãã¼ã«ã¯ãã¡ãã¥ã¼é
ç®ã®ç®æ¡æ¸ããªã¹ããå«ã¾ãã¦ãããããããã®é
ç®ã«ã¯å
å
ãããããããªã¼ãã¼ãéãæ
å ±ãã¿ã³ãä»ãã¦ãã¾ããã¡ãã¥ã¼ããããªã¼ãã¼ã§ã¯ popover="auto" ã使ç¨ãã¦ãã¾ããããã¯ãå
å
ãããããããªã¼ãã¼ãéããã¦ããã¡ãã¥ã¼ããããªã¼ãã¼èªä½ã¯éããããªãã¨ãããã¨ãæå³ãã¾ãã
<!-- menu popover -->
<div id="menu" popover="auto">
<ul>
<li>
<a href="#">æ°è¦ä½æãããã¨</a><button popovertarget="new-info">â</button>
</li>
<li>
<a href="#">éããã¨</a><button popovertarget="open-info">â</button>
</li>
<li>
<a href="#">ä¿åãããã¨</a><button popovertarget="save-info">â</button>
</li>
<li>
<a href="#">éãããã¨</a><button popovertarget="close-info">â</button>
</li>
</ul>
</div>
HTML ã®æå¾ã®é¨åã§ã¯ãããããã®ã¡ãã¥ã¼ã¢ã¤ãã ç¨ã®æ
å ±ããããªã¼ãã¼ã使ãã¾ããåããããªã¼ãã¼ã«ã¯ popover="hint" ãè¨è¼ããã¦ãããããã«ãã£ã¦å
ã®ã¡ãã¥ã¼ããããªã¼ãã¼ã¯éããããããã以å¤ã«ãéãã¦ããæ
å ±ããããªã¼ãã¼ã®ã¿ãéãããã¾ãã
<!-- info popovers -->
<div id="new-info" class="info-popover" popover="hint">
<strong>æ°è¦ä½æãã</strong>ãã¨ã«ã¤ãã¦ã®ããã¤ãã®æ
å ±ã§ãã
</div>
<div id="open-info" class="info-popover" popover="hint">
<strong>æ¢åã®ãã®ãéã</strong>ãã¨ã«ã¤ãã¦ã®ããã¤ãã®æ
å ±ã§ãã
</div>
<div id="save-info" class="info-popover" popover="hint">
<strong>ç¾å¨ã®ãã®ãä¿åãã</strong>ãã¨ã«ã¤ãã¦ã®ããã¤ãã®æ
å ±ã§ãã
</div>
<div id="close-info" class="info-popover" popover="hint">
<strong>ç¾å¨ã®ãã®ãéãã</strong>ãã¨ã«ã¤ãã¦ã®ããã¤ãã®æ
å ±ã§ãã
</div>
CSS
ã¡ãã¥ã¼ã®ããããªã¼ãã¼ã <button> ã®ä¸è¨ã«é
ç½®ããããã«ã¢ã³ã«ã¼ä½ç½®æå®ã使ç¨ããã¡ãã¥ã¼é
ç®ãæ
å ±ãã¿ã³ã®ã¬ã¤ã¢ã¦ãã«ã¯ã°ãªããã使ç¨ãã¾ããã
#menu {
margin: 0;
margin-top: 0.4rem;
inset: auto;
position-area: bottom;
}
#menu ul {
display: grid;
grid-template-columns: max-content 1fr;
gap: 0.4rem;
padding: 0.4rem;
}
#menu li {
grid-column: span 2;
display: grid;
grid: inherit;
grid-template-columns: subgrid;
gap: 1.4rem;
}
li [popovertarget] {
cursor: pointer;
font-size: 1.2rem;
}
li button {
border: none;
padding: 0;
background-color: inherit;
}
ããã§ã¯ãã¢ã³ã«ã¼ä½ç½®æå®ã使ç¨ãã¦ãåæ å ±ãã¿ã³ã®å³å´ã«æ å ±ããããªã¼ãã¼ãç¾ããããã«ãã¾ããã
div.info-popover {
margin: 2rem;
inset: auto;
max-width: 300px;
position-area: right;
}
çµæ
ãã¡ãã¥ã¼ãéãããã¿ã³ãã¯ãªãã¯ãã¦ãããã¡ãã¥ã¼é ç®ã®æ¨ªã«ããæ å ±ã¢ã¤ã³ã³ (â) ãã¯ãªãã¯ããæ å ±ããããªã¼ãã¼ãéãã¦ã¿ã¦ãã ããã
ã¡ã¢: MDN ã«ããããããªã¼ãã¼ã®ä¾ã®å®å ¨ãªä¾ã«ã¢ã¯ã»ã¹ããã«ã¯ãããããªã¼ãã¼ API ä¾ã®ã©ã³ãã£ã³ã°ãã¼ã¸ãåç §ãã¦ãã ããã
仿§æ¸
| 仿§æ¸ |
|---|
| HTML > # the-popover-attribute > |
ãã©ã¦ã¶ã¼ã®äºææ§
é¢é£æ å ±
- ããããªã¼ãã¼ API
- HTML ã®
popovertarget屿§ - HTML ã®
popovertargetaction屿§ - CSS ã®
::backdropæ¬ä¼¼è¦ç´ - CSS ã®
:popover-openæ¬ä¼¼ã¯ã©ã¹