ããããªã¼ãã¼ API ã®ä½¿ç¨
ããããªã¼ãã¼ API ã¯ãä»ã®ãã¼ã¸ã³ã³ãã³ãã®ä¸ã«è¡¨ç¤ºããããããªã¼ãã¼ã®ã³ã³ãã³ãã表示ããããã®ãæ¨æºçãªãä¸è²«æ§ã®ãããæè»ãªä»çµã¿ãéçºè ã«æä¾ãã¾ããããããªã¼ãã¼ã®ã³ã³ãã³ãã¯ãHTML 屿§ãç¨ãã¦å®£è¨çã«ãã¾ã㯠JavaScript ãç¨ãã¦å¶å¾¡ãããã¨ãã§ãã¾ãããã®è¨äºã§ã¯ããã®æ©è½ã®ãã¹ã¦ã使ç¨ããããã®è©³ç´°ãªã¬ã¤ããæä¾ãã¾ãã
宣è¨çãªããããªã¼ãã¼ã®ä½æ
æãåç´ãªå½¢ã§ã¯ãããããªã¼ãã¼ã®ã³ã³ãã³ããå«ã HTML è¦ç´ ã« popover 屿§ã追å ããã°ãããããªã¼ãã¼ã使ããã¾ããã¾ããããããªã¼ãã¼ã¨ãã®ã³ã³ããã¼ã«ãé¢é£ä»ããããã« id ãå¿
è¦ã§ãã
<div id="mypopover" popover>ããããªã¼ãã¼ã®ã³ã³ãã³ã</div>
ã¡ã¢:
å¤ãªãã§ popover 屿§ã追å ããã¨ã popover="auto" ãè¨å®ããã®ã¨åãã«ãªãã¾ãã
ãã®å±æ§ã追å ããã¨ãdisplay: none ããã®è¦ç´ ã«è¨å®ãããã¨ã§ããã¼ã¸èªã¿è¾¼ã¿æã«é表示ã«ãããã¨ãã§ãã¾ããããããªã¼ãã¼ã®è¡¨ç¤ºã»é表示ãåãæ¿ããã«ã¯ã1 ã¤ä»¥ä¸ã®å¶å¾¡ãã¿ã³ï¼ããããªã¼ãã¼ã¤ã³ãã¼ã«ã¼ã¨ãå¼ã°ããï¼ã追å ããå¿
è¦ãããã¾ãã<button>ï¼ã¾ã㯠<input> ã® type="button"ï¼ã« popovertarget 屿§ããå¶å¾¡ããããããªã¼ãã¼ã® ID ãå¤ã¨ãã¦è¨å®ãããã¨ãããã¨ã«ãããããããªã¼ãã¼å¶å¾¡ãã¿ã³ã«è¨å®ãããã¨ãã§ãã¾ãã
<button popovertarget="mypopover">ããããªã¼ãã¼ãåãæ¿ã</button>
<div id="mypopover" popover>ããããªã¼ãã¼ã®ã³ã³ãã³ã</div>
æ¢å®ã§ã¯ããã¿ã³ã¯ãã°ã«ãã¿ã³ã«ãªã£ã¦ãã¾ããç¹°ãè¿ãæ¼ãã¨ãããããªã¼ãã¼ã®è¡¨ç¤ºã¨é表示ãåãæ¿ããã¾ãã
ãã®åä½ã夿´ãããå ´åã¯ã popovertargetaction 屿§ã使ç¨ãã¾ã - ãã㯠"hide"ã"show"ã"toggle" ã®ä½ããã®å¤ãåãã¾ããä¾ãã°ã表示ãã¿ã³ã¨é表示ãã¿ã³ãå¥åã«ä½æããã«ã¯ã次ã®ããã«ãã¾ãã
<button popovertarget="mypopover" popovertargetaction="show">
ããããªã¼ãã¼ã表示
</button>
<button popovertarget="mypopover" popovertargetaction="hide">
ããããªã¼ãã¼ãé表示
</button>
<div id="mypopover" popover>ããããªã¼ãã¼ã®ã³ã³ãã³ã</div>
åºæ¬çãªå®£è¨çããããªã¼ãã¼ã®ä¾ï¼ã½ã¼ã¹ï¼ã§ãä¸è¨ã®ã³ã¼ãçãã©ã®ããã«è¦ãããã確èªã§ãã¾ãã
ã¡ã¢:
popovertargetaction 屿§ãçç¥ãããã¨ãå¶å¾¡ãã¿ã³ã§å®è¡ãããæ¢å®ã®ã¢ã¯ã·ã§ã³ã¯ "toggle" ã«ãªãã¾ãã
ããããªã¼ãã¼ã表示ãããã¨ãdisplay: noneãåé¤ããã¦æä¸ä½ã¬ã¤ã¤ã¼ã«é
ç½®ãããä»ã®ãã¹ã¦ã®ãã¼ã¸ã®ã³ã³ãã³ãã®ä¸ã«ç½®ãããããã«ãªãã¾ãã
command 㨠commandfor
commandfor 屿§ã¨ command 屿§ã¯ãpopovertarget ããã³ popovertargetaction ã¨ã¨ã¦ãããä¼¼ãæ©è½ãæä¾ãã¾ãããããä¸è¬çãªè¨è¨ã¨ãªã£ã¦ãããããããªã¼ãã¼ã³ãã³ã以å¤ã®æ©è½ï¼ç¬èªã®ã³ãã³ããå«ãï¼ãæä¾ãããã¨ãç®çã¨ãã¦ãã¾ãã
ååã®ã³ã¼ãã¹ããããã¯åæ§ã«æ¸ãæãå¯è½ã§ãã
<button commandfor="mypopover" command="show-popover">ããããªã¼ãã¼ã表示</button>
<button commandfor="mypopover" command="hide-popover">ããããªã¼ãã¼ãé表示</button>
<div id="mypopover" popover>ããããªã¼ãã¼ã®ã³ã³ãã³ã</div>
èªåç¶æ ã¨ãç°¡åãªè§£é¤ã
ä¸è¨ã®ããã«ãããããªã¼ãã¼è¦ç´ ã« popover ã¾ã㯠popover="auto" ãè¨å®ããã¦ããå ´åããã®è¦ç´ ã¯èªåç¶æ
(auto state) ã§ããã¨è¨ãã¾ããèªåç¶æ
ã«ã¤ãã¦æ³¨æãã¹ãéè¦ãªåä½ã 2 ã¤ããã¾ãã
- ããããªã¼ãã¼ã¯ãç°¡åã«è§£é¤ããã("light dismissed") ãã¨ãã§ãã¾ããããã¯ãããããªã¼ãã¼ã®å¤å´ãã¯ãªãã¯ãããã¨ã«ãã£ã¦ãããããªã¼ãã¼ãéãããã¨ãã§ããã¨ããæå³ã§ãã
- ããããªã¼ãã¼ã¯ã Esc ãã¼ãæ¼ããªã©ããã©ã¦ã¶ã¼ä¾åã®ä»çµã¿ã使ã£ã¦éãããã¨ãã§ãã¾ãã
- é常ãä¸åº¦ã«è¡¨ç¤ºã§ãã
autoããããªã¼ãã¼ã¯ 1 ã¤ã ãã§ãããã§ã« 1 ã¤ã®ããããªã¼ãã¼ã表示ããã¦ããã¨ã ã« 2 ã¤ç®ã表示ããã¨ãæåã®ããããªã¼ãã¼ãéãã¦ãã¾ãã¾ãããã®ã«ã¼ã«ã®ä¾å¤ã¯ãå ¥ãåã®ãªã¼ãããããªã¼ãã¼ãããå ´åã§ãã詳ããã¯ãå ¥ãåã®ããããªã¼ãã¼ã®ç¯ãåç §ãã¦ãã ããã
ã¡ã¢:
popover="auto" ããããªã¼ãã¼ã¯ãææ¸å
ã®ä»ã®è¦ç´ ã§ HTMLDialogElement.showModal() ã Element.requestFullscreen() ã®å¼ã³åºããæåããå ´åã«ãéãã¾ãããããããããã®ã¡ã½ããã表示ããã¦ããããããªã¼ãã¼ã«å¯¾ãã¦å¼ã³åºãã¨å¤±æãããã¨ã«çæãã¦ãã ãããããããç¾å¨è¡¨ç¤ºããã¦ããªã popover 屿§ãæã¤è¦ç´ ã«å¯¾ãã¦ãããã®ã¡ã½ãããå¼ã³åºããã¨ã¯ã§ãã¾ãã
èªåç¶æ ã¯ãä¸åº¦ã«åä¸ã®ããããªã¼ãã¼ã ãã示ãããå ´åã«æçãªæ©è½ã§ãã表示ããããã¥ã¼ããªã¢ã«ã® UI ã¡ãã»ã¼ã¸ãè¤æ°ãããã表示ãä¹±éã«ãªã£ã¦æ··ä¹±ããã®ãé¿ãããå ´åããæ°ããç¶æ ãååã®ç¶æ ã䏿¸ããããããªã¹ãã¼ã¿ã¹ã¡ãã»ã¼ã¸ã表示ããå ´åãªã©ã«å©ç¨ã§ãã¾ãã
ä¸è¨ã®ãããªåä½ã¯ãè¤æ°ã®èªåããããªã¼ãã¼ã®ä¾ï¼ã½ã¼ã¹ï¼ã§å®éã«è¦ããã¨ãã§ãã¾ããããããªã¼ãã¼ã表示ããå¾ã«ç°¡åã«è§£é¤ãã¦ã¿ã¦ãåæã«ä¸¡æ¹ã表示ãããã¨ããã¨ãã«ã©ããªãããè¦ã¦ã¿ã¾ãããã
ããããªã¼ãã¼ã®ã¢ã¯ã»ã·ããªãã£æ©è½
ããããªã¼ãã¼ã¨ãã®å¶å¾¡å
ï¼ã¤ã³ãã¼ã«ã¼ï¼ã popovertarget 屿§ã§é¢é£ä»ããããã¨ãAPI ã¯èªåçã«ç°å¢ã«å¯¾ãã¦ä»¥ä¸ã® 2 ã¤ã®å¤æ´ãå ãããã¼ãã¼ãæä½ãæ¯æ´æè¡ (AT) ãå©ç¨ããã¦ã¼ã¶ã¼ãããããªã¼ãã¼ã«ä½ç¨ãããã¨ãã§ããããã«ãã¾ãã
- ããããªã¼ãã¼ã表示ãããã¨ããã¼ãã¼ããã©ã¼ã«ã¹ããã²ã¼ã·ã§ã³é åºãæ´æ°ãããããããªã¼ãã¼ã次ã®é åºã«ãªãã¾ããä¾ãã°ããã¿ã³ãæ¼ãã¦ããããªã¼ãã¼ã表示ãããå ´åãããããªã¼ãã¼å ã®ãã¿ã³ã¯ã¿ãé åºã§æ¬¡ã«ãªãã¾ãï¼Tab ãã¼ãæ¼ãã¨ãã©ã¼ã«ã¹ããã¾ãï¼ãéã«ããã¼ãã¼ãæä½ï¼é常㯠Esc ãã¼ï¼ã§ããããªã¼ãã¼ãéããã¨ããã©ã¼ã«ã¹ã¯ã¤ã³ãã¼ã«ã¼ã«æ»ãã¾ãã
- ã¹ã¯ãªã¼ã³ãªã¼ãã¼ãªã©ã®æ¯æ´æè¡ãã¤ã³ãã¼ã«ã¼ã¨ããããªã¼ãã¼ã®é¢ä¿ãçè§£ãããã¨ãã§ããããã«ããããã両è
ã®éã«æé»ã®
aria-detailsããã³aria-expandedã®é¢ä¿ãè¨å®ããã¾ãã
ãã®æ¹æ³ã§ããããªã¼ãã¼ã¨ãã®ã³ã³ããã¼ã«éã®é¢ä¿ãè¨å®ããã¨ãåæã«ä¸¡è ã®éã«æé»ã®ã¢ã³ã«ã¼åç §ã使ããã¾ãã詳細ã¯ããããªã¼ãã¼ã®ã¢ã³ã«ã¼ä½ç½®æå®ãåç §ãã¦ãã ããã
ããããªã¼ãã¼ã¨ã¤ã³ãã¼ã«ã¼ã®é¢ä¿ãè¨å®ããä»ã®æ¹æ³
ããããªã¼ãã¼ã¨ã¤ã³ãã¼ã«ã¼ã®é¢ä¿ã¯ãpopovertarget 屿§ã使ç¨ãã以å¤ã«ããä»ã®æ¹æ³ã§è¨å®ãããã¨ãã§ãã¾ãã
HTMLElement.showPopover()ã¾ãã¯HTMLElement.togglePopover()ã¡ã½ããã®sourceãªãã·ã§ã³ã使ç¨ãã¾ãããã®å ´åããã©ã¼ã«ã¹ããã²ã¼ã·ã§ã³é åºã®å¤æ´ã®ã¿ãè¡ãããæé»ã® ARIA é¢ä¿ã¯å¤æ´ãããªããã¨ã«çæãã¦ãã ãããããã¯ãsourceãªãã·ã§ã³ã<button>è¦ç´ ã ãã§ãªãããããã種é¡ã®è¦ç´ ã«è¨å®å¯è½ã§ããããã®é¢ä¿ãæå³ããªãã¨ã¯ä¿è¨¼ã§ããªãããã§ãã<select>è¦ç´ ã¨ãã®ãããããã¦ã³ããã«ã¼ã®éã§ãã«ã¹ã¿ãã¤ãºå¯è½ãª select è¦ç´ ã®æ©è½ã«çµã¿è¾¼ãå ´åãappearanceããããã£ã®base-selectå¤ãä»ãã¦è¡ããã¾ãããã®å ´åã両è ã®éã«æé»ã®ããããªã¼ãã¼ã¨ã¤ã³ãã¼ã«ã¼ã®é¢ä¿ãçæããã¾ãã
æåã®ããããªã¼ãã¼ç¶æ ã®ä½¿ç¨
èªåç¶æ
ã®ã»ãã«ãæåç¶æ
ããããããã¯ããããªã¼ãã¼è¦ç´ ã« popover="manual" ãè¨å®ãããã¨ã§è¨å®ãããã¨ãã§ãã¾ãã
<div id="mypopover" popover="manual">ããããªã¼ãã¼ã®ã³ã³ãã³ã</div>
ãã®ç¶æ ã§ã¯ã次ã®ããã«ãªãã¾ãã
- ããããªã¼ãã¼ã¯ãç°¡åã«è§£é¤ããããã¨ã¯ã§ãã¾ãããã宣è¨çãªè¡¨ç¤º/é表示/ãã°ã«ãã¿ã³ï¼å ã«è¦ãã¨ããï¼ã¯å¼ãç¶ãæ©è½ãã¾ãã
- ç¬ç«ããè¤æ°ã®ããããªã¼ãã¼ãåæã«è¡¨ç¤ºãããã¨ãã§ãã¾ãã
ãã®åä½ã¯ãè¤æ°ã®æåããããªã¼ãã¼ã®ä¾ï¼ã½ã¼ã¹ï¼ã§ç¢ºèªãããã¨ãã§ãã¾ãã
beforetoggle ããã³ toggle ã¤ãã³ã
ããããªã¼ãã¼ã®è¡¨ç¤ºã¾ãã¯é表示ã«å¯¾ãã¦ã¯ãbeforetoggle ããã³ toggle ã¤ãã³ãã使ç¨ãã¦å¿çãããã¨ãã§ãã¾ãã
beforetoggleã¯ãããããªã¼ãã¼ã表示ã¾ãã¯é表示ã«ãªãç´åã«çºçãã¾ããä¾ãã°ãããããªã¼ãã¼ã®è¡¨ç¤ºã¾ãã¯é表示ã鲿¢ããããï¼Event.preventDefault()ã使ç¨ï¼ãããããªã¼ãã¼ã«ã¢ãã¡ã¼ã·ã§ã³ã追å ãã¦ã¢ãã¡ã¼ã·ã§ã³ãé©ç¨ãããããã¾ãã¯ä½¿ç¨å¾ã®ããããªã¼ãã¼ã®ç¶æ ãã¯ãªã¼ã³ã¢ããããããã«ä½¿ç¨ã§ãã¾ããtoggleã¯ãããããªã¼ ãã¼ã表示ã¾ãã¯é表示ã«ãªã£ãç´å¾ã«çºçãã¾ããããã¯é常ãããããªã¼ãã¼ã®ãã°ã«ç¶æ ã®å¤åã«å¯¾ããå¿çã¨ãã¦ããã®ä»ã®ã³ã¼ããå®è¡ããããã«ä½¿ç¨ããã¾ãã
ãããã®ã¤ãã³ãã¯ã©ã¡ãã ToggleEvent ã¤ãã³ããªãã¸ã§ã¯ããæã¡ã¾ãããã®ã¤ãã³ãã¯ãããã©ã«ãã® Event ãªãã¸ã§ã¯ãããç¶æ¿ãããæ©è½ã«å ãã¦ãæ¬¡ã®æ©è½ãåãã¦ãã¾ãã
oldStateããã³newStateããããã£ã¯ãããããªã¼ãã¼ããã©ã³ã¸ã·ã§ã³ããç´åã®ç¶æ ã¨ãã©ã³ã¸ã·ã§ã³å ã®ç¶æ ã示ãã¾ããããã«ãããããããªã¼ãã¼ãéãããéãããããéã«ãç¹å®ã®å¦çãå®è¡ãããã¨ãã§ãã¾ããsourceããããã£ã«ã¯ããã°ã«ãèµ·åãã HTML ããããªã¼ãã¼å¶å¾¡è¦ç´ ã¸ã®åç §ãå«ã¾ãã¾ããããã«ãããã©ã®å¶å¾¡ããã°ã«ãèµ·åãããã«å¿ãã¦ããã°ã«ã¤ãã³ãã¸ã®ã¬ã¹ãã³ã¹ã¨ãã¦ç°ãªãã³ã¼ããå®è¡ã§ãã¾ãã
å ¸åçãªä½¿ç¨ä¾ã¯ã次ã®ããã«ãªãã¾ãã
const popover = document.getElementById("mypopover");
popover.addEventListener("toggle", (e) => {
console.log(e.newState);
});
詳細æ å ±ã¨ä¾ã«ã¤ãã¦ã¯ãååã®åç §ãªã³ã¯ãåç §ãã¦ãã ããã
JavaScript ã§ããããªã¼ãã¼ã表示
JavaScript API ã使ç¨ãã¦ããããªã¼ãã¼ãå¶å¾¡ãããã¨ãã§ãã¾ãã
HTMLElement.popover ããããã£ã使ç¨ãã¦ãpopover 屿§ãåå¾ãããè¨å®ããããããã¨ãã§ãã¾ããããã使ç¨ã㦠JavaScript ã§ããããªã¼ãã¼ã使ãããã¨ãã§ããæ©è½æ¤åºã«ãå©ç¨ã§ãã¾ããä¾ãã°ãã®ããã«ãªãã¾ãã
function supportsPopover() {
return Object.hasOwn(HTMLElement.prototype, "popover");
}
åæ§ã«ã
HTMLButtonElement.popoverTargetElementã¨HTMLInputElement.popoverTargetElementã¯popovertarget屿§ã«ç¸å½ããããããªã¼ãã¼ã«å¯¾ããå¶å¾¡ãã¿ã³ã®è¨å®ãè¡ããã¨ãã§ãã¾ãããããããã£å¤ã¨ãã¦ã¯å¶å¾¡ãã¹ãããããªã¼ãã¼ã® DOM è¦ç´ ã®åç §ãåãã¾ããHTMLButtonElement.popoverTargetActionã¨HTMLInputElement.popoverTargetAction㯠HTML ã®popovertargetactionã°ãã¼ãã«å±æ§ã«ç¸å½ããå¶å¾¡ãã¿ã³ãããããã¢ã¯ã·ã§ã³ãæå®ãããã¨ãã§ããããã«ãã¾ãã
ãã® 3 ã¤ãçµã¿åãããã¨ã次ã®ããã«ããããªã¼ãã¼ã¨ãã®å¶å¾¡ãã¿ã³ãããã°ã©ã çã«è¨å®ãããã¨ãã§ãã¾ãã
const popover = document.getElementById("mypopover");
const toggleBtn = document.getElementById("toggleBtn");
const keyboardHelpPara = document.getElementById("keyboard-help-para");
const popoverSupported = supportsPopover();
if (popoverSupported) {
popover.popover = "auto";
toggleBtn.popoverTargetElement = popover;
toggleBtn.popoverTargetAction = "toggle";
} else {
toggleBtn.style.display = "none";
}
ã¾ãã表示ã»é表示ãå¶å¾¡ããããã«ããã¤ãã®ã¡ã½ãããããã¾ãã
HTMLElement.showPopover()ã§ããããªã¼ãã¼ã表示ãã¾ããHTMLElement.hidePopover()ã§ããããªã¼ãã¼ãé表示ã«ãã¾ããHTMLElement.togglePopover()ã§ããããªã¼ãã¼ããã°ã«åãæ¿ããã¾ãã
ä¾ãã°ããã¿ã³ãã¯ãªãã¯ãããããã¼ãã¼ãã®ç¹å®ã®ãã¼ãæ¼ããããããã¨ã§ãããããªã¼ãã¼ã®ãªã³/ãªãã®åãæ¿ããæ¯æ´ããæ©è½ãæä¾ãããå ´åãããã¾ããæåã®ãã®ã¯å®£è¨çã«å®ç¾ã§ãã¾ãããä¸ã«ç¤ºããããã« JavaScript ã使ç¨ãã¦å®ç¾ãããã¨ãã§ãã¾ãã
2 ã¤ç®ã«ã¤ãã¦ã¯ãããããªã¼ãã¼ãéãããã®ãã¼ã¨éããããã®ãã¼ã® 2 ã¤ãããã°ã©ã ããã¤ãã³ããã³ãã©ã¼ã使ãããã¨ãã§ãã¾ãã
document.addEventListener("keydown", (event) => {
if (event.key === "h") {
if (popover.matches(":popover-open")) {
popover.hidePopover();
}
}
if (event.key === "s") {
if (!popover.matches(":popover-open")) {
popover.showPopover();
}
}
});
ãã®ä¾ã§ã¯ãElement.matches() ã使ç¨ãã¦ãããããªã¼ãã¼ãç¾å¨è¡¨ç¤ºããã¦ãããã©ãããããã°ã©ã ã§èª¿ã¹ã¦ãã¾ãã:popover-open æ¬ä¼¼ã¯ã©ã¹ã¯ãç¾å¨è¡¨ç¤ºããã¦ããããããªã¼ãã¼ã ãã«ä¸è´ãã¾ããããã¯ããã§ã«è¡¨ç¤ºããã¦ããããããªã¼ãã¼ã表示ãããã¨ãããããã§ã«é表示ã«ãªã£ã¦ããããããªã¼ãã¼ãé表示ã«ãããã¨ããã¨ãã«çºçããã¨ã©ã¼ãé¿ããããã«éè¦ã§ãã
å¥ã®æ¹æ³ã¨ãã¦ã次ã®ããã«åä¸ã®ãã¼ã§ããããªã¼ãã¼ã®è¡¨ç¤ºã¨é表示ãããã°ã©ã ãããã¨ãã§ãã¾ãã
document.addEventListener("keydown", (event) => {
if (event.key === "h") {
popover.togglePopover();
}
});
JavaScript ã®ããããªã¼ãã¼ã®ããããã£ãæ©è½æ¤åºã`togglePopover()' ã¡ã½ããã®åä½ã¯ããã°ã«ãã«ã UI ã®ä¾ï¼ã½ã¼ã¹ï¼ãã覧ãã ããã
å ¥ãåã®ããããªã¼ãã¼
è¤æ°ã®ãªã¼ãããããªã¼ãã¼ãä¸åº¦ã«è¡¨ç¤ºããªãã¨ããã«ã¼ã«ã«ã¯ãä¾å¤ãããã¾ããäºãã«å ¥ãåã«ãªã£ã¦ããå ´åã§ãããããã®å ´åãè¤æ°ã®ããããªã¼ãã¼ã¯ãäºãã®é¢ä¿ãããåæã«éããã¨ã許å¯ããã¾ãããã®ãã¿ã¼ã³ã¯ãå ¥ãåå¼ããããªã¼ãã¼ã¡ãã¥ã¼ã®ãããªç¨éã«å½¹ç«ã¡ã¾ãã
å ¥ãåã®ããããªã¼ãã¼ã使ããæ¹æ³ã¯ã3 ã¤ããã¾ãã
-
DOM ã§ã®ç´æ¥ã®åå«ã«ãã
html<div popover> 親 <div popover>å</div> </div> -
è¦ç´ ãå¼ã³åºã/å¶å¾¡
html<div popover> 親 <button popovertarget="foo">ãã¡ããã¯ãªãã¯</button> </div> <div popover id="foo">å</div> -
anchor屿§ã«ããhtml<div popover id="foo">親</div> <div popover anchor="foo">å</div>
ä¾ã¯ãå ¥ãåã¡ãã¥ã¼ã®ä¾ï¼ã½ã¼ã¹ï¼ãåç §ãã¦ãã ããããã¦ã¹ããã¼ãã¼ãã®æä½ã§ãµãããããªã¼ãã¼ãé©åã«è¡¨ç¤ºã»é表示ãåãæ¿ãããããã¾ããã©ã¡ããã®ãªãã·ã§ã³ã鏿ãããã¨ãã«ä¸¡æ¹ã®ã¡ãã¥ã¼ãé表示ã«ããããã«ãããã¤ãã®ã¤ãã³ããã³ãã©ã¼ã使ç¨ããã¦ãããã¨ããããã¾ããSPA ãè¤æ°ãã¼ã¸ã®ã¦ã§ããµã¤ãã§ã¯ãæ°ããã³ã³ãã³ãã®èªã¿è¾¼ã¿ãã©ã®ããã«å¦çãããã«ãã£ã¦ããããã®ãã¡ã®ããã¤ãã¯å¿ è¦ãªãããããã¾ãããããã®ãã¢ã§ã¯èª¬æã®ããã«å«ãã¦ãã¾ãã
ããããªã¼ãã¼ã® "hint" ç¶æ ã®ä½¿ç¨
使ã§ããããããªã¼ãã¼ã«ã¯ 3 ã¤ç®ã®ç¨®é¡ã¨ãã¦ããã³ãããããªã¼ãã¼ãããã¾ããããã¯ããããªã¼ãã¼è¦ç´ ã« popover="hint" ãè¨å®ãããã¨ã§æå®ãã¾ããhint ããããªã¼ãã¼ã¯è¡¨ç¤ºæã« auto ããããªã¼ãã¼ãéãã¾ãããããã以å¤ã® hint ããããªã¼ãã¼ã¯éãã¾ããç°¡åã«éãããå¯è½ã§ãéãããªã¯ã¨ã¹ãã«ãå¿çãã¾ãã
ããã¯ãä¾ãã°ãã¼ã«ãã¼ãã¿ã³ãæ¼ã㨠UI ããããªã¼ãã¼ã表示ã§ãããã¿ã³ã§ããã¨åæã«ããã¿ã³ã«ãã¤ã³ã¿ã¼ãå½ã¦ãéã« UI ããããªã¼ãã¼ãéããã«ãã¼ã«ãããã表示ãããå ´åãªã©ã«æç¨ã§ãã
hint ããããªã¼ãã¼ã¯ãéã¯ãªã㯠JavaScript ã¤ãã³ãï¼mouseover/mouseout ã focus/ blur ãªã©ï¼ãçºçããã¨ãè¦ç´ ã¯è¡¨ç¤ºã»é表示ããã¾ãããã¿ã³ãã¯ãªãã¯ã㦠hint ããããªã¼ãã¼ãéãããã® JavaScript ãå®è¡ãããã¨ãéãã¦ãã auto ããããªã¼ãã¼ã¯ç°¡åã«è§£é¤ãããããã«ãªãã¾ãã
以ä¸ã®åä½ãæ£ç¢ºã«åç¾ããä¾ã«ã¤ãã¦ã¯ãããããªã¼ãã¼ãã³ãã®ãã¢ï¼ã½ã¼ã¹ï¼ãã覧ãã ããããã®ãã¢ã§ã¯ãã¿ã³ãã¼ãæ¡ç¨ãã¦ãã¾ãããã¿ã³ãæ¼ãã¨ãauto ãããã¢ãããµãã¡ãã¥ã¼ã表示ãããããã«è©³ç´°ãªãªãã·ã§ã³ã鏿ãããã¨ãå¯è½ã«ãªãã¾ãããã ãããã¿ã³ã«å½ã¦ãã¾ãã¯ãã©ã¼ã«ã¹ããéã«ã¯ãåãã¿ã³ã®æ©è½ã示ããã¼ã«ãããï¼hint ããããªã¼ãã¼ï¼ãåæã«è¡¨ç¤ºããã¾ãããã®ãã¼ã«ãããã¯ãç¾å¨è¡¨ç¤ºä¸ã®ãµãã¡ãã¥ã¼ãé表示ã«ãã¾ããã
ä¸è¨ã®ç¯ã§ã¯ãã³ã¼ãã®éè¦ãªé¨åããã¹ã¦è¿½ã£ã¦ã¿ã¾ãããã
ã¡ã¢:
hint ããããªã¼ãã¼ã¯ãmanual ããããªã¼ãã¼ã¨åæã«ä½¿ç¨ã§ãã¾ãããå®éã«ã¯ãã®å¿
è¦æ§ã¯ãã¾ãããã¾ããããããã¯ä¸»ã« auto ããããªã¼ãã¼ã®å¶éãåé¿ããããã«è¨è¨ããã¦ããããã®ç¯ã§è©³ç´°ã«èª¬æããããã«ç¨éãæ¡å¤§ãããã¨ãã§ãã¾ãã
ãªããpopover="hint" ã¯æªå¯¾å¿ãã©ã¦ã¶ã¼ã§ã¯ popover="manual" ã«ä»£æ¿ããã¾ãã
ã¡ã¢: é¢é£ããæ©è½ã¨ãã¦ãã¤ã³ã¿ã¬ã¹ãã¤ã³ãã¼ã«ã¼ãããã¾ãããã㯠JavaScript ãå¿ è¦ã¨ããã«ãããã¼/ãã©ã¼ã«ã¹æã®ããããªã¼ãã¼æ©è½ã便å©ãã¤ä¸è²«ãã¦çæããããã«ä½¿ç¨ã§ãã¾ãã詳細ã«ã¤ãã¦ã¯ãã¤ã³ã¿ã¬ã¹ãã¤ã³ãã¼ã«ã¼ã®ä½¿ç¨æ¹æ³ãã覧ãã ããã
popover="auto" ã«ãããµãã¡ãã¥ã¼ã®ä½æ
ãããã¢ãããµãã¡ãã¥ã¼ã¯ãauto ããããªã¼ãã¼ã宣è¨çã«ä½¿ç¨ããå½¢ã§çæããã¾ãã
ã¾ããå¶å¾¡ãã¿ã³ã§ãã
<section id="button-bar">
<button popovertarget="submenu-1" popovertargetaction="toggle" id="menu-1">
ã¡ãã¥ã¼ A
</button>
<button popovertarget="submenu-2" popovertargetaction="toggle" id="menu-2">
ã¡ãã¥ã¼ B
</button>
<button popovertarget="submenu-3" popovertargetaction="toggle" id="menu-3">
ã¡ãã¥ã¼ C
</button>
</section>
ããã¦ãããããªã¼ãã¼èªèº«ã§ãã
<div id="submenu-1" popover="auto">
<button>é¸æè¢ A</button><br /><button>é¸æè¢ B</button>
</div>
<div id="submenu-2" popover="auto">
<button>é¸æè¢ A</button><br /><button>é¸æè¢ B</button>
</div>
<div id="submenu-3" popover="auto">
<button>é¸æè¢ A</button><br /><button>é¸æè¢ B</button>
</div>
popover="hint" ã«ãããã¼ã«ãããã®ä½æ
ãµãã¡ãã¥ã¼ã®ããããªã¼ãã¼ã¯ç¾ç¶ã§ãåé¡ãªãåä½ãããã¼ã«ãã¼ãã¿ã³ãæ¼ãã¨éãããã®ãã®ã¨ãã¦æ©è½ãã¦ãã¾ãããããããã¿ã³ã«ããã¼/ãã©ã¼ã«ã¹ããéã«åæã«ãã¼ã«ãããã表示ãããã«ã¯ã©ãããã°ããã§ããããï¼ã¾ããHTML å
ã§ hint ããããªã¼ãã¼ã使ç¨ãã¦ãã¼ã«ãããã使ãã¾ãã
<div id="tooltip-1" class="tooltip" popover="hint">ãã¼ã«ããã A</div>
<div id="tooltip-2" class="tooltip" popover="hint">ãã¼ã«ããã B</div>
<div id="tooltip-3" class="tooltip" popover="hint">ãã¼ã«ããã C</div>
ã¡ã¢:
ãã®ãã¢ã§ã¯ã½ã¼ã¹ã³ã¼ãã«ããã¦ããã¼ã«ãããã¯ããããªã¼ãã¼ã³ã³ããã¼ã«ãã¿ã³å
ã«å
¥ãåã«ãªã£ã¦ãã¾ããããã¯ãCSS ã¢ã³ã«ã¼ä½ç½®æå®ã«å¯¾å¿ãã¦ããªããã©ã¦ã¶ã¼ã«ããã¦ãããåªããä»£æ¿ææ®µãæä¾ããããã§ããã¤ã¾ããhint ããããªã¼ãã¼ã¯é¢é£ä»ããããã³ã³ããã¼ã«ãã¿ã³ã®é£ã«è¡¨ç¤ºãããå
¨ãç°ãªãå ´æã«è¡¨ç¤ºããããã¨ã¯ããã¾ããã
表示/é表示ãå¶å¾¡ããã«ã¯ãJavaScript ã使ç¨ããå¿
è¦ãããã¾ããæåã«ãhint ããããªã¼ãã¼ã¨å¶å¾¡ãã¿ã³ã 2 ã¤ã®å¥åã® NodeList ã§åå¾ããããã«ã Document.querySelectorAll() ã使ç¨ãã¦ãã¾ãã
const tooltips = document.querySelectorAll(".tooltip");
const btns = document.querySelectorAll("#button-bar button");
次ã«ã颿° addEventListeners() ã使ãã¾ããããã¯ã4 ã¤ã®ã¤ãã³ããªã¹ãã¼ãï¼EventTarget.addEventListener() ã«ãã£ã¦ï¼æå®ããã <button> ã«è¨å®ãããã®ã§ãããã® <button> 㯠btns NodeList ã®ç¹å®ã®ã¤ã³ããã¯ã¹å¤ã«ãããã®ã§ãããããã®é¢æ°ã¯ãtooltips NodeList ã®åãã¤ã³ããã¯ã¹å¤ã«ãã hint ããããªã¼ãã¼ã«å¯¾ãã¦åä½ãã¾ããããã«ããããã¿ã³ã¨ãã¼ã«ããããåæãããã¨ãã§ããããã«ãªãããã¿ã³ã対話ãããéã«æ£ãããã¼ã«ãããã表示/é表示ã«ã§ãã¾ãã
ãã®ã¤ãã³ããªã¹ãã¼ã¯ãmouseover ããã³ focus æã«ããããªã¼ãã¼ã表示ãã mouseout ããã³ blur æã«ããããªã¼ãã¼ãé表示ã«ãã¾ããã¤ã¾ãããã¼ã«ãããã¯ãã¦ã¹ã¨ãã¼ãã¼ãã®ä¸¡æ¹ã§ã¢ã¯ã»ã¹å¯è½ã§ããã¨ãããã¨ã§ãã
function addEventListeners(i) {
btns[i].addEventListener("mouseover", () => {
tooltips[i].showPopover({ source: btns[i] });
});
btns[i].addEventListener("mouseout", () => {
tooltips[i].hidePopover();
});
btns[i].addEventListener("focus", () => {
tooltips[i].showPopover({ source: btns[i] });
});
btns[i].addEventListener("blur", () => {
tooltips[i].hidePopover();
});
}
æå¾ã«ãfor ã«ã¼ãã使ç¨ãã¦ãbtns NodeList å
ã® <buttons> ãå復å¦çããããããã® addEventListeners() 颿°ãå¼ã³åºãã¾ããããã«ããããã¹ã¦ã®ãã¿ã³ã«ç®çã®ã¤ãã³ããªã¹ãã¼ãè¨å®ããã¾ãã
for (let i = 0; i < btns.length; i++) {
addEventListeners(i);
}
ããããªã¼ãã¼ã®ã¹ã¿ã¤ã«è¨å®
ãã®ç¯ã§ã¯ãããããªã¼ãã¼ã«é¢é£ãã CSS ã®é¸æã¨ä½ç½®æå®ã®ãã¯ããã¯ãåãä¸ãã¾ãã
ããããªã¼ãã¼ã®é¸æ
åç´ãªå±æ§ã»ã¬ã¯ã¿ã¼ã§ããã¹ã¦ã®ããããªã¼ãã¼ã®é¸æãå¯è½ã§ãã
[popover] {
/* ããã§å®£è¨ */
}
ãããã¯ã屿§ã»ã¬ã¯ã¿ã¼ã«å¤ãæå®ãããã¨ã§ãç¹å®ã®ããããªã¼ãã¼ã®ç¨®é¡ãæå®ãããã¨ãå¯è½ã§ãã
[popover="auto"] {
/* ããã§å®£è¨ */
}
:popover-open æ¬ä¼¼ã¯ã©ã¹ã使ç¨ãã¦ã示ãã¦ããããããªã¼ãã¼ã§ããããããªã¼ãã¼ã®ã¿ã鏿ã§ãã¾ãã
:popover-open {
/* ããã§å®£è¨ */
}
ããããªã¼ãã¼ã®èæ¯ã®ã¹ã¿ã¤ã«è¨å®
::backdrop æ¬ä¼¼è¦ç´ ã¯ãæä¸ä½ã¬ã¤ã¤ã¼ã«ããããããªã¼ãã¼è¦ç´ ã®ããå¾ãã«é
ç½®ãããå
¨ç»é¢è¦ç´ ã§ãå¿
è¦ã«å¿ãã¦ããããªã¼ãã¼ã®å¾ãã®ãã¼ã¸ã³ã³ãã³ãã«å¹æã追å ãããã¨ãã§ããããã«ãã¾ããä¾ãã°ãã¦ã¼ã¶ã¼ã®æ³¨æãããããªã¼ãã¼ã«éä¸ãããããã«ãããããªã¼ãã¼ã®å¾ãã®ã³ã³ãã³ããã¼ããããå ´åãããã¾ãã
::backdrop {
backdrop-filter: blur(3px);
}
ãããã©ã®ããã«æç»ããããã¨ããèãã«ã¤ãã¦ã¯ãããããªã¼ãã¼ã®èæ¯ãã¼ããä¾ï¼ã½ã¼ã¹ï¼ãåç §ãã¦ãã ããã
ããããªã¼ãã¼ã®ä½ç½®æå®
è¨äºã®åé ã§ãªã³ã¯ããã¦ããæåã®ããã¤ãã®ä¾ãè¦ãã¨ãããããªã¼ãã¼ããã¥ã¼ãã¼ãã®ä¸å¤®ã«è¡¨ç¤ºãããã³ã³ãã³ããå²ã¿ãé»ãå¢çç·ããããã¨ã«æ°ã¥ããããããã¾ãããããã¯ããã©ã«ãã®ã¹ã¿ã¤ã«ã§ãããUA ã¹ã¿ã¤ã«ã·ã¼ãå ã®ä»¥ä¸ã®ã«ã¼ã«ãç¨ãã¦å®ç¾ããã¦ãã¾ãã
[popover] {
position: fixed;
inset: 0;
width: fit-content;
height: fit-content;
margin: auto;
border: solid;
padding: 0.25em;
overflow: auto;
color: CanvasText;
background-color: Canvas;
}
ç¬èªã®ãµã¤ãºãé©ç¨ããããããªã¼ãã¼ãå¥ã®ä½ç½®ã«é ç½®ããã«ã¯ã以ä¸ã®ã¹ã¿ã¤ã«ã次ã®ããã«ä¸æ¸ãã§ãã¾ãã
:popover-open {
width: 200px;
height: 100px;
position: absolute;
inset: unset;
bottom: 5px;
right: 5px;
margin: 0;
}
ããããªã¼ãã¼ã®ä½ç½®æå®ã®ä¾ï¼ã½ã¼ã¹ï¼ã§ããã®ç¬ç«ããä¾ãè¦ããã¨ãã§ãã¾ãã
ããããªã¼ãã¼ã®ã¢ã³ã«ã¼ä½ç½®æå®
ããããªã¼ãã¼ API ãæä¾ãããã 1 ã¤ã®ä¾¿å©ãªä½ç½®æå®ãªãã·ã§ã³ãããã¾ããããããªã¼ãã¼ããã¥ã¼ãã¼ããé ç½®ãããç¥å è¦ç´ ã§ã¯ãªããã¤ã³ãã¼ã«ã¼ã«å¯¾ãã¦ç¸å¯¾çã«é ç½®ãããå ´åãããããªã¼ãã¼ã¨ãã®ã¤ã³ãã¼ã«ã¼ãæé»ã®ã¢ã³ã«ã¼åç §ãæã£ã¦ããã¨ããäºå®ãæ´»ç¨ã§ãã¾ãã
ãããã種é¡ã®ããããªã¼ãã¼ããã®ã¤ã³ãã¼ã«ã¼ã«é¢é£ä»ããã¨ã両è ã®éã«æé»ã®ã¢ã³ã«ã¼åç §ãçæããã¾ããããã«ããã¤ã³ãã¼ã«ã¼ãããããªã¼ãã¼ã®ã¢ã³ã«ã¼è¦ç´ ã¨ãªããCSS ã¢ã³ã«ã¼ä½ç½®æå®ã使ç¨ãã¦ããããªã¼ãã¼ãç¸å¯¾çã«é ç½®ã§ãããã¨ãããã¨ã«ãªãã¾ãã
ããããªã¼ãã¼ã¨ã¤ã³ãã¼ã«ã¼ã¨ã®é¢é£ä»ãã¯æé»çã«è¡ããããããanchor-name ããã³ position-anchor ããããã£ãç¨ããæç¤ºçãªé¢é£ä»ãã¯å¿
è¦ããã¾ããããã ããä½ç½®æå®ã«é¢ãã CSS ã®æå®ã¯ä¾ç¶ã¨ãã¦å¿
è¦ã§ãã
ä¾ãã°ãã¤ã³ã»ããããããã£ã«è¨å®ããã anchor() 颿°ã®å¤ã¨ãé
ç½®ããããã£ã«è¨å®ããã anchor-center ã®å¤ãçµã¿åããã¦ä½¿ç¨ãããã¨ãã§ãã¾ãã
.my-popover {
margin: 0;
inset: auto;
bottom: calc(anchor(top) + 20px);
justify-self: anchor-center;
}
ã¾ã㯠position-area ããããã£ã使ç¨ãã¦ã
.my-popover {
margin: 0;
inset: auto;
position-area: top;
}
position-area ã¾ã㯠anchor() ã使ç¨ãã¦ããããªã¼ãã¼ãä½ç½®æå®ããå ´åãããããªã¼ãã¼ã®ããã©ã«ãã¹ã¿ã¤ã«ããè¨å®ãããã¨ãã¦ããä½ç½®ã¨ç«¶åããå¯è½æ§ããããã¨ã«æ³¨æãã¦ãã ããã主ãªåå 㯠margin 㨠inset ã®ããã©ã«ãã¹ã¿ã¤ã«ã§ããããã以ä¸ã®ä¾ã®ããã«ãããããªã»ãããããã¨ããå§ããã¾ããCSS ã¯ã¼ãã³ã°ã°ã«ã¼ãã¯ããã®åé¿çãè¦æ±ããããã¨ãé¿ããæ¹æ³ãæ¢ãã¦ãã¾ãã
ã¢ã³ã«ã¼ã¨ä½ç½®æå®è¦ç´ ã®é¢é£ä»ããããã³è¦ç´ ãã¢ã³ã«ã¼ã«å¯¾ãã¦ç¸å¯¾çã«ä½ç½®æå®ããæ¹æ³ã®è©³ç´°ã«ã¤ãã¦ã¯ãCSS ã¢ã³ã«ã¼ä½ç½®æå®ã®ä½¿ç¨ãåç §ãã¦ãã ããã
ã¡ã¢:
ä¾ãã°ããã®æé»ã®é¢é£ä»ãã使ç¨ããä¾ã«ã¤ãã¦ã¯ãããããªã¼ãã¼ãã³ããã¢ï¼ã½ã¼ã¹ï¼ãåç
§ãã¦ãã ãããCSS ã®ã³ã¼ãã確èªããã¨ãanchor-name ããã³ position-anchor ããããã£ã使ç¨ãã¦æç¤ºçãªã¢ã³ã«ã¼é¢é£ä»ããè¡ããã¦ããªããã¨ããããã¾ãã
ã¡ã¢:
ããããªã¼ãã¼ãã¤ã³ãã¼ã«ã¼è¦ç´ ã«ã¢ã³ã«ã¼ãããã®ãé²ãã«ã¯ãæé»ã®ã¢ã³ã«ã¼åç
§ãåé¤ããå¿
è¦ãããã¾ãããããè¡ãã«ã¯ãããããªã¼ãã¼ã® position-anchor ããããã£ããç¾å¨ã®ããã¥ã¡ã³ãå
ã«åå¨ããªãã¢ã³ã«ã¼åï¼--not-an-anchor-name ãªã©ï¼ã«è¨å®ãã¾ãã詳細ã¯ã¢ã³ã«ã¼é¢é£ä»ãã®åé¤ãåç
§ãã¦ãã ããã
ããããªã¼ãã¼ã®ã¢ãã¡ã¼ã·ã§ã³
ããããªã¼ãã¼ã¯æä¸ä½ã¬ã¤ã¤ã¼ã¨ã¢ã¯ã»ã·ããªãã£ããªã¼ããé¤å»ãããã追å ããããããã ãã§ãªããé表示æã«ã¯ display: none;ã表示æã«ã¯ display: block; ã«è¨å®ããã¾ãããããã£ã¦ãããããªã¼ãã¼ãã¢ãã¡ã¼ã·ã§ã³ãããã«ã¯ã display ããããã£ãã¢ãã¡ã¼ã·ã§ã³å¯è½ã«ããå¿
è¦ãããã¾ãã対å¿ãã¦ãããã©ã¦ã¶ã¼ã§ã¯ãdisplay ã颿£ã¢ãã¡ã¼ã·ã§ã³åã®å¤å½¢ã§ã¢ãã¡ã¼ã·ã§ã³ããã¾ããå
·ä½çã«ã¯ããã©ã¦ã¶ã¼ã¯ã¢ãã¡ã¼ã·ã§ã³ã®åçæéå
¨ä½ã«ããã£ã¦ã³ã³ãã³ãã表示ãããããã«ã none 㨠display ã®ä»ã®å¤ãåãæ¿ãã¾ããä¾ãã°ã次ã®ããã«ãªãã¾ãã
displayãnoneããblockï¼ã¾ãã¯ä»ã®è¡¨ç¤ºå¯è½ãªdisplayå¤ï¼ã«ã¢ãã¡ã¼ã·ã§ã³ãããå ´åãå¤ã¯ã¢ãã¡ã¼ã·ã§ã³æéã®0%ã§blockã«åãæ¿ããããã£ã¨è¡¨ç¤ºããã¾ããdisplayãblockï¼ã¾ãã¯ä»ã®è¡¨ç¤ºå¯è½ãªdisplayå¤ï¼ããnoneã«ã¢ãã¡ã¼ã·ã§ã³ãããå ´åãå¤ã¯ã¢ãã¡ã¼ã·ã§ã³æéã®100%ã§noneã«åãæ¿ããããã£ã¨è¡¨ç¤ºããã¾ãã
ã¡ã¢:
CSS ãã©ã³ã¸ã·ã§ã³ã使ç¨ãã¦ã¢ãã¡ã¼ã·ã§ã³ãè¡ãå ´åãä¸è¨ã®åä½ãæå¹ã«ããã«ã¯ transition-behavior: allow-discrete ãè¨å®ããå¿
è¦ãããã¾ãã CSS ã¢ãã¡ã¼ã·ã§ã³ã§ã¢ãã¡ã¼ã·ã§ã³ãããå ´åãæ¢å®ã§ã¯ä¸è¨ã®åä½ãå©ç¨ã§ãã¾ãã
ããããªã¼ãã¼ã®ãã©ã³ã¸ã·ã§ã³
CSS ã®ãã©ã³ã¸ã·ã§ã³ã§ããããªã¼ãã¼ãã¢ãã¡ã¼ã·ã§ã³ãããå ´åã以ä¸ã®æ©è½ãå¿ è¦ã§ãã
@starting-styleã¢ããã«ã¼ã«-
ããããªã¼ãã¼ãæåã«è¡¨ç¤ºãããã¨ãã«ãã©ã³ã¸ã·ã§ã³ãããããããããªã¼ãã¼ã«è¨å®ããããããã£ã®éå§å¤ã®ã»ãããæä¾ãã¾ããããã¯äºæããªãåä½ãé¿ããããã«å¿ è¦ã§ããæ¢å®ã§ã¯ã CSS ã®ãã©ã³ã¸ã·ã§ã³ã¯å¯è¦è¦ç´ ã§ããããã£ãããå¤ããå¥ã®å¤ã«å¤æ´ãããã¨ãã®ã¿çºçãã¾ããè¦ç´ ã®æåã®ã¹ã¿ã¤ã«æ´æ°æã
displayåãnoneããå¥ã®åã«å¤æ´ãããã¨ãã«ã¯çºçãã¾ããã displayããããã£-
ãã©ã³ã¸ã·ã§ã³ã®ãªã¹ãã«
displayã追å ãã¦ãããããªã¼ãã¼ããã©ã³ã¸ã·ã§ã³ã®åçæéã®éãdisplay: blockï¼ã¾ãã¯ä»ã®è¡¨ç¤ºå¯è½ãªdisplayå¤ï¼ã¨ãã¦æ®ããä»ã®ãã©ã³ã¸ã·ã§ã³ã確å®ã«è¡¨ç¤ºãããããã«ãã¾ãã overlayããããã£-
ãã©ã³ã¸ã·ã§ã³ã®ãªã¹ãã«
overlayãè¨è¿°ãã¦ãæä¸ä½ã¬ã¤ã¤ã¼ããã®ããããªã¼ãã¼ã®é¤å»ããã©ã³ã¸ã·ã§ã³ãå®å ¨ã«å®äºããã¾ã§ç¢ºå®ã«å»¶æãããã©ã³ã¸ã·ã§ã³ã確å®ã«è¡¨ç¤ºãããããã«ãã¾ãã transition-behaviorããããã£-
transition-behavior:allow-discreteãdisplayã¨overlayã®ãã©ã³ã¸ã·ã§ã³ï¼ã¾ãã¯ä¸æ¬æå®ã®transitionï¼ã«è¨å®ããæ¢å®ã§ã¯ã¢ãã¡ã¼ã·ã§ã³ä¸å¯è½ãªããã 2 ã¤ã®ããããã£ã®é¢æ£ãã©ã³ã¸ã·ã§ã³ãæå¹ã«ãã¾ãã
ãã®ä¾ãã©ã®ããã«è¦ãããã®ããè¦ã¦ããã¾ãããã
HTML
ãã® HTML ã§ã¯ã <div> è¦ç´ ãããããªã¼ãã¼ã«ãªããããã°ãã¼ãã«å±æ§ã® popover ã§å®£è¨ããã¦ããã <button> è¦ç´ ãããããªã¼ãã¼ã®è¡¨ç¤ºã³ã³ããã¼ã«ã¨ãã¦æå®ããã¦ãã¾ãã
<button popovertarget="mypopover">ããããªã¼ãã¼ã表示</button>
<div popover="auto" id="mypopover">ããããªã¼ãã¼ã§ããã¢ãã¡ã¼ã·ã§ã³ãã¾ãã</div>
CSS
ãã©ã³ã¸ã·ã§ã³ããããããããªã¼ãã¼ã®ããããã£ã¯ã opacity 㨠transform ã® 2 ã¤ã§ããããããªã¼ãã¼ãæ°´å¹³æ¹åã«æ¡å¤§ã¾ãã¯ç¸®å°ããªãããã§ã¼ãã¤ã³ã¾ãã¯ãã§ã¼ãã¢ã¦ãããããã«ãã¾ãããããå®ç¾ããããã«ããããã®ããããã£ã®éå§ç¶æ
ãããããªã¼ãã¼è¦ç´ ã®éè¡¨ç¤ºç¶æ
ï¼[popover] 屿§ã»ã¬ã¯ã¿ã¼ã§é¸æï¼ã«è¨å®ããçµäºç¶æ
ãããããªã¼ãã¼ã®è¡¨ç¤ºç¶æ
ï¼:popover-open æ¬ä¼¼ã¯ã©ã¹ã§é¸æï¼ã«è¨å®ãã¾ããã¾ããtransition ããããã£ã使ç¨ãã¦ãããããªã¼ãã¼ã表示ããããé表示ã«ãªã£ããããã¨ãã«ã¢ãã¡ã¼ã·ã§ã³ããããããã£ã¨ã¢ãã¡ã¼ã·ã§ã³ã®åçæéãå®ç¾©ãã¾ãã
html {
font-family: "Helvetica", "Arial", sans-serif;
}
/* ããããªã¼ãã¼èªä½ã®ãã©ã³ã¸ã·ã§ã³ */
[popover]:popover-open {
opacity: 1;
transform: scaleX(1);
}
[popover] {
font-size: 1.2rem;
padding: 10px;
/* æ¶æ»
ã¢ãã¡ã¼ã·ã§ã³ã®æçµç¶æ
*/
opacity: 0;
transform: scaleX(0);
transition:
opacity 0.7s,
transform 0.7s,
overlay 0.7s allow-discrete,
display 0.7s allow-discrete;
/* transition: all 0.7s allow-discrete;
ã¨åç */
}
/* 詳細度ãåããªã®ã§ã广ãå¾ãã«ã¯ [popover]:popover-open ã«ã¼ã«ã®
å¾ã§ãªããã°ãªããªãã */
@starting-style {
[popover]:popover-open {
opacity: 0;
transform: scaleX(0);
}
}
/* ããããªã¼ãã¼ã®èæ¯ã®ãã©ã³ã¸ã·ã§ã³ */
[popover]::backdrop {
background-color: transparent;
transition:
display 0.7s allow-discrete,
overlay 0.7s allow-discrete,
background-color 0.7s;
/* transition: all 0.7s allow-discrete;
ã¨åç */
}
[popover]:popover-open::backdrop {
background-color: rgb(0 0 0 / 25%);
}
/* å
¥ãåã»ã¬ã¯ã¿ã¼ (&) ã¯æ¬ä¼¼è¦ç´ ã表ããã¨ãã§ããªãã®ã§ã
ãã®åºç¾ã¹ã¿ã¤ã«ã«ã¼ã«ã¯å
¥ãåã«ã§ããªã */
@starting-style {
[popover]:popover-open::backdrop {
background-color: transparent;
}
}
åã«èª¬æããã¨ãããæ¬¡ã®ãã¨ãè¡ãå¿ è¦ãããã¾ãã
- éå§ç¶æ
ã®
transitionã@starting-styleãããã¯å ã«è¨å®ãã¾ãã - ãã©ã³ã¸ã·ã§ã³ããè¦ç´ ã®ãªã¹ãã«
displayã追å ããããããªã¼ãã¼ã®åºç¾ã»æ¶æ» ã¢ãã¡ã¼ã·ã§ã³ãéãã¦ãã¢ãã¡ã¼ã·ã§ã³ããè¦ç´ ãè¦ããï¼display: blockã«è¨å®ããï¼ããã«ãã¾ãããããããªããã°ãçµäºã¢ãã¡ã¼ã·ã§ã³ã¯è¡¨ç¤ºããã¾ãããçµæçã«ãããããªã¼ãã¼ã¯ãã æ¶ãã¦ãã¾ãã¾ãã - ãã©ã³ã¸ã·ã§ã³ããè¦ç´ ã®ãªã¹ãã«
overlayã追å ããã¢ãã¡ã¼ã·ã§ã³ãå®äºããã¾ã§æä¸ä½ã¬ã¤ã¤ã¼ããã®è¦ç´ ã®é¤å»ãå»¶æãããããã«ãã¾ãããã®å¹æã¯ããã®ãããªåºæ¬çãªã¢ãã¡ã¼ã·ã§ã³ã§ã¯æ°ã«ãªããªãããããã¾ããããããè¤éãªã±ã¼ã¹ã§ã¯ããã®ããããã£ãçç¥ããã¨ããã©ã³ã¸ã·ã§ã³ã®å®äºåã«è¦ç´ ããªã¼ãã¼ã¬ã¤ããé¤å»ããã¦ãã¾ãå¯è½æ§ãããã¾ãã - ä¸è¨ã®ãã©ã³ã¸ã·ã§ã³ã®ä¸¡æ¹ã®ããããã£ã«
allow-discreteãè¨å®ãã颿£ãã©ã³ã¸ã·ã§ã³ãã§ããããã«ãã¾ãã
ã¾ããéãããã®ããããªã¼ãã¼ã®èå¾ã«ç¾ãã ::backdrop ã«ãã©ã³ã¸ã·ã§ã³ãè¨è¿°åãæããªãã¢ãã¡ã¼ã·ã§ã³ãæå®ãã¦ãããã¨ã«æ³¨æãã¦ãã ããã
çµæ
ãã®ã³ã¼ãã¯æ¬¡ã®ããã«è¡¨ç¤ºããã¾ãã
ã¡ã¢:
ããããªã¼ãã¼ã¯è¡¨ç¤ºããããã³ã« display: none ãã display: block ã«å¤ããã®ã§ãé
ç®ããã©ã³ã¸ã·ã§ã³ãããã³ã« @starting-style ã¹ã¿ã¤ã«ãã [popover]:popover-open ã¹ã¿ã¤ã«ã«ãã©ã³ã¸ã·ã§ã³ãã¾ããããããªã¼ãã¼ãéããããã¨ãã [popover]:popover-open ç¶æ
ããæ¢å®ã® [popover] ç¶æ
ã«ãã©ã³ã¸ã·ã§ã³ãã¾ãã
ãã®ãããªå ´åãåºç¾æã¨æ¶æ» æã®ã¹ã¿ã¤ã«è¨å®ãç°ãªãå½¢ã«ãããã¨ãå¯è½ã§ãããã®ãã¨ã®è¨¼æã«ã¤ãã¦ã¯ãéå§ã¹ã¿ã¤ã«ã使ç¨ããå ´åã®ãã¢ã®ä¾ãåç §ãã¦ãã ããã
ããããªã¼ãã¼ã®ãã¼ãã¬ã¼ã ã¢ãã¡ã¼ã·ã§ã³
CSSãã¼ãã¬ã¼ã ã¢ãã¡ã¼ã·ã§ã³ã§ããããªã¼ãã¼ãã¢ãã¡ã¼ã·ã§ã³ãããå ´åãããã¤ã注æãã¹ãéããããã¾ãã
@starting-styleãæä¾ããã®ã§ã¯ãªãããã¼ãã¬ã¼ã ã« "to" 㨠"from" ã®displayå¤ãè¨è¿°ãã¾ãã- 颿£ã¢ãã¡ã¼ã·ã§ã³ãæç¤ºçã«æå¹ã«ãããã¨ã¯ããã¾ããããã¼ãã¬ã¼ã å
ã«
allow-discreteã«ç¸å½ãããã®ã¯ããã¾ããã - ãã¼ãã¬ã¼ã å
ã§
overlayãè¨å®ããå¿ è¦ãããã¾ãããdisplayã¢ãã¡ã¼ã·ã§ã³ã¯ããããªã¼ãã¼ã®è¡¨ç¤ºããé表示ã¾ã§ã®ã¢ãã¡ã¼ã·ã§ã³ãå¦çãã¾ãã
ä¾ãåç §ãã¦ãã ããã
HTML
HTML ã«ã¯ãããããªã¼ãã¼ã¨ãã¦å®£è¨ããã <div> è¦ç´ ã¨ãããããªã¼ãã¼ã®è¡¨ç¤ºã³ã³ããã¼ã«ã¨ãã¦æå®ããã <button> è¦ç´ ãããã¾ãã
<button popovertarget="mypopover">ããããªã¼ãã¼ã表示</button>
<div popover="auto" id="mypopover">ããããªã¼ãã¼ã§ããã¢ãã¡ã¼ã·ã§ã³ãã¾ãã</div>
CSS
å¿ è¦ãªåºç¾ã¢ãã¡ã¼ã·ã§ã³ã¨æ¶æ» ã¢ãã¡ã¼ã·ã§ã³ãæå®ãããã¼ãã¬ã¼ã ãå®ç¾©ããèæ¯ã¯åºç¾ã¢ãã¡ã¼ã·ã§ã³ã®ã¿ãå®ç¾©ãã¾ããèæ¯ããã§ã¼ãã¢ã¦ãããã¢ãã¡ã¼ã·ã§ã³ã¯ä¸å¯è½ã§ãããã¨ã«æ³¨æãã¦ãã ãã - èæ¯ã¯ããããªã¼ãã¼ãéããããã¨ãã« DOM ããå³åº§ã«é¤å»ããããããã¢ãã¡ã¼ã·ã§ã³ãããã®ã¯ããã¾ããã
html {
font-family: "Helvetica", "Arial", sans-serif;
}
[popover] {
font-size: 1.2rem;
padding: 10px;
animation: fade-out 0.7s ease-out;
}
[popover]:popover-open {
animation: fade-in 0.7s ease-out;
}
[popover]:popover-open::backdrop {
animation: backdrop-fade-in 0.7s ease-out forwards;
}
/* ã¢ãã¡ã¼ã·ã§ã³ã®ãã¼ãã¬ã¼ã */
@keyframes fade-in {
0% {
opacity: 0;
transform: scaleX(0);
}
100% {
opacity: 1;
transform: scaleX(1);
}
}
@keyframes fade-out {
0% {
opacity: 1;
transform: scaleX(1);
/* display ã¯ã¢ãã¡ã¼ã·ã§ã³ãçµäºããã¾ã§ããããªã¼ãã¼ã
表示ãç¶ããããã«å¿
è¦ */
display: block;
}
100% {
opacity: 0;
transform: scaleX(0);
/* display: none ã¯ããã§ã¯å¿
é ã§ã¯ãªããéããããããªã¼ãã¼ã®
æ¢å®å¤ã§ããããããã ããããã§ã¯åä½ãæç¢ºåããããã«å
¥ãã¦ãã */
display: none;
}
}
@keyframes backdrop-fade-in {
0% {
background-color: transparent;
}
100% {
background-color: rgb(0 0 0 / 25%);
}
}
çµæ
ãã®ã³ã¼ãã¯æ¬¡ã®ããã«è¡¨ç¤ºããã¾ãã
é¢é£æ å ±
- ããããªã¼ãã¼ API ã®ä¾ã®ã³ã¬ã¯ã·ã§ã³