60 phút
Responsive Design
Mobile-First Approach
Phương pháp thiết kế mobile-first bắt đầu từ mobile và mở rộng lên desktop.
Media Queries
Breakpoints cơ bản
/* Mobile First */
.container {
padding: 1rem;
}
/* Tablet */
@media (min-width: 768px) {
.container {
padding: 2rem;
}
}
/* Desktop */
@media (min-width: 1024px) {
.container {
padding: 3rem;
}
}
Common Breakpoints
/* Small devices (landscape phones, 576px and up) */
@media (min-width: 576px) { }
/* Medium devices (tablets, 768px and up) */
@media (min-width: 768px) { }
/* Large devices (desktops, 992px and up) */
@media (min-width: 992px) { }
/* Extra large devices (large desktops, 1200px and up) */
@media (min-width: 1200px) { }
Responsive Units
Relative Units
.container {
width: 100%; /* Percentage */
padding: 1rem; /* Root EM */
font-size: 1.125rem; /* Relative to root */
margin: 2em; /* Relative to parent */
width: 50vw; /* Viewport Width */
height: 100vh; /* Viewport Height */
}
Fluid Typography
html {
font-size: 16px;
}
@media (min-width: 768px) {
html {
font-size: 18px;
}
}
@media (min-width: 1200px) {
html {
font-size: 20px;
}
}
h1 {
font-size: clamp(2rem, 5vw, 4rem);
}
Responsive Images
srcset và sizes
<img
srcset="image-320w.jpg 320w,
image-480w.jpg 480w,
image-800w.jpg 800w"
sizes="(max-width: 320px) 280px,
(max-width: 480px) 440px,
800px"
src="image-800w.jpg"
alt="Responsive image">
picture element
<picture>
<source media="(min-width: 1200px)" srcset="large.jpg">
<source media="(min-width: 768px)" srcset="medium.jpg">
<img src="small.jpg" alt="Responsive image">
</picture>
Responsive Navigation
Hamburger Menu
<nav class="navbar">
<div class="nav-brand">Logo</div>
<button class="nav-toggle">☰</button>
<ul class="nav-menu">
<li><a href="#">Home</a></li>
<li><a href="#">About</a></li>
<li><a href="#">Services</a></li>
<li><a href="#">Contact</a></li>
</ul>
</nav>
.navbar {
display: flex;
justify-content: space-between;
align-items: center;
}
.nav-menu {
display: flex;
list-style: none;
gap: 2rem;
}
.nav-toggle {
display: none;
background: none;
border: none;
font-size: 1.5rem;
cursor: pointer;
}
@media (max-width: 768px) {
.nav-toggle {
display: block;
}
.nav-menu {
display: none;
position: absolute;
top: 100%;
left: 0;
right: 0;
background: white;
flex-direction: column;
padding: 1rem;
}
.nav-menu.active {
display: flex;
}
}