现代布局模式和响应式设计

49 阅读4分钟

第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));
}

/* 使用aspect-ratio */
.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);

// 使用ResizeObserver
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代替top/left */
  transform: translate(100px, 50px);
}

/* 批量样式更新 */
.batch-update {
  transform: translate(100px, 50px) scale(1.1);
}

/* 使用will-change提示浏览器 */
.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 { }

/* 使用CSS变量定义布局 */
: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;
}

/* 使用现代CSS特性 */
.component {
  padding-inline: 1rem;
  margin-block: 0.5rem;
  container-type: inline-size;
  container-name: component;
}

@container component (min-width: 600px) {
  .component {
    padding-inline: 2rem;
  }
}

💡 现代布局模式总结

  1. 内在设计: 内容驱动布局
  2. 瀑布流: 灵活的网格布局
  3. 响应式: 多级响应策略
  4. 性能优化: 减少布局抖动
  5. 工具类: 快速布局开发