Imagine you're building the interior of an Egyptian pyramid. Every decoration, every hieroglyph, and every statue must be in a precisely planned location. This is exactly what positioning in CSS is for - it gives us full control over where our elements appear on the page.
The
position property in CSS determines how an element is placed on the page. It has five main values, each behaving differently.Every HTML element by default has
position: static. This means the element displays in the normal document flow - one below the other (blocks) or next to each other (inline). The top, left, right, and bottom properties don't work on static elements.1.element {
2 position: static; /* default value */
3}It's like stones laid naturally in a pyramid - each lies in its place, following the building order.
An element with
position: relative stays in the normal document flow, but you can shift it relative to its original position using top, left, right, and bottom. Importantly - the space the element occupied is preserved.1.hieroglyph {
2 position: relative;
3 top: 20px; /* shifts down by 20px */
4 left: 30px; /* shifts right by 30px */
5}Imagine a hieroglyph carved on a wall that we slightly shift - its "place" in the row of other hieroglyphs still exists, but the symbol itself is slightly offset.
An element with
position: absolute is taken out of the normal document flow. It positions itself relative to the nearest ancestor that has a position other than static (i.e., relative, absolute, fixed, or sticky). If no such ancestor exists - it positions itself relative to the <html> element.1.pyramid-container {
2 position: relative; /* positioning context */
3 width: 500px;
4 height: 400px;
5}
6
7.treasure {
8 position: absolute;
9 top: 50px;
10 right: 30px;
11}It's like placing a treasure in a specific spot within a pyramid chamber. The treasure doesn't affect the positions of other objects - it simply lies where you put it.
An element with
position: fixed is positioned relative to the browser window (viewport). It stays in its place even while scrolling the page.1.navigation {
2 position: fixed;
3 top: 0;
4 left: 0;
5 width: 100%;
6 background-color: #2C1810;
7 z-index: 100;
8}Think of it like a star in the Egyptian sky - no matter where you walk in the desert, the star is always in the same place in the firmament. Similarly, a
fixed element is always visible at the same point on the screen.A
sticky element is a hybrid between relative and fixed. It behaves like relative until the user scrolls the page to a certain point - then it "sticks" and behaves like fixed.1.section-header {
2 position: sticky;
3 top: 0;
4 background-color: #FFD700;
5 padding: 10px;
6}It's like a guard watching the entrance to the pharaoh's chamber. They stand in their place, but when you approach the threshold, they block the passage and don't move further.
When elements overlap (which happens with
absolute, relative, fixed, and sticky positioning), the z-index property determines their order.1.background-layer { position: absolute; z-index: 1; }
2.middle-layer { position: absolute; z-index: 2; }
3.front-layer { position: absolute; z-index: 3; }Imagine an Egyptian wall painting consisting of layers: first the desert background (z-index: 1), then pyramids (z-index: 2), and on top the pharaoh figures (z-index: 3). The higher the
z-index, the closer to the viewer (on top) the element is.Important z-index rules:
position other than staticz-index have a default value of auto (equivalent to 0)z-index means displaying "above" other elementsz-index display in the order they appear in HTMLWhen an element's content is larger than the element itself, the
overflow property controls what happens to it.1.scroll-container { width: 300px; height: 200px; overflow: hidden; }
2.scroll-container-visible { overflow: scroll; }
3.scroll-container-auto { overflow: auto; }overflow: hidden - hides content going beyond the element (like a pyramid wall behind which the interior isn't visible)overflow: scroll - always shows scrollbarsoverflow: auto - scrollbars appear only when content is larger than the containerBefore the era of Flexbox and Grid, the
float property was used to create column layouts. Although this approach is outdated today, it's worth knowing because you'll encounter it in older code.1.column-left { float: left; width: 50%; }
2.column-right { float: right; width: 50%; }
3
4/* Clearfix - fixes the float problem */
5.container::after { content: ""; display: table; clear: both; }float removes an element from the normal flow and "floats" it to the left or right side of the container. The problem is that the parent container "forgets" about the dimensions of children with float - that's why clearfix is needed.Today, instead of float, we use
display: flex or display: grid, which are much simpler and more predictable. Float remains useful mainly for wrapping text around images.| Value | Flow | Positioning relative to | Scrolling | |---------|----------|------------------------|-------------| | static | normal | - | yes | | relative | normal | own position | yes | | absolute | removed | positioned ancestor | yes | | fixed | removed | viewport | no | | sticky | normal/removed | viewport (after reaching threshold) | sticks |
Mohamed says: "Just as pyramid builders had to precisely plan the placement of every stone, you must understand CSS positioning. With
position and z-index, you can place elements exactly where you want - like an architect of the Karnak temple!"