Master the Box Model: Essential CSS Layout

Eduardo Casanova
18 min readJun 14, 2024

--

In CSS, every element is essentially a box. Understanding how these boxes work is crucial for crafting complex layouts and achieving precise alignment between elements. This lesson will guide you through the CSS Box Model, explaining its components and terminology.

Understanding CSS Boxes and Display Types

In CSS, elements are represented by boxes that influence how they appear on the page. These boxes fall into two main categories:

  • Block Boxes: These boxes typically start on a new line and occupy the full available width by default. Examples include headings, paragraphs, and division elements (<div>)
  • Inline Boxes: These boxes sit on the same line with other content, typically flowing around text or other inline elements. Examples include images (<img>), links (<a>), and spans (<span>).

Display Property and Inner/Outer Display Types:

The display property controls how an element is displayed. It can have various values, influencing both the box's behavior and its inner and outer display types:

  • Inner Display Type: This defines how the element’s content behaves within the box. For example, text within a paragraph element (<p>) typically flows across multiple lines (inner display type: inline).
  • Outer Display Type: This determines how the box itself interacts with surrounding elements on the page. For instance, a paragraph element (<p>) typically starts on a new line and occupies full width (outer display type: block).

By understanding these concepts and manipulating the display property, you can achieve precise control over how elements are displayed and interact with each other on your webpage.

Block vs. Inline Display Behavior

The display property defines how an element is displayed and how it interacts with other elements on the page. Here's a breakdown of block and inline display types:

Block Boxes (Outer Display Type: block)

Behavior:

  • Starts on a new line, occupying the full available width by default.
  • Respects the width and height properties.
  • Padding, margin, and borders on all sides push other elements away from the box.
  • If width is not specified, it expands to fill its container's width (100% by default).

Examples: Headings (<h1>, <h2>), paragraphs (<p>), division elements (<div>)

Inline Boxes (Outer Display Type: inline)

Behavior:

  • Sits on the same line with other content, typically flowing around text or other inline elements.
  • Ignores the width and height properties.
  • Top and bottom padding, margin, and borders apply but don’t affect other inline boxes’ position.
  • Left and right padding, margin, and borders apply and can push other inline boxes away horizontally.

Examples: Images (<img>), links (<a>), spans (<span>), emphasis (<em>, <strong>)

Default Display Types of Common Elements:

  • Block elements by default: <h1>, <h2>, <p>, <div>
  • Inline elements by default: <a>, <span>, <em>, <strong>

Let’s look at an example highlighting how elements with a block display type behave in CSS:

p,
ul {
border: 2px solid rebeccapurple;
padding: .5em;
}

.block,
li {
border: 2px solid blue;
padding: .5em;
}

ul {
display: flex;
list-style: none;
}

.block {
display: block;
}
<p>I am a paragraph. A short one.</p>
<ul>
<li>Item One</li>
<li>Item Two</li>
<li>Item Three</li>
</ul>
<p>I am another paragraph. Some of the <span class="block">words</span> have been wrapped in a <span>span element</span>.</p>

Paragraph with Border: This paragraph element has a border added using CSS. Due to its default display: block, the browser renders it as a block box. This means:

  • It starts on a new line, creating a clear separation from other elements.
  • It expands horizontally to fill the entire available width within its container.

List with Flex Layout: While the list itself uses display: flex to arrange its child elements, the list element itself remains a block box. This translates to:

  • It occupies a new line like the paragraph.
  • It expands to fill the full container width, similar to the paragraph.

Inline Elements with Forced Block Display: The example includes a block-level paragraph containing two <span> elements. These spans would normally be inline elements, but one has a class named "block" that sets its display to block. Here, the class overrides the default inline behavior, making the span behave like a block box:

  • It starts on a new line within the paragraph, creating a separation from the other span element.
  • It likely occupies the full width available within the paragraph, depending on any additional styles applied.

Now, let’s see how inline elements behave in CSS:

Default Inline Behavior: The <span> elements within the first paragraph are inline by default. This means:

  • They sit on the same line with other content, flowing horizontally alongside text or other inline elements.
  • They don’t force a line break unless explicitly styled to do so.

Inline Flex Container: While the <ul> element uses display: inline-flex to arrange its child elements, the list itself remains an inline box. This translates to:

  • It stays on the same line with surrounding content, just like the <span> elements.
  • It can contain flex items arranged using flexbox properties.

Forced Inline Display on Paragraphs: The example demonstrates two paragraphs set to display: inline. Here, the display type is forced to inline, overriding the default block behavior of paragraphs. This results in:

  • Both paragraphs appearing on the same line as any surrounding content, rather than starting new lines.
  • All elements (paragraphs and the inline flex container) running together horizontally.

Toggling Display Modes: You can experiment with different display values in CSS. Changing display: inline to display: block or display: inline-flex to display: flex will show how these elements behave differently based on the display type applied.

p,
ul {
border: 2px solid rebeccapurple;
}

span,
li {
border: 2px solid blue;
}

ul {
display: inline-flex;
list-style: none;
padding: 0;
}

.inline {
display: inline;
}
<p>
I am a paragraph. Some of the
<span>words</span> have been wrapped in a
<span>span element</span>.
</p>
<ul>
<li>Item One</li>
<li>Item Two</li>
<li>Item Three</li>
</ul>
<p class="inline">I am a paragraph. A short one.</p>
<p class="inline">I am another paragraph. Also a short one.</p>

Remember This:

The display property is a powerful tool in CSS. Changing its value can transform the outer display type of an element, switching it between block and inline behavior. This, in turn, significantly impacts how the element interacts with and flows alongside other elements in your web page layout.

This understanding is fundamental for building web pages with the desired structure and element positioning.

Demystifying the CSS Box Model

The CSS box model is a fundamental concept for building web page layouts. It defines how elements are displayed and how their different parts interact. This model primarily applies to block-level elements, which typically start on new lines and occupy full width by default.

Understanding the Box Components:

A block-level element in CSS can be visualized as having four key parts:

  1. Content Box: This is the core area where your element’s actual content resides, such as text, images, or videos. You can control its size using properties like width and height.
  2. Padding Box: This surrounds the content box, adding space around it. Padding acts like a buffer zone between the content and the outer edges of the element. You can define the padding size using the padding property and its variations (e.g., padding-top, padding-left).
  3. Border Box: The border box encapsulates the content box and any padding applied. It defines the visual border surrounding the element. You can control the border style, width, and color using the border property and its variations.
  4. Margin Box: This is the outermost layer, creating a whitespace area between the element and other elements on the page. It encompasses the content, padding, and border. You can control the margin size using the margin property and its variations (e.g., margin-top, margin-right).

Sizing the Content Box in the Standard Model

In the standard CSS box model, properties like inline-size and block-size (or width and height for horizontal writing systems) directly control the dimensions of the content box. This means:

  • Setting these properties defines the intrinsic size of your element’s content (text, images, etc.).
  • Any padding and border styles you add are applied on top of these content dimensions.

Calculating the Total Box Size:

To determine the total size of the box displayed on the page, we consider the content box dimensions as the starting point. Then, we add:

  • Any padding applied using the padding property.
  • The border width defined by the border property.

This combined size represents the final dimensions of the entire box, including content, padding, and border.

.box {
width: 350px;
height: 150px;
margin: 10px;
padding: 25px;
border: 5px solid black;
}

The actual space taken up by the box will be 410px wide (350 + 25 + 25 + 5 + 5) and 210px high (150 + 25 + 25 + 5 + 5).

The margin is an essential part of the box model, but it’s important to remember it doesn’t directly contribute to the element’s size. Here’s why:

Margin Creates Space Around the Box: Margins define a clearance area surrounding the element’s border. This creates visual separation between the element and other elements on the page.

Doesn’t Affect Content Area: The margin does not add to the width or height of the content, padding, or border. It creates additional whitespace purely for spacing purposes.

In simpler terms, imagine the element’s content, padding, and border as a solid box. The margin acts like an invisible buffer zone surrounding this solid box, influencing the overall space the element occupies on the page.

The Simpler Approach: Alternative Box Model

The standard box model can sometimes require calculations to determine the final size of an element with padding and borders. The alternative box model offers a simpler approach:

  • Total Width = Visible Width: In this model, the width property you set directly defines the total visible width of the element on the page, including padding and border.
  • Content Shrinks to Accommodate: Any padding and border styles you define are subtracted from the available space for the content box. This means the content area shrinks to fit within the specified total width.

Activating the Alternative Model:

To take advantage of this simpler approach, you can enable the alternative box model for an element using the CSS property box-sizing: border-box. This property essentially tells the browser to consider the padding and border as part of the overall width you define, making calculations unnecessary.

.box {
box-sizing: border-box;
}

If we assume the box has the same CSS as above:

.box {
width: 350px;
inline-size: 350px;
height: 150px;
block-size: 150px;
margin: 10px;
padding: 25px;
border: 5px solid black;
}

Now, the actual space taken up by the box will be 350px in the inline direction and 150px in the block direction.

Many developers prefer the simplicity of the alternative box model.

  • Set box-sizing: border-box on the <html> element: By applying this property to the root HTML element, you establish border-box as the default behavior for all descendant elements within your webpage.
  • Inheritance Takes Care of the Rest: The box-sizing property is inheritable. This means child elements will inherit the border-box value from the parent <html> element, eliminating the need to set it individually on every element.
html {
box-sizing: border-box;
}

*,
*::before,
*::after {
box-sizing: inherit;
}

Challenge: Matching Box Sizes with Alternative Box Model

The example below showcases two boxes with the same class .box. This class defines their width, height, margin, border, and padding. The key difference? The second box utilizes the alternative box model with box-sizing: border-box.

.box {
border: 5px solid rebeccapurple;
background-color: lightgray;
padding: 40px;
margin: 40px;
width: 300px;
height: 150px;
}

.alternate {
box-sizing: border-box;
}
<div class="box">I use the standard box model.</div>
<div class="box alternate">I use the alternate box model.</div>

Can you achieve the same visual size for both boxes using CSS applied to the .alternate class?

Here’s the twist: since the second box uses border-box, the specified width already includes padding and border. To match the first box visually, you'll need to adjust the content area's width within the second box.

Hint: Think about how the padding property affects the content area in the alternative box model.

Unveiling the Box Model with Browser Developer Tools

Mastering the box model can be much easier with the help of your browser’s developer tools. Take Firefox DevTools for example. By inspecting an element on your webpage, you can gain valuable insights:

  • Visualizing the Box Breakdown: DevTools often provide a visual representation of the element’s box model, clearly showing the dimensions of the content area, padding, border, and margin.
  • Inspecting Actual Sizes: You can see the exact pixel values for each box component (content, padding, border, margin). This allows you to verify if the element’s size matches your expectations based on the applied CSS styles.

Benefits of Inspecting Elements:

  • Troubleshooting Layout Issues: If your element appears unexpectedly large or small, inspecting it can reveal where the issue lies. Is it excessive padding or a margin pushing it out of place?
  • Experimenting with Styles: You can experiment with different CSS values directly within DevTools and see how they affect the box model dimensions in real-time. This provides a safe and interactive way to refine your layouts.

So, next time you’re working on CSS layouts, don’t hesitate to leverage your browser’s developer tools. Inspecting elements can be a game-changer in understanding and effectively using the box model.

Margin: The Invisible Spacer

Imagine a clear zone surrounding your element — that’s the margin! It acts like a buffer, creating space between your element and its neighbors on the page. Margins can have:

  • Positive values: These push the element away from other elements by the specified distance.
  • Negative values: (Use with caution!) These cause the element to overlap surrounding elements by the specified amount.

Benefits of Margins:

  • Spacing and Separation: Margins provide visual separation between elements, improving readability and organization on your webpage.
  • Fine-Tuning Layouts: By adjusting margins, you can control how close or far apart elements appear.

Controlling Margins:

You have two ways to define margins in CSS:

  1. Shorthand margin property: This allows you to set a single value for all margins simultaneously. (e.g., margin: 10px;)
  2. Longhand margin properties: These provide more granular control, letting you define margins for each side individually. (e.g., margin-top: 20px; margin-right: 5px;)

Interactive Experiment (Optional):

The provided example allows you to play around with margin values. Try adjusting the numbers and see how the element’s position changes. Positive values will push it away from the surrounding element, while negative values (used strategically) can create overlapping effects.

Remember, margins are always added after the visible box size is calculated, regardless of the box model (standard or alternative) being used.

.box {
margin-top: 40px;
margin-right: 30px;
margin-bottom: 40px;
margin-left: 4em;
}
<div class="container">
<div class="box">Change my margin.</div>
</div>

Margin Collapsing: The Merging Mystery

Margin collapsing is a behavior in CSS that can sometimes lead to unexpected results when margins of adjacent elements touch. Here’s what happens:

  • Positive Margins Collide: When two elements have positive margins that touch, these margins collapse into a single margin. The resulting margin size is equal to the largest individual margin involved.
  • Negative Margins Interact: If both margins are negative, they also collapse, but the resulting margin adopts the smallest (most negative) value.
  • Mixed Positive and Negative: When one margin is negative and the other positive, the negative value is subtracted from the positive one to determine the final margin size.

Interactive Experiment (Optional):

The provided example showcases two paragraphs. Play around with the margin values to see margin collapse in action:

  • Try setting the top paragraph’s margin-bottom to a high value (e.g., 80px) and the bottom paragraph's margin-top to a smaller value (e.g., 30px). Observe how the actual space between the paragraphs remains equal to the larger margin (80px) due to collapsing.
  • Now, change the bottom paragraph’s margin-top to a negative value (e.g., -10px). See how the overall margin between the paragraphs shrinks, as the negative value is subtracted from the larger positive margin.

Understanding margin collapsing is crucial for crafting predictable layouts in CSS. By being aware of this behavior, you can avoid unwanted surprises and achieve the desired spacing between your elements.

.one {
margin-bottom: 50px;
}

.two {
margin-top: 40px;
}
<div class="container">
<p class="one">I am paragraph one.</p>
<p class="two">I am paragraph two.</p>
</div>

Sometimes, you might set margins on elements expecting a certain amount of space, but things don’t quite work as planned. This can be due to a concept called margin collapsing in CSS.

Adding Style with Borders

Borders are a great way to visually define the edges of your elements and enhance your webpage design. They sit between the margin (outer clearance) and the padding (inner space) of a box.

Understanding Border Sizing:

  • Standard Box Model: Border width is added to the content box dimensions (width and height) to determine the overall size of the element.
  • Alternative Box Model: Border width is subtracted from the available space for the content box, making it slightly smaller.

Border Styling Options

CSS offers extensive control over border appearance using various properties:

Shorthand Properties:

  • border: Set all four borders' style, width, or color at once (e.g., border: 2px solid red;).

Longhand Properties:

  • For individual control over each side:
  • border-top-width, border-top-style, border-top-color (top border)
  • border-right-width, border-right-style, border-right-color (right border)
  • border-bottom-width, border-bottom-style, border-bottom-color (bottom border)
  • border-left-width, border-left-style, border-left-color (left border)

Interactive Experiment (Optional):

In the provided example, play with the different border properties to see how they affect the element’s appearance.

.container {
border-top: 5px dotted green;
border-right: 1px solid black;
border-bottom: 20px double rgb(23 45 145);
}

.box {
border: 1px solid #333333;
border-top-style: dotted;
border-right-width: 20px;
border-bottom-color: hotpink;
}
<div class="container">
<div class="box">Change my borders.</div>
</div>

Creating Space with Padding

Padding adds space between the element’s border and its content, effectively pushing the content inwards. Unlike margins (used for outer spacing), padding cannot have negative values. Any background color or image applied to the element will show behind the padding area.

Controlling Padding

  • Shorthand Property: Use the padding property to set padding values for all sides of the element simultaneously (e.g., padding: 10px;).
  • Longhand Properties: For more granular control, use individual properties for each side:
  • padding-top: Controls the top padding
  • padding-right: Controls the right padding
  • padding-bottom: Controls the bottom padding
  • padding-left: Controls the left padding

Interactive Experiment (Optional):

The provided example allows you to play around with padding values for the .box and .container classes. Observe how these changes affect:

  • The position of text within the box relative to its borders (.box class).
  • The spacing between the container and the box (.container class).

Remember, padding applies to any element. Experiment with different padding values to create the desired amount of space between the content and the border.

.box {
padding-top: 0;
padding-right: 30px;
padding-bottom: 40px;
padding-left: 4em;
}

.container {
padding: 20px;
}
<div class="container">
<div class="box">Change my padding.</div>
</div>

Block Boxes vs. Inline Boxes: Understanding the Differences

Everything we’ve covered so far applies primarily to block-level elements, which typically start new lines and occupy full width by default.

However, there’s another type of element: inline elements. These elements, like <span>, flow horizontally alongside text and other inline content. While they share some properties with block boxes, their behavior with the box model differs.

Inline Box Quirks

  • Width and Height: Inline elements typically don’t respond to width and height properties. Their width is determined by the content they hold, and their height is usually influenced by the font size and line height.
  • Margins and Padding:
  • Top and bottom margins, padding, and borders are generally respected.
  • Left and right margins and padding can cause overlapping with surrounding content, pushing other inline elements aside.

Example Breakdown

span {
margin: 20px;
padding: 20px;
width: 80px;
height: 50px;
background-color: lightblue;
border: 2px solid blue;
}
<p>
I am a paragraph and this is a <span>span</span> inside that paragraph. A span is an inline element and so does not respect width and height.
</p>

The provided example demonstrates an inline <span> element within a paragraph. Although styled with width, height, margin, border, and padding:

  • The width and height are ignored because the element is inline.
  • Top and bottom margins, padding, and borders are applied, but they don’t affect the vertical positioning of the surrounding text. Padding and border might overlap nearby words.
  • Left and right margins and padding can push other inline elements horizontally away from the <span>.

Understanding these distinctions between block and inline boxes is crucial for building well-structured and predictable layouts in CSS.

Taming the Middle Ground: display: inline-block

Sometimes, you need an element to behave like inline content but also respect properties like width and height. This is where display: inline-block comes in! It offers a compromise between inline and block behavior.

Key Characteristics of display: inline-block

  • Doesn’t Break Lines: Unlike inline elements, elements with display: inline-block won't break onto a new line by default. They flow horizontally alongside other content.
  • Respects Width and Height: You can define explicit dimensions using width and height properties, allowing for more control over the element's size.
  • Margins and Padding Push Content Away: Similar to block elements, padding, margin, and border properties cause surrounding content to move away from the element, preventing unwanted overlapping.

Interactive Experiment (Optional)

The provided example showcases an <span> element with display: inline-block applied. Play around with the following options to see the effects on the element:

span {
margin: 20px;
padding: 20px;
width: 80px;
height: 50px;
background-color: lightblue;
border: 2px solid blue;
display: inline-block;
}
<p>
I am a paragraph and this is a <span>span</span> inside that paragraph. A span is an inline element and so does not respect width and height.
</p>
  • Change display: inline-block to display: block. This will turn the element into a full block box, starting on a new line and potentially occupying the full width available.
  • Remove the display property altogether. In this case, the element will revert to its default inline behavior, likely flowing horizontally with the text and respecting only top and bottom margins/padding.

By understanding display: inline-block, you can create flexible layouts where elements can sit side-by-side without unnecessary line breaks, while still offering some control over their size and spacing.

Enhancing Clickable Areas with display: inline-block

One practical application of display: inline-block is making links more user-friendly. By default, <a> elements are inline, making it trickier to add padding for a larger clickable area.

The Power of Padding:

  • Adding padding to a link increases the clickable region, improving user experience, especially on touchscreens.
  • However, since <a> is inline, padding can overlap with surrounding elements' borders.

Navigation Bar Example:

The provided example showcases a navigation bar with links displayed in a row using Flexbox. Padding is added to the <a> elements to allow background color changes on hover. But, you might notice the padding overlapping the border of the unordered list <ul>.

display: inline-block to the Rescue!

By adding display: inline-block to the CSS rule targeting the link elements (.links-list a), you can fix this issue. Here's how it helps:

  • It transforms the link elements from inline to inline-block behavior.
  • This ensures the padding is respected as part of the element’s size, preventing overlap with the list border.

Remember, display: inline-block is a valuable tool for creating more user-friendly and visually appealing interactive elements like links in your layouts.

.links-list a {
background-color: rgb(179 57 81);
color: #fff;
text-decoration: none;
padding: 1em 2em;
display: inline-flex
}

.links-list a:hover {
background-color: rgb(66 28 40);
color: #fff;
}
<nav>
<ul class="links-list">
<li><a href="">Link one</a></li>
<li><a href="">Link two</a></li>
<li><a href="">Link three</a></li>
</ul>
</nav>

Summary

Congratulations! You’ve grasped the fundamental concepts of the CSS box model. Understanding how elements are sized and spaced with margins, padding, borders, and content is essential for building well-structured and predictable layouts.

While this serves as a solid foundation, there’s more to explore! In the next article, we’ll delve into the world of backgrounds and borders. You’ll learn how to style your elements visually, transforming those plain boxes into captivating design components.

Remember, the box model is a cornerstone of CSS layout. Keep practicing, and refer back to this lesson if needed. As you move forward, you’ll discover how backgrounds and borders can elevate your layouts to the next level!

If you liked this article I’d appreciate a clap or a comment. That helps me improve the quality of my posts as well as getting to know more about you my dear reader. Muchas gracias!

Down below you can find my social media and a link to subscribe for new posts. Tips are always welcomed.

type SocialMedia = {
LinkedIn: string;
GitHub: string;
StackOverflow: string;
Litsy: string;
Email: string;
X: string;
}

function newSocialMedia(): SocialMedia {
return {
LinkedIn: "https://www.linkedin.com/in/edwardcasanova/",
GitHub: "https://github.com/ed3899",
StackOverflow: "stackoverflow.com/users/11941146/edward-casanova",
Litsy: "https://www.litsy.com/web/stack/edca3899/read",
Email: "ed.wacc1995@gmail.com",
X: "https://twitter.com/edca3911"
};
}
const subscribe = (): string => {
return "https://medium.com/@ed.wacc1995/subscribe";
};
const tip = (): string => {
return "https://paypal.me/edca3899?country.x=MX&locale.x=es_XC";
};

--

--

Eduardo Casanova

💻 Software Engineer 💪🏽 Ex-Fitness Coach 📹 I do Videos About Computer Scientists