Responsive Design
Device-Agnostic Approach To Responsive Web Design
1. Basics
- WikiPedia: Responsive Web Design
- Google: Responsive Web Design Basics
- CSS-Tricks: Optimizing for Large-Scale Displays
- The pro's guide to responsive web design
- Device-Agnostic Approach To Responsive Web Design
- Responsive Design
2. Viewport
The viewport meta tag tells the device at what scale to render the page.
<meta name="viewport" content="width=device-width, initial-scale=1">
@viewport {
width: device-width;
zoom:1;
}
Viewport Mobile
Media Queries
W3C: Media Queries Level 4
CSS Breakpoints
Tests
2.1. Browser Support
https://caniuse.com/css-deviceadaptation
2.2. Resources
- W3C: CSS Device Adaptation Module Level 1
- Mozilla: Using the viewport meta tag to control layout on mobile browsers
- quirksmode.org: A tale of two viewports
3. Layout
4. Markup
<!DOCTYPE html> <div class="wrapper"> <header>...</header> <main> <article>...</article> <nav>...</nav> <aside>...</aside> </main> <footer>...</footer> </div>
5. CSS
CSS Guidelines
How to Order CSS Selectors
5.1. Units
5.1.1. Em
target ÷ context = result
So with our formula in hand, let’s turn back to that 24px headline. Assuming that our base font-size: 100% on the body element equates to 16px, we can plug those values directly into our formula. So if we need to express our h1’s target font size (24px) relative to its context (16px), we get:
24 ÷ 16 = 1.5
And there we are: 24px is 1.5 times greater than 16px, so our font-size is 1.5em:
h1 {
font-size: 1.5em; /* 24px / 16px */
font-style: italic;
font-weight: normal;
}
| Browser default considered as :root {font-size:16px} | ||||
|---|---|---|---|---|
| Pixel | Em | Percent | Keyword | Notes |
| 8px | 0.5em | 50% | ||
| 9px | 0.5625em | 56.25% | ||
| 10px | 0.625em | 62.5% | x-small | |
| 11px | 0.6875em | 68.75% | ||
| 12px | 0.75em | 75% | ||
| 13px | 0.8125em | 81.25% | small | |
| 14px | 0.875em | 87.5% | ||
| 15px | 0.9375em | 93.75% | ||
| 16px | 1em | 100% | medium | |
| 17px | 1.0625em | 106.25% | ||
| 18px | 1.125em | 112.5% | large | |
| 19px | 1.1875em | 118.75% | ||
| 20px | 1.25em | 125% | ||
| 21px | 1.3125em | 131.25% | ||
| 22px | 1.375em | 137.5% | ||
| 23px | 1.4375em | 143.75% | ||
| 24px | 1.5em | 150% | x-large | |
| 26px | 1.625em | 162.5% | ||
| 28px | 1.75em | 175% | ||
| 30px | 1.875em | 187.5% | ||
| 32px | 2em | 200% | xx-large | |
| 34px | 2.125em | 212.5% | ||
| 36px | 2.25em | 225% | ||
| 38px | 2.35em | 235% | ||
| 40px | 2.5em | 250% | ||
| 42px | 2.625em | 262.5% | ||
| 44px | 2.75em | 275% | ||
| 46px | 2.875em | 287.5% | ||
| 48px | 3em | 300% |
Tools
5.1.2. Resources
- W3C: https://www.w3.org/TR/css-values-3/#relative-lengths
- CSS-Tricks: Font Size Idea: px at the Root, rem for Components, em for Text Elements
- Size Matters: Balancing Line Length And Font Size In Responsive Web Design
- R.I.P. REM, Viva CSS Reference Pixel!
- Comprehensive Guide: When to Use Em vs. Rem
5.2. Breakpoints
@media screen and (min-width: 1200px) {
body { font-size: 110%; } /* Increase the font size */
}
@media screen and (min-width: 1400px) {
html { padding: 0 15%; } /* Reduce the container width */
}
@media screen and (min-width: 1600px) {
body { font-size: 125%; } /* Increase the font size */
}
@media screen and (min-width:1800px) {
html { padding: 0 20%; } /* Reduce the container width */
}
5.3. Flexbox
Flexbox vs Grid
- Flexbox: content dictates layout
- Grid: container dictates layout (to some extent)
Flexbox is great, it just isn't the best thing for overall page layouts.
Flexbox and grid play well together, and are a huge step forward from the float & table hacks they replace. The sooner we can use them both in production, the better.
main { display: flex; } main > article { order: 2; min-width: 12em; flex:1; } main > nav { order: 1; width: 200px; } main > aside { order: 3; width: 200px; }
@media all and (max-width: 600px) { /* Too narrow to support three columns */ main { flex-flow: column; } main > article, main > nav, main > aside { /* Return them to document order */ order: 0; width: auto; } }
5.3.1. Browser Support
5.3.2. Resources
- W3C: CSS Flexible Box Layout Module Level 1
- CSS-Tricks: A Complete Guide to Flexbox
https://www.mediaevent.de/css/display-flex.html
https://www.mediaevent.de/tutorial/flexbox.html
5.4. Grid
main { display: grid; grid: "h h h" "a b c" "f f f"; grid-template-columns: auto 1fr 20%; } article { grid-area: b; min-width: 12em; } nav { grid-area: a; /* auto min-width */ } aside { grid-area: c; min-width: 12em; }
@media all and (max-width: 60em) { /* Too narrow to support three columns */ main { display: block; } }
Examples
5.4.1. Browser Support
5.4.2. Resources
- W3C: CSS Grid Layout Module Level 1
- CSS-Tricks: A Complete Guide to Grid
6. Typography
6.1. Font Size
html {font-size: 100%;}
6.2. Leading (Line Height)
6.3. Measure (Line Length)
45 to 85 characters
An estimate for optimal line length: between 45 and 75-85 characters (including spaces and punctuation), with 65 the “ideal” target value.
1rem = 1character
Using a rough estimate of 1rem = 1character, we can control the flow of text for a single column of content.
.container { width: 100%; } @media (min-width: 85rem) { .container { width: 65rem; } }
6.4. Hyphenation
6.5. Resources
7. Helpers
8. Frameworks
- Bulma
- Spectre.css
- Foundation
- Bootstrap - > build a theme for R6
- Ulkit
- Semantic UI