position
Baseline
Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since Juli 2015.
Die position CSS Eigenschaft legt fest, wie ein Element in einem Dokument positioniert ist. Die physikalischen Eigenschaften top, right, bottom und left sowie die flussrelativen logischen Eigenschaften inset-block-start, inset-block-end, inset-inline-start und inset-inline-end können verwendet werden, um den endgültigen Standort von positionierten Elementen zu bestimmen.
Probieren Sie es aus
position: static;
position: relative;
top: 40px;
left: 40px;
position: absolute;
inset-inline-start: 40px;
inset-block-start: 40px;
position: sticky;
top: 20px;
<section class="default-example" id="default-example">
<div id="example-element-container">
<p>
In this demo you can control the <code>position</code> property for the
yellow box.
</p>
<div class="box"></div>
<div class="box" id="example-element"></div>
<div class="box"></div>
<p class="clear">
To see the effect of <code>sticky</code> positioning, select the
<code>position: sticky</code> option and scroll this container.
</p>
<p>
The element will scroll along with its container, until it is at the top
of the container (or reaches the offset specified in <code>top</code>),
and will then stop scrolling, so it stays visible.
</p>
<p>
The rest of this text is only supplied to make sure the container
overflows, so as to enable you to scroll it and see the effect.
</p>
<hr />
<p>
Far out in the uncharted backwaters of the unfashionable end of the
western spiral arm of the Galaxy lies a small unregarded yellow sun.
Orbiting this at a distance of roughly ninety-two million miles is an
utterly insignificant little blue green planet whose ape-descended life
forms are so amazingly primitive that they still think digital watches are
a pretty neat idea.
</p>
</div>
</section>
section {
align-items: flex-start;
overflow: auto;
}
.box {
background-color: rgb(0 0 255 / 0.2);
border: 3px solid blue;
float: left;
width: 65px;
height: 65px;
}
.box + .box {
margin-left: 10px;
}
.clear {
clear: both;
padding-top: 1em;
}
#example-element-container {
position: relative;
text-align: left;
}
#example-element {
background-color: yellow;
border: 3px solid red;
z-index: 1;
}
Syntax
position: static;
position: relative;
position: absolute;
position: fixed;
position: sticky;
/* Global values */
position: inherit;
position: initial;
position: revert;
position: revert-layer;
position: unset;
Werte
static-
Das Element wird gemäß dem normalen Fluss des Dokuments positioniert. Die Eigenschaften
top,right,bottom,leftundz-indexhaben keine Wirkung. Dies ist der Standardwert. relative-
Das Element wird gemäß dem normalen Fluss des Dokuments positioniert und dann relativ zu sich selbst basierend auf den Werten von
top,right,bottomundleftversetzt. Der Versatz beeinflusst nicht die Position anderer Elemente; der Platz, der dem Element im Seitenlayout zugewiesen wird, ist derselbe, wie wenn die Positionstaticwäre.Dieser Wert erstellt einen neuen Stapelkontext, wenn der Wert von
z-indexnichtautoist. Seine Wirkung auftable-*-group,table-row,table-column,table-cellundtable-captionElemente ist nicht definiert. absolute-
Das Element wird aus dem normalen Dokumentfluss entfernt, und es wird kein Platz für das Element im Seitenlayout geschaffen. Das Element wird relativ zu seinem nächstgelegenen positionierten Vorfahren (falls vorhanden) oder zum initialen Enthaltenen Block positioniert. Seine endgültige Position wird durch die Werte von
top,right,bottomundleftbestimmt.Dieser Wert erstellt einen neuen Stapelkontext, wenn der Wert von
z-indexnichtautoist. Die Ränder von absolut positionierten Boxen kollidieren nicht mit anderen Rändern. fixed-
Das Element wird aus dem normalen Dokumentfluss entfernt, und es wird kein Platz für das Element im Seitenlayout geschaffen. Das Element wird relativ zu seinem initialen Enthaltenen Block positioniert, der im Falle von visuellen Medien das Viewport ist. Seine endgültige Position wird durch die Werte von
top,right,bottomundleftbestimmt.Dieser Wert erstellt immer einen neuen Stapelkontext. In gedruckten Dokumenten wird das Element auf jeder Seite an derselben Position platziert.
sticky-
Das Element wird gemäß dem normalen Fluss des Dokuments positioniert und dann relativ zu seinem nächstgelegenen scrollenden Vorfahren und Enthaltenen Block (nächstgelegener Block-Ebene Vorfahre), einschließlich tabellenbezogene Elemente, basierend auf den Werten von
top,right,bottomundleftversetzt. Der Versatz beeinflusst nicht die Position anderer Elemente.Dieser Wert erstellt immer einen neuen Stapelkontext. Beachten Sie, dass ein Sticky-Element an seinem nächstgelegenen Vorfahren "haftet", der einen "Scrollmechanismus" hat (erzeugt, wenn
overflowhidden,scroll,autooderoverlayist), selbst wenn dieser Vorfahre nicht der tatsächlich nächstgelegene scrollende Vorfahre ist.Hinweis: Mindestens eine Einsetzen Eigenschaft (
top,inset-block-start,right,inset-inline-end, etc.) muss für die Achse, auf der das Element sticky gemacht werden soll, auf einen anderen Wert alsautogesetzt werden. Wenn beideinset-Eigenschaften für eine Achse aufautogesetzt sind, verhält sich dersticky-Wert auf dieser Achse wierelative.
Beschreibung
>Arten der Positionierung
- Ein positioniertes Element ist ein Element, dessen berechneter
positionWert entwederrelative,absolute,fixedoderstickyist. (Mit anderen Worten, es ist alles außerstatic.) - Ein relativ positioniertes Element ist ein Element, dessen berechneter
positionWertrelativeist. Die Eigenschaftentopundbottomlegen den vertikalen Versatz von ihrer normalen Position fest; die Eigenschaftenleftundrightlegen den horizontalen Versatz fest. - Ein absolut positioniertes Element ist ein Element, dessen berechneter
positionWertabsoluteoderfixedist. Die Eigenschaftentop,right,bottomundleftbestimmen den Versatz von den Kanten des Enthaltenen Blockes des Elements. (Der Enthaltene Block ist der Vorfahre, relativ zu dem das Element positioniert ist.) Wenn das Element Ränder hat, werden diese zum Versatz hinzugefügt. Das Element stellt einen neuen Block-Formatierungskontext (BFC) für seinen Inhalt her. - Ein haftend positioniertes Element ist ein Element, dessen berechneter
positionWertstickyist. Es wird als relativ positioniert behandelt, bis sein Enthaltener Block einen bestimmten Schwellenwert überschreitet (z. B. das Setzen vontopauf einen anderen Wert als auto) innerhalb seiner Flusswurzel (oder des Containers, in dem es scrollt), an welchem Punkt es als "angeheftet" behandelt wird, bis es den gegenüberliegenden Rand seines Enthaltenen Blockes erreicht.
In den meisten Fällen sind absolut positionierte Elemente, die height und width auf auto gesetzt haben, so dimensioniert, dass sie ihren Inhalt aufnehmen können. Nicht-ersetzte absolut positionierte Elemente können jedoch so angeordnet werden, dass sie den verfügbaren vertikalen Raum füllen, indem sowohl top als auch bottom angegeben wird und height weggelassen wird (d.h. auto). Ebenso können sie so angeordnet werden, dass sie den verfügbaren horizontalen Raum füllen, indem sowohl left als auch right angegeben wird und width auf auto gelassen wird.
Außer für den gerade beschriebenen Fall (wenn absolut positionierte Elemente den verfügbaren Raum füllen):
Barrierefreiheit
Achten Sie darauf, dass Elemente, die mit einem absolute oder fixed Wert positioniert sind, beim Vergrößern der Seite zur Erhöhung der Textgröße keine anderen Inhalte verdecken.
Leistung & Barrierefreiheit
Das Scrollen von Elementen, die fixed oder sticky Inhalte enthalten, kann Leistungs- und Barrierefreiheitsprobleme verursachen. Wenn ein Benutzer scrollt, muss der Browser den Sticky- oder Fixed-Inhalt an eine neue Position neu zeichnen. Abhängig vom Inhalt, der neu gezeichnet werden muss, der Browserleistung und der Verarbeitungsgeschwindigkeit des Geräts, kann der Browser Repaints möglicherweise nicht mit 60 fps verwalten. Ein solches Szenario kann zu Jank führen und, wichtiger noch, Barrierefreiheitsbedenken für Menschen mit Empfindlichkeiten hervorrufen. Eine Lösung besteht darin, will-change: transform zu den positionierten Elementen hinzuzufügen, um das Element in seiner eigenen Ebene zu rendern, was die Geschwindigkeit der Neuzeichnung erhöht und somit die Leistung und Barrierefreiheit verbessert.
Formale Definition
| Anfangswert | static |
|---|---|
| Anwendbar auf | alle Elemente |
| Vererbt | Nein |
| Berechneter Wert | wie angegeben |
| Animationstyp | diskret |
| Erstellt Stapelkontext | Ja |
Formale Syntax
position =
static |
relative |
absolute |
sticky |
fixed |
<running()>
<running()> =
running( <custom-ident> )
Beispiele
>Relative Positionierung
Relativ positionierte Elemente sind um einen bestimmten Betrag von ihrer normalen Position innerhalb des Dokuments versetzt, ohne dass dieser Versatz andere Elemente beeinflusst. Im folgenden Beispiel beachten Sie, wie die anderen Elemente platziert sind, als ob "Zwei" den Raum seiner normalen Position einnehmen würde.
HTML
<div class="box" id="one">One</div>
<div class="box" id="two">Two</div>
<div class="box" id="three">Three</div>
<div class="box" id="four">Four</div>
CSS
* {
box-sizing: border-box;
}
.box {
display: inline-block;
width: 100px;
height: 100px;
background: red;
color: white;
}
#two {
position: relative;
top: 20px;
left: 20px;
background: blue;
}
Absolute Positionierung
Elemente, die relativ positioniert sind, bleiben im normalen Fluss des Dokuments. Im Gegensatz dazu wird ein absolut positioniertes Element aus dem Fluss herausgenommen; andere Elemente werden also positioniert, als ob es nicht existieren würde. Das absolut positionierte Element wird relativ zu seinem nächstgelegenen positionierten Vorfahren (d.h. der nächstgelegene Vorfahre, der nicht static ist) positioniert. Wenn ein positionierter Vorfahre nicht existiert, wird es relativ zum ICB (initialer enthaltener Block) positioniert, der der enthaltende Block des Wurzelelements des Dokuments ist.
HTML
<h1>Absolute positioning</h1>
<p>
I am a basic block level element. My adjacent block level elements sit on new
lines below me.
</p>
<p class="positioned">
By default we span 100% of the width of our parent element, and we are as tall
as our child content. Our total width and height is our content + padding +
border width/height.
</p>
<p>
We are separated by our margins. Because of margin collapsing, we are
separated by the width of one of our margins, not both.
</p>
<p>
inline elements <span>like this one</span> and <span>this one</span> sit on
the same line as one another, and adjacent text nodes, if there is space on
the same line. Overflowing inline elements
<span>wrap onto a new line if possible — like this one containing text</span>,
or just go on to a new line if not, much like this image will do:
<img src="https://mdn.github.io/shared-assets/images/examples/long.jpg" />
</p>
CSS
* {
box-sizing: border-box;
}
body {
width: 500px;
margin: 0 auto;
}
p {
background: aqua;
border: 3px solid blue;
padding: 10px;
margin: 10px;
}
span {
background: red;
border: 1px solid black;
}
.positioned {
position: absolute;
background: yellow;
inset-block-start: 30px;
inset-inline-start: 30px;
}
Ergebnis
Feste Positionierung
Feste Positionierung ist ähnlich wie absolute Positionierung, mit der Ausnahme, dass der Enthaltene Block des Elements der initiale Enthaltene Block ist, der durch das Viewport festgelegt wird, es sei denn, ein Vorfahre hat die transform, perspective oder filter Eigenschaft auf einen anderen Wert als none gesetzt (siehe fest positionierter enthaltener Block), wodurch dieser Vorfahre die Position des Enthaltenen Blocks des Elements einnimmt. Dies kann verwendet werden, um ein "schwebendes" Element zu erstellen, das unabhängig vom Scrollen an derselben Position bleibt. Im folgenden Beispiel bleibt das Feld "Eins" 80 Pixel vom oberen Rand der Seite und 10 Pixel von links festgesetzt. Auch nach dem Scrollen bleibt es an derselben Position relativ zum Viewport. Außerdem wird bei gesetztem will-change Wert auf transform ein neuer Enthaltener Block erstellt.
HTML
<div class="outer">
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam congue tortor
eget pulvinar lobortis. Vestibulum ante ipsum primis in faucibus orci luctus
et ultrices posuere cubilia Curae; Nam ac dolor augue. Pellentesque mi mi,
laoreet et dolor sit amet, ultrices varius risus. Nam vitae iaculis elit.
Aliquam mollis interdum libero. Sed sodales placerat egestas. Vestibulum ut
arcu aliquam purus viverra dictum vel sit amet mi. Duis nisl mauris, aliquam
sit amet luctus eget, dapibus in enim. Sed velit augue, pretium a sem
aliquam, congue porttitor tortor. Sed tempor nisl a lorem consequat, id
maximus erat aliquet. Sed sagittis porta libero sed condimentum. Aliquam
finibus lectus nec ante congue rutrum. Curabitur quam quam, accumsan id
ultrices ultrices, tempor et tellus.
</p>
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam congue tortor
eget pulvinar lobortis. Vestibulum ante ipsum primis in faucibus orci luctus
et ultrices posuere cubilia Curae; Nam ac dolor augue. Pellentesque mi mi,
laoreet et dolor sit amet, ultrices varius risus. Nam vitae iaculis elit.
Aliquam mollis interdum libero. Sed sodales placerat egestas. Vestibulum ut
arcu aliquam purus viverra dictum vel sit amet mi. Duis nisl mauris, aliquam
sit amet luctus eget, dapibus in enim. Sed velit augue, pretium a sem
aliquam, congue porttitor tortor. Sed tempor nisl a lorem consequat, id
maximus erat aliquet. Sed sagittis porta libero sed condimentum. Aliquam
finibus lectus nec ante congue rutrum. Curabitur quam quam, accumsan id
ultrices ultrices, tempor et tellus.
</p>
<div class="box" id="one">One</div>
</div>
CSS
* {
box-sizing: border-box;
}
.box {
width: 100px;
height: 100px;
background: red;
color: white;
}
#one {
position: fixed;
top: 80px;
left: 10px;
background: blue;
}
.outer {
width: 500px;
height: 300px;
overflow: scroll;
padding-left: 150px;
}
Ergebnis
Sticky-Positionierung
Die folgende CSS-Regel positioniert das Element mit der id one relativ, bis das Viewport so weit gescrollt wird, dass das Element 10 Pixel vom oberen Rand entfernt ist. Jenseits dieses Schwellenwerts bleibt das Element 10 Pixel vom oberen Rand fixiert.
#one {
position: sticky;
top: 10px;
}
Liste mit Sticky-Überschriften
Eine häufige Verwendung für Sticky-Positionierung ist für die Überschriften in einer alphabetischen Liste. Die Überschrift "B" erscheint direkt unterhalb der Elemente, die mit "A" beginnen, bis sie vom Bildschirm gescrollt werden. Anstatt mit dem Rest des Inhalts vom Bildschirm zu gleiten, bleibt die Überschrift "B" dann oben am Viewport fixiert, bis alle "B"-Elemente vom Bildschirm gescrollt wurden, an welchem Punkt sie von der "C"-Überschrift überdeckt wird und so weiter.
Sie müssen einen Schwellenwert mit mindestens einer der Eigenschaften top, right, bottom oder left festlegen, damit sich die sticky Positionierung erwartungsgemäß verhält. Andernfalls ist sie nicht von relativer Positionierung zu unterscheiden.
HTML
<dl>
<div>
<dt>A</dt>
<dd>Andrew W.K.</dd>
<dd>Apparat</dd>
<dd>Arcade Fire</dd>
<dd>At The Drive-In</dd>
<dd>Aziz Ansari</dd>
</div>
<div>
<dt>C</dt>
<dd>Chromeo</dd>
<dd>Common</dd>
<dd>Converge</dd>
<dd>Crystal Castles</dd>
<dd>Cursive</dd>
</div>
<div>
<dt>E</dt>
<dd>Explosions In The Sky</dd>
</div>
<div>
<dt>T</dt>
<dd>Ted Leo & The Pharmacists</dd>
<dd>T-Pain</dd>
<dd>Thrice</dd>
<dd>TV On The Radio</dd>
<dd>Two Gallants</dd>
</div>
</dl>
CSS
* {
box-sizing: border-box;
}
dl > div {
background: white;
padding-top: 24px;
}
dt {
background: #b8c1c8;
border-bottom: 1px solid #989ea4;
border-top: 1px solid #717d85;
color: white;
font:
bold 18px/21px "Helvetica",
"Arial",
sans-serif;
margin: 0;
padding: 2px 0 0 12px;
position: -webkit-sticky;
position: sticky;
top: -1px;
}
dd {
font:
bold 20px/45px "Helvetica",
"Arial",
sans-serif;
margin: 0;
padding-left: 12px;
white-space: nowrap;
}
dd + dd {
border-top: 1px solid #cccccc;
}
Ergebnis
Sticky Positionierung mit allen gesetzten Einfügenbegrenzungen
Das folgende Beispiel demonstriert das Verhalten eines Elements, wenn alle Einfügenbegrenzungen gesetzt sind. Hier haben wir zwei Glühbirnen-Emojis in einem Absatz. Die Glühbirnen verwenden Sticky-Positionierung, und die Einfügenbegrenzungen sind mit 50px vom oberen Rand, 100px vom rechten Rand, 50px vom unteren Rand und 50px vom linken Rand angegeben. Ein grauer Hintergrund auf dem übergeordneten div-Element kennzeichnet den Einfügenbereich.
HTML
Use scrollbars to put the light bulbs(💡) in the right place in the following
text:
<div>
<p>
The representation of an idea by a light bulb(<span class="bulb">💡</span>)
is a commonly used metaphor that symbolizes the moment of inspiration or the
birth of a new idea. The association between a light bulb and an idea can be
traced back to the invention of the incandescent light bulb(<span
class="bulb"
>💡</span
>) by Thomas Edison in the late 19th century. The light bulb is a powerful
symbol because it represents illumination, clarity, and the sudden
brightening of one's thoughts or understanding. When someone has an idea, it
is often described as a light bulb turning on in their mind, signifying a
moment of insight or creativity. The image of a light bulb also suggests the
idea of energy, power, and the potential for growth and development.
</p>
</div>
CSS
.bulb {
position: sticky;
inset: 50px 100px;
}
div {
/* mark area defined by the inset boundaries using gray color */
background: linear-gradient(#99999999, #99999999) 100px 50px / 192px 100px
no-repeat;
}
Ergebnis
Wenn Sie beide Glühbirnen an ihre richtige Stelle setzen, werden Sie feststellen, dass sie innerhalb des Einfügenbereichs relativ positioniert sind. Wenn Sie sie aus dem Einfügenbereich hinausbewegen, werden sie in dieser Richtung an die Einfügenbegrenzung fixiert (sticky).
Spezifikationen
| Specification |
|---|
| CSS Positioned Layout Module Level 3> # position-property> |