<

Resize Observer – GrĂ¶ĂŸenĂ€nderungen von Elementen erkennen

Das ResizeObserver-Objekts stellt fest, ob sich Breite und Höhe eines Elements – z.B. durch einen Benutzereingriff oder einen dynamischen Datentransfer – Ă€ndern. Die geĂ€nderte GrĂ¶ĂŸe kann effizient mit contentRect abgefragt werden – einem exklusiven Teil des ResizeObserver-Callbacks.

ResizeObserver, wenn iframe oder anderes Element verkleinert oder vergrĂ¶ĂŸert wird

Breite oder Höhe eines Elements geÀndert?

Der hĂ€ufigste Grund fĂŒr eine GrĂ¶ĂŸenĂ€nderung ist das Drehen eines Handys oder Tabletts vom Hochkant- oder PortrĂ€t-Modus in das Querformat bzw. Landscape. DarĂŒber hinaus können dynamisch hinzugefĂŒgte Elemente die Breite / Höhe ihres Containers Ă€ndern.

Ein Resize Observer beschrĂ€nkt die Beobachtung auf einzelne Elemente, wĂ€hrend das globale window.resize bei jeder GrĂ¶ĂŸenĂ€nderung des Viewports feuert und schnell zu Leistungseinbußen fĂŒhrt.

Resize Observer - Initialisierung

Der Resize Observer wird genauso wie der Intersection Observer durch eine Callback-Funktion initialisiert:

const resizeObserver = new ResizeObserver(
   entries => {

   });

Der Aufruf erfolgt mit

resizeObserver.observe(elems);
resizeObserver.observe(otherElems);

Die Callback-Funktion iteriert ĂŒber die gemeldeten Elemente.

const resizeObserver = new ResizeObserver(entries => {
  entries.forEach(entry => {
    const target = entry.target;
    const width = entry.contentRect.width.toFixed(2);

    if (target.classList.contains("maxw")) {
      document.querySelector(".max").textContent = `width: ${width}`;
    } else if (target.classList.contains("min")) {
      document.querySelector(".min").textContent = `width: ${width}`;
    } 
  });
});

resizeObserver.observe(document.querySelector(".max"));
resizeObserver.observe(document.querySelector(".min"));

resize-Observer und contentRect

getBoundingClientRect() liefert Informationen ĂŒber die GrĂ¶ĂŸe und Position eines Elements. Der resize-Observer liefert mit contentRect nur die GrĂ¶ĂŸe, nicht aber die Position und ist effizienter, wenn tatsĂ€chlich nur die GrĂ¶ĂŸe nach einem Resize gefragt ist.

Jedem beobachteten Element ist ein Objekt mit einem contentRect und einer target-Eigenschaft zugewiesen. Target ist das DOM-Element selber. Das contentRect hat width, height, x, y, top, right, bottom und left.

Anders als die mit getBoundingClientRect enthaltene Breite und Höhe enthÀlt das contentRect kein padding.

  • contentRect.top ist top padding,
  • contentRect.left ist left padding.
.elem {
	max-width: 900px;
	padding: 2rem; 
}
Merkmal contentRect getBoundingClientRect()
Herkunft ResizeObserverEntry.contentRect Methode an jedem DOM-Element
WofĂŒr? GrĂ¶ĂŸe des Inhaltsbereichs bei Resize Gerenderte GrĂ¶ĂŸe und Position im Viewport
Bezieht sich auf Nur den Content (ohne Padding, Border, Margin) Alles Sichtbare, inkl. Padding + Border
Einheit CSS-Pixel CSS-Pixel
Beeinflusst von CSS box-sizing (bedingt) Layout, Transform, Scroll, Zoom usw.
Position enthalten? Nein Ja: top, left, bottom, right

resizeObserver und CSS resize

Der Benutzer kann ein HTML-textarea-Element schon seit langer Zeit durch Ziehen an der Ecke unten rechts kleiner oder grĂ¶ĂŸer aufziehen. CSS erlaubt mit der resize-Eigenschaft weiteren Elementen ein Verkleinern oder VergrĂ¶ĂŸern von Bereichen:

.myElem {
  resize: vertical/horizontal/both
}

Es war einmal eine kluge junge Ente, die hervorragend sehen konnte und obendrein eine angesehene Mathematikerin war. Durch das lange Studieren bei schlechtem Licht wurden ihre Augen mit den Jahren zusehens schlechter, und eines Tages konnte sie kaum noch ihre eigenen Randnotizen erkennen, nicht einmal ihre Lieblingsformel e = N*te.

Formeln mit MathML konnte sie nur noch erkennen, wenn sie nicht innerhalb von Zeilen standen, sondern zentral mit viel Padding drum herum.

∑ k= n m a (k)

Weil Chrome MathML damals noch nicht verstand, konnte sie Publikationen nur noch mit Firefox studieren. Darum bat sie eines Tages ihren Assistenten, ihr einen guten Augenarzt zu suchen.

width: 200px
const myObserver = new ResizeObserver(entries => {
  entries.forEach(entry => {
    document.querySelector (".res").innerHTML = 
    	`width: ${entry.contentRect.width}<br>
    	 height: ${entry.contentRect.height}`;
  });
});

const resizedBox = document.querySelector('.resbox');
myObserver.observe(resizedBox);
Suchen auf mediaevent.de