🌞

The Box Model

Everything in CSS is a box - master how they work and you'll master layouts

Box Model Fundamentals

The CSS box model describes how every element is rendered as a rectangular box, consisting of content, padding, border, and margin layers.

The Anatomy of a Box

Margin
Border
Padding
Content

The actual content of your element lives here

/* The box model layers */
.element {
    /* Content dimensions */
    width: 300px;
    height: 150px;
    
    /* Padding: space inside the border */
    padding: 20px;
    
    /* Border: the element's frame */
    border: 5px solid var(--colour-primary);
    
    /* Margin: space outside the border */
    margin: 30px;
    
    /* Background affects content + padding */
    background: var(--colour-surface);
}

Padding

Uniform padding: 20px
Different padding per side
Shorthand: top/bottom left/right
/* Padding variations */
.uniform {
    padding: 20px;
}

.directional {
    padding-top: 10px;
    padding-right: 20px;
    padding-bottom: 30px;
    padding-left: 40px;
}

.shorthand {
    /* top right bottom left */
    padding: 10px 20px 30px 40px;
    
    /* vertical horizontal */
    padding: 20px 40px;
}

Margin

Basic margin
Auto margin for centering
Negative margin overlap
/* Margin techniques */
.basic {
    margin: 20px;
}

.auto {
    width: 200px;
    margin: 0 auto; /* Horizontal centering */
}

.negative {
    margin-top: -10px; /* Pulls element up */
    margin-left: -20px; /* Overlaps left */
}

/* Margin collapse */
.paragraph {
    margin-bottom: 20px;
}
.next-paragraph {
    margin-top: 30px;
    /* Total space: 30px (not 50px) */
}

Borders

Solid border
Dashed border
Gradient border trick
Rounded corners
/* Border styles */
.solid {
    border: 3px solid var(--colour-primary);
}

.dashed {
    border: 2px dashed var(--colour-secondary);
}

.gradient {
    border: 4px solid transparent;
    background: 
        linear-gradient(white, white) padding-box,
        linear-gradient(45deg, #f06, #48f) border-box;
}

.rounded {
    border: 2px solid var(--colour-border);
    border-radius: 12px;
    /* Individual corners */
    border-top-left-radius: 20px;
}

Box Sizing Models

The box-sizing property changes how the total width and height of elements are calculated. This can make layouts much more predictable!

Content Box vs Border Box

content-box (default)

Width: 300px + padding + border

Total: 350px

border-box

Width: 300px total

Total: 300px
/* Default behaviour */
.content-box {
    box-sizing: content-box;
    width: 300px;
    padding: 20px;
    border: 5px solid;
    /* Total width: 300 + 40 + 10 = 350px */
}

/* Modern approach */
.border-box {
    box-sizing: border-box;
    width: 300px;
    padding: 20px;
    border: 5px solid;
    /* Total width: 300px (includes padding/border) */
}

/* Best practice: apply globally */
*, *::before, *::after {
    box-sizing: border-box;
}

Practical Example

1/3
1/3
1/3
/* With border-box, math is easy! */
.layout-grid {
    display: flex;
    gap: 20px;
}

.grid-item {
    box-sizing: border-box;
    width: 33.333%;
    padding: 20px;
    border: 2px solid;
    /* No need to calculate! */
}

Interactive Box Model Playground

Experiment with different values to see how they affect the box model in real-time.

Adjust Properties

200px
100px
20px
5px
20px
Total Width: 250px Total Height: 150px
Content Area
.box {
    width: 200px;
    height: 100px;
    padding: 20px;
    border: 5px solid;
    margin: 20px;
    box-sizing: content-box;
}

Advanced Box Model Techniques

Take your box model skills to the next level with these advanced techniques and edge cases.

Margin Collapse

30px bottom margin
20px top margin

Gap = 30px (not 50px)

/* Margins collapse vertically */
.first {
    margin-bottom: 30px;
}
.second {
    margin-top: 20px;
}
/* Result: 30px gap (larger wins) */

/* Prevent collapse */
.parent {
    /* Any of these work: */
    overflow: hidden;
    padding: 1px;
    border: 1px solid transparent;
}

Outline vs Border

/* Border affects box size */
.border-style {
    border: 3px solid var(--colour-primary);
}

/* Outline doesn't affect layout */
.outline-style {
    outline: 3px solid var(--colour-secondary);
    outline-offset: 2px;
}

/* Perfect for focus states */
.focus-style:focus {
    outline: 2px dashed currentColor;
    outline-offset: 4px;
}

Percentage Calculations

50% width
10% padding
25% margin
/* Percentages reference parent */
.parent {
    width: 400px;
    height: 200px;
}

.child {
    /* Width: 50% of parent width */
    width: 50%; /* = 200px */
    
    /* Padding: % of parent WIDTH */
    padding: 10%; /* = 40px all sides */
    
    /* Margin: % of parent WIDTH */
    margin: 25%; /* = 100px */
    
    /* Height % needs parent height */
    height: 50%; /* = 100px */
}

Box Shadow Layers

Basic shadow
Inset shadow
Multiple shadows
Glow effect
/* Box shadows don't affect layout */
.basic-shadow {
    box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
}

.inset-shadow {
    box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.2);
}

.multiple-shadows {
    box-shadow: 
        0 2px 4px rgba(0, 0, 0, 0.1),
        0 8px 16px rgba(0, 0, 0, 0.1);
}

.glow-effect {
    box-shadow: 
        0 0 20px rgba(59, 130, 246, 0.5),
        0 0 40px rgba(59, 130, 246, 0.3);
}

Box Model Best Practices

📦

Always Use Border-Box

Set box-sizing: border-box globally to make width calculations predictable and intuitive.

📐

Margin for Spacing Between

Use margin for space between elements, padding for space inside elements.

🎯

Consistent Spacing Scale

Define spacing variables (8px, 16px, 24px...) for consistent rhythm throughout your design.

Outline for Focus States

Use outline instead of border for focus indicators to avoid layout shifts.

Continue Your Journey

Now that you understand how boxes work, explore how to arrange them!