CSS Flexbox and Grid
CMU422: Fundamentals of Web Design - Session 5
Birmingham Newman University
Lecturer: James Williams
Modern layout techniques for responsive design
3-hour session • 26 slides • 2 interactive tasks
Session Timeline:
- 10 min: Registration & waiting
- 20 min: Opening slides
- 45 min: Task 1
- 15 min: Break/Catch up
- 20 min: Secondary slides
- 45 min: Task 2
- Remaining: Self-study
Learning Objectives
- Understand CSS Flexbox layout system
- Master CSS Grid for complex layouts
- Create responsive and flexible designs
- Combine Flexbox and Grid effectively
- Build modern, accessible layouts
What is CSS Flexbox?
Flexbox is a one-dimensional layout method for arranging items
in rows or columns
- Designed for one-dimensional layouts
- Automatically adjusts item sizes
- Handles alignment and distribution
- Great for navigation, forms, and card layouts
.container {
display: flex;
justify-content: space-between;
align-items: center;
}
Flexbox Container Properties
.flex-container {
display: flex;
flex-direction: row | column;
justify-content: flex-start | center | flex-end | space-between;
align-items: stretch | center | flex-start | flex-end;
flex-wrap: nowrap | wrap | wrap-reverse;
}
flex-direction
: Main axis direction
justify-content
: Main axis alignment
align-items
: Cross axis alignment
flex-wrap
: Wrapping behavior
Flexbox Item Properties
.flex-item {
flex-grow: 0;
flex-shrink: 1;
flex-basis: auto;
flex: 0 1 auto; /* shorthand */
align-self: auto | flex-start | center | flex-end;
}
flex-grow
: Growth factor
flex-shrink
: Shrink factor
flex-basis
: Initial size
align-self
: Individual alignment
Common Flexbox Patterns
/* Navigation bar */
.nav {
display: flex;
justify-content: space-between;
align-items: center;
}
/* Card layout */
.card {
display: flex;
flex-direction: column;
justify-content: space-between;
}
Try It: Layout Playground
Current CSS Properties:
display: flex
justify-content: flex-start
align-items: stretch
flex-direction: row
Switch between Flexbox and Grid, then adjust the properties to see how they
affect the layout!
What is CSS Grid?
CSS Grid is a two-dimensional layout system for creating
complex web layouts
- Two-dimensional (rows and columns)
- Precise control over layout
- Great for overall page layouts
- Works well with Flexbox
.grid-container {
display: grid;
grid-template-columns: 1fr 2fr 1fr;
grid-template-rows: auto 1fr auto;
}
Grid Container Properties
.grid-container {
display: grid;
grid-template-columns: 200px 1fr 200px;
grid-template-rows: 100px 1fr 100px;
grid-gap: 20px;
justify-items: center;
align-items: center;
}
grid-template-columns/rows
: Define tracks
grid-gap
: Spacing between items
justify-items/align-items
: Item alignment
Grid Template Areas
.container {
display: grid;
grid-template-areas:
"header header header"
"sidebar main aside"
"footer footer footer";
}
.header { grid-area: header; }
.sidebar { grid-area: sidebar; }
.main { grid-area: main; }
.aside { grid-area: aside; }
.footer { grid-area: footer; }
Grid Item Properties
.grid-item {
grid-column: 1 / 3;
grid-row: 1 / 2;
justify-self: center;
align-self: center;
}
grid-column/row
: Item placement
justify-self/align-self
: Individual alignment
- Use line numbers or area names
Responsive Grid Layout
.grid {
display: grid;
grid-template-columns: 1fr;
}
@media (min-width: 768px) {
.grid {
grid-template-columns: 1fr 1fr;
}
}
@media (min-width: 1024px) {
.grid {
grid-template-columns: 1fr 1fr 1fr;
}
}
Flexbox vs Grid: When to Use Each
Flexbox: One-dimensional layouts (rows OR columns)
- Navigation menus
- Form layouts
- Card components
- Toolbars
Grid: Two-dimensional layouts (rows AND columns)
- Page layouts
- Photo galleries
- Dashboard layouts
- Complex forms
Combining Flexbox and Grid
/* Grid for overall layout */
.page {
display: grid;
grid-template-areas: "header" "main" "footer";
}
/* Flexbox for navigation */
.nav {
display: flex;
justify-content: space-between;
}
- Use Grid for overall page structure
- Use Flexbox for component layouts
- Grid items can be Flexbox containers
- Flexbox items can be Grid containers
Browser Support
- Flexbox: Excellent support in all modern browsers
- Grid: Good support in modern browsers
- Use fallbacks for older browsers
- Test across different browsers
- Consider using CSS Grid polyfills
Progressive Enhancement: Start with basic layouts, enhance with
modern features
Performance Considerations
- Grid and Flexbox are hardware accelerated
- Avoid excessive nesting
- Use appropriate units (fr, %, auto)
- Minimize layout recalculations
- Test on mobile devices
/* Good: Use fr units for flexible layouts */
grid-template-columns: 1fr 2fr 1fr;
/* Avoid: Fixed pixel values for responsive layouts */
grid-template-columns: 200px 400px 200px;
Accessibility Best Practices
- Maintain logical document flow
- Use semantic HTML elements
- Ensure keyboard navigation works
- Test with screen readers
- Provide fallbacks for older browsers
- Use appropriate ARIA attributes
Remember: Layout should enhance, not hinder, accessibility
Common Layout Patterns
- Holy Grail Layout: Header, footer, sidebar, main content
- Card Layout: Flexible cards in a grid
- Sticky Footer: Footer at bottom of viewport
- Sidebar Layout: Fixed sidebar with scrollable main
- Masonry Layout: Pinterest-style grid
- Dashboard: Multiple widgets in grid
Task 1: Flexbox Layout Practice
Instructions:
- Create a new HTML file called
flexbox-practice.html
- Build a navigation bar using Flexbox with:
- Logo on the left
- Navigation links in the center
- User menu on the right
- Create a card layout with:
- 3 cards in a row (responsive)
- Cards with image, title, description, and button
- Equal height cards
- Add a footer with social media links
- Make it responsive for mobile devices
Time: 45 minutes
This task will help you understand Flexbox layout and responsive
design
Break Time
15 Minutes
Take a break, ask questions, or catch up on the previous task.
Next: Secondary slides and Task 2
Grid Best Practices
- Plan your grid structure before coding
- Use semantic names for grid areas
- Keep grid definitions simple
- Use appropriate units (fr, %, auto)
- Test on different screen sizes
- Consider mobile-first approach
/* Good: Named grid areas */
grid-template-areas:
"header header"
"sidebar main"
"footer footer";
Auto-Fit vs Auto-Fill
/* Auto-fit: Creates as many columns as can fit */
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
/* Auto-fill: Creates as many columns as possible */
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
auto-fit
: Expands columns to fill space
auto-fill
: Keeps minimum column width
- Great for responsive card layouts
- No media queries needed
CSS Subgrid (Future Feature)
.parent {
display: grid;
grid-template-columns: 1fr 2fr 1fr;
}
.child {
display: grid;
grid-template-columns: subgrid;
}
- Allows nested grids to align with parent
- Currently limited browser support
- Will simplify complex layouts
- Use with feature detection
Layout Debugging Tools
- Browser Developer Tools
- Grid and Flexbox inspectors
- Layout visualization
- CSS Grid Garden (learning tool)
- Flexbox Froggy (learning tool)
- Grid by Example (resources)
Chrome DevTools: Highlight grid areas and flex items
Task 2: CSS Grid Dashboard
Instructions:
- Create a new HTML file called
grid-dashboard.html
- Build a dashboard layout using CSS Grid with:
- Header: Full width, contains title and user info
- Sidebar: Navigation menu with multiple items
- Main Content: Grid of widgets/cards
- Widgets: Statistics, charts, recent activity
- Use grid-template-areas for layout
- Make widgets responsive (different sizes)
- Add hover effects and transitions
- Ensure the layout works on different screen sizes
Time: 45 minutes
This task will help you understand CSS Grid and complex layouts
Common Layout Issues
- Items not aligning: Check justify/align properties
- Grid not working: Verify display: grid
- Responsive issues: Use appropriate units
- Browser differences: Test across browsers
- Performance problems: Avoid excessive nesting
- Accessibility issues: Maintain logical flow
Session Summary
- Flexbox for one-dimensional layouts
- Grid for two-dimensional layouts
- Combine both for complex designs
- Use responsive units and techniques
- Test across different browsers
- Consider accessibility and performance
Next Session:
JavaScript Basics - Adding interactivity to your layouts