The position
CSS property chooses alternative rules for positioning elements, designed to be useful for scripted animation effects.
Initial value | static |
---|---|
Applies to | all elements |
Inherited | no |
Media | visual |
Computed value | as specified |
Animation type | discrete |
Canonical order | the unique non-ambiguous order defined by the formal grammar |
Creates stacking context | yes |
A positioned element is an element whose computed position property is either relative
, absolute
, fixed
or sticky
.
A relatively positioned element is an element whose computed position property is relative
.
An absolutely positioned element is an element whose computed position property is absolute
or fixed.
A stickily positioned element is an element whose computed position property is sticky
.
The top
, right
, bottom
, and left
properties specify the position of positioned elements.
/* Keyword values */ position: static; position: relative; position: absolute; position: fixed; position: sticky; /* Global values */ position: inherit; position: initial; position: unset;
static
top
, right
, bottom
, left
and z-index
properties do not apply.relative
position:relative
on table-*-group
, table-row
, table-column
, table-cell
, and table-caption
elements is undefined.absolute
transform
property set to something different from none
then this ancestor is used as container instead of the viewport (see CSS Transforms Spec).sticky
table
elements, does not affect the position of any following boxes. When a box B is stickily positioned, the position of the following box is calculated as though B were not offset. The effect of ‘position: sticky
’ on table
elements is the same as for ‘position: relative
’.static | relative | absolute | sticky | fixed
<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>
.box { display: inline-block; background: red; width: 100px; height: 100px; float: left; margin: 20px; color: white; } #two { position: relative; top: 20px; left: 20px; }
Note how the other elements are displayed as if "Two" were in its normal position and taking up space.
Elements that are positioned relatively are still considered to be in the normal flow of elements in the document. In contrast, an element that is positioned absolutely is taken out of the flow and thus takes up no space when placing other elements. The absolutely positioned element is positioned relative to nearest positioned ancestor (non-static
). If a positioned ancestor doesn't exist, the initial container is used.
In the example below, a positioned ancestor doesn't exist and box Three is positioned absolutely relative to the immediate ancestor (the <body>
of the iframe here):
<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>
.box { display: inline-block; background: red; width: 100px; height: 100px; float: left; margin: 20px; color: white; } #three { position: absolute; top: 20px; left: 20px; }
Fixed positioning is similar to absolute positioning, with the exception that the element's containing block is the viewport. This is often used to create a floating element that stays in the same position even after scrolling the page. In the example below the "One" box is fixed 80px from the top of the page and 20px from the left:
<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>
.box { background: red; width: 100px; height: 100px; margin: 20px; color: white; } #one { position: fixed; top: 80px; left: 10px; } .outer { width: 500px; height: 300px; overflow: scroll; padding-left: 150px; }
When viewing the top of the page, the position box appears in the upper left, and after scrolling, it remains in the same place relative to the viewport:
Sticky positioning is a hybrid of relative and fixed positioning. The element is treated as relative positioned until it crosses a specified threshold, at which point it is treated as fixed positioned. For instance:
#one { position: sticky; top: 10px; }
will behave just like a relatively positioned element until the viewport scrolls such that the element would be less than 10px from the top. Then, it will be fixed to 10px from the top until the viewport is scrolled back past this threshold.
top
, right
, bottom
, or left
for sticky positioning to behave as expected. Otherwise, it will be indistinguishable from relative positioning.
<div> <dl> <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> </dl> <dl> <dt>C</dt> <dd>Chromeo</dd> <dd>Common</dd> <dd>Converge</dd> <dd>Crystal Castles</dd> <dd>Cursive</dd> </dl> <dl> <dt>E</dt> <dd>Explosions In The Sky</dd> </dl> <dl> <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> </dl> </div>
* { box-sizing: border-box; } dl { margin: 0; padding: 24px 0 0 0; } dt { background: #B8C1C8; border-bottom: 1px solid #989EA4; border-top: 1px solid #717D85; color: #FFF; 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: 0 0 0 12px; white-space: nowrap; } dd + dd { border-top: 1px solid #CCC }
For relatively positioned elements, the top
or bottom
property specifies the vertical offset from the normal position and the left
or right
property specifies the horizontal offset.
For absolutely positioned elements, the top
, right
, bottom
, and left
properties specify offsets from the edge of the element's containing block (what the element is positioned relative to). The margin of the element is then positioned inside these offsets.
Most of the time, absolutely positioned elements have auto
values of height
and width
computed to fit the contents of the element. However, non-replaced absolutely positioned elements can be made to fill the available space by specifying (as other than auto
) both top
and bottom
and leaving height
unspecified (that is, auto
). Likewise for left
, right
, and width
.
Except for the case just described of absolutely positioned elements filling the available space:
top
and bottom
are specified (technically, not auto
), top
wins.left
and right
are specified, left
wins when direction
is ltr
(English, horizontal Japanese, etc.) and right
wins when direction
is rtl
(Persian, Arabic, Hebrew, etc.).Specification | Status | Comment |
---|---|---|
CSS Level 2 (Revision 1) The definition of 'position' in that specification. | Recommendation | |
CSS Positioned Layout Module Level 3 The definition of 'position' in that specification. | Working Draft | Adds sticky property value |
Feature | Chrome | Edge | Firefox (Gecko) | Internet Explorer | Opera | Safari (WebKit) |
---|---|---|---|---|---|---|
Basic support | 1.0 | (Yes) | 1.0 (1.0) [1] | 4.0 [3] | 4.0 | 1.0 (85) |
fixed value | 1.0 | ? | 1.0 (1.0) [4] | 7.0 | 4.0 | 1.0 (85) |
sticky value | 56 | ? | 32 (32.0) [2] | No support [5] | No support | 6.1 -webkit- |
Feature | Android | Edge | Firefox Mobile (Gecko) | IE Phone | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
Basic support | ? | (Yes) | 1.0 (1.0) [1] | ? | ? | 7.0 -webkit- |
[1] Since Firefox 30, Gecko allows <tr>
, <thead>
, and <tfoot>
elements with a position: relative;
style to act as absolute positioning containers. This means that a position: absolute;
styled element inside the table can be positioned relative to these elements. In other browsers and in older versions of Firefox, setting position: relative;
on a table row or row group has no effect. Firefox helps developers transition to the new behavior and detect any rendering issues it may cause on their sites by printing a warning to the JavaScript console if you use this feature: Relative positioning of table rows and row groups is now supported. This site may need to be updated because it may depend on this feature having no effect.
[2] Sticky positioning only worked in Firefox 26 to Firefox 31, included, when the about:config
preference layout.css.sticky.enabled
is set to true
. From Firefox 27 to 31, it was the default value for Nightly and Aurora versions of the browser. The preference has been removed in Firefox 48.
[3] In Internet Explorer, fixed positioning doesn't work if the document is in quirks mode.
[4] Prior to Firefox 44, position: fixed
didn't created a stacking context in most cases. The specification, and Gecko implementation, have been modified to mimick Chrome and Safari long time behavior.
[5] Sticky positioning is under consideration for Edge
© 2005–2017 Mozilla Developer Network and individual contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/CSS/position