Layout und der enthaltende Block
Die Größe und Position eines Elements werden oft von seinem enthaltenden Block beeinflusst. Meistens ist der enthaltende Block der Inhaltsbereich des nächsten Block-Level-Vorfahren-Elements, dies ist jedoch nicht immer der Fall. In diesem Artikel untersuchen wir die Faktoren, die den enthaltenden Block eines Elements bestimmen.
Wenn ein Benutzeragent (wie Ihr Browser) ein Dokument anordnet, wird für jedes Element eine Box erzeugt. Jede Box ist in vier Bereiche unterteilt:
- Inhaltsbereich
- Auffüllbereich
- Randbereich
- Außenabstandbereich
Viele Entwickler glauben, dass der enthaltende Block eines Elements immer der Inhaltsbereich seines Elternteils ist, aber das ist nicht unbedingt wahr. Lassen Sie uns die Faktoren untersuchen, die bestimmen, was der enthaltende Block eines Elements ist.
Auswirkungen des enthaltenden Blocks
Bevor Sie lernen, was den enthaltenden Block eines Elements bestimmt, ist es nützlich, zu wissen, warum es überhaupt wichtig ist.
Die Größe und Position eines Elements werden oft von seinem enthaltenden Block beeinflusst. Prozentwerte, die auf die Eigenschaften width
, height
, padding
, margin
und die Versatzeigenschaften eines absolut positionierten Elements angewendet werden (d. h. das position
auf absolute
oder fixed
gesetzt hat), werden aus dem enthaltenden Block des Elements berechnet.
Identifizierung des enthaltenden Blocks
Der Prozess zur Identifizierung des enthaltenden Blocks hängt vollständig vom Wert der position
-Eigenschaft des Elements ab:
-
Wenn die
position
-Eigenschaftstatic
,relative
odersticky
ist, wird der enthaltende Block durch die Kante der Inhaltsbox des nächsten Vorfahren-Elements gebildet, das entweder ein Block-Container ist (wie ein Inline-Block, Block oder Listenelement) oder einen Formatierungskontext erstellt (wie ein Tabellencontainer, Flexcontainer, Rastercontainer oder der Blockcontainer selbst). -
Wenn die
position
-Eigenschaftabsolute
ist, wird der enthaltende Block durch die Kante der Auffüllbox des nächsten Vorfahren-Elements gebildet, das einenposition
-Wert ungleichstatic
(fixed
,absolute
,relative
odersticky
) hat. -
Wenn die
position
-Eigenschaftfixed
ist, wird der enthaltende Block durch das viewport (im Falle kontinuierlicher Medien) oder den Seitenbereich (im Falle von Seitenmedien) festgelegt. -
Wenn die
position
-Eigenschaftabsolute
oderfixed
ist, kann der enthaltende Block auch durch die Kante der Auffüllbox des nächsten Vorfahren-Elements gebildet werden, das eine der folgenden Eigenschaften hat:- Einen
filter
,backdrop-filter
,transform
, oderperspective
-Wert ungleichnone
. - Einen
contain
-Wert vonlayout
,paint
,strict
odercontent
(z. B.contain: paint;
). - Einen
container-type
-Wert ungleichnormal
. - Einen
will-change
-Wert, der eine Eigenschaft enthält, für die ein Wert ungleich dem Anfangswert einen enthaltenden Block bilden würde (z. B.filter
odertransform
). - Einen
content-visibility
-Wert vonauto
.
- Einen
Hinweis:
Der enthaltende Block, in dem sich das Wurzelelement (<html>
) befindet, ist ein Rechteck, das als anfänglicher enthaltender Block bezeichnet wird. Es hat die Abmessungen des Viewports (für kontinuierliche Medien) oder des Seitenbereichs (für Seitenmedien).
Hinweis:
Es gibt Browser-Inkonsistenzen bei perspective
und filter
, die zur Bildung des enthaltenden Blocks beitragen.
Berechnung von Prozentwerten aus dem enthaltenden Block
Wie oben erwähnt, hängt der berechnete Wert, wenn bestimmten Eigenschaften ein Prozentwert gegeben wird, vom enthaltenden Block des Elements ab. Die Eigenschaften, die auf diese Weise funktionieren, sind Eigenschaften des Box-Modells und Versatzeigenschaften:
- Die
height
,top
undbottom
-Eigenschaften berechnen Prozentwerte aus derheight
des enthaltenden Blocks. - Die
width
,left
,right
,padding
undmargin
-Eigenschaften berechnen Prozentwerte aus derwidth
des enthaltenden Blocks.
Hinweis: Ein Block-Container (wie ein Inline-Block, Block oder Listenelement) enthält entweder nur Inline-Level-Boxen, die an einem Inline-Formatierungskontext teilnehmen, oder nur Block-Level-Boxen, die an einem Block-Formatierungskontext teilnehmen. Ein Element ist nur dann ein Block-Container, wenn es Block-Level- oder Inline-Level-Boxen enthält.
Einige Beispiele
Der HTML-Code für alle unsere Beispiele ist:
<body>
<section>
<p>This is a paragraph!</p>
</section>
</body>
Nur das CSS wird in jedem der untenstehenden Beispiele geändert.
Beispiel 1
In diesem Beispiel ist der Absatz statisch positioniert, also ist sein enthaltender Block <section>
, da dies der nächste Vorfahre ist, der ein Block-Container ist (aufgrund von display: block
).
body {
background: beige;
}
section {
display: block;
width: 400px;
height: 160px;
background: lightgray;
}
p {
width: 50%; /* == 400px * .5 = 200px */
height: 25%; /* == 160px * .25 = 40px */
margin: 5%; /* == 400px * .05 = 20px */
padding: 5%; /* == 400px * .05 = 20px */
background: cyan;
}
Beispiel 2
In diesem Beispiel ist der enthaltende Block des Absatzes das <body>
-Element, weil <section>
kein Block-Container ist (aufgrund von display: inline
) und keinen Formatierungskontext erstellt.
body {
background: beige;
}
section {
display: inline;
background: lightgray;
}
p {
width: 50%; /* == half the body's width */
height: 200px; /* Note: a percentage would be 0 */
background: cyan;
}
Beispiel 3
In diesem Beispiel ist der enthaltende Block des Absatzes <section>
, da letzterer position
auf absolute
gesetzt hat. Die Prozentwerte des Absatzes werden durch das padding
seines enthaltenden Blocks beeinflusst, obwohl dies nicht der Fall wäre, wenn der box-sizing
-Wert des enthaltenden Blocks border-box
wäre.
body {
background: beige;
}
section {
position: absolute;
left: 30px;
top: 30px;
width: 400px;
height: 160px;
padding: 30px 20px;
background: lightgray;
}
p {
position: absolute;
width: 50%; /* == (400px + 20px + 20px) * .5 = 220px */
height: 25%; /* == (160px + 30px + 30px) * .25 = 55px */
margin: 5%; /* == (400px + 20px + 20px) * .05 = 22px */
padding: 5%; /* == (400px + 20px + 20px) * .05 = 22px */
background: cyan;
}
Beispiel 4
In diesem Beispiel ist die position
des Absatzes fixed
, also ist sein enthaltender Block der anfängliche enthaltende Block (bei Bildschirmen der Viewport). Somit ändern sich die Abmessungen des Absatzes basierend auf der Größe des Browserfensters.
body {
background: beige;
}
section {
width: 400px;
height: 480px;
margin: 30px;
padding: 15px;
background: lightgray;
}
p {
position: fixed;
width: 50%; /* == (50vw - (width of vertical scrollbar)) */
height: 50%; /* == (50vh - (height of horizontal scrollbar)) */
margin: 5%; /* == (5vw - (width of vertical scrollbar)) */
padding: 5%; /* == (5vw - (width of vertical scrollbar)) */
background: cyan;
}
Beispiel 5
In diesem Beispiel ist die position
des Absatzes absolute
, also ist sein enthaltender Block <section>
, welches das nächste Vorfahren-Element mit einer transform
-Eigenschaft ist, die nicht none
ist.
body {
background: beige;
}
section {
transform: rotate(0deg);
width: 400px;
height: 160px;
background: lightgray;
}
p {
position: absolute;
left: 80px;
top: 30px;
width: 50%; /* == 200px */
height: 25%; /* == 40px */
margin: 5%; /* == 20px */
padding: 5%; /* == 20px */
background: cyan;
}
Siehe auch
all
-Eigenschaftcontain
-Eigenschaftaspect-ratio
-Eigenschaftbox-sizing
-Eigenschaftmin-content
undmax-content
Größenwerte- Lernen: Größenanpassung von Elementen in CSS
- Box-Modell
- CSS Box-Modell Modul
- Layout-Modi
- Visuelle Formatierungsmodelle
- Block-Formatierungskontext
- Stacking-Kontext
- Außenabstand-Kollaps
- Initial, berechnet, verwendet, und tatsächliche Werte
- Ersetzte Elemente
- Intrinsische Größe