Esegui il debug delle variazioni del layout

Scopri come identificare e correggere le variazioni del layout.

Katie Hempenius
Katie Hempenius

La prima parte di questo articolo illustra gli strumenti per eseguire il debug delle variazioni di layout. mentre la seconda parte illustra il processo mentale da utilizzare identificando la causa di una variazione del layout.

Utensili

API Layout Instability

L'API Layout Instability è il meccanismo del browser per misurare e generare report sulle variazioni del layout. Tutti gli strumenti per le variazioni del layout di debug, tra cui DevTools, si basano API Layout Instability. Tuttavia, l'utilizzo diretto dell'API Layout Instability è potente strumento di debug grazie alla sua flessibilità.

Utilizzo

Lo stesso snippet di codice misura Cumulative Layout Shift (CLS) viene pubblicato per eseguire il debug delle variazioni del layout. Lo snippet seguente registra le informazioni sul layout passa alla console. Esaminando questo log potrai ottenere informazioni quando, dove e come si è verificata una variazione del layout.

let cls = 0;
new PerformanceObserver((entryList) => {
  for (const entry of entryList.getEntries()) {
    if (!entry.hadRecentInput) {
      cls += entry.value;
      console.log('Current CLS value:', cls, entry);
    }
  }
}).observe({type: 'layout-shift', buffered: true});

Quando esegui questo script, tieni presente che:

  • L'opzione buffered: true indica che PerformanceObserver occorre controllare la voce relativa alle prestazioni del browser buffer per le voci relative alle prestazioni create prima della durante l'inizializzazione. Di conseguenza, l'elemento PerformanceObserver mostrerà il layout che si sono verificati prima e dopo l'inizializzazione. Conserva in quando esamini i log della console. Un eccesso di variazioni iniziali del layout può da un arretrato di report, piuttosto che dall'improvviso verificarsi di numerosi variazioni del layout.
  • Per evitare di influire sulle prestazioni, PerformanceObserver attende fino a quando l'istanza principale il thread è inattivo per segnalare le variazioni del layout. Di conseguenza, in base a come è impegnato nel thread principale, potrebbe esserci un leggero ritardo tra il momento in cui un layout e quando viene registrato nella console.
  • Questo script ignora le variazioni del layout che si sono verificate entro 500 ms dall'input dell'utente e per questo non verranno prese in considerazione per la metrica CLS.

Le informazioni sulle variazioni del layout vengono segnalate utilizzando una combinazione di due API: LayoutShift e LayoutShiftAttribution interfacce. Ognuna di queste interfacce è spiegata più dettagliatamente nel le sezioni seguenti.

LayoutShift

Ogni variazione del layout viene registrata utilizzando l'interfaccia LayoutShift. I contenuti di una voce avrà il seguente aspetto:

duration: 0
entryType: "layout-shift"
hadRecentInput: false
lastInputTime: 0
name: ""
sources: (3) [LayoutShiftAttribution, LayoutShiftAttribution, LayoutShiftAttribution]
startTime: 11317.934999999125
value: 0.17508567530168798

La voce sopra indica una variazione del layout durante la quale sono stati modificati tre elementi DOM posizione. Il punteggio della variazione del layout di questa particolare variazione del layout è stato 0.175.

Queste sono le proprietà di un'istanza LayoutShift più pertinenti per debug delle variazioni del layout:

Proprietà Descrizione
sources La proprietà sources elenca gli elementi DOM spostati durante la variazione del layout. Questo array può contenere fino a cinque origini. Se la variazione del layout influisce su più di cinque elementi, vengono indicate le cinque origini principali (misurate in base all'impatto sulla stabilità del layout) di questa variazione. Queste informazioni vengono riportate utilizzando l'interfaccia LayoutShiftAttribution (spiegata più dettagliatamente di seguito).
value La proprietà value registra il punteggio della variazione del layout per una determinata variazione del layout.
hadRecentInput La proprietà hadRecentInput indica se si è verificata una variazione del layout entro 500 millisecondi dall'input dell'utente.
startTime La proprietà startTime indica quando si è verificata una variazione del layout. Il valore startTime viene indicato in millisecondi e viene misurato in relazione al tempo di avvio del caricamento della pagina.
duration La proprietà duration sarà sempre impostata su 0. Questa proprietà viene ereditata dall'interfaccia di PerformanceEntry (l'interfaccia LayoutShift estende l'interfaccia PerformanceEntry). Tuttavia, il concetto di durata non si applica agli eventi di variazione del layout, pertanto è impostato su 0. Per informazioni sull'interfaccia PerformanceEntry, consulta le specifiche.

LayoutShiftAttribution

L'interfaccia LayoutShiftAttribution descrive un singolo turno di un singolo DOM . Se più elementi si spostano durante una variazione del layout, sources contiene più voci.

Ad esempio, il codice JSON seguente corrisponde a una variazione del layout con una sola origine: spostamento verso il basso dell'elemento DOM <div id='banner'> da y: 76 a y:246.

// ...
  "sources": [
    {
      "node": "div#banner",
      "previousRect": {
        "x": 311,
        "y": 76,
        "width": 4,
        "height": 18,
        "top": 76,
        "right": 315,
        "bottom": 94,
        "left": 311
      },
      "currentRect": {
        "x": 311,
        "y": 246,
        "width": 4,
        "height": 18,
        "top": 246,
        "right": 315,
        "bottom": 264,
        "left": 311
      }
    }
  ]

La proprietà node identifica l'elemento HTML che è stato spostato. Passaggio del mouse sopra in DevTools evidenzia l'elemento della pagina corrispondente.

Le proprietà previousRect e currentRect registrano le dimensioni e la posizione nel nodo.

  • Le coordinate x e y indicano le coordinate x e y rispettivamente dell'angolo superiore sinistro dell'elemento
  • Le proprietà width e height registrano rispettivamente la larghezza e l'altezza dell'elemento.
  • Le proprietà top, right, bottom e left registrano la risposta x o y i valori delle coordinate corrispondenti al bordo specificato dell'elemento. In altre parole, il valore di top è uguale a y; il valore di bottom è uguale a y+height.

Se tutte le proprietà di previousRect sono impostate su 0, significa che l'elemento ha ora visibile. Se tutte le proprietà di currentRect sono impostate su 0, significa che l'elemento è spostato fuori dall'area visibile.

Uno degli aspetti più importanti da capire quando si interpretano questi output è che gli elementi elencati come sorgenti sono quelli che si sono spostati durante il variazione del layout. Tuttavia, è possibile che questi elementi siano solo indirettamente correlati alla "causa principale" di instabilità del layout. Ecco alcuni esempi.

Esempio 1

Questa variazione del layout verrebbe registrata con una sola origine: l'elemento B. Tuttavia, la causa principale di questa variazione del layout è la variazione delle dimensioni dell'elemento A.

Esempio di una variazione del layout causata da una modifica delle dimensioni dell&#39;elemento

Esempio 2

La variazione del layout in questo esempio verrebbe registrata con due origini: elemento A e l'elemento B. La causa principale di questa variazione del layout è il cambiamento di posizione elemento A.

Esempio di una variazione del layout causata da un cambiamento nella posizione dell&#39;elemento

Esempio 3

La variazione del layout in questo esempio verrebbe registrata con una sola sorgente: l'elemento B. La modifica della posizione dell'elemento B ha comportato questa variazione del layout.

Esempio di una variazione del layout causata da un cambiamento nella posizione dell&#39;elemento

Esempio 4

Anche se le dimensioni dell'elemento B cambiano, in questo esempio non c'è alcuna variazione del layout.

Esempio che mostra la modifica delle dimensioni di un elemento senza causare una variazione del layout

Guarda una demo di come le modifiche al DOM vengono segnalate dall'API Layout Instability.

DevTools

Riquadro Rendimento

Il riquadro Esperienza del riquadro Prestazioni di DevTools mostra tutte variazioni del layout che si verificano durante un determinato monitoraggio delle prestazioni, anche se si verificano entro 500 ms da un'interazione dell'utente e, pertanto, non vengono conteggiate ai fini della metrica CLS. Passare il mouse sopra una determinata variazione del layout nelle evidenziazioni del riquadro Esperienza. l'elemento DOM interessato.

Screenshot di una variazione del layout visualizzata nel riquadro Rete DevTools

Per visualizzare ulteriori informazioni sulla variazione del layout, fai clic sulla variazione del layout, quindi apri il riquadro a scomparsa Riepilogo. Le modifiche apportate alle dimensioni dell'elemento vengono elencate utilizzando il formato [width, height]; le modifiche alla posizione dell'elemento vengono elencate utilizzando il formato [x,y]. La proprietà Inserimento recente indica se un la variazione del layout si è verificata entro 500 ms da un'interazione dell'utente.

Screenshot del &quot;Riepilogo&quot; di DevTools per una variazione del layout

Per informazioni sulla durata di una variazione del layout, apri la scheda Log eventi. La durata di una variazione del layout può essere approssimata anche osservando i valori Riquadro Esperienza per la lunghezza del rettangolo con la variazione del layout rosso.

Screenshot del &quot;Log eventi&quot; di DevTools per una variazione del layout

Per ulteriori informazioni sull'uso del riquadro Prestazioni, consulta la sezione Prestazioni. Analisi Riferimento.

Evidenzia le regioni con variazioni del layout

Evidenziare le regioni con variazioni del layout può essere una tecnica utile per ottenere la posizione e le tempistiche delle variazioni del layout per una visione immediata e immediata che si verificano su una pagina.

Per abilitare le regioni Variazione del layout in DevTools, vai a Impostazioni > Altri strumenti > Rendering > Layout con modifica delle regioni, quindi aggiorna la pagina di cui vuoi eseguire il debug. Le aree di variazione del layout saranno brevemente evidenziate in viola.

Processo di pensiero per identificare la causa delle variazioni del layout

Puoi utilizzare i passaggi riportati di seguito per identificare la causa delle variazioni del layout indipendentemente da quando o come si verifica la variazione del layout. Questi passaggi possono essere integrato con Lighthouse, ma tieni presente che Lighthouse può Identificare solo le variazioni del layout che si sono verificate durante il caricamento iniziale della pagina. Nella Inoltre, Lighthouse può fornire solo suggerimenti per alcune cause di layout variazioni, ad esempio elementi dell'immagine senza larghezza e altezza esplicite.

Identificare la causa di una variazione del layout

Le variazioni del layout possono essere causate dai seguenti eventi:

  • Modifiche alla posizione di un elemento DOM
  • Modifiche alle dimensioni di un elemento DOM
  • Inserimento o rimozione di un elemento DOM
  • Animazioni che attivano il layout

In particolare, l'elemento DOM immediatamente prima dell'elemento spostato è l'elemento che ha maggiori probabilità di essere coinvolto nel "causare" variazione del layout. Pertanto, quando per capire perché si è verificata una variazione del layout, considera:

  • La posizione o le dimensioni dell'elemento precedente sono cambiate?
  • Un elemento DOM è stato inserito o rimosso prima dell'elemento spostato?
  • La posizione dell'elemento spostato è stata modificata esplicitamente?

Se l'elemento precedente non ha causato la variazione del layout, continua la ricerca prendendo in considerazione altri elementi precedenti e vicini.

Inoltre, la direzione e la distanza di una variazione del layout possono fornire suggerimenti sulla causa principale. Ad esempio, uno scostamento elevato verso il basso indica spesso l'inserimento di un elemento DOM, mentre una variazione del layout di 1 px o 2 px indica spesso l'applicazione di stili CSS in conflitto o il caricamento e l'applicazione di un carattere web.

Diagramma che mostra una variazione del layout causata dallo scambio di caratteri
. In questo esempio, lo scambio dei caratteri ha causato uno spostamento verso l'alto degli elementi della pagina di cinque pixel.

Di seguito sono riportati alcuni dei comportamenti specifici che più spesso causano la variazione del layout eventi:

Modifiche alla posizione di un elemento (non dovute al movimento di un altro elemento)

Questo tipo di modifica spesso è il risultato di:

  • I fogli di stile che vengono caricati tardi o sovrascrivono gli stili dichiarati in precedenza.
  • Effetti di animazione e transizione.

Modifiche alle dimensioni di un elemento

Questo tipo di modifica spesso è il risultato di:

  • I fogli di stile che vengono caricati tardi o sovrascrivono gli stili dichiarati in precedenza.
  • Immagini e iframe senza attributi width e height che vengono caricati dopo il suo "spazio" è stato eseguito il rendering.
  • Blocchi di testo senza attributi width o height che si scambiano i caratteri dopo il viene eseguito il rendering del testo.

Inserimento o rimozione di elementi DOM

Spesso la causa è:

  • Inserimento di annunci e altri incorporamenti di terze parti.
  • Inserimento di banner, avvisi e modali.
  • Scorrimento continuo e altri pattern UX che caricano contenuti aggiuntivi sopra contenuti esistenti.

Animazioni che attivano il layout

Alcuni effetti dell'animazione possono attivarsi layout. Un comune Un esempio di ciò è quando gli elementi DOM sono "animati" incrementando le proprietà come top o left anziché utilizzare gli attributi CSS transform: proprietà. Leggi l'articolo Come creare animazioni CSS ad alte prestazioni per ulteriori informazioni.

Riprodurre le variazioni del layout

Non puoi correggere le variazioni del layout che non riesci a riprodurre. Uno dei più semplici azioni più efficaci che puoi adottare per comprendere meglio il layout del tuo sito. stabile richiede 5-10 minuti per interagire con il tuo sito web con l'obiettivo che attivano variazioni del layout. Tieni aperta la console mentre esegui questa operazione e utilizza API Layout Instability per generare report sulle variazioni del layout.

Per variazioni di layout difficili da individuare, considera la possibilità di ripetere questo esercizio con diversi dispositivi e velocità di connessione. In particolare, l'utilizzo di un metodo velocità di connessione può semplificare l'identificazione delle variazioni del layout. Inoltre, puoi utilizzare un'istruzione debugger per semplificare la visualizzazione dei passaggi del layout senza interruzioni.

new PerformanceObserver((entryList) => {
  for (const entry of entryList.getEntries()) {
    if (!entry.hadRecentInput) {
      cls += entry.value;
      debugger;
      console.log('Current CLS value:', cls, entry);
    }
  }
}).observe({type: 'layout-shift', buffered: true});

Infine, per i problemi di layout che non sono riproducibili in fase di sviluppo, utilizzando l'API Layout Instability insieme allo strumento di logging front-end di raccogliere ulteriori informazioni su questi problemi. Paga il codice di esempio su come monitorare l'elemento spostato più grande di una pagina.