第11章: 现代布局模式和响应式设计
🎯 本章重点
- 内在网页设计(Intrinsic Web Design)
- 瀑布流布局实现
- 响应式设计模式
- 布局性能优化
- 现代布局工具类
📖 内容概述
11.1 内在网页设计
11.1.1 基于内容的尺寸
.intrinsic-layout {
width: fit-content;
height: fit-content;
min-width: min-content;
max-width: max-content;
width: stretch;
width: available;
width: min-content;
width: max-content;
width: fit-content(300px);
}
.grid-intrinsic {
display: grid;
grid-template-columns:
minmax(min-content, 1fr)
minmax(max-content, 2fr)
fit-content(200px);
}
11.1.2 内容驱动布局
.content-driven {
grid-template-rows: masonry;
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
}
.responsive-media {
aspect-ratio: 16 / 9;
width: 100%;
height: auto;
}
.card {
aspect-ratio: 3 / 4;
container-type: inline-size;
}
11.2 瀑布流布局实现
11.2.1 CSS Grid瀑布流
.masonry-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
grid-auto-rows: 20px;
gap: 16px;
}
.masonry-item {
grid-row-end: span var(--item-rows, 5);
background: white;
border-radius: 8px;
padding: 16px;
box-shadow: 0 2px 8px rgba(0,0,0,0.1);
}
.masonry-item.tall {
--item-rows: 8;
}
.masonry-item.short {
--item-rows: 3;
}
11.2.2 JavaScript辅助
function calculateMasonry() {
document.querySelectorAll('.masonry-item').forEach(item => {
const height = item.offsetHeight;
const rows = Math.ceil(height / 20);
item.style.setProperty('--item-rows', rows);
});
}
window.addEventListener('resize', calculateMasonry);
window.addEventListener('load', calculateMasonry);
const resizeObserver = new ResizeObserver(entries => {
calculateMasonry();
});
resizeObserver.observe(document.querySelector('.masonry-grid'));
11.3 响应式设计模式
11.3.1 容器查询响应式
.product-grid {
container-type: inline-size;
container-name: products;
}
@container products (min-width: 300px) {
.product-card {
grid-template-columns: 1fr;
}
}
@container products (min-width: 500px) {
.product-card {
grid-template-columns: 1fr 2fr;
}
}
@container products (min-width: 800px) {
.product-card {
grid-template-columns: 1fr 3fr 1fr;
}
}
11.3.2 媒体查询与容器查询结合
@media (min-width: 1024px) {
.main-layout {
grid-template-columns: 250px 1fr;
}
}
.component {
container-type: inline-size;
container-name: comp;
}
@container comp (min-width: 400px) {
.component-content {
flex-direction: row;
}
}
@container comp (min-width: 600px) {
.component-content {
gap: 32px;
padding: 24px;
}
}
11.4 布局性能优化
11.4.1 减少布局抖动
.stable-layout {
width: 300px;
height: auto;
transform: translate(100px, 50px);
}
.batch-update {
transform: translate(100px, 50px) scale(1.1);
}
.optimized-element {
will-change: transform;
contain: layout;
}
11.4.2 内容可见性优化
.long-list {
content-visibility: auto;
contain-intrinsic-size: 0 500px;
}
.off-screen {
content-visibility: hidden;
contain: style layout paint;
}
.lazy-image {
loading: lazy;
decoding: async;
width: 100%;
height: auto;
}
11.5 现代布局工具类
11.5.1 实用工具类
.flex { display: flex; }
.grid { display: grid; }
.inline-flex { display: inline-flex; }
.inline-grid { display: inline-grid; }
.flex-row { flex-direction: row; }
.flex-col { flex-direction: column; }
.flex-row-reverse { flex-direction: row-reverse; }
.flex-col-reverse { flex-direction: column-reverse; }
.items-start { align-items: flex-start; }
.items-center { align-items: center; }
.items-end { align-items: flex-end; }
.items-stretch { align-items: stretch; }
.justify-start { justify-content: flex-start; }
.justify-center { justify-content: center; }
.justify-end { justify-content: flex-end; }
.justify-between { justify-content: space-between; }
.gap-4 { gap: 1rem; }
.gap-8 { gap: 2rem; }
.gap-x-4 { column-gap: 1rem; }
.gap-y-4 { row-gap: 1rem; }
11.5.2 容器查询工具类
.container-type-inline { container-type: inline-size; }
.container-type-size { container-type: size; }
.container-type-normal { container-type: normal; }
.container-name-main { container-name: main; }
.container-name-sidebar { container-name: sidebar; }
@container main (min-width: 400px) {
.cq\:flex-row { flex-direction: row; }
.cq\:grid-cols-2 { grid-template-columns: repeat(2, 1fr); }
}
@container main (min-width: 600px) {
.cq\:grid-cols-3 { grid-template-columns: repeat(3, 1fr); }
.cq\:gap-8 { gap: 2rem; }
}
11.6 浏览器兼容性策略
11.6.1 特性检测
.component {
display: grid;
grid-template-columns: 1fr;
}
@supports (container-type: inline-size) {
.component {
container-type: inline-size;
container-name: component;
}
@container component (min-width: 400px) {
.component {
grid-template-columns: 1fr 2fr;
}
}
}
11.6.2 渐进增强
.button {
padding: 0.5rem 1rem;
border: 1px solid #ccc;
}
@supports (container-type: inline-size) {
.button {
padding: 0.75rem 1.5rem;
}
}
@supports (backdrop-filter: blur(10px)) {
.modal {
backdrop-filter: blur(10px);
}
}
11.7 布局最佳实践
11.7.1 语义化布局
.page-header { }
.main-navigation { }
.article-grid { }
:root {
--header-height: 80px;
--sidebar-width: 250px;
--content-padding: 2rem;
}
.layout {
grid-template-rows: var(--header-height) 1fr;
grid-template-columns: var(--sidebar-width) 1fr;
gap: var(--content-padding);
}
11.7.2 可维护性策略
.component {
font-size: 1rem;
line-height: 1.6;
}
.component--large {
font-size: 1.2rem;
padding: 2rem;
}
.component {
padding-inline: 1rem;
margin-block: 0.5rem;
container-type: inline-size;
container-name: component;
}
@container component (min-width: 600px) {
.component {
padding-inline: 2rem;
}
}
💡 现代布局模式总结
- 内在设计: 内容驱动布局
- 瀑布流: 灵活的网格布局
- 响应式: 多级响应策略
- 性能优化: 减少布局抖动
- 工具类: 快速布局开发