Table of Contents
- Introduction to CSS Layout
- Normal Flow
- Display Property
- Positioning
- Floats and Clearfix
- Flexbox
- CSS Grid
- Multi-column Layout
- Responsive Design
- Layout Patterns
- Practical Examples
- Common Layout Issues
- Best Practices
Introduction to CSS Layout
CSS layout refers to the techniques used to position elements on a web page. Understanding layout fundamentals is crucial for creating well-structured, responsive websites that work across different devices and screen sizes.
Why Layout Matters
- User Experience: Good layout makes content easy to read and navigate
- Visual Hierarchy: Guides users through content in order of importance
- Responsiveness: Adapts to different screen sizes and devices
- Maintainability: Clean layout code is easier to update and debug
- Accessibility: Proper layout helps assistive technologies
Evolution of CSS Layout
/* 1990s - Tables for layout */ <table width="100%" cellpadding="10"> <tr> <td width="200">Sidebar</td> <td>Main Content</td> </tr> </table> /* 2000s - Floats */ .sidebar { float: left; width: 200px; } /* 2010s - Flexbox */ .container { display: flex; } /* 2020s - Grid */ .container { display: grid; grid-template-columns: 200px 1fr; } Normal Flow
Normal flow is the default layout behavior where elements appear in the order they appear in the HTML.
Block and Inline Flow
/* Block-level elements stack vertically */ .block-element { display: block; width: 100%; margin: 10px 0; } /* Inline elements flow horizontally */ .inline-element { display: inline; margin-right: 10px; } /* HTML structure */ <div class="block-element">Block 1</div> <div class="block-element">Block 2</div> <span class="inline-element">Inline 1</span> <span class="inline-element">Inline 2</span> <span class="inline-element">Inline 3</span> Flow Examples
<div class="flow-demo"> <style> .flow-demo { background-color: #f5f5f5; padding: 20px; border-radius: 8px; } .block { background-color: #ff6b6b; color: white; padding: 10px; margin: 10px 0; border-radius: 4px; } .inline { background-color: #4ecdc4; color: white; padding: 5px 10px; margin: 0 5px; border-radius: 4px; display: inline-block; /* Better for demonstration */ } </style> <div class="block">Block Element 1</div> <div class="block">Block Element 2</div> <span class="inline">Inline 1</span> <span class="inline">Inline 2</span> <span class="inline">Inline 3</span> <span class="inline">Inline 4</span> </div> Formatting Contexts
/* Block Formatting Context (BFC) */ .bfc-demo { overflow: auto; /* Creates BFC */ /* or */ display: flow-root; /* or */ position: absolute; } /* Inline Formatting Context (IFC) */ .ifc-demo { text-align: center; line-height: 1.5; } Display Property
The display property is fundamental to layout, determining how elements are rendered.
Block, Inline, and Inline-Block
/* Block display */ .block { display: block; width: 200px; /* Takes effect */ height: 100px; /* Takes effect */ margin: 10px; /* All margins work */ padding: 10px; /* All padding works */ } /* Inline display */ .inline { display: inline; width: 200px; /* Ignored */ height: 100px; /* Ignored */ margin: 10px; /* Only horizontal margins work */ padding: 10px; /* Padding works but may overlap */ } /* Inline-block display */ .inline-block { display: inline-block; width: 200px; /* Takes effect */ height: 100px; /* Takes effect */ margin: 10px; /* All margins work */ padding: 10px; /* All padding works */ } Display Comparison
<div class="display-comparison"> <style> .display-comparison { background-color: #f5f5f5; padding: 20px; } .demo-box { background-color: #007bff; color: white; text-align: center; padding: 10px; margin: 10px; width: 150px; height: 80px; } .block-demo { display: block; background-color: #ff6b6b; } .inline-demo { display: inline; background-color: #4ecdc4; width: 150px; /* Ignored */ height: 80px; /* Ignored */ } .inline-block-demo { display: inline-block; background-color: #45b7d1; } </style> <div class="demo-box block-demo">Block</div> <div class="demo-box block-demo">Block</div> <hr> <span class="demo-box inline-demo">Inline</span> <span class="demo-box inline-demo">Inline</span> <span class="demo-box inline-demo">Inline</span> <hr> <span class="demo-box inline-block-demo">Inline-Block</span> <span class="demo-box inline-block-demo">Inline-Block</span> <span class="demo-box inline-block-demo">Inline-Block</span> </div> Other Display Values
/* None - element not displayed */ .hidden { display: none; /* Completely removed from layout */ } /* Contents - only children are rendered */ .contents { display: contents; /* Parent doesn't generate a box */ } /* Table displays */ .table { display: table; } .table-row { display: table-row; } .table-cell { display: table-cell; padding: 10px; border: 1px solid #ccc; } /* List-item */ .list-item { display: list-item; margin-left: 20px; } Positioning
Positioning allows you to take elements out of normal flow and position them precisely.
Position Values
/* Static (default) */ .static { position: static; /* top, right, bottom, left have no effect */ } /* Relative */ .relative { position: relative; top: 20px; left: 20px; /* Stays in flow but offset from normal position */ } /* Absolute */ .absolute { position: absolute; top: 50px; right: 0; /* Removed from flow, positioned relative to nearest positioned ancestor */ } /* Fixed */ .fixed { position: fixed; bottom: 20px; right: 20px; /* Removed from flow, positioned relative to viewport */ } /* Sticky */ .sticky { position: sticky; top: 0; /* Toggles between relative and fixed based on scroll */ } Positioning Examples
<div class="position-demo"> <style> .position-demo { height: 400px; background-color: #f5f5f5; position: relative; margin: 20px; overflow: auto; } .pos-box { width: 150px; height: 100px; color: white; display: flex; align-items: center; justify-content: center; margin: 10px; } .static-box { background-color: #6c757d; position: static; } .relative-box { background-color: #007bff; position: relative; top: 20px; left: 20px; } .absolute-box { background-color: #dc3545; position: absolute; bottom: 20px; right: 20px; } .fixed-box { background-color: #28a745; position: fixed; top: 20px; right: 20px; z-index: 1000; } .sticky-box { background-color: #ffc107; color: #333; position: sticky; top: 0; z-index: 100; } </style> <div class="sticky-box">Sticky Header</div> <div class="static-box">Static</div> <div class="relative-box">Relative</div> <div class="absolute-box">Absolute</div> <div class="fixed-box">Fixed</div> <div style="height: 200px;"></div> </div> Z-Index and Stacking Context
/* Z-index controls stacking order */ .layer1 { position: relative; z-index: 1; background-color: #ff6b6b; } .layer2 { position: relative; z-index: 2; background-color: #4ecdc4; margin-top: -30px; margin-left: 30px; } /* Stacking context created by various properties */ .stack-context { position: relative; z-index: 0; /* or */ opacity: 0.9; /* or */ transform: scale(1); /* or */ filter: blur(0); } /* Z-index only works on positioned elements */ .not-positioned { z-index: 999; /* Has no effect */ } Practical Positioning Examples
/* Modal overlay */ .modal-overlay { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(0,0,0,0.5); display: flex; align-items: center; justify-content: center; z-index: 1000; } .modal-content { position: relative; background-color: white; padding: 30px; border-radius: 8px; max-width: 500px; width: 90%; } .modal-close { position: absolute; top: 10px; right: 10px; cursor: pointer; } /* Tooltip */ .tooltip-trigger { position: relative; } .tooltip { position: absolute; bottom: 100%; left: 50%; transform: translateX(-50%); background-color: #333; color: white; padding: 5px 10px; border-radius: 4px; white-space: nowrap; display: none; } .tooltip-trigger:hover .tooltip { display: block; } /* Badge */ .badge { position: absolute; top: -5px; right: -5px; background-color: #ff6b6b; color: white; border-radius: 50%; width: 20px; height: 20px; display: flex; align-items: center; justify-content: center; font-size: 12px; } Floats and Clearfix
Floats were historically used for layout but are now primarily for wrapping text around images.
Float Basics
/* Float left/right */ .float-left { float: left; margin-right: 20px; } .float-right { float: right; margin-left: 20px; } /* Clear floats */ .clear-left { clear: left; } .clear-right { clear: right; } .clear-both { clear: both; } Float Example
<div class="float-demo"> <style> .float-demo { background-color: #f5f5f5; padding: 20px; max-width: 600px; } .float-image { float: left; margin: 0 20px 20px 0; width: 150px; height: 150px; background-color: #007bff; color: white; display: flex; align-items: center; justify-content: center; } .clearfix::after { content: ""; display: table; clear: both; } </style> <div class="float-image">Floated Image</div> <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris.</p> <p class="clearfix">This paragraph clears the float and starts below the image.</p> </div> Clearfix Techniques
/* Modern clearfix */ .clearfix::after { content: ""; display: table; clear: both; } /* Alternative clearfix */ .clearfix-alt::after { content: ""; display: block; clear: both; } /* Old IE clearfix */ .clearfix-old { zoom: 1; } .clearfix-old::after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } Float Layout (Legacy)
/* Old-school float-based layout */ .layout-container { max-width: 1200px; margin: 0 auto; } .header { background-color: #333; color: white; padding: 20px; } .sidebar { float: left; width: 25%; background-color: #f0f0f0; padding: 20px; box-sizing: border-box; } .main-content { float: left; width: 50%; background-color: white; padding: 20px; box-sizing: border-box; } .sidebar-right { float: left; width: 25%; background-color: #f0f0f0; padding: 20px; box-sizing: border-box; } .footer { clear: both; background-color: #333; color: white; padding: 20px; } /* Responsive break */ @media (max-width: 768px) { .sidebar, .main-content, .sidebar-right { float: none; width: 100%; } } Flexbox
Flexbox is a one-dimensional layout model designed for distributing space and aligning items.
Flex Container Properties
/* Flex container */ .flex-container { display: flex; /* or inline-flex */ /* Direction */ flex-direction: row; /* Default */ flex-direction: row-reverse; flex-direction: column; flex-direction: column-reverse; /* Wrapping */ flex-wrap: nowrap; /* Default */ flex-wrap: wrap; flex-wrap: wrap-reverse; /* Shorthand for direction and wrap */ flex-flow: row nowrap; /* Main axis alignment */ justify-content: flex-start; /* Default */ justify-content: flex-end; justify-content: center; justify-content: space-between; justify-content: space-around; justify-content: space-evenly; /* Cross axis alignment */ align-items: stretch; /* Default */ align-items: flex-start; align-items: flex-end; align-items: center; align-items: baseline; /* Multi-line alignment */ align-content: stretch; /* Default */ align-content: flex-start; align-content: flex-end; align-content: center; align-content: space-between; align-content: space-around; } Flex Item Properties
/* Flex items */ .flex-item { /* Order */ order: 0; /* Default - lower numbers appear first */ /* Growth factor */ flex-grow: 0; /* Default - 0 means don't grow */ /* Shrink factor */ flex-shrink: 1; /* Default - 1 means can shrink */ /* Base size */ flex-basis: auto; /* Default - based on content */ /* Shorthand */ flex: 0 1 auto; /* grow shrink basis */ /* Common shortcuts */ flex: 1; /* flex: 1 1 0 */ flex: auto; /* flex: 1 1 auto */ flex: none; /* flex: 0 0 auto */ /* Self alignment - overrides align-items */ align-self: auto; /* Default - inherits from container */ align-self: flex-start; align-self: flex-end; align-self: center; align-self: stretch; align-self: baseline; } Flexbox Examples
<div class="flexbox-demo"> <style> .flexbox-demo { background-color: #f5f5f5; padding: 20px; } .demo-section { margin-bottom: 30px; } .flex-container { display: flex; background-color: #e0e0e0; padding: 10px; border-radius: 8px; margin: 10px 0; } .flex-item { background-color: #007bff; color: white; padding: 20px; margin: 5px; border-radius: 4px; text-align: center; min-width: 50px; } </style> <!-- Basic flex row --> <div class="demo-section"> <h3>Flex Row (Default)</h3> <div class="flex-container"> <div class="flex-item">1</div> <div class="flex-item">2</div> <div class="flex-item">3</div> </div> </div> <!-- Justify content examples --> <div class="demo-section"> <h3>Justify Content: Center</h3> <div class="flex-container" style="justify-content: center;"> <div class="flex-item">1</div> <div class="flex-item">2</div> <div class="flex-item">3</div> </div> </div> <div class="demo-section"> <h3>Justify Content: Space Between</h3> <div class="flex-container" style="justify-content: space-between;"> <div class="flex-item">1</div> <div class="flex-item">2</div> <div class="flex-item">3</div> </div> </div> <!-- Align items --> <div class="demo-section"> <h3>Align Items: Center</h3> <div class="flex-container" style="height: 150px; align-items: center;"> <div class="flex-item" style="height: 40px;">Short</div> <div class="flex-item" style="height: 80px;">Medium</div> <div class="flex-item" style="height: 120px;">Tall</div> </div> </div> <!-- Flex grow --> <div class="demo-section"> <h3>Flex Grow</h3> <div class="flex-container"> <div class="flex-item" style="flex-grow: 1;">Grow 1</div> <div class="flex-item" style="flex-grow: 2;">Grow 2</div> <div class="flex-item" style="flex-grow: 1;">Grow 1</div> </div> </div> <!-- Flex wrap --> <div class="demo-section"> <h3>Flex Wrap</h3> <div class="flex-container" style="flex-wrap: wrap; max-width: 400px;"> <div class="flex-item" style="width: 120px;">Item 1</div> <div class="flex-item" style="width: 120px;">Item 2</div> <div class="flex-item" style="width: 120px;">Item 3</div> <div class="flex-item" style="width: 120px;">Item 4</div> <div class="flex-item" style="width: 120px;">Item 5</div> </div> </div> <!-- Column direction --> <div class="demo-section"> <h3>Column Direction</h3> <div class="flex-container" style="flex-direction: column; height: 300px;"> <div class="flex-item">Top</div> <div class="flex-item">Middle</div> <div class="flex-item">Bottom</div> </div> </div> </div> Common Flexbox Patterns
/* Navigation bar */ .navbar { display: flex; justify-content: space-between; align-items: center; padding: 1rem 2rem; background-color: #333; color: white; } .nav-links { display: flex; gap: 1rem; list-style: none; } /* Card grid */ .card-grid { display: flex; flex-wrap: wrap; gap: 20px; } .card { flex: 1 1 300px; /* Grow, shrink, basis */ background-color: white; border-radius: 8px; overflow: hidden; box-shadow: 0 2px 5px rgba(0,0,0,0.1); } /* Centered content */ .center-container { display: flex; justify-content: center; align-items: center; min-height: 100vh; } /* Holy grail layout */ .holy-grail { display: flex; flex-direction: column; min-height: 100vh; } .holy-grail-body { display: flex; flex: 1; } .holy-grail-content { flex: 1; padding: 20px; } .holy-grail-sidebar { width: 200px; background-color: #f0f0f0; padding: 20px; } /* Responsive */ @media (max-width: 768px) { .holy-grail-body { flex-direction: column; } .holy-grail-sidebar { width: 100%; } } CSS Grid
CSS Grid is a two-dimensional layout system that allows you to create complex grid-based layouts.
Grid Container Properties
/* Grid container */ .grid-container { display: grid; /* or inline-grid */ /* Define columns */ grid-template-columns: 100px 200px 100px; grid-template-columns: 1fr 2fr 1fr; grid-template-columns: repeat(3, 1fr); grid-template-columns: minmax(100px, 1fr) 2fr; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); /* Define rows */ grid-template-rows: 100px 200px; grid-template-rows: auto 1fr auto; /* Gap between grid items */ gap: 20px; column-gap: 20px; row-gap: 10px; /* Align grid items within cells */ justify-items: stretch; /* Horizontal alignment */ align-items: stretch; /* Vertical alignment */ /* Align the entire grid within container */ justify-content: start; /* Horizontal alignment */ align-content: start; /* Vertical alignment */ } Grid Item Properties
/* Grid items */ .grid-item { /* Placement by line numbers */ grid-column-start: 1; grid-column-end: 3; grid-row-start: 1; grid-row-end: 3; /* Shorthand */ grid-column: 1 / 3; grid-row: 1 / 3; /* Span syntax */ grid-column: 1 / span 2; /* Start at 1, span 2 columns */ grid-row: 2 / span 2; /* Start at 2, span 2 rows */ /* Named areas */ grid-area: header; /* Self alignment */ justify-self: center; align-self: center; } Grid Template Areas
/* Named grid areas */ .grid-container { display: grid; grid-template-areas: "header header header" "sidebar content content" "footer footer footer"; grid-template-columns: 200px 1fr 1fr; grid-template-rows: auto 1fr auto; min-height: 100vh; gap: 10px; } .header { grid-area: header; background-color: #333; color: white; } .sidebar { grid-area: sidebar; background-color: #f0f0f0; } .content { grid-area: content; background-color: white; } .footer { grid-area: footer; background-color: #333; color: white; } Grid Examples
<div class="grid-demo"> <style> .grid-demo { background-color: #f5f5f5; padding: 20px; } .demo-grid { display: grid; gap: 10px; margin: 20px 0; } .grid-cell { background-color: #007bff; color: white; padding: 20px; border-radius: 4px; text-align: center; } </style> <!-- Basic grid --> <h3>Basic 3x3 Grid</h3> <div class="demo-grid" style="grid-template-columns: repeat(3, 1fr);"> <div class="grid-cell">1</div> <div class="grid-cell">2</div> <div class="grid-cell">3</div> <div class="grid-cell">4</div> <div class="grid-cell">5</div> <div class="grid-cell">6</div> <div class="grid-cell">7</div> <div class="grid-cell">8</div> <div class="grid-cell">9</div> </div> <!-- Responsive grid --> <h3>Responsive Grid (auto-fit)</h3> <div class="demo-grid" style="grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));"> <div class="grid-cell">Item 1</div> <div class="grid-cell">Item 2</div> <div class="grid-cell">Item 3</div> <div class="grid-cell">Item 4</div> <div class="grid-cell">Item 5</div> <div class="grid-cell">Item 6</div> </div> <!-- Grid with spanning --> <h3>Spanning Items</h3> <div class="demo-grid" style="grid-template-columns: repeat(4, 1fr);"> <div class="grid-cell" style="grid-column: span 2;">Span 2</div> <div class="grid-cell">1</div> <div class="grid-cell">2</div> <div class="grid-cell">3</div> <div class="grid-cell" style="grid-column: span 3;">Span 3</div> <div class="grid-cell">4</div> <div class="grid-cell" style="grid-row: span 2; grid-column: span 2;">Span 2x2</div> <div class="grid-cell">5</div> <div class="grid-cell">6</div> <div class="grid-cell">7</div> <div class="grid-cell">8</div> </div> <!-- Named areas --> <h3>Named Grid Areas</h3> <div class="demo-grid" style="grid-template-areas: 'header header header' 'sidebar content content' 'footer footer footer'; grid-template-columns: 1fr 2fr 1fr;"> <div class="grid-cell" style="grid-area: header;">Header</div> <div class="grid-cell" style="grid-area: sidebar;">Sidebar</div> <div class="grid-cell" style="grid-area: content;">Content</div> <div class="grid-cell" style="grid-area: footer;">Footer</div> </div> </div> Common Grid Patterns
/* Holy Grail Layout with Grid */ .holy-grail-grid { display: grid; grid-template-areas: "header header header" "nav main aside" "footer footer footer"; grid-template-columns: 200px 1fr 200px; grid-template-rows: auto 1fr auto; min-height: 100vh; gap: 10px; } /* Responsive card grid */ .card-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 20px; padding: 20px; } /* Magazine layout */ .magazine { display: grid; grid-template-columns: repeat(4, 1fr); grid-auto-rows: minmax(100px, auto); gap: 20px; } .featured { grid-column: span 2; grid-row: span 2; } /* Dashboard layout */ .dashboard { display: grid; grid-template-columns: repeat(12, 1fr); gap: 20px; } .widget { grid-column: span 3; } .widget-wide { grid-column: span 6; } .widget-full { grid-column: span 12; } Multi-column Layout
Multi-column layout allows content to flow into multiple columns like a newspaper.
Column Properties
/* Multi-column container */ .multi-col { column-count: 3; /* Number of columns */ column-width: 300px; /* Minimum column width */ columns: 3 300px; /* Shorthand: count width */ /* Column gap */ column-gap: 40px; /* Column rule (border between columns) */ column-rule-width: 2px; column-rule-style: solid; column-rule-color: #ccc; column-rule: 2px solid #ccc; /* Shorthand */ /* Column span */ column-span: all; /* Element spans all columns */ /* Column fill */ column-fill: balance; /* Balance content between columns */ column-fill: auto; /* Fill sequentially */ } Multi-column Example
<div class="multi-col-demo"> <style> .multi-col-demo { background-color: #f5f5f5; padding: 20px; } .newspaper { column-count: 3; column-gap: 40px; column-rule: 2px solid #ccc; text-align: justify; background-color: white; padding: 20px; border-radius: 8px; } .newspaper h2 { column-span: all; text-align: center; margin: 0 0 20px 0; color: #333; } .newspaper p { margin: 0 0 20px 0; line-height: 1.6; } .newspaper .pull-quote { column-span: all; font-size: 1.2em; font-style: italic; text-align: center; padding: 20px; background-color: #f0f0f0; margin: 20px 0; } </style> <div class="newspaper"> <h2>The Daily News</h2> <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris.</p> <p>Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident.</p> <div class="pull-quote"> "This is a pull quote that spans all columns" </div> <p>Sunt in culpa qui officia deserunt mollit anim id est laborum. Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium.</p> <p>Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt.</p> </div> </div> Responsive Design
Responsive design ensures layouts work across different screen sizes and devices.
Viewport Meta Tag
<!DOCTYPE html> <html lang="en"> <head> <!-- Essential for responsive design --> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <!-- Additional options --> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=5.0, user-scalable=yes"> </head>
Media Queries
/* Basic media queries */ @media screen and (max-width: 768px) { /* Tablet styles */ .container { width: 100%; padding: 10px; } } @media screen and (max-width: 480px) { /* Mobile styles */ .container { padding: 5px; } } /* Min-width (mobile-first) */ @media screen and (min-width: 768px) { /* Tablet and up */ .container { max-width: 750px; margin: 0 auto; } } @media screen and (min-width: 1024px) { /* Desktop */ .container { max-width: 960px; } } /* Orientation */ @media (orientation: landscape) { /* Landscape styles */ } @media (orientation: portrait) { /* Portrait styles */ } /* Resolution */ @media (min-resolution: 2dppx) { /* High DPI screens */ .logo { background-image: url('[email protected]'); } } Responsive Layout Patterns
/* Mobile-first approach */ .layout { display: flex; flex-direction: column; gap: 20px; } /* Tablet */ @media (min-width: 768px) { .layout { display: grid; grid-template-columns: 200px 1fr; gap: 20px; } } /* Desktop */ @media (min-width: 1024px) { .layout { grid-template-columns: 250px 1fr 200px; } } /* Responsive navigation */ .nav { display: flex; flex-direction: column; gap: 10px; } @media (min-width: 768px) { .nav { flex-direction: row; justify-content: space-between; align-items: center; } } /* Responsive images */ img { max-width: 100%; height: auto; } /* Responsive typography */ body { font-size: 16px; } @media (min-width: 768px) { body { font-size: 18px; } } /* Modern responsive units */ .element { width: clamp(300px, 50%, 800px); padding: clamp(1rem, 3vw, 2rem); font-size: clamp(1rem, 2vw, 1.5rem); } Layout Patterns
Card Layout
<div class="card-layout"> <style> .card-layout { background-color: #f5f5f5; padding: 40px; } .card-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 30px; max-width: 1200px; margin: 0 auto; } .card { background-color: white; border-radius: 8px; overflow: hidden; box-shadow: 0 4px 6px rgba(0,0,0,0.1); transition: transform 0.3s, box-shadow 0.3s; display: flex; flex-direction: column; } .card:hover { transform: translateY(-5px); box-shadow: 0 8px 15px rgba(0,0,0,0.2); } .card-image { width: 100%; height: 200px; object-fit: cover; } .card-content { padding: 20px; flex: 1; } .card-title { margin: 0 0 10px 0; font-size: 1.25rem; color: #333; } .card-text { margin: 0 0 20px 0; color: #666; line-height: 1.6; } .card-footer { padding: 15px 20px; background-color: #f9f9f9; border-top: 1px solid #eee; display: flex; justify-content: space-between; align-items: center; } .card-button { background-color: #007bff; color: white; border: none; padding: 8px 16px; border-radius: 4px; cursor: pointer; transition: background-color 0.3s; } .card-button:hover { background-color: #0056b3; } .card-tag { background-color: #e0e0e0; padding: 4px 8px; border-radius: 4px; font-size: 0.875rem; color: #666; } </style> <div class="card-grid"> <div class="card"> <img src="https://via.placeholder.com/300x200" alt="Card image" class="card-image"> <div class="card-content"> <h3 class="card-title">Card Title 1</h3> <p class="card-text">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt.</p> </div> <div class="card-footer"> <span class="card-tag">Tag</span> <button class="card-button">Read More</button> </div> </div> <div class="card"> <img src="https://via.placeholder.com/300x200" alt="Card image" class="card-image"> <div class="card-content"> <h3 class="card-title">Card Title 2</h3> <p class="card-text">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut enim ad minim veniam, quis nostrud exercitation.</p> </div> <div class="card-footer"> <span class="card-tag">Tag</span> <button class="card-button">Read More</button> </div> </div> <div class="card"> <img src="https://via.placeholder.com/300x200" alt="Card image" class="card-image"> <div class="card-content"> <h3 class="card-title">Card Title 3</h3> <p class="card-text">Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.</p> </div> <div class="card-footer"> <span class="card-tag">Tag</span> <button class="card-button">Read More</button> </div> </div> </div> </div> Holy Grail Layout
<div class="holy-grail-demo"> <style> .holy-grail-demo { min-height: 100vh; display: flex; flex-direction: column; } .hg-header { background-color: #333; color: white; padding: 20px; text-align: center; } .hg-footer { background-color: #333; color: white; padding: 20px; text-align: center; } .hg-body { display: flex; flex: 1; } .hg-sidebar { width: 200px; background-color: #f0f0f0; padding: 20px; } .hg-content { flex: 1; padding: 20px; background-color: white; } .hg-sidebar-right { width: 150px; background-color: #f0f0f0; padding: 20px; } @media (max-width: 768px) { .hg-body { flex-direction: column; } .hg-sidebar, .hg-sidebar-right { width: 100%; } } </style> <header class="hg-header">Header</header> <div class="hg-body"> <nav class="hg-sidebar">Left Sidebar</nav> <main class="hg-content">Main Content</main> <aside class="hg-sidebar-right">Right Sidebar</aside> </div> <footer class="hg-footer">Footer</footer> </div> Dashboard Layout
<div class="dashboard-demo"> <style> .dashboard-demo { background-color: #f5f5f5; padding: 20px; } .dashboard { display: grid; grid-template-columns: repeat(12, 1fr); gap: 20px; max-width: 1400px; margin: 0 auto; } .dashboard-header { grid-column: span 12; background-color: white; padding: 20px; border-radius: 8px; box-shadow: 0 2px 5px rgba(0,0,0,0.1); } .dashboard-sidebar { grid-column: span 2; background-color: white; padding: 20px; border-radius: 8px; box-shadow: 0 2px 5px rgba(0,0,0,0.1); } .dashboard-main { grid-column: span 7; background-color: white; padding: 20px; border-radius: 8px; box-shadow: 0 2px 5px rgba(0,0,0,0.1); } .dashboard-right { grid-column: span 3; background-color: white; padding: 20px; border-radius: 8px; box-shadow: 0 2px 5px rgba(0,0,0,0.1); } .dashboard-widget { background-color: #f9f9f9; padding: 15px; border-radius: 4px; margin-bottom: 15px; } @media (max-width: 1024px) { .dashboard-sidebar { grid-column: span 3; } .dashboard-main { grid-column: span 9; } .dashboard-right { grid-column: span 12; } } @media (max-width: 768px) { .dashboard-sidebar, .dashboard-main, .dashboard-right { grid-column: span 12; } } </style> <div class="dashboard"> <header class="dashboard-header"> <h2>Dashboard</h2> </header> <nav class="dashboard-sidebar"> <div class="dashboard-widget">Navigation</div> <div class="dashboard-widget">Filters</div> <div class="dashboard-widget">Settings</div> </nav> <main class="dashboard-main"> <div class="dashboard-widget">Main Content Area</div> <div class="dashboard-widget">Data Visualization</div> <div class="dashboard-widget">Recent Activity</div> </main> <aside class="dashboard-right"> <div class="dashboard-widget">Notifications</div> <div class="dashboard-widget">Quick Actions</div> <div class="dashboard-widget">Statistics</div> </aside> </div> </div> Common Layout Issues and Solutions
Issue 1: Centering
/* Horizontal centering for block elements */ .block-center { width: 300px; margin-left: auto; margin-right: auto; } /* Horizontal centering for inline elements */ .inline-center { text-align: center; } /* Horizontal centering with flex */ .flex-center { display: flex; justify-content: center; } /* Vertical centering (old way) */ .vertical-center-old { position: relative; top: 50%; transform: translateY(-50%); } /* Vertical centering with flex */ .flex-vertical { display: flex; align-items: center; } /* Perfect centering (both axes) */ .perfect-center { display: flex; justify-content: center; align-items: center; min-height: 100vh; } /* With grid */ .grid-center { display: grid; place-items: center; min-height: 100vh; } Issue 2: Equal Height Columns
/* Problem - columns don't match height */ .columns { display: flex; } .column { flex: 1; padding: 20px; } /* Solution 1 - Flexbox (automatic) */ .flex-equal { display: flex; align-items: stretch; /* Default */ } /* Solution 2 - Grid */ .grid-equal { display: grid; grid-template-columns: repeat(3, 1fr); } /* Solution 3 - Table display */ .table-equal { display: table; width: 100%; } .table-cell-equal { display: table-cell; width: 33.333%; } Issue 3: Sticky Footer
/* Sticky footer with flex */ .flex-sticky { display: flex; flex-direction: column; min-height: 100vh; } .flex-sticky .content { flex: 1; } /* Sticky footer with grid */ .grid-sticky { display: grid; grid-template-rows: auto 1fr auto; min-height: 100vh; } /* Sticky footer with calc */ .calc-sticky { position: relative; min-height: 100vh; } .calc-sticky .footer { position: absolute; bottom: 0; width: 100%; height: 100px; } .calc-sticky .content { padding-bottom: 100px; } Issue 4: Overflow Handling
/* Prevent horizontal overflow */ body { overflow-x: hidden; max-width: 100%; } /* Handle long words */ .text-container { overflow-wrap: break-word; word-wrap: break-word; word-break: break-word; } /* Handle flex item overflow */ .flex-container { min-width: 0; /* Allows flex items to shrink below content size */ } .flex-item { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } Best Practices
1. Choose the Right Layout Method
/* Use Flexbox for 1D layouts */ .navigation { display: flex; justify-content: space-between; } /* Use Grid for 2D layouts */ .page-layout { display: grid; grid-template-areas: "header header" "sidebar content" "footer footer"; } /* Use positioning for specific elements */ .tooltip { position: absolute; top: 100%; left: 50%; } 2. Mobile-First Approach
/* Start with mobile styles */ .container { width: 100%; padding: 10px; } /* Add tablet styles */ @media (min-width: 768px) { .container { max-width: 750px; margin: 0 auto; padding: 20px; } } /* Add desktop styles */ @media (min-width: 1024px) { .container { max-width: 960px; padding: 30px; } } 3. Use Semantic Class Names
/* Good - semantic */ .article-card { } .nav-menu { } .user-profile { } /* Avoid - presentational */ .red-box { } .left-column { } big-text { } 4. Maintain Consistent Spacing
/* CSS variables for spacing */ :root { --space-xs: 0.25rem; --space-sm: 0.5rem; --space-md: 1rem; --space-lg: 1.5rem; --space-xl: 2rem; } .card { padding: var(--space-lg); margin-bottom: var(--space-md); } .card-header { margin-bottom: var(--space-sm); } 5. Test Responsiveness
/* Use viewport units for testing */ .test-view { width: 100vw; height: 100vh; } /* Use clamp for fluid typography */ h1 { font-size: clamp(1.5rem, 5vw, 3rem); } /* Use min/max for containers */ .container { width: min(90%, 1200px); margin: 0 auto; } 6. Document Complex Layouts
/* Complex grid layout */ .dashboard { display: grid; /* 12-column grid for flexibility */ grid-template-columns: repeat(12, 1fr); gap: 20px; } /* Sidebar - spans columns 1-3 */ .sidebar { grid-column: span 3; /* Sticky on desktop */ position: sticky; top: 20px; height: fit-content; } Layout Cheat Sheet
Flexbox Quick Reference
| Property | Values |
|---|---|
display | flex, inline-flex |
flex-direction | row, row-reverse, column, column-reverse |
flex-wrap | nowrap, wrap, wrap-reverse |
justify-content | flex-start, flex-end, center, space-between, space-around, space-evenly |
align-items | stretch, flex-start, flex-end, center, baseline |
align-content | stretch, flex-start, flex-end, center, space-between, space-around |
Grid Quick Reference
| Property | Values |
|---|---|
display | grid, inline-grid |
grid-template-columns | 1fr 2fr, repeat(3, 1fr), minmax(100px, 1fr) |
grid-template-rows | auto 1fr auto |
gap | 20px, 10% |
grid-template-areas | "header header" "sidebar content" |
justify-items | start, end, center, stretch |
align-items | start, end, center, stretch |
Media Query Breakpoints
/* Common breakpoints */ /* Mobile: 320px - 480px */ /* Tablet: 768px - 1024px */ /* Desktop: 1024px+ */ @media (max-width: 480px) { } /* Mobile */ @media (min-width: 481px) and (max-width: 768px) { } /* Small tablet */ @media (min-width: 769px) and (max-width: 1024px) { } /* Tablet */ @media (min-width: 1025px) { } /* Desktop */ Conclusion
Mastering CSS layout fundamentals is essential for creating professional, responsive websites.
Key Takeaways
- Normal flow is the foundation - understand it before breaking it
- Display property controls how elements behave in flow
- Positioning allows precise placement of elements
- Flexbox excels at one-dimensional layouts
- Grid is powerful for two-dimensional layouts
- Media queries make layouts responsive
- Start simple - use the simplest layout method that works
- Mobile-first approach leads to better responsive designs
- Test on real devices - don't rely solely on emulators
- Keep learning - new layout techniques continue to emerge
Layout Decision Tree
- Need one-dimensional layout? → Use Flexbox
- Need two-dimensional layout? → Use Grid
- Need precise positioning? → Use Positioning
- Need text wrap around image? → Use Float
- Need newspaper-style columns? → Use Multi-column
- Need responsive layout? → Use Media queries with any of the above
Remember: There's usually more than one way to achieve a layout. Choose the method that makes your code clean, maintainable, and performs well across browsers!