CSS Zibaldone

Block & Line Cheat Sheet

Articolo originale: http://www.mozilla.org/newlayout/doc/block-and-line.html

Autore: Chris Waterson

Traduzione: Gabriele Romanato (19 febbraio 2008)

Sguardo d'insieme

I dettagli del layout di blocco e inline sono difficili. Questo documento serve da "cheat sheet" per descrivere come le stravaganze dei diversi flag di stato controllino quello che accade. È un lavoro in svolgimento, con le domande in rosso. Se conoscete le risposte siete pregati di informari in modo che io possa aggiornare il documento.

Oggetti

Questa sezione presenta alcune delle classi coinvolte nel reflow di blocco e inline, insieme con i membri importanti di ciascun oggetto che controllano il processo di reflow.

nsFrame

La classe di base per tutti i frame.

mFlags

Flag impostati sul frame per indicare il suo stato. Questi flag possono essere divisi in due categorie: flag che influenzano tutti i frame (flag "pubblici") e flag riservati ad un uso privato del singolo frame (flag "privati").

NS_FRAME_IN_REFLOW

Questo bit viene impostato quando il frame è in fase di reflow. Di default è impostato in WillReflow(), e non impostato in DidReflow(). Molti metodi Reflow() verificano che il bit sia impostato con un'asserzione.

NS_FRAME_FIRST_REFLOW

Questo flag viene impostato su un frame creato ex novo ed in seguito pulito dal metodo Reflow() quando il frame ha avuto il suo reflow iniziale.

NS_FRAME_SYNC_FRAME_AND_VIEW
NS_FRAME_OUTSIDE_CHILDREN

Questo flag viene impostato se l'area combinata del figlio di un frame si estende oltre il box che delimita il frame. (Qual'è il "box che delimita il frame"?) Se questo flag viene impostato, allora mOverflowArea conterrà l'area totale del frame, incluso l'overflow.

NS_FRAME_EXTERNAL_REFERENCE
NS_FRAME_REPLACED_ELEMENT
NS_FRAME_GENERATED_CONTENT
NS_FRAME_HAS_LOADED_IMAGES
NS_FRAME_OUT_OF_FLOW
NS_FRAME_SELECTED_CONTENT
NS_FRAME_IS_DIRTY
NS_FRAME_IS_UNFLOWABLE

Un frame che non scorre è una condizione di errore, per esempio dovuta a delle limitazioni nel sistema. Attualmente l'unico modo di ottenere questo tipo di frame è avere un albero dei frame "troppo profondo" (vedi nsFrame::IsFrameTreeTooDeep()).

NS_FRAME_HAS_DIRTY_CHILDREN
NS_FRAME_HAS_VIEW
NS_FRAME_INDEPENDENT_SELECTION
NS_FRAME_IS_SPECIAL
nsBlockFrame
mFlags

Questi flag sono i flag privati che hanno un senso per i frame di blocco.

NS_BLOCK_SHRINK_WRAP

Fa in modo che il blocco si stringa attorno al suo contenuto. Questo significa che il blocco determina la larghezza dei suoi figli e rende l'area di contenuto di quella larghezza. Infine aggiunge padding e bordo per determinare la larghezza finale.

È qui che interviene la "larghezza che tende a zero"?

NS_BLOCK_NO_AUTO_MARGINS
NS_BLOCK_MARGIN_ROOT

Indica che questo è un frame da cui possono essere calcolati i margini figlio. L'assenza di questo flag implica che il calcolo dei margini figlio dovrebbero ignorare il frame e risalire la catena dei genitori. Usato in nsBlockReflowContext::ComputeCollapsedTopMargin().

Questo flag fa in modo che il costruttore di nsBlockReflowState imposti i flag BRS_ISTOPMARGINROOT e BRS_ISBOTTOMMARGINROOT.

Viene impostato di default per il documento, le celle di tabella interne e i frame contenitori posizionati in modo assoluto.

NS_BLOCK_SPACE_MGR

Questo indica che un frame di blocco dovrebbe creare un proprio Space Manager. È richiesto per ogni frame di blocco che contiene flottanti: lo Space Manager viene usato per creare spazio per i frame flottati.

Viene impostato di default per i frame del documento, i frame area, i frame interni delle celle di tabella, i frame contenitori posizionati in modo assoluto e i frame flottati quando viene creato il frame.

nsLineBox

Un blocco consta di righe e altri blocchi, impilati in verticale. Un frame di blocco ha un solo nsLineBox per ciascuna riga, e un solo nsLineBox per ciascun blocco figlio. Questi sono memorizzati come un elenco doubly-linked nel membro mLines di nsBlockFrame.

nsInlineFrame
mFlags
NS_INLINE_FRAME_CONTAINS_PERCENT_AWARE_CHILD

Questo flag viene impostato se il frame inline ha dei figli con un valore in percentuale impostato (attraverso lo Style Context) per la larghezza o l'altezza dell'area di contenuto, padding, bordo o margine.

nsHTMLReflowState

Lo stato attuale del reflow, costruito quando il reflow scende ricorsivamente l'albero dei frame. Viene "passato" ad un frame figlio dal suo genitore, e fornisce le restrizioni con cui il frame figlio deve dimensionarsi (per esempio la larghezza e l'altezza disponibile per un frame figlio).

mComputedWidth
mComputedHeight
mComputedMargin
mComputedBorderPadding
mComputedPadding
mComputedOffsets
mComputedMinWidth
mComputedMaxWidth
mComputedMinHeight
mComputedMaxHeight

Given the current container frame and the style applied to the child, these values are the resolved values for the child frame's box.

nsHTMLReflowMetrics

La struttura che viene "riempita" da un frame durante il reflow, e viene usata per comunicare le informazioni sulle dimensioni desiderate del frame al suo contenitore.

mMaximumWidth

La larghezza massima che il frame occuperebbe se venisse eseguito il reflow con una larghezza disponibile non limitata. Lo si potrebbe meglio chiamare "larghezza preferita".

Viene calcolato quando è impostato il flag di nsBlockReflowState BRS_COMPUTEMAXWIDTH.

maxElementWidth

La larghezza massima per gli elementi all'interno del frame che non può essere ulteriormente divisa (per esempio la parola più lunga in un paragrafo). Si noti che un frame fuori dal flusso (per esempio un float) può influenzare questo valore.

Questo campo è un puntatore a un oggetto nsSize. Se è null, il frame non ha bisogno di calcolarlo.

nsBlockReflowState

Informazioni aggiuntive sullo stato di reflow che il frame di blocco usa insieme con nsHTMLReflowState. Come nsHTMLReflowState, questo è un dato a sola lettura che viene passato da un genitore ai suoi figli.

mFlags
BRS_UNCONSTRAINEDWIDTH

Questo flag è impostato nel costruttore nsBlockReflowState quando:

  1. Non c'è una larghezza calcolata per il frame in nsHTMLReflowState, e
  2. al frame che ha il reflow è stato dato NS_UNCONSTRAINEDSIZE come sua larghezza disponibile in nsHTMLReflowState.
BRS_UNCONSTRAINEDHEIGHT

Questo flag viene impostato nel costruttore nsBlockReflowState quando al frame che ha avuto il reflow è stato dato NS_UNCONSTRAINEDSIZE come sua altezza disponibile in nsHTMLReflowState.

Se impostato, NS_UNCONSTRAINEDSIZE viene passato a nsLineLayout come altezza disponibile.

BRS_SHRINKWRAPWIDTH
BRS_NEEDRESIZEREFLOW

Correlato a BRS_SHRINKWRAPWIDTH. Impostato se abbiamo bisogno di un reflow di ridimensionamento quando calcoliamo la dimensione finale. per esempio perché... perché?

BRS_ISINLINEINCRREFLOW

Questo flag è impostato in nsBlockFrame::Reflow() se ci accorgiamo che stiamo facendo il reflow incrementale di un box di riga che contiene frame inline. In questo caso possiamo evitare un pò di lavoro durante il reflow.

BRS_NOWRAP

Questo flag è impostato nel costruttore nsBlockReflowState quando lo stile white-space del frame di blocco è pre o nowrap. Altrimenti viene pulito.

BRS_ISTOPMARGINROOT

Questo flag è impostato nel costruttore nsBlockReflowState quando si fa il reflow di un frame "block margin root" (ossia un frame con il flag NS_BLOCK_MARGIN_ROOT impostato, per cui i margini si applicano di default).

Il flag viene anche impostato quando si fa il reflow di un frame il cui bordo o padding superiore ha un valore calcolato di zero. (perché?)

BRS_ISBOTTOMMARGINROOT

Questo flag è impostato nel costruttore nsBlockReflowState quando si fa il reflow di un frame "block margin root" (ossia un frame con il flag NS_BLOCK_MARGIN_ROOT impostato, per cui i margini si applicano di default).

Il flag viene anche impostato quando si fa il reflow di un frame il cui bordo o padding inferiore ha un valore calcolato di zero. (perché?)

BRS_APPLYTOPMARGIN

Questo flag è impostato se il margine superiore deve essere preso in considerazione quando si posiziona un box di riga che contiene un frame di blocco. Può essere impostato come effetto collaterale della chiamata a nsBlockFrame::ShouldApplyTopMargin(). Una volta impostato, ShouldApplyTopMargin() lo usa come un facile modo di stabilire se il margine superiore deve essere applicato.

Se il flag non è stato impostato nello stato di reflow del blocco, allora ShouldApplyTopMargin() passa in rassegna l'elenco della riga per vedere se un frame di blocco precede il frame specificato. Se lo precede, il margine superiore deve essere applicato, e il flag viene impostato per memorizzare il risultato. Se non lo precede, il margine superiore viene applicato come risultato della logica generazionale del collassamento dei margini in nsBlockReflowContext::ComputeCollapsedTopMargin(). In questo caso, il flag non viene impostato, e le successive chiamate a ShouldApplyTopMargin() continueranno a scorrere l'elenco della riga.

Viene anche impostato nel costruttore nsBlockReflowState se è impostato BRS_ISTOPMARGINROOT. In altre parole, se il frame che ha il reflow è un margine radice di default.

BRS_COMPUTEMAXELEMENTSIZE

Questo flag viene impostato se il reflow deve ricalcolare la dimensione massima di un elemento.

Viene impostato nel costruttore nsBlockReflowState se il membro "maxElementSize" dell'oggetto nsHTMLReflowMetrics è stato fornito dal (frame genitore?).

BRS_COMPUTEMAXWIDTH

Questo flag viene impostato se il reflow deve ricalcolare la larghezza massima di un frame (per esempio durante la prima fase del reflow di una tabella). Quando viene impostato, nsBlockFrame::ReflowLine fa fluire la prima riga e ogni riga senza contenitore due volte nel blocco.

nsBlockReflowContext

Incapsula lo stato di reflow transitorio per un nsLineBox che contiene un frame di blocco.

mNextRCFrame

Durante un reflow incrementale, questo membro conserva il frame corrente nella catena del reflow.

nsLineLayout

Incapsula lo stato di reflow transitorio per un nsLineBox che contiene frame inline. Viene creato un nuovo oggetto nsLineLayout per ogni box di riga inline lungo il flusso.

mFlags
LL_ENDSINWHITESPACE

Impostato a true di default quando si inizia il layout di riga.

LL_UNDERSTANDSNWHITESPACE
LL_TEXTSTARTSWITHNBSP
LL_FIRSTLETTERSTYLEOK
LL_ISTOPOFPAGE
LL_UPDATEDBAND
LL_IMPACTEDBYFLOATERS
LL_LASTFLOATERWASLETTERFRAME
LL_CANPLACEFLOATER
LL_KNOWSTRICTMODE
LL_INSTRICTMODE
LL_LINEENDSINBR
PerFrameData

(Perché non è semplicemente memorizzato nel frame?)

mFlags
PFD_RELATIVEPOS
PFD_ISTEXTFRAME
PFD_ISNONEMPTYTEXTFRAME
PFD_ISNONWHITESPACETEXTFRAME
PFD_ISLETTERFRAME
PFD_ISSTICKY
PFD_ISBULLET
PerSpanData

In nsLineLayout, uno "span" è un frame contenitore inline e un "frame" è uno dei suoi figli. Forse PerParentData e PerChildData sarebbero nomi migliori?

nsLineLayout::BeginLineReflow crea l'iniziale PerSpanData che viene detto "root span". nsInlineFrame::ReflowFrames crea un nuovo PerSpanData quando chiama nsLineLayout::BeginSpan. Questa volta, il nsLineLayout dell'oggetto mCurrentSpan viene passato al nuovo span. Il nuovo span registra il vecchio mCurrentSpan come suo genitore. Dopo aver fatto il reflow dei frame inline figli, nsInlineFrame::ReflowFrames chiama nsLineLayout::EndSpan, che fa il pop di PerSpanData e reimposta mCurrentSpan.

mFirstFrame

La prima struttura PerFrameData nello span.

mLastFrame

L'ultima struttura PerFrameData nello span. Le strutture PerFrameData vengono aggiunte allo span come se avessero il reflow.

mLastFrame può anche essere manipolato direttamente se una riga viene divisa, o se i frame vengono spinti da una riga alla successiva.

mFrame

Il PerFrameData del frame inline che "possiede" lo span, oppure null, se questo è lo span radice.

mFrame viene inizializzato sul PerFrameData del frame inline contenitore quando un nuovo PerSpanData viene spinto in nsLineLayout::BeginSpan.

Risorse interne

Risorse esterne

Feed dal blog

onwebdev

Gabriele Romanato