CSS Positioning and Simple Layout
Day 4: Mastering Page Layout Control
From Spacing to Layout
You've learned how to style individual elements with colors, fonts, and spacing. But how do you control where those elements appear on the page? How do you create a horizontal navigation bar instead of a vertical list? How do you make an element stay in one place while the page scrolls?
Today, you'll learn how CSS controls the flow and positioning of elements on your page. This is fundamental to creating professional layouts before we dive into modern layout systems like Flexbox and Grid.
Display Types: How Elements Behave
Every HTML element has a default display type that determines how it behaves in the page flow. Understanding these is crucial for creating layouts.
Block Elements
Block elements take up the full width available and always start on a new line. They stack vertically like blocks.
Default Block Elements: div, p, h1-h6, section, header, footer, ul, li
div {
display: block;
background: #3498db;
padding: 20px;
margin-bottom: 10px;
}
Visual Result:
Notice: Each element takes the full width and stacks vertically
• Takes up full width available
• Always starts on a new line
• Can have width and height set
• Can have margin and padding on all sides
Inline Elements
Inline elements only take up as much width as their content needs and don't start on a new line. They flow with text like words in a sentence.
Default Inline Elements: span, a, strong, em, img
span {
display: inline;
background: #3498db;
color: white;
padding: 5px 10px;
}
Visual Result:
This is a paragraph with inline element 1 and inline element 2 flowing within the text naturally.
Notice: Inline elements flow with the text and don't break to new lines
• Only takes up width of content
• Flows with surrounding content
• Cannot have width and height set
• Vertical margins/padding don't push other elements away
Inline-Block Elements
Inline-block combines the best of both worlds: elements flow inline like text, but you can set width, height, and all margins/padding like block elements.
.box {
display: inline-block;
width: 150px;
height: 100px;
background: #3498db;
color: white;
padding: 20px;
margin: 10px;
}
Visual Result:
150x100
150x100
150x100
Notice: Elements sit side-by-side but can have width and height
• Flows inline with other content
• Can have width and height set
• Respects all margins and padding
• Perfect for horizontal navigation menus
Changing Display Types
You can change any element's display type. This is commonly done to make lists horizontal or to control element behavior.
Example: Making a list horizontal
/* By default, li is block (vertical) */
nav li {
display: inline-block; /* Now they're horizontal */
margin: 0 10px;
}
Before (block):
- Home
- About
- Contact
After (inline-block):
- Home
- About
- Contact
CSS Positioning: Precise Control
The position property determines how an element is positioned in the document. Different position values enable different behaviors and use cases.
Static Positioning (Default)
This is the default. Elements follow the normal document flow. The top, right, bottom, and left properties have no effect.
div {
position: static; /* This is the default */
}
Static elements cannot be moved with top, right, bottom, or left properties. They just flow naturally.
Relative Positioning
Positioned relative to its normal position. The element still takes up its original space in the document flow, but visually appears shifted.
.shifted {
position: relative;
top: 20px; /* Move 20px down from normal position */
left: 30px; /* Move 30px right from normal position */
}
Visual Demonstration:
The space where the blue box would normally be is preserved
Absolute Positioning
Removed from the normal document flow. Positioned relative to its nearest positioned ancestor (or the viewport if none exists). Other elements act as if it doesn't exist.
.container {
position: relative; /* Creates positioning context */
height: 200px;
}
.badge {
position: absolute;
top: 10px;
right: 10px;
}
Visual Demonstration:
Product Card (position: relative)
This container has position: relative, creating a positioning context for its children.
The badges are absolutely positioned within the container
• Element is removed from document flow
• Positioned relative to nearest positioned ancestor
• If no positioned ancestor, positioned relative to viewport
• Perfect for overlays, badges, tooltips, dropdowns
Common Positioning Pattern
The most common pattern is to set a parent to position: relative and the child to position: absolute. This lets you position the child anywhere within the parent.
/* HTML */
Online
User Profile
/* CSS */
.card {
position: relative; /* Parent */
padding: 20px;
}
.status {
position: absolute; /* Child */
top: 0;
right: 0;
background: #2ecc71;
}
Basic Layout Techniques
Before modern layout systems like Flexbox and Grid, developers used these fundamental techniques. They're still useful and important to understand.
Centering with Margin Auto
The classic way to center a block element horizontally on the page.
.container {
max-width: 1200px; /* Set a maximum width */
margin: 0 auto; /* Center it horizontally */
padding: 0 20px; /* Add side padding */
}
Visual Result:
max-width: 500px, margin: 0 auto
Stacked Card Layout
The simplest layout: cards stacked vertically. This is achieved naturally with block elements, enhanced with proper spacing and styling.
.card {
background: white;
padding: 30px;
margin-bottom: 20px;
border-radius: 8px;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
}
Visual Result:
Project Card 1
Clean vertical stacking with consistent spacing
Project Card 2
Each card is independent and easy to scan
Project Card 3
Professional and readable layout
Full-Width Header with Centered Content
A common pattern: header spans full width, but content inside is centered with max-width.
header {
background: #2c3e50;
padding: 20px 0; /* Vertical padding */
}
.header-content {
max-width: 1200px;
margin: 0 auto; /* Center the content */
padding: 0 20px; /* Side padding */
}
Visual Result:
Full-Width Header
Content is centered with max-width
Width Control for Readability
Text becomes hard to read when lines are too long. Limit content width for better readability.
Too Wide (hard to read):
This is a very long line of text that spans the entire width of the container. Research shows that lines longer than 75 characters become difficult for readers to track from the end of one line to the beginning of the next. This creates eye fatigue and reduces reading comprehension significantly.
Optimal Width (comfortable to read):
This text has a max-width of 600px. Notice how much easier it is to read? The optimal line length is 50-75 characters. This creates comfortable reading that doesn't strain the eyes.
Day 4 Project: Professional Layout Portfolio
Let's build a complete portfolio with professional header navigation, centered content layout, and clean stacked project cards.
Complete HTML Structure
John Doe - Web Developer
John Doe
Full Stack Web Developer
About Me
I am a passionate web developer with expertise in modern
frontend technologies. My journey in web development began
with a fascination for creating user-friendly interfaces.
Technical Skills
- HTML5 & CSS3
- JavaScript (ES6+)
- React.js
- Node.js
- Responsive Design
- Git & GitHub
Featured Projects
Featured
E-Commerce Platform
Full-stack application built with React and Node.js
featuring user authentication, product catalog, and
payment processing integration.
View Project →
Task Management App
Productivity application with real-time updates using
WebSockets. Features task creation, assignment, and
team collaboration.
View Project →
Weather Dashboard
Data visualization project using weather APIs with
interactive charts and historical data analysis.
View Project →
Complete CSS Stylesheet
/* ===== RESET & BASE ===== */
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Georgia', serif;
color: #333;
background: #f5f5f5;
line-height: 1.6;
}
/* ===== TYPOGRAPHY ===== */
h1, h2, h3 {
font-family: 'Arial', sans-serif;
}
h1 {
font-size: 42px;
margin-bottom: 10px;
}
h2 {
font-size: 32px;
color: #2c3e50;
margin-bottom: 20px;
border-bottom: 3px solid #3498db;
padding-bottom: 10px;
}
h3 {
font-size: 24px;
color: #2c3e50;
margin-bottom: 15px;
}
/* ===== HEADER ===== */
header {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
padding: 40px 0;
}
.header-content {
max-width: 1200px;
margin: 0 auto;
padding: 0 20px;
text-align: center;
}
header h1 {
color: white;
}
.tagline {
font-size: 20px;
margin-bottom: 30px;
opacity: 0.95;
}
/* ===== NAVIGATION ===== */
nav ul {
list-style: none;
padding: 0;
margin: 0;
}
nav li {
display: inline-block;
margin: 0 10px;
}
nav a {
display: inline-block;
color: white;
text-decoration: none;
padding: 12px 24px;
background: rgba(255, 255, 255, 0.1);
border-radius: 5px;
transition: background 0.3s ease;
}
nav a:hover,
nav a.active {
background: rgba(255, 255, 255, 0.25);
}
/* ===== MAIN CONTENT ===== */
main {
max-width: 900px;
margin: 40px auto;
padding: 0 20px;
}
/* ===== SECTION CARDS ===== */
.section-card {
background: white;
padding: 40px;
margin-bottom: 30px;
border-radius: 8px;
box-shadow: 0 2px 8px rgba(0,0,0,0.1);
}
/* ===== PROFILE ===== */
.profile-container {
text-align: center;
margin-bottom: 25px;
}
.profile-img {
width: 180px;
height: 180px;
border-radius: 50%;
border: 5px solid #3498db;
object-fit: cover;
}
/* ===== SKILLS LIST ===== */
.skills-list {
list-style: none;
}
.skills-list li {
display: inline-block;
background: #ecf0f1;
padding: 12px 20px;
margin: 5px;
border-left: 4px solid #3498db;
border-radius: 5px;
}
/* ===== PROJECTS SECTION ===== */
#projects {
margin-bottom: 40px;
}
#projects h2 {
background: white;
padding: 30px 40px 20px 40px;
margin-bottom: 20px;
border-radius: 8px;
box-shadow: 0 2px 8px rgba(0,0,0,0.1);
}
/* ===== PROJECT CARDS ===== */
.project-card {
position: relative;
background: white;
padding: 35px;
margin-bottom: 25px;
border: 2px solid #e0e0e0;
border-radius: 8px;
box-shadow: 0 2px 4px rgba(0,0,0,0.05);
transition: all 0.3s ease;
}
.project-card:hover {
border-color: #3498db;
box-shadow: 0 4px 12px rgba(52, 152, 219, 0.15);
transform: translateY(-2px);
}
.project-badge {
position: absolute;
top: 15px;
right: 15px;
background: #e74c3c;
color: white;
padding: 6px 15px;
border-radius: 20px;
font-size: 14px;
font-weight: bold;
}
.project-card h3 {
color: #3498db;
margin-top: 0;
}
.project-link {
display: inline-block;
color: #3498db;
text-decoration: none;
font-weight: bold;
margin-top: 10px;
}
.project-link:hover {
text-decoration: underline;
}
/* ===== FOOTER ===== */
footer {
background: #2c3e50;
color: white;
padding: 40px 0;
margin-top: 60px;
}
.footer-content {
max-width: 900px;
margin: 0 auto;
padding: 0 20px;
text-align: center;
}
footer h2 {
color: white;
border: none;
}
footer a {
color: #3498db;
text-decoration: none;
}
footer a:hover {
text-decoration: underline;
}
.copyright {
margin-top: 20px;
font-size: 14px;
opacity: 0.8;
}
Key Layout Features Explained
Header spans full width with gradient background. Content inside is centered with max-width: 1200px
List items use display: inline-block to sit horizontally. Hover effects provide feedback
Main content has max-width: 900px and margin: 0 auto to center on page
Project cards naturally stack vertically with consistent margin-bottom spacing
Featured badge uses position: absolute within position: relative parent card
Skills display: inline-block to wrap naturally while maintaining size control
Testing Checklist
- Header spans full width with gradient background
- Navigation links are horizontal and have hover effects
- Active navigation link is highlighted
- Main content is centered on the page (max-width applied)
- Section cards have white background and shadows
- Project cards stack vertically with even spacing
- First project has "Featured" badge in top-right corner
- Project cards have hover effects (border color change, shadow, slight lift)
- Skills display as inline-block tags that wrap
- Footer is full-width with centered content
- Page looks clean and readable on desktop (no horizontal scroll needed)
Complete this lesson
Mark as complete to track your progress