1845 字
9 分钟
CSS 现代特性完全指南

CSS 现代特性完全指南#

概述#

现代 CSS 引入了许多强大的新特性,极大地扩展了 CSS 的能力,让开发者能够创建更复杂、更灵活的布局和效果。

容器查询#

1. 基础用法#

/* 定义容器 */
.container {
  container-type: inline-size;
  container-name: card-container;
}

/* 基于容器尺寸的查询 */
@container card-container (min-width: 400px) {
  .card {
    display: grid;
    grid-template-columns: 1fr 2fr;
    gap: 20px;
  }
  
  .card-image {
    width: 100%;
    height: auto;
  }
  
  .card-content {
    padding: 20px;
  }
}

@container card-container (min-width: 600px) {
  .card {
    grid-template-columns: 1fr 3fr;
  }
  
  .card-title {
    font-size: 24px;
  }
}

2. 实际应用#

/* 响应式卡片组件 */
.card {
  container-type: inline-size;
}

.card-content {
  padding: 15px;
}

/* 小尺寸卡片 */
@container (max-width: 300px) {
  .card {
    display: flex;
    flex-direction: column;
  }
  
  .card-image {
    width: 100%;
    height: 150px;
    object-fit: cover;
  }
  
  .card-title {
    font-size: 16px;
    margin-bottom: 8px;
  }
  
  .card-description {
    display: none; /* 小尺寸隐藏描述 */
  }
}

/* 中等尺寸卡片 */
@container (min-width: 301px) and (max-width: 500px) {
  .card {
    display: grid;
    grid-template-columns: 120px 1fr;
    gap: 15px;
  }
  
  .card-image {
    width: 100%;
    height: 120px;
    object-fit: cover;
    border-radius: 8px;
  }
  
  .card-title {
    font-size: 18px;
  }
  
  .card-description {
    font-size: 14px;
    line-height: 1.4;
    display: -webkit-box;
    -webkit-line-clamp: 3;
    -webkit-box-orient: vertical;
    overflow: hidden;
  }
}

/* 大尺寸卡片 */
@container (min-width: 501px) {
  .card {
    display: grid;
    grid-template-columns: 200px 1fr;
    gap: 25px;
    align-items: center;
  }
  
  .card-image {
    width: 100%;
    height: 200px;
    object-fit: cover;
    border-radius: 12px;
  }
  
  .card-title {
    font-size: 24px;
    margin-bottom: 10px;
  }
  
  .card-description {
    font-size: 16px;
    line-height: 1.6;
  }
}

层叠层#

1. 基础概念#

/* 定义层叠层 */
@layer base, components, utilities;

/* 创建层 */
@layer base {
  /* 基础样式 */
  * {
    box-sizing: border-box;
    margin: 0;
    padding: 0;
  }
  
  body {
    font-family: system-ui, sans-serif;
    line-height: 1.6;
  }
}

@layer components {
  /* 组件样式 */
  .button {
    display: inline-block;
    padding: 10px 20px;
    background: #007bff;
    color: white;
    border-radius: 4px;
    cursor: pointer;
  }
  
  .card {
    border: 1px solid #ddd;
    border-radius: 8px;
    padding: 20px;
  }
}

@layer utilities {
  /* 工具类 */
  .text-center { text-align: center; }
  .mt-1 { margin-top: 0.25rem; }
  .mb-2 { margin-bottom: 0.5rem; }
}

/* 未分层的样式优先级最高 */
.unlayered {
  color: red; /* 优先级高于所有层 */
}

2. 层管理#

/* 导入外部样式到指定层 */
@import url('reset.css') layer(base);
@import url('components.css') layer(components);

/* 条件层 */
@layer theme.dark {
  /* 暗色主题样式 */
  :root {
    --bg-color: #1a1a1a;
    --text-color: #f8f9fa;
  }
}

@layer theme.light {
  /* 亮色主题样式 */
  :root {
    --bg-color: #ffffff;
    --text-color: #333333;
  }
}

/* 动态激活层 */
[data-theme="dark"] {
  @layer theme.dark;
}

[data-theme="light"] {
  @layer theme.light;
}

子网格#

1. 基础用法#

/* 父网格 */
.parent-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 20px;
  padding: 20px;
}

/* 子网格 */
.child-grid {
  display: grid;
  grid-template-columns: subgrid; /* 继承父网格列 */
  grid-template-rows: subgrid;    /* 继承父网格行 */
  grid-column: span 2;           /* 跨越两列 */
  
  /* 子网格内部布局 */
  gap: 10px;
}

/* 子网格项目 */
.child-item {
  background: #f8f9fa;
  padding: 15px;
  border-radius: 6px;
}

/* 复杂布局示例 */
.complex-grid {
  display: grid;
  grid-template-columns: 200px 1fr 300px;
  grid-template-rows: auto 1fr auto;
  gap: 25px;
  min-height: 100vh;
}

.sidebar {
  grid-column: 1;
  grid-row: 1 / -1;
}

.content {
  grid-column: 2;
  grid-row: 2;
  display: grid;
  grid-template-columns: subgrid;
  grid-template-rows: subgrid;
}

.widget {
  grid-column: 3;
  grid-row: 2;
  display: grid;
  grid-template-rows: subgrid;
}

现代颜色函数#

1. color-mix()#

/* 颜色混合 */
.mixed-color {
  /* 混合两种颜色 */
  color: color-mix(in srgb, #007bff 50%, white);
  background-color: color-mix(in lch, red 30%, blue 70%);
}

/* 实际应用 */
.button {
  --color-primary: #007bff;
  --color-primary-hover: color-mix(in srgb, var(--color-primary) 80%, black);
  --color-primary-active: color-mix(in srgb, var(--color-primary) 60%, black);
  
  background-color: var(--color-primary);
  color: white;
  border: none;
  padding: 10px 20px;
  border-radius: 4px;
  cursor: pointer;
  transition: background-color 0.3s ease;
}

.button:hover {
  background-color: var(--color-primary-hover);
}

.button:active {
  background-color: var(--color-primary-active);
}

/* 创建颜色变体 */
:root {
  --color-base: #3498db;
  --color-light: color-mix(in srgb, var(--color-base) 20%, white);
  --color-dark: color-mix(in srgb, var(--color-base) 20%, black);
  --color-muted: color-mix(in srgb, var(--color-base) 50%, gray);
}

2. color-contrast()#

/* 自动选择对比度足够的颜色 */
.auto-contrast {
  background-color: var(--bg-color, #333);
  color: color-contrast(var(--bg-color) vs white, black);
}

/* 实际应用 */
.theme-card {
  --card-bg: #f8f9fa;
  
  background-color: var(--card-bg);
  color: color-contrast(var(--card-bg) vs #333, #666, #999, white);
  padding: 20px;
  border-radius: 8px;
}

/* 动态主题 */
[data-theme="dark"] .theme-card {
  --card-bg: #2d3748;
}

[data-theme="light"] .theme-card {
  --card-bg: #ffffff;
}

3. 相对颜色语法#

/* 基于现有颜色创建新颜色 */
.relative-colors {
  --primary: #007bff;
  --primary-light: rgb(from var(--primary) r g b / 0.8);
  --primary-dark: rgb(from var(--primary) calc(r * 0.8) calc(g * 0.8) calc(b * 0.8));
  
  /* 使用HSL调整 */
  --primary-hsl: hsl(from var(--primary) h s l);
  --primary-lighter: hsl(from var(--primary) h s calc(l + 10%));
  --primary-darker: hsl(from var(--primary) h s calc(l - 10%));
}

/* 实际应用 */
.color-system {
  --base-hue: 210; /* 蓝色系 */
  --base-saturation: 70%;
  --base-lightness: 50%;
  
  --color-primary: hsl(var(--base-hue) var(--base-saturation) var(--base-lightness));
  --color-secondary: hsl(calc(var(--base-hue) + 30) var(--base-saturation) var(--base-lightness));
  --color-accent: hsl(calc(var(--base-hue) + 60) var(--base-saturation) var(--base-lightness));
  
  /* 创建调色板 */
  --color-50: hsl(from var(--color-primary) h s 95%);
  --color-100: hsl(from var(--color-primary) h s 90%);
  --color-200: hsl(from var(--color-primary) h s 80%);
  --color-300: hsl(from var(--color-primary) h s 70%);
  --color-400: hsl(from var(--color-primary) h s 60%);
  --color-500: hsl(from var(--color-primary) h s 50%);
  --color-600: hsl(from var(--color-primary) h s 40%);
  --color-700: hsl(from var(--color-primary) h s 30%);
  --color-800: hsl(from var(--color-primary) h s 20%);
  --color-900: hsl(from var(--color-primary) h s 10%);
}

现代布局函数#

1. min(), max(), clamp()#

/* 响应式字体 */
.responsive-text {
  font-size: clamp(16px, 2vw, 24px);
  line-height: clamp(1.4, 2vw, 1.6);
}

/* 响应式间距 */
.responsive-spacing {
  padding: clamp(15px, 3vw, 30px);
  margin: clamp(10px, 2vw, 20px);
}

/* 复杂布局 */
.complex-layout {
  width: min(100%, 1200px);
  height: max(500px, 50vh);
  font-size: clamp(14px, calc(1vw + 0.5rem), 18px);
}

/* 实际应用 */
.card-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 300px), 1fr));
  gap: clamp(15px, 3vw, 30px);
  padding: clamp(20px, 4vw, 40px);
}

2. calc() 增强#

/* 现代calc用法 */
.enhanced-calc {
  /* 支持更多单位 */
  width: calc(100% - 2rem);
  height: calc(100vh - 60px);
  font-size: calc(1rem + 0.5vw);
  
  /* 支持三角函数 */
  --angle: 45deg;
  transform: rotate(calc(sin(var(--angle)) * 1rad));
  
  /* 支持指数函数 */
  --scale: 2;
  transform: scale(calc(pow(var(--scale), 2)));
}

现代选择器#

1.() 和()#

/* 简化选择器 */
.simplified-selectors {
  /* 传统写法 */
  .header h1,
  .header h2,
  .header h3 {
    margin-bottom: 1rem;
  }
  
  /* 现代写法 */
  .header :is(h1, h2, h3) {
    margin-bottom: 1rem;
  }
  
  /* :where() 优先级为0 */
  .header :where(h1, h2, h3) {
    color: #333;
  }
}

/* 实际应用 */
.card :is(.title, .subtitle) {
  font-weight: 600;
  margin-bottom: 0.5rem;
}

.form :where(input, textarea, select) {
  border: 1px solid #ddd;
  border-radius: 4px;
  padding: 8px 12px;
}

2.() 父选择器#

/* 根据子元素选择父元素 */
.parent-selector {
  /* 选择包含img的.card */
  .card:has(img) {
    border: 2px solid #007bff;
  }
  
  /* 选择包含.active的.nav-item */
  .nav-item:has(.active) {
    background-color: #f8f9fa;
  }
  
  /* 选择包含特定文本的元素 */
  .message:has(.error) {
    border-color: #dc3545;
  }
}

/* 实际应用 */
/* 当表单有错误时改变样式 */
.form:has(.error) {
  border-color: #dc3545;
  background-color: #fff5f5;
}

/* 当卡片有特定标签时 */
.card:has(.tag-premium) {
  box-shadow: 0 8px 25px rgba(255, 193, 7, 0.3);
}

/* 响应式布局调整 */
.grid-item:has(.video) {
  grid-column: span 2;
}

现代动画与过渡#

1. @scroll-timeline#

/* 滚动时间线动画 */
@scroll-timeline scroll-animation {
  source: selector(#scroller);
  orientation: vertical;
  scroll-offsets: 0%, 100%;
}

@keyframes fade-in-on-scroll {
  from {
    opacity: 0;
    transform: translateY(50px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}

.scroll-element {
  animation: fade-in-on-scroll 1s ease forwards;
  animation-timeline: scroll-animation;
}

2. 视图过渡API#

/* 视图过渡动画 */
@view-transition {
  navigation: auto;
}

/* 自定义过渡 */
::view-transition-old(root) {
  animation: fade-out 0.3s ease;
}

::view-transition-new(root) {
  animation: fade-in 0.3s ease;
}

@keyframes fade-out {
  from { opacity: 1; }
  to { opacity: 0; }
}

@keyframes fade-in {
  from { opacity: 0; }
  to { opacity: 1; }
}

性能与兼容性#

1. 特性检测#

/* 检测现代特性支持 */
@supports (container-type: inline-size) {
  .modern-layout {
    container-type: inline-size;
  }
}

@supports (color: color-mix(in srgb, red, blue)) {
  .modern-colors {
    color: color-mix(in srgb, #007bff 50%, white);
  }
}

@supports selector(:has(a)) {
  .modern-selectors {
    .parent:has(.child) {
      border-color: #007bff;
    }
  }
}

2. 渐进增强#

/* 基础样式(所有浏览器) */
.button {
  background-color: #007bff;
  color: white;
  padding: 10px 20px;
  border-radius: 4px;
}

/* 增强样式(支持现代特性的浏览器) */
@supports (color: color-mix(in srgb, red, blue)) {
  .button {
    --color-primary: #007bff;
    background-color: color-mix(in srgb, var(--color-primary) 90%, white);
  }
  
  .button:hover {
    background-color: color-mix(in srgb, var(--color-primary) 70%, black);
  }
}

工具与资源#

1. 开发工具#

  • Chrome DevTools:容器查询调试、层叠层检查
  • Firefox DevTools:现代CSS特性支持
  • Can I Use:浏览器兼容性查询

2. 学习资源#

  • MDN Web Docs:现代CSS文档
  • CSS-Tricks:现代特性教程
  • Modern CSS:最新CSS技术分享

总结#

现代 CSS 特性为前端开发带来了革命性的变化:

  1. 更强大的布局能力:容器查询、子网格
  2. 更好的样式管理:层叠层、作用域样式
  3. 更灵活的颜色系统:颜色函数、相对颜色
  4. 更智能的选择器()、()、()
  5. 更丰富的交互效果:视图过渡、滚动动画

随着浏览器支持的不断完善,这些现代特性正在成为 Web 开发的新标准。建议开发者积极学习和采用这些技术,提升开发效率和用户体验。


创建时间:2022-08-22 最后更新:2022-08-22 作者:前端开发团队 标签:CSS, 现代CSS, 容器查询, 层叠层, 子网格, 颜色函数

CSS 现代特性完全指南
https://ameng404.com/posts/css/css现代特性详解/
作者
Ameng
发布于
2022-08-22
许可协议
CC BY-NC-SA 4.0