ResizeObserver
Baseline
åºãå©ç¨å¯è½
ãã®æ©è½ã¯åºãå®è£ ããã¦ãããå¤ãã®ãã¼ã¸ã§ã³ã®ç«¯æ«ããã©ã¦ã¶ã¼ã§åä½ãã¾ãã2020å¹´7æä»¥éããã¹ã¦ã®ãã©ã¦ã¶ã¼ã§å©ç¨å¯è½ã§ãã
ResizeObserver ã¤ã³ã¿ã¼ãã§ã¤ã¹ã¯ãè¦ç´ (Element) ã®ã³ã³ãã³ãã¾ãã¯å¢çããã¯ã¹ãã¾ã㯠SVGElement ã®ãã¦ã³ãã£ã³ã°ããã¯ã¹ã®å¤§ãããå¤åãããã¨ãå ±åãã¾ãã
ã¡ã¢: ã³ã³ãã³ãããã¯ã¹ã¯ãã³ã³ãã³ããé ç½®ã§ããããã¯ã¹ã§ããã¤ã¾ããå¢çããã¯ã¹ããããã£ã³ã°ãå¼ãããã®ã§ããå¢çã¨ããã£ã³ã°ã®èª¬æã¯ããã¯ã¹ã¢ãã«ãåç §ãã¦ãã ããã
ã³ã³ã¹ãã©ã¯ã¿ã¼
ResizeObserver()-
æ°ãã
ResizeObserverãªãã¸ã§ã¯ãã使ãã¦è¿ãã¾ãã
ã¤ã³ã¹ã¿ã³ã¹ããããã£
ãªãã
ã¤ã³ã¹ã¿ã³ã¹ã¡ã½ãã
ResizeObserver.disconnect()-
ç¹å®ã®ãªãã¶ã¼ãã¼ã®ç£è¦å¯¾è±¡ã®
Elementããã¹ã¦ç£è¦è§£é¤ãã¾ãã ResizeObserver.observe()-
æå®ããã
Elementã®ç£è¦ãéå§ãã¾ãã ResizeObserver.unobserve()-
æå®ããã
Elementã®ç£è¦ãçµäºãã¾ãã
ä¾
resize-observer-text.html ï¼ã½ã¼ã¹ãåç
§ï¼ã®ä¾ã§ã¯ãã¹ã©ã¤ãã¼ã®å¤ã夿´ããããããå«ã <div> ã®å¹
ã夿´ãããã¨ããªãµã¤ãºãªãã¶ã¼ãã¼ã使ç¨ãã¦ãããã¼ã¨æ®µè½ã® font-size ã夿´ãã¾ããããã¯ããã¥ã¼ãã¼ãã«å½±é¿ããªãè¦ç´ ã®ãµã¤ãºã®å¤åã«ãå¿çãããã¨ãã§ãããã¨ã示ãã¦ãã¾ãã
ã¾ãããªãã¶ã¼ãã¼ããªãããªã³ã«ããããã®ãã§ãã¯ããã¯ã¹ãç¨æãã¦ãã¾ãããªãã«ããã¨ã <div> ã®å¹
ãå¤åãã¦ãããã¹ãã¯å¤åãã¾ããã
JavaScript ã¯æ¬¡ã®ããã«ãªãã¾ãã
const h1Elem = document.querySelector("h1");
const pElem = document.querySelector("p");
const divElem = document.querySelector("body > div");
const slider = document.querySelector('input[type="range"]');
const checkbox = document.querySelector('input[type="checkbox"]');
divElem.style.width = "600px";
slider.addEventListener("input", () => {
divElem.style.width = `${slider.value}px`;
});
const resizeObserver = new ResizeObserver((entries) => {
for (const entry of entries) {
if (entry.contentBoxSize) {
const contentBoxSize = entry.contentBoxSize[0];
h1Elem.style.fontSize = `${Math.max(
1.5,
contentBoxSize.inlineSize / 200,
)}rem`;
pElem.style.fontSize = `${Math.max(
1,
contentBoxSize.inlineSize / 600,
)}rem`;
} else {
h1Elem.style.fontSize = `${Math.max(
1.5,
entry.contentRect.width / 200,
)}rem`;
pElem.style.fontSize = `${Math.max(1, entry.contentRect.width / 600)}rem`;
}
}
console.log("Size changed");
});
resizeObserver.observe(divElem);
checkbox.addEventListener("change", () => {
if (checkbox.checked) {
resizeObserver.observe(divElem);
} else {
resizeObserver.unobserve(divElem);
}
});
ç£è¦ã¨ã©ã¼
仿§ã«å¾ãå®è£
ã§ã¯ãæç»åï¼ã¤ã¾ãããã¬ã¼ã ãã¦ã¼ã¶ã¼ã«è¡¨ç¤ºãããåï¼ã«ãªãµã¤ãºã¤ãã³ããå¼ã³åºãã¾ãããªãµã¤ãº ã¤ãã³ãããã£ãå ´åãã¹ã¿ã¤ã«ã¨ã¬ã¤ã¢ã¦ããåè©ä¾¡ãããããã«ãªãµã¤ãºã¤ãã³ããçºçããå¯è½æ§ãããã¾ãã循ç°çãªä¾åé¢ä¿ã«ããç¡éã«ã¼ãã¯ãããããã®å復å¦çä¸ã« DOM ã®ããæ·±ãè¦ç´ ã®ã¿ãå¦çãããã¨ã§å¯¾å¦ãã¾ãããã®æ¡ä»¶ãæºãããªããªãµã¤ãºã¤ãã³ãã¯æ¬¡ã®æç»ã«å»¶æãããã¨ã©ã¼ã¤ãã³ãã Window ãªãã¸ã§ã¯ãã«å®ç¾©ãããã¡ãã»ã¼ã¸æååã¨ã¨ãã«çºè¡ããã¾ãã
ResizeObserver loop completed with undelivered notifications.
ããã¯ã¦ã¼ã¶ã¼ã¨ã¼ã¸ã§ã³ãã®ããã¯ãé²ãã ãã§ãç¡éã«ã¼ããã®ãã®ãé²ãããã§ã¯ãªããã¨ã«æ³¨æãã¦ãã ãããä¾ãã°ã次ã®ä¾ã§ã¯ divElem ã®å¹ ãç¡éã«åºãããã³ã³ã½ã¼ã«ã«ä¸è¨ã®ãããªã¨ã©ã¼ã¡ãã»ã¼ã¸ãæ¯ãã¬ã¼ã çºçãã¾ãã
const divElem = document.querySelector("body > div");
const resizeObserver = new ResizeObserver((entries) => {
for (const entry of entries) {
entry.target.style.width = entry.contentBoxSize[0].inlineSize + 10 + "px";
}
});
window.addEventListener("error", function (e) {
console.error(e.message);
});
ã¨ã©ã¼ã¤ãã³ãããã¤ã¾ã§ãçºè¡ãããªãéãããªãµã¤ãºãªãã¶ã¼ãã¼ã¯æ±ºå®ããå®å®ãããããããæ£ããã¬ã¤ã¢ã¦ããçæãã¾ãããããã訪åè ã¯ãåä¸ã®ãã¬ã¼ã ã§èµ·ããã¯ãã®ä¸é£ã®å¤æ´ããè¤æ°ã®ãã¬ã¼ã ã«ããã£ã¦èµ·ãããããå£ããã¬ã¤ã¢ã¦ãããã©ãã·ã¥ãã¦è¦ããããããã¾ããã
仿§æ¸
| 仿§æ¸ |
|---|
| Resize Observer > # resize-observer-interface > |
ãã©ã¦ã¶ã¼ã®äºææ§
é¢é£æ å ±
- ããã¯ã¹ã¢ãã«
PerformanceObserverIntersectionObserverï¼äº¤å·®ãªãã¶ã¼ãã¼ API ã®ä¸é¨ï¼- ä»å¾ãªãªã¼ã¹ãããã³ã³ããã¼ã¯ã¨ãªã¼ã¯ãã¬ã¹ãã³ã·ããã¶ã¤ã³ãå®è£ ããããã®æå¹ãªé¸æè¢ã«ãªãããããã¾ããã