CSS Position Property
Position is a vital property in CSS that enables the placement of elements. This page provides detailed information regarding the use of positioning in CSS.
CSS Position Property Breaking the Flow and Managing Coordinates
Web pages inherently follow an invisible rule similar to gravity; this is called Normal Flow.
While block elements ( <div>, <p> ) pour from top to bottom like a waterfall, inline elements ( <span> ) flow from left to right.
The position property is the unique tool that allows you to defy these rules of gravity.
By applying positioning to an element, you unlock the ability to use directional commands such as top, right, bottom, and left.
The positioning system is not a standalone property; it is a combination of three fundamental concepts: Flow, Reference, and Layer.
To understand why an element does not stay where you expect, you must decipher how this triple system works together.
Normal flow is sufficient in most cases; however, modern interfaces require overlapping, pinning, or independent movement.
At this point, the Position property intervenes, giving the developer the power to break the flow and establish their own coordinate system.
Default State: Static All HTML elements have position: static by default.
In this state, the element obeys the natural flow of the page.
Even if you give a static element a command like top: 50px, the browser ignores it because the coordinates of static elements cannot be altered.
Relative Motion: Relative position: relative is perhaps the most confusing yet strategic step in positioning.
When you make an element "relative," it remains part of the normal flow; however, it can now move relative to its own original position.
The Ghost Space Rule When you shift an element to the right or down with Relative, the element moves visually, but its soul stays behind.
The browser reserves the element's initial spot as if it were still there, leaving it blank.
Consequently, the shifted element does not push other content or break the layout; it simply appears elsewhere like a visual illusion.
Absolute Freedom: Absolute position: absolute completely detaches the element from the document flow.
There is no longer gravity for that element. Other HTML elements behave as if the absolute element never existed and occupy the space it once held.
This allows elements to overlap.
When this mechanism is misunderstood, errors occur where absolute elements seem to go to "random" places.
Actually, this is not an error; it is merely an incorrect determination of the reference point.
Searching for a Reference Parent An absolute element wants to know where to position itself relative to.
The browser looks at the element's containers ( parent elements ) and searches for the first ancestor whose position value is non-static.
If it cannot find such a parent, it accepts the browser window ( <body> ) as the reference point.
Therefore, we usually give the parent of an absolute element position: relative to define the boundaries.
Fixed and Sticky Layouts There are two more powerful values for pinning menus or advertisements in modern web design.
The main difference in choosing between Fixed and Sticky is this: one references the entire screen, while the other remains bound to parent boundaries.
Pinning to the Screen: Fixed position: fixed positions the element directly relative to the Viewport.
Even if you scroll down the page, this element remains suspended in the corner you designated.
"Back to Top" buttons or sticky top menus are generally created using this technique.
Smart Transition: Sticky position: sticky is a hybrid of relative and fixed properties.
The element behaves in the normal flow until it reaches a certain scroll point.
However, once the scroll operation passes the determined threshold, the element suddenly exhibits fixed behavior and sticks to the screen.
Debug Perspective If an element is not where you expect, the first question to ask is: "Is this element inside or outside the flow?"
The second step is finding the reference point: "Whom is this element positioning itself relative to?"
Understanding the Position SystemThe key to learning Position is not memorizing values, but asking these three questions for every element:
- Is this element inside or outside the flow?
- Which reference point is it positioning itself relative to?
- On which layer (z-index) does it reside relative to other elements?
For a developer who can answer these three questions, position is no longer complex but a completely controllable system.
Static Positioning (position: static) Default Gravity and Natural Flow
position: static is the factory default of the HTML world.
Unless you specify otherwise, every element on the page is born with this identity.
In this mode, elements are arranged according to the Normal Flow rules, staying true to their writing order in the HTML code—stacking top-to-bottom ( blocks ) or left-to-right ( inline elements ).
A static element says, "I am here because it's my turn," and does not request extra coordinates.
The Rule of Deaf Ears (Offset Insensitivity) The most defining technical feature of static positioning is that it is immune to directional commands.
If an element is static, the browser completely ignores any top, left, right, or bottom values you assign to it.
The only way to move it is to use tools of the natural flow, such as margin or transform properties.
Absence of Depth Perception (Z-Index)Positioning is not only about the X and Y axes but also the Z-axis (depth).
However, an element using position: static cannot participate in the depth race.
You cannot give these elements a z-index value. If you want to bring one element over another, you must break the static chain.
Parental Inadequacy This is one of the most common mistakes beginners make.
When you place a child element with position: absolute inside a parent, the child looks for a parent to reference.
However, if the parent is static, the child ignores it and looks at the next ancestor up. Static elements cannot serve as a
Reference Point (Containing Block) in the context of positioning.
Why Do We Use It? (The Power of Resetting)You might ask, "If it's already the default, why write it manually?"
Especially when doing Responsive Design, you may want to force a menu that is absolute on desktop back into the normal flow on mobile.
This is where position: static acts as a reset button that cancels out previous powerful rules.
Summary of Role in the System
The static value is often overlooked, but it is actually the starting point of the entire positioning system.
Because it is pure flow, the browser performs no position calculation for these elements; it simply places them according to flow rules.
Debug Perspective If the top or left values you assigned are not working, the first thing to check is if the element is still position: static.
Static is completely bound to the flow and offers no control. To break this limitation and gain coordinate control, the next step, relative, comes into play.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Static (Default) vs. Relative Comparison Example</title>
<link rel="stylesheet" href="style.css?v=1.0.150">
</head>
<body>
<div class="position-test">
<div class="box static">
Static: top/left do not affect me.
</div>
<div class="box relative">
Relative: I respond to coordinates.
</div>
</div>
</body>
</html>
.position-test {
padding: 20px;
background-color: #f0f0f0;
font-family: sans-serif;
}
.box {
width: 250px;
padding: 20px;
color: white;
margin-bottom: 10px;
border-radius: 8px;
}
.static {
position: static;
background-color: #34495e;
top: 50px;
left: 50px;
}
.relative {
position: relative;
background-color: #e67e22;
top: 20px;
left: 40px;
}
Relative Positioning (position: relative) Moving Relative to Self and Defining Boundaries
position: relative does not detach an element from the Normal Flow; it simply grants it flexibility.
Relative is the first level of positioning control; the element remains within the flow but can now perform a controlled deviation.
You essentially command the browser: "Place this element where you normally would, but then offset it with the coordinates I provide."
Here, the reference point is not the browser window, but the element's own default position.
Visual Illusion: Ghost Space When you push a relative element down with top: 50px, the element visually moves downward.
This behavior demonstrates that the relative element does not exit the flow; it only changes its visual location.
However, technically, the element's soul ( the space it occupies ) remains above, in its original spot.
Reverse Offset LogicPositioning values ( top, left... ) are not "go to" commands; they are "push from" commands.
When you say left: 20px, the element does not go to the left; it is pushed from the left by 20px, causing it to slide to the right.
When you say bottom: 10px, it is pushed from the bottom by 10px and moves upward. This inverse logic is the foundation of using relative positioning.
When this inverse logic is not understood, it leads to confusion about why an element moves in the opposite direction of what was expected.
Superpower: Acting as an Anchor Point Perhaps the most frequent use of Relative is not to move itself, but to define boundaries for its children.
When you give a box position: relative, ( even if you don't move it ) that box becomes a new reference world for any children with position: absolute.
If you fail to do this, absolute children will not recognize the parent and will escape to the very top of the page.
Layer Management (Z-Index) Unlike static elements, relative elements possess depth perception.
By using z-index, you can bring this element in front of other objects or hide it behind them.
This feature allows elements to be controlled not just on the horizontal and vertical axes, but also on the Z-axis.
How to Think with Relative? When using Relative, asking these three questions is sufficient:
- Should this element remain in the flow?
- Should it only change its position visually?
- Does it create a reference for an absolute child?
The answers to these questions clarify the use of relative positioning entirely.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Relative: "The Ones Whose Spirit Stays Behind" Example</title>
<link rel="stylesheet" href="style.css?v=1.0.150">
</head>
<body>
<ul class="main-navigation">
<li>Home</li>
<li>
Corporate
<ul class="sub-pages">
<li>About Us</li>
<li>Our Vision</li>
</ul>
</li>
</ul>
</body>
</html>
/* Target ONLY direct children of main-navigation */
.main-navigation > li {
display: inline-block;
border: 2px solid #3498db;
padding: 10px 20px;
border-radius: 20px;
color: #3498db;
font-weight: bold;
}
/* Sub-pages (grandchildren) do NOT inherit the above styling automatically */
.sub-pages li {
border: none;
color: #666;
font-weight: normal;
padding: 5px;
}
Absolute Positioning (position: absolute) Detachment from Flow and Precise Coordinates
The moment you use position: absolute, that element severs all ties with the Normal Flow.
Its biggest difference from Relative is this: while Relative leaves a "Ghost Space" behind, Absolute leaves no trace at all.
As soon as the element exits the flow, the space it occupied vanishes ( collapses ).
Other content shifts upward to immediately fill the void, as if that element never existed.
Absolute is the true point of rupture in the positioning system; the element both exits the flow and connects to a completely new reference system.
Reference Hunting: "Who defines my coordinates?"An absolute element that has declared its freedom searches for a new center point ( reference ); this search happens from the inside out.
The browser checks the element's ancestors one by one: "Is your position value static?"
If an ancestor is static, the browser skips it and looks at the next one up.
Relative, Absolute, Fixed, or Sticky—as soon as it finds the first non-static ancestor, it adopts that location as its center.
Debug Perspective If an absolute element is not where you expect, the problem is usually not with the element itself, but with the ancestor it is referencing.
Therefore, the first thing to check is which element is creating the positioning context.
Becoming Homeless (The Body Reference)What happens if an absolute element cannot find any specialized positioning in its lineage?
As a last resort, it clings to the very top of the page—the <html> block.
This is why you sometimes see your menus or buttons appearing at the top-right corner of the page instead of inside their intended box.
The solution is to give the intended parent position: relative.
This is one of the most common errors that causes components like dropdowns, tooltips, or modals to appear in the wrong place.
Dimension Manipulation and StretchingNormally, block elements occupy the full width ( width: 100% ).
However, absolute elements only take up as much space as the text inside them ( shrink-to-fit ).
But there is a great trick: if you give an element both left: 0 and right: 0 simultaneously, the element doesn't lose its width; instead, it is forcibly stretched to match the width of its parent.
Full-screen Modals and Overlays are typically created using the top: 0; bottom: 0; left: 0; right: 0; technique.
Absolute is generally preferred when overlapping, creating overlays, or independent component positioning is required.
How to Think with Absolute? When using Absolute, answering these three questions is sufficient:
- Should this element exit the flow?
- Which parent should it be positioned relative to?
- Is an overlay required?
These questions make the use of absolute positioning predictable and controllable.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Absolute: "Those Who Abandon Their Roots" Example</title>
<link rel="stylesheet" href="style.css?v=1.0.150">
</head>
<body>
<div class="parent-card">
<div class="badge">NEW</div>
<h3>Product Title</h3>
<p>Content inside the card...</p>
</div>
</body>
</html>
.parent-card {
position: relative;
width: 250px;
padding: 20px;
background-color: #fff;
border: 1px solid #ddd;
font-family: sans-serif;
}
.badge {
position: absolute;
top: -10px;
right: -10px;
background-color: #2ecc71;
color: white;
padding: 5px 10px;
font-size: 12px;
}
Fixed Positioning (position: fixed) Elements Pinned to the Screen
position: fixed is a more stubborn cousin of absolute positioning ( absolute ).
While absolute elements are positioned relative to the document ( the page ), fixed elements are positioned directly relative to the Viewport (Browser Window).
This means that no matter how long the page is or how far the user
scrolls down, the element's position on the screen will never change.
Fixed utilizes absolute logic within the positioning system but completely changes the reference point to anchor it to the Viewport.
The Peak of Flow DetachmentJust like absolute, fixed elements are entirely removed from the Normal Flow.
They leave no gap behind; other content continues to flow beneath the fixed element.
This often results in fixed elements (such as sticky top menus) overlapping the page content.
To prevent this, a padding-top equal to the height of the menu is usually applied to the body or the first content block.
Debug Perspective If a fixed element is not anchoring to the entire screen as expected, it is highly likely that one of its ancestors has created a new reference system.
The Mobile Transformation Trap (Transform Issue)Fixed's biggest exception and technical trap lies here.
If any ancestor of a fixed element has a transform, filter, or perspective property applied, the fixed element is no longer anchored to the Viewport, but relative to that ancestor.
In this scenario, the "anchor to full screen" magic is broken, and the element moves within that specific container.
This behavior is the fundamental reason behind many developers' question: "Why is my fixed not working?"
Usage Scenarios- Sticky Header: Navigation menus that do not disappear as the user scrolls down.
- Back to Top: "Back to Top" buttons waiting in the bottom-right corner.
- Modal / Lightbox: Windows that open in the center of the page and darken the background.
(Usually centered with top: 50%; left: 50%; transform: translate(-50%, -50%);)
Fixed is ideal for elements that must remain stationary relative to the screen; however, for situations where an element should move with the content but stick at a threshold, Sticky is the better choice.
How to Think with Fixed? When using Fixed, asking these three questions is sufficient:
- Should this element remain stationary relative to the screen?
- Should the Viewport or an ancestor be used as the reference?
- Does it create an overlap problem?
These questions ensure that the use of fixed positioning is correct and controlled.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Fixed: "Pinned to the Screen" Example</title>
<link rel="stylesheet" href="style.css?v=1.0.150">
</head>
<body>
<div class="fixed-button">
Contact Me Anytime!
</div>
</body>
</html>
.fixed-button {
position: fixed;
bottom: 20px;
right: 20px;
background-color: #2c3e50;
color: white;
padding: 15px 25px;
border-radius: 50px;
cursor: pointer;
box-shadow: 0 4px 10px rgba(0, 0, 0, 0.3);
font-family: sans-serif;
}
Sticky Positioning (position: sticky) Hybrid Intelligence and Contextual Pinning
position: sticky is the hybrid child of the CSS world.
An element behaves like Relative ( staying in the flow ) until it reaches a boundary you have defined.
However, the moment the user scrolls and the element touches the designated threshold (for example, top: 0), the element shifts its identity and behaves like Fixed, sticking to the screen.
Sticky is a combination of relative and fixed behaviors within the positioning system; however, this transition is controlled by a specific threshold and parent boundary.
The Golden Cage: Parent BoundaryThe most vital difference between Sticky and Fixed is this: Fixed elements are free ( they use the entire screen ), but Sticky elements are imprisoned within their parents.
A sticky element remains stuck only as long as its own parent box is visible.
Once the end of the parent is reached, the parent drags the element along with it, moving it off-screen.
Therefore, for a sticky element to work, the parent must have a substantial height.
Debug Perspective If sticky isn't working, the problem is often not with the element itself, but within the boundaries of the parent.
Hence, when debugging sticky, the parent chain must always be examined.
The "Failure Guarantee" (The Overflow Trap)This is the biggest issue that causes developers immense frustration.
If any ancestor of a sticky element (including the body) has overflow: hidden, overflow: scroll, or overflow: auto defined, the sticky property is completely disabled.
If sticky is not working, the first place you should check is the overflow rules of the ancestors.
The Threshold Requirement Simply writing position: sticky is not enough; you must provide the answer to the browser's question: "Where should I stick?"
At least one threshold value ( top, bottom, left, or right ) must be specified.
For Example: If you set top: 20px, the element will "brake" 20px before the top of the screen and remain suspended there.
How to Think with Sticky? When using Sticky, answering these three questions is sufficient:
- When should this element be pinned?
- Within which parent boundary should it remain?
- Which threshold value will act as the trigger?
These questions make sticky behavior entirely predictable.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Sticky: "Changes After Crossing the Threshold" Example</title>
<link rel="stylesheet" href="style.css?v=1.0.150">
</head>
<body>
<div class="content-area">
<nav class="sticky-menu">I Am a Navigation Menu</nav>
<div class="long-content">
<p>As you scroll down, the menu will stick to the top...</p>
<div style="height: 1000px;"></div>
</div>
</div>
</body>
</html>
.sticky-menu {
position: sticky;
top: 0;
background-color: #f1c40f;
padding: 15px;
font-weight: bold;
text-align: center;
font-family: sans-serif;
border-bottom: 2px solid #d4ac0d;
}
Z-index and Stacking Context Managing the 3rd Dimension and Layer Battles
We typically think of web pages as two-dimensional planes consisting of X ( horizontal ) and Y ( vertical ) axes.
However, when positioned elements come into play, the page gains a third dimension: the Z-Axis.
This axis is an imaginary line that emerges from the screen surface and extends directly toward the user's eye.
Z-index determines an element's position along this line.
The Battle of Numbers (Z-index Values)z-index is the mathematical way of telling elements, "You come to the front" or "You go to the back."
Positive integers ( 1, 100, 9999 ) bring the element closer to the user ( move it upward ), while negative numbers ( -1 ) push the element below the standard layer
( to the back ).
However, one of the most critical rules of the CSS world applies here: z-index never works on elements whose position is "static."
If you want to give an element depth, you must first give it an identity ( relative, absolute, fixed, sticky ).
Invisible Hierarchy: Stacking ContextSometimes you may find that even with "z-index: 9999," an element cannot rise above another element that has "z-index: 1."
The culprit is the Stacking Context.
A Stacking Context is a local sphere of influence formed within the HTML.
When an element creates a new context, it imprisons all its children within its own rules.
The rule is simple: The champion of a lower league cannot surpass the last-place finisher of a higher league.
If a parent element remains in a lower layer with a low z-index, its child cannot rise above the layer where the parent resides, even if you give the child a million z-index.
The Law of Natural OrderingWhen no z-index is specified, the browser follows this order:
- Backgrounds and borders are at the very bottom.
- Block-level elements ( div ) are above them.
- Inline ( text ) content is above blocks.
- Positioned elements are above everyone who is static.
- If two elements are under the same conditions, the one written last in the HTML code ( DOM Order ) always appears on top.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Z-Index and Layer Battles Example</title>
<link rel="stylesheet" href="style.css?v=1.0.150">
</head>
<body>
<div class="layer-area">
<div class="box-back">Z-Index: 1</div>
<div class="box-front">Z-Index: 10</div>
</div>
</body>
</html>
.box-back,
.box-front {
position: absolute;
width: 150px;
height: 150px;
color: white;
padding: 10px;
font-family: sans-serif;
border-radius: 6px;
}
.box-back {
background-color: #9b59b6;
top: 20px;
left: 20px;
z-index: 1;
}
.box-front {
background-color: #34495e;
top: 60px;
left: 60px;
z-index: 10;
}
Formation of Stacking Context Hidden Layers and Unexpected Triggers
To understand Stacking Context, you must imagine a hierarchy of boxes.
If an HTML element creates a new Stacking Context, all its child elements are aligned within this context and become unable to compete with the outside world.
That is, if your parent element is "z-index: 1," even if you give its child "z-index: 9999," that child can only
surpass its other siblings within the parent itself; it can never rise above a box outside that parent that has "z-index: 2."
Hidden Triggers: Not Just Position!Many developers mistakenly believe that only using "position: relative/absolute" and "z-index" creates a new layer.
The following CSS properties also silently convert an element into a new Stacking Context and alter the z-index ordering:
- Any element with an opacity value less than 1.
- Elements where the transform property is defined and its value is not "none."
- Elements with filter ( blur, grayscale ) applied.
- Elements using the clip-path or mask property.
When you use one of these properties, the element may rise above its siblings or imprison its children even without a "z-index" assignment.
Modern Solution: IsolationSometimes we want an element to separate its children from others and create a new context, but we don't want to mess with "position" or "opacity."
This is where the isolation: isolate; property comes into play.
This code instructs the browser: "Isolate this element from others while calculating and start a new stack."
It is a surgical intervention tool for resolving complex design errors.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Parent Trap: The Z-Index Rule (The Z-Index Trap) Example</title>
<link rel="stylesheet" href="style.css?v=1.0.150">
</head>
<body>
<div class="parent-box">
Parent (z-index: 1)
<div class="child-box">Child (z-index: 9999)</div>
</div>
<div class="rival-box">
Outside Rival (z-index: 2)
</div>
</body>
</html>
.parent-box {
position: relative;
z-index: 1;
background-color: #3498db;
width: 200px;
height: 150px;
padding: 20px;
color: white;
}
.child-box {
position: absolute;
z-index: 9999;
background-color: #e74c3c;
bottom: -30px;
right: -30px;
width: 120px;
height: 120px;
padding: 10px;
}
.rival-box {
position: relative;
z-index: 2;
background-color: #2ecc71;
width: 200px;
height: 100px;
margin-top: -60px;
color: white;
padding: 20px;
}
Containing Block The Zero Point of Coordinates and Reference Box
When you set "top: 0" on an element in CSS, the browser's first question is: "The top of where?"
The answer to this question is the Containing Block.
The Containing Block is the reference coordinate system upon which an element's size and position are calculated.
Your element accepts the boundaries of this box as the boundaries of its universe and performs its calculations accordingly.
The Containing Block is the invisible foundation of the position system; it is the actual reference point that determines where an element will appear.
Mathematical ResponsibilitiesPosition Calculation: The top, right, bottom, and left values are measured from the edges of the Containing Block.
Debug Perspective If an element is not where you expect, the problem is often not in the value you provided, but in the referenced container.
Percentage (%) Sizing: If you give an element width: 50%, this 50% value is calculated from the width of the Containing Block, not necessarily the immediate parent. ( Usually, the parent and the Containing Block are the same, but with absolute positioning, things change! )
This is the most common reason why percentage values in absolute elements are calculated differently than expected.
Therefore, the first thing to check in positioning errors is which containing block the element is bound to.
The correct behavior of absolute elements depends directly on the establishment of the correct containing block.
Identity Shift: Container Selection Based on PositionAn element's Containing Block is not fixed; it changes based on the element's position value:
- Static / Relative: The container is the content-box of the nearest block-level ancestor.
- Absolute: The container is the padding-box of the nearest ancestor whose position is non-static.
- Fixed: Usually, the browser window (viewport) acts as the container.
When you encounter a positioning problem, asking these questions is enough:
- Relative to which container is this element being calculated?
- Is this container chosen correctly?
- Has the position value altered this reference?
These questions allow you to resolve complex positioning errors rapidly.
|
Position Value
|
Containing Block Reference
|
Offset Effect
|
|---|---|---|
|
static
Slave to the Flow
|
Containing Block Reference: Its nearest block-level ancestor. |
Offset Effect: The top, left, bottom, and right values are completely ignored. The browser does not include these values in calculations; the element is ordered solely according to the text flow. |
|
relative
Self-Reference
|
Containing Block Reference: The element's own default position. It doesn't look at another ancestor; it looks in the mirror. |
Offset Effect: Offset values are calculated relative to the top-left corner of the element's original box. The key point: Even if the element shifts visually, its physical space in the DOM remains unchanged and does not push other elements. |
|
absolute
Ancestor Search
|
Containing Block Reference: The nearest ancestor whose position is not static (relative, absolute, fixed, sticky). If no such ancestor exists, it references the ICB (Initial Containing Block), which is the root of the page ( <html> ). |
Offset Effect: Coordinates are precisely calculated relative to the edges of the Padding Box (including internal spacing, excluding border) of the referenced ancestor. |
|
fixed
Pinned to Screen
|
Containing Block Reference: Aside from exceptions ( transform ), the Viewport is always taken as the reference. |
Offset Effect: Coordinates are determined relative to the window pane. How long the page is or where the scrollbar is located is irrelevant; offset values are anchored relative to the top-left corner of the screen. |
|
sticky
Dual Character
|
Containing
Block Reference: It has two references:
|
Offset Effect: During scrolling, the element locks to a specified point of the Viewport (like top: 0), provided it does not move outside its parent's boundaries. |