本文将深入讲解CSS高级特性和动画技巧,包括Flexbox、Grid布局、CSS变量、动画与过渡、以及现代CSS新特性,帮助你打造精美的用户界面。
📋 目录
一、现代布局方案
1.1 Flexbox布局
常用属性速查
css
/* 容器属性 */
.container {
display: flex;
flex-direction: row | column | row-reverse | column-reverse;
flex-wrap: nowrap | wrap | wrap-reverse;
justify-content: flex-start | center | flex-end | space-between | space-around | space-evenly;
align-items: stretch | flex-start | center | flex-end | baseline;
align-content: flex-start | center | flex-end | space-between | space-around | stretch;
gap: 10px; /* 间距 */
}
/* 子项属性 */
.item {
flex: 1; /* flex-grow flex-shrink flex-basis 简写 */
flex-grow: 1; /* 放大比例 */
flex-shrink: 0; /* 缩小比例 */
flex-basis: 200px; /* 初始大小 */
align-self: auto | flex-start | center | flex-end | stretch;
order: 0; /* 排序 */
}
实战:经典布局
css
/* 1. 垂直水平居中 */
.center-box {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
}
/* 2. 两端对齐导航 */
.navbar {
display: flex;
justify-content: space-between;
align-items: center;
padding: 0 20px;
}
/* 3. 等高卡片布局 */
.card-container {
display: flex;
gap: 20px;
}
.card {
flex: 1;
display: flex;
flex-direction: column;
}
.card-content {
flex: 1; /* 内容区自动填充 */
}
.card-footer {
margin-top: auto; /* 底部对齐 */
}
/* 4. 圣杯布局 */
.holy-grail {
display: flex;
min-height: 100vh;
flex-direction: column;
}
.holy-grail-body {
display: flex;
flex: 1;
}
.holy-grail-main {
flex: 1;
}
.holy-grail-aside {
flex: 0 0 200px;
}
1.2 Grid布局
基础语法
css
.grid-container {
display: grid;
/* 定义列 */
grid-template-columns: 200px 1fr 200px;
grid-template-columns: repeat(3, 1fr);
grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
/* 定义行 */
grid-template-rows: 100px auto 100px;
/* 间距 */
gap: 20px;
row-gap: 20px;
column-gap: 10px;
/* 区域命名 */
grid-template-areas:
"header header header"
"sidebar main aside"
"footer footer footer";
}
.grid-item {
/* 位置 */
grid-column: 1 / 3; /* 从第1列到第3列 */
grid-row: 1 / 2;
/* 使用区域名 */
grid-area: header;
/* 跨越 */
grid-column: span 2; /* 跨2列 */
}
实战:响应式网格
css
/* 自适应卡片网格 */
.auto-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 20px;
}
/* 瀑布流布局 */
.masonry {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-auto-rows: 10px;
gap: 10px;
}
.masonry-item {
grid-row: span var(--row-span, 20);
}
/* 复杂仪表盘布局 */
.dashboard {
display: grid;
grid-template-columns: 250px 1fr 300px;
grid-template-rows: 60px 1fr 40px;
grid-template-areas:
"header header header"
"sidebar main aside"
"footer footer footer";
min-height: 100vh;
}
.dashboard-header { grid-area: header; }
.dashboard-sidebar { grid-area: sidebar; }
.dashboard-main { grid-area: main; }
.dashboard-aside { grid-area: aside; }
.dashboard-footer { grid-area: footer; }
1.3 Flexbox vs Grid
| 特性 | Flexbox | Grid |
|---|---|---|
| 维度 | 一维(行或列) | 二维(行和列) |
| 适用场景 | 组件内部布局 | 页面整体布局 |
| 对齐方式 | 灵活 | 更强大 |
| 响应式 | 需要媒体查询 | auto-fit/auto-fill |
| 浏览器支持 | 更好 | 现代浏览器 |
二、CSS变量与主题切换
2.1 CSS变量基础
css
/* 定义变量 */
:root {
/* 颜色 */
--primary-color: #3498db;
--secondary-color: #2ecc71;
--text-color: #333;
--bg-color: #fff;
/* 间距 */
--spacing-xs: 4px;
--spacing-sm: 8px;
--spacing-md: 16px;
--spacing-lg: 24px;
--spacing-xl: 32px;
/* 字体 */
--font-size-sm: 12px;
--font-size-md: 14px;
--font-size-lg: 18px;
/* 圆角 */
--border-radius: 8px;
/* 阴影 */
--shadow-sm: 0 1px 3px rgba(0,0,0,0.1);
--shadow-md: 0 4px 6px rgba(0,0,0,0.1);
--shadow-lg: 0 10px 20px rgba(0,0,0,0.15);
}
/* 使用变量 */
.button {
background: var(--primary-color);
padding: var(--spacing-sm) var(--spacing-md);
border-radius: var(--border-radius);
box-shadow: var(--shadow-sm);
}
/* 带默认值 */
.card {
color: var(--card-color, var(--text-color));
}
2.2 主题切换
css
/* 亮色主题(默认) */
:root {
--bg-color: #ffffff;
--text-color: #333333;
--card-bg: #f5f5f5;
--border-color: #e0e0e0;
--primary-color: #3498db;
}
/* 暗色主题 */
[data-theme="dark"] {
--bg-color: #1a1a2e;
--text-color: #eaeaea;
--card-bg: #16213e;
--border-color: #0f3460;
--primary-color: #e94560;
}
/* 应用主题 */
body {
background-color: var(--bg-color);
color: var(--text-color);
transition: background-color 0.3s, color 0.3s;
}
.card {
background: var(--card-bg);
border: 1px solid var(--border-color);
}
javascript
// JavaScript切换主题
function toggleTheme() {
const currentTheme = document.documentElement.getAttribute('data-theme');
const newTheme = currentTheme === 'dark' ? 'light' : 'dark';
document.documentElement.setAttribute('data-theme', newTheme);
localStorage.setItem('theme', newTheme);
}
// 初始化主题
const savedTheme = localStorage.getItem('theme') ||
(window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light');
document.documentElement.setAttribute('data-theme', savedTheme);
2.3 动态CSS变量
javascript
// JavaScript动态修改CSS变量
document.documentElement.style.setProperty('--primary-color', '#e74c3c');
// 获取CSS变量值
const primaryColor = getComputedStyle(document.documentElement)
.getPropertyValue('--primary-color');
// 鼠标跟随效果
document.addEventListener('mousemove', (e) => {
document.documentElement.style.setProperty('--mouse-x', e.clientX + 'px');
document.documentElement.style.setProperty('--mouse-y', e.clientY + 'px');
});
css
/* 鼠标跟随光效 */
.spotlight {
background: radial-gradient(
circle at var(--mouse-x, 50%) var(--mouse-y, 50%),
rgba(255,255,255,0.2) 0%,
transparent 50%
);
}
三、CSS动画与过渡
3.1 Transition过渡
css
/* 基础过渡 */
.button {
background: #3498db;
transform: scale(1);
transition: all 0.3s ease;
/* 或分开写 */
transition-property: background, transform;
transition-duration: 0.3s;
transition-timing-function: ease;
transition-delay: 0s;
}
.button:hover {
background: #2980b9;
transform: scale(1.05);
}
/* 常用缓动函数 */
.ease-in { transition-timing-function: ease-in; }
.ease-out { transition-timing-function: ease-out; }
.ease-in-out { transition-timing-function: ease-in-out; }
.linear { transition-timing-function: linear; }
/* 自定义贝塞尔曲线 */
.custom-ease {
transition-timing-function: cubic-bezier(0.68, -0.55, 0.265, 1.55);
}
3.2 Animation动画
css
/* 定义关键帧 */
@keyframes fadeIn {
from {
opacity: 0;
transform: translateY(20px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
@keyframes pulse {
0%, 100% {
transform: scale(1);
}
50% {
transform: scale(1.1);
}
}
@keyframes rotate {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}
/* 应用动画 */
.fade-in {
animation: fadeIn 0.5s ease forwards;
}
.pulse {
animation: pulse 2s ease-in-out infinite;
}
.loading-spinner {
animation: rotate 1s linear infinite;
}
/* 动画属性详解 */
.animated {
animation-name: fadeIn;
animation-duration: 0.5s;
animation-timing-function: ease;
animation-delay: 0s;
animation-iteration-count: 1; /* infinite */
animation-direction: normal; /* reverse, alternate */
animation-fill-mode: forwards; /* backwards, both */
animation-play-state: running; /* paused */
}
3.3 Transform变换
css
/* 2D变换 */
.transform-2d {
transform: translate(50px, 100px);
transform: translateX(50px);
transform: translateY(100px);
transform: scale(1.5);
transform: scaleX(2);
transform: rotate(45deg);
transform: skew(10deg, 20deg);
/* 组合变换 */
transform: translate(50px, 50px) rotate(45deg) scale(1.2);
/* 变换原点 */
transform-origin: center center;
transform-origin: top left;
transform-origin: 50% 50%;
}
/* 3D变换 */
.transform-3d {
transform: perspective(1000px) rotateX(45deg);
transform: rotateY(180deg);
transform: rotateZ(90deg);
transform: rotate3d(1, 1, 0, 45deg);
transform: translateZ(100px);
transform: scale3d(1, 1, 1.5);
/* 3D空间 */
transform-style: preserve-3d;
perspective: 1000px;
perspective-origin: center;
backface-visibility: hidden;
}
3.4 实用动画效果
css
/* 1. 弹跳效果 */
@keyframes bounce {
0%, 20%, 50%, 80%, 100% {
transform: translateY(0);
}
40% {
transform: translateY(-30px);
}
60% {
transform: translateY(-15px);
}
}
/* 2. 抖动效果 */
@keyframes shake {
0%, 100% { transform: translateX(0); }
10%, 30%, 50%, 70%, 90% { transform: translateX(-10px); }
20%, 40%, 60%, 80% { transform: translateX(10px); }
}
/* 3. 心跳效果 */
@keyframes heartbeat {
0% { transform: scale(1); }
14% { transform: scale(1.3); }
28% { transform: scale(1); }
42% { transform: scale(1.3); }
70% { transform: scale(1); }
}
/* 4. 打字机效果 */
.typewriter {
overflow: hidden;
border-right: 2px solid;
white-space: nowrap;
animation:
typing 3.5s steps(40, end),
blink-caret 0.75s step-end infinite;
}
@keyframes typing {
from { width: 0; }
to { width: 100%; }
}
@keyframes blink-caret {
from, to { border-color: transparent; }
50% { border-color: currentColor; }
}
/* 5. 渐变背景动画 */
.gradient-bg {
background: linear-gradient(-45deg, #ee7752, #e73c7e, #23a6d5, #23d5ab);
background-size: 400% 400%;
animation: gradient 15s ease infinite;
}
@keyframes gradient {
0% { background-position: 0% 50%; }
50% { background-position: 100% 50%; }
100% { background-position: 0% 50%; }
}
四、高级选择器与伪类
4.1 属性选择器
css
/* 精确匹配 */
[type="text"] { }
/* 包含 */
[class*="btn"] { } /* class包含btn */
/* 开头 */
[href^="https"] { } /* href以https开头 */
/* 结尾 */
[href$=".pdf"] { } /* href以.pdf结尾 */
/* 空格分隔的词 */
[class~="active"] { }
/* 连字符分隔 */
[lang|="en"] { } /* en或en-US */
/* 大小写不敏感 */
[type="text" i] { }
4.2 结构伪类
css
/* 子元素选择 */
:first-child { }
:last-child { }
:nth-child(2) { } /* 第2个 */
:nth-child(odd) { } /* 奇数 */
:nth-child(even) { } /* 偶数 */
:nth-child(3n) { } /* 3的倍数 */
:nth-child(3n+1) { } /* 1,4,7,10... */
:nth-last-child(2) { } /* 倒数第2个 */
:only-child { }
/* 同类型选择 */
:first-of-type { }
:last-of-type { }
:nth-of-type(2) { }
:only-of-type { }
/* 空元素 */
:empty { }
/* 非选择器 */
:not(.active) { }
:not(:first-child) { }
4.3 状态伪类
css
/* 链接状态 */
:link { } /* 未访问 */
:visited { } /* 已访问 */
:hover { } /* 悬停 */
:active { } /* 激活 */
:focus { } /* 聚焦 */
:focus-visible { } /* 键盘聚焦 */
:focus-within { } /* 子元素聚焦 */
/* 表单状态 */
:enabled { }
:disabled { }
:checked { }
:indeterminate { }
:valid { }
:invalid { }
:required { }
:optional { }
:placeholder-shown { }
:read-only { }
:read-write { }
/* 目标 */
:target { } /* URL锚点目标 */
4.4 伪元素
css
/* 内容伪元素 */
.element::before {
content: '';
display: block;
}
.element::after {
content: attr(data-tooltip);
}
/* 首字母/首行 */
p::first-letter {
font-size: 2em;
float: left;
}
p::first-line {
font-weight: bold;
}
/* 选中文本 */
::selection {
background: #3498db;
color: white;
}
/* 占位符 */
::placeholder {
color: #999;
}
/* 滚动条 */
::-webkit-scrollbar {
width: 8px;
}
::-webkit-scrollbar-track {
background: #f1f1f1;
}
::-webkit-scrollbar-thumb {
background: #888;
border-radius: 4px;
}
五、CSS新特性
5.1 Container Queries容器查询
css
/* 定义容器 */
.card-container {
container-type: inline-size;
container-name: card;
}
/* 容器查询 */
@container card (min-width: 400px) {
.card {
display: flex;
flex-direction: row;
}
}
@container card (max-width: 399px) {
.card {
display: block;
}
}
5.2 :has()父选择器
css
/* 包含图片的卡片 */
.card:has(img) {
padding: 0;
}
/* 包含选中复选框的行 */
tr:has(input:checked) {
background: #e3f2fd;
}
/* 表单验证状态 */
.form-group:has(input:invalid) {
border-color: red;
}
/* 空状态 */
.list:has(:not(*)) {
display: none;
}
5.3 Subgrid子网格
css
.grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 20px;
}
.grid-item {
display: grid;
grid-template-rows: subgrid; /* 继承父网格 */
grid-row: span 3;
}
5.4 CSS嵌套
css
/* 原生CSS嵌套 */
.card {
padding: 20px;
& .title {
font-size: 18px;
}
&:hover {
box-shadow: 0 4px 8px rgba(0,0,0,0.1);
}
@media (max-width: 768px) {
padding: 10px;
}
}
5.5 Scroll Snap滚动吸附
css
/* 滚动容器 */
.scroll-container {
scroll-snap-type: x mandatory;
overflow-x: auto;
display: flex;
}
/* 滚动项 */
.scroll-item {
scroll-snap-align: start;
flex: 0 0 100%;
}
/* 垂直滚动 */
.vertical-scroll {
scroll-snap-type: y proximity;
overflow-y: auto;
height: 100vh;
}
.section {
scroll-snap-align: start;
height: 100vh;
}
5.6 Aspect Ratio宽高比
css
/* 固定宽高比 */
.video-container {
aspect-ratio: 16 / 9;
width: 100%;
}
.square {
aspect-ratio: 1;
}
.portrait {
aspect-ratio: 3 / 4;
}
六、实战案例
6.1 炫酷按钮效果
css
/* 渐变边框按钮 */
.gradient-border-btn {
position: relative;
padding: 12px 24px;
background: #1a1a2e;
border: none;
color: white;
cursor: pointer;
overflow: hidden;
}
.gradient-border-btn::before {
content: '';
position: absolute;
inset: 0;
padding: 2px;
background: linear-gradient(45deg, #ff6b6b, #4ecdc4, #45b7d1, #96e6a1);
background-size: 300% 300%;
-webkit-mask:
linear-gradient(#fff 0 0) content-box,
linear-gradient(#fff 0 0);
mask:
linear-gradient(#fff 0 0) content-box,
linear-gradient(#fff 0 0);
-webkit-mask-composite: xor;
mask-composite: exclude;
animation: gradient 3s ease infinite;
}
/* 波纹效果按钮 */
.ripple-btn {
position: relative;
overflow: hidden;
}
.ripple-btn::after {
content: '';
position: absolute;
width: 100%;
height: 100%;
top: 0;
left: 0;
background: radial-gradient(circle, rgba(255,255,255,0.3) 10%, transparent 10%);
background-position: center;
background-size: 1000% 1000%;
opacity: 0;
transition: background-size 0.5s, opacity 0.5s;
}
.ripple-btn:active::after {
background-size: 0% 0%;
opacity: 1;
transition: 0s;
}
6.2 卡片悬停效果
css
/* 3D翻转卡片 */
.flip-card {
perspective: 1000px;
width: 300px;
height: 400px;
}
.flip-card-inner {
position: relative;
width: 100%;
height: 100%;
transition: transform 0.6s;
transform-style: preserve-3d;
}
.flip-card:hover .flip-card-inner {
transform: rotateY(180deg);
}
.flip-card-front,
.flip-card-back {
position: absolute;
width: 100%;
height: 100%;
backface-visibility: hidden;
}
.flip-card-back {
transform: rotateY(180deg);
}
/* 倾斜效果卡片 */
.tilt-card {
transition: transform 0.3s;
}
.tilt-card:hover {
transform: perspective(1000px) rotateX(5deg) rotateY(-5deg) scale(1.02);
}
6.3 加载动画
css
/* 三点加载 */
.loading-dots {
display: flex;
gap: 8px;
}
.loading-dots span {
width: 12px;
height: 12px;
background: #3498db;
border-radius: 50%;
animation: bounce 1.4s ease-in-out infinite both;
}
.loading-dots span:nth-child(1) { animation-delay: -0.32s; }
.loading-dots span:nth-child(2) { animation-delay: -0.16s; }
/* 环形加载 */
.spinner {
width: 40px;
height: 40px;
border: 4px solid #f3f3f3;
border-top: 4px solid #3498db;
border-radius: 50%;
animation: rotate 1s linear infinite;
}
/* 骨架屏 */
.skeleton {
background: linear-gradient(
90deg,
#f0f0f0 25%,
#e0e0e0 50%,
#f0f0f0 75%
);
background-size: 200% 100%;
animation: shimmer 1.5s infinite;
}
@keyframes shimmer {
0% { background-position: 200% 0; }
100% { background-position: -200% 0; }
}
📊 CSS技巧速查表
| 技巧 | 代码 | 用途 |
|---|---|---|
| 文字截断 | text-overflow: ellipsis |
单行省略 |
| 多行截断 | -webkit-line-clamp: 3 |
多行省略 |
| 平滑滚动 | scroll-behavior: smooth |
锚点滚动 |
| 禁止选中 | user-select: none |
防止复制 |
| 图片适应 | object-fit: cover |
图片裁剪 |
| 滤镜效果 | filter: blur(5px) |
模糊等效果 |
| 混合模式 | mix-blend-mode |
图层混合 |
💡 总结
CSS高级技巧核心要点:
- ✅ 现代布局:Flexbox处理一维,Grid处理二维
- ✅ CSS变量:实现主题切换和动态样式
- ✅ 动画过渡:提升用户体验
- ✅ 高级选择器:精准定位元素
- ✅ 新特性:容器查询、:has()、嵌套等
- ✅ 性能优化:使用transform和opacity做动画
掌握这些CSS技巧,让你的页面更加精美和流畅!
💬 如果这篇文章对你有帮助,欢迎点赞收藏!有问题欢迎在评论区讨论~