window onresize

JS window onresize Zentimetermaß um den Monitor eines Notebooks gewickelt

Javascript onresize ruft einen Event Handler auf, wenn das Browserfenster (window oder body) verkleinert oder vergrößert wird – z.B. um das Webseiten-Layout über die Möglichkeiten von HTML und CSS hinaus an die Größe des Browserfensters anzupassen.

Wie Javascript onabort und onerror war auch onresize ein privates Event von Microsoft für Internet Explorer – war also kein Standard. Aber resize wird heute von allem Browsern zuverlässig unterstützt und ist eine Ergänzung der Media Querys für responsive Webseiten.

resize feuert in allen Browsern außer Internet Explorer nur bei Events auf window oder body. Aber das reicht den meisten responsiven Anwendungen – das Abfangen von eines resize-Events auf anderen Elementen als window oder body ist selten gefragt.

Geräteklassen Eine Reihe von verschiedenen Monitoren: Desktop, Handy, Tablett, Notebook

Zur Anpassung von Bildern haben wir heute Media Queries, die z.B. Bilder automatisch an den verfügbaren Platz anpassen.

Das resize-Event in Javascript feuert in Chrome, Firefox, IE11 und Safari kontinuiertlich, in älteren Firefox-Versionen feuerte onresize erst, wenn der Benutzer die Größenänderung beendet. Darum wurden Aktionen in Firefox in sichtbaren Sprüngen erst angepasst, wenn der Benutzer die Maus nicht mehr bewegte. In den jüngeren Versionen von Firefox tritt dieser Effekt nicht mehr auf.

resize – Eigenschaften

target
Das Objekt, zu dem das Ereignis ursprünglich gesendet wurde
eventPhase
Phase, in der das Ereignis bearbeitet wird: AT_TARGET, BUBBLING_PHASE, CAPTURING_PHASE
bubbles
true, wenn das Ereignis nach oben steigen kann
cancelable
Nein
timeStamp
Zeit in Millisekunden, zu der das Ereignis eingetreten ist

Größe des Browserfensters bei resize

resize Performance

Bei aufwändigen Aktionen ist das kontinuierliche Feuern von des resize-Events eine hohe Last für den Browser – z.B. auch wenn das Layout der Seite bei Änderungen an die Fenstergröße angepasst wird.

Da resize mit einer hohen Wiederholrate feuert, kann die Frequenz mit setTimeout oder requestAnimationFrame reduziert werden.

resize
getDimensions() wurde 0 mal aufgerufen
Seite ist px breit und px hoch.

Hier wird die Aktionen beim resize durch einen Delay ausgebremst:

let width = document.getElementById("width");
let hight = document.getElementById("height");
let action = document.getElementById("actions");
let delay = 250;           // Delay zwischen den Aufrufen
let throttled = false;
action = 0;

// resize callback
function getDimensions() {
  width.innerHTML = window.innerWidth;
  hight.innerHTML = window.innerHeight;
  action += 1;
  actions.innerHTML = action;
}

// window.resize event listener
window.addEventListener('resize', function() {
  if (!throttled) {      // nur wenn throttled nicht gesetzt ist
    getDimensions();     // Callback-Aktion
    
    throttled = true;    // Jetzt wird wieder ausgebremst
    
    setTimeout(function() {  // Timeout
      throttled = false;
    }, delay);
  }  
});

getDimensions();

Heute sind CSS Media Queries eine zuverlässige und effiziente Alternative, wenn das Layout der Seite beim Verkleinern oder Vergrößern des Browserfensters angepasst wird. Als Pendant zu CSS Media Queries gibt window.matchMedia Auskunft über Breite, Höhe, Orientierung oder Auflösung des Monitors.

onresize und onorientationchange

onresize feuert auch bei einem onorientationchange-Event.

   // Entdeckt, ob das Gerät das orientationchange-Event unterstützt
   // Fallback auf resize, falls nicht
   let supportsOrientationChange = "onorientationchange" in window,
      orientationEvent = supportsOrientationChange ? "orientationchange" : "resize";

   window.addEventListener(orientationEvent, function() {
      alert('HOLY ROTATING SCREENS BATMAN:' + window.orientation + " " + screen.width);
   }, false);

Quelle Detect rotation of Android phone in the browser with JavaScript auf Stackoverflow.

Resize auf alten IE-Versionen

Bei älteren Versionen von Internet Explorer (vor IE6, IE7) konnte ein resize in bestimmten Situationen den Browser stilllegen. Weil IE das Ereignis kontinuierlich feuert – und zwar nicht nur bei einem window.resize, sondern auch bei einem body.resize bzw. document.resize – kann resize die Höhe von Texten durch einen Zeilenumbruch verändern. Das erzeugt dann ein neues resize-Ereignis, bis IE am Ende nur noch mit dem resize beschäftigt war und sich aufhing.

onresize 858687888990919293949596979899100 234567891011121314151617181920