The CSS position
property is used to define the position of an
element on a webpage.
The location of the positioned element is set with the four properties:
top
, left
, right
, and
bottom
. These properties only work when the
position
property is set and have different positioning
behaviors.
The position
property has the following five values:
- static (default value)
- relative
- absolute
- fixed
- sticky
We will look into each of them.
CSS static Position
The static
value of the position
property allows
elements to be positioned accordingly to the normal flow of the document.
The static
position is not affected by the top
,
right
, bottom
, and left
values.
Let's see an example,
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" href="style.css" />
<title>CSS position</title>
</head>
<body>
<p>This is a normal paragraph.</p>
<p class="main">This paragraph is positioned using the static value.</p>
<p>This is a normal paragraph.</p>
</body>
</html>
p {
border: 1px solid black;
padding: 4px;
}
p.main {
position: static;
top: 50px; /* doesn't work */
right: 50px; /* doesn't work */
bottom: 50px; /* doesn't work */
left: 50%; /* doesn't work */
background-color: greenyellow;
}
Browser Output
Note: The static
value is the default value
for the position
property.
CSS Relative Position
The relative
value positions the element relative to the
original position in the document. The element is positioned with the
top
, right
, bottom
, and
left
values.
Let's see an example,
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" href="style.css" />
<title>CSS position</title>
</head>
<body>
<p>This is a normal paragraph.</p>
<p class="main">
This paragraph is positioned with a relative value of top 50px and
left 40px.
</p>
<p>This is a normal paragraph.</p>
</body>
</html>
p {
border: 1px solid black;
padding: 4px;
}
p.main {
position: relative;
/* positions 90px from the top */
top: 90px;
/* positions 40px from the left */
left: 40px;
background-color: greenyellow;
}
Browser Output
In the above example, the second paragraph is positioned relative to its
normal flow i.e. 90px
from the top and 40px
from
the left of the original position.
The space is preserved in the original position of the element.
CSS Absolute Position
The absolute
value removes the element completely from its
normal flow in the document.
The element is positioned relative to their closest positioned parent
element (an ancestor element with a position value other than
static
).
If there is no positioned ancestor, they are positioned relative to the document itself.
Let's see an example,
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" href="style.css" />
<title>CSS position</title>
</head>
<body>
<p>This is a normal paragraph.</p>
<p class="main">
This is an absolutely positioned paragraph at 40px top and 60px left.
</p>
<p>This is a normal paragraph.</p>
</body>
</html>
p {
border: 1px solid black;
padding: 4px;
}
p.main {
position: absolute;
top: 70px;
left: 60px;
background-color: greenyellow;
}
Browser Output
In the above example, the second paragraph doesn't have a positioned parent element, so it is positioned relative to the viewport (visible area of the browser).
Let's see an example to understand how the absolute
position
works with positioned parent element:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" href="style.css" />
<title>CSS position</title>
</head>
<body>
<p>This is a normal paragraph.</p>
<p class="main">
This is an absolutely positioned paragraph at 40px top and 60px
left.
</p>
<p>This is a normal paragraph.</p>
<!-- Creating an container -->
<div class="parent">
<p>This paragraph is inside the div element.</p>
<p class="main">
This is an absolutely positioned paragraph inside the div
element at 40px top and 60px left.
</p>
<p>This paragraph is inside the div element.</p>
</div>
</body>
</html>
p {
border: 1px solid black;
padding: 4px;
}
p.main {
position: absolute;
top: 70px;
left: 60px;
background-color: greenyellow;
}
div.parent {
position: relative;
background-color: orange;
border: 4px solid red;
}
Browser Output
Here, even though both paragraphs of the main
class are given
the same styles, their positions are different. This is because the first
paragraph doesn't have a positioned parent element, so it is positioned
relative to the document (viewport).
On the other hand, the second paragraph has a parent
div
element with a relative
position value and is
hence positioned relative to the div
element.
Note: An absolutely positioned element loses its size and original space in the document flow.
CSS fixed Position
The fixed
value positions an element to remain fixed in the
same position, even when the page is scrolled. It is similar to the
absolute
value, but it remains relative to the viewport at all
times.
Let's see an example,
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" href="style.css" />
<title>CSS position</title>
</head>
<body>
<p class="main">
This paragraph has a fixed position value at 10px top.
</p>
<p>This is a normal paragraph.</p>
<p>This is a normal paragraph.</p>
<p>This is a normal paragraph.</p>
<p>This is a normal paragraph.</p>
<p>This is a normal paragraph.</p>
<p>This is a normal paragraph.</p>
<p>This is a normal paragraph.</p>
</body>
</html>
p {
border: 2px solid black;
padding: 4px;
}
p.main {
position: fixed;
top: 10px;
background-color: greenyellow;
}
Browser Output
This parapraph has a fixed position value at 10px top.
This is a normal paragraph.
This is a normal paragraph.
This is a normal paragraph.
This is a normal paragraph.
This is a normal paragraph.
This is a normal paragraph.
This is a normal paragraph.
In the above example,
position: fixed;
top: 10px;
fixes the paragraph at the 10px
distance from the
top
in the webpage. The paragraph doesn't scroll with the other
content in the document.
CSS sticky Position
The sticky
value positions the element as a combination of
relative
and fixed
values.
The sticky
position behaves like
relative
positioning until the element reaches a certain scroll
point on the screen. After that, the element sticks to the top of the
viewport like a fixed
element.
Let's see an example,
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" href="style.css" />
<title>CSS position</title>
</head>
<body>
<p class="main">
This paragraph has a fixed position value at 10px top.
</p>
<p>This is a normal paragraph.</p>
<p>This is a normal paragraph.</p>
<p>This is a normal paragraph.</p>
<p>This is a normal paragraph.</p>
<p>This is a normal paragraph.</p>
<p>This is a normal paragraph.</p>
<p>This is a normal paragraph.</p>
</body>
</html>
p {
border: 2px solid black;
padding: 4px;
}
p.main {
position: fixed;
top: 10px;
background-color: greenyellow;
}
Browser Output
This is a normal paragraph.
This parapraph is set sticky position at top 10px.
This is a normal paragraph.
In the above example, the paragraph remains scrollable until it reaches to
10px
distance from the top
of the viewport. After
that, it remains in the sticky
position.