分类
标签
API设计 BEM Core Web Vitals CSRF CSS CSS-in-JS CSS变量 Flexbox Grid HTTP HTTP-2 HTTP-3 HTTPS JavaScript Less RESTful Sass SSL-TLS Stylus WebSocket Web安全 Web性能 XSS 主题切换 全双工通信 前端 前端优化 前端安全 前端工程化 前端开发 前端架构 动画 后端开发 响应式设计 团队协作 媒体查询 子网格 实时通信 容器查询 层叠层 布局 性能优化 接口规范 架构设计 模块化 渲染性能 现代CSS 用户体验 移动优先 组件库 缓存策略 网络 网络协议 网络安全 网络请求 自定义属性 认证授权 设计令牌 设计系统 过渡 预处理器 颜色函数
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 特性为前端开发带来了革命性的变化:
- 更强大的布局能力:容器查询、子网格
- 更好的样式管理:层叠层、作用域样式
- 更灵活的颜色系统:颜色函数、相对颜色
- 更智能的选择器:
()、 ()、 () - 更丰富的交互效果:视图过渡、滚动动画
随着浏览器支持的不断完善,这些现代特性正在成为 Web 开发的新标准。建议开发者积极学习和采用这些技术,提升开发效率和用户体验。
创建时间:2022-08-22 最后更新:2022-08-22 作者:前端开发团队 标签:CSS, 现代CSS, 容器查询, 层叠层, 子网格, 颜色函数
