☰
CSS3核心能力拆解:选择器、布局、动效与响应式主题的工程实践
2026/10/21 19:34:29 网站建设 项目流程

如果你去问一个前端开发者“CSS3能做什么”,大概率会收到一长串属性名:圆角、阴影、渐变、动画、弹性布局……但这些零散的特性,恰恰是CSS3这十几年来最容易被误解的地方。我做了这么多年前端,最大的体会是:CSS3带来的不是“多了几个属性”,而是一整套思维方式的转变——从给元素“补样式”变成给界面“搭系统”。这篇文章我就从实际项目视角,把个人认为真正值得下功夫的CSS3核心技术拆开梳理一遍:选择器精度、布局选型、动效引擎、视觉细节、响应式与主题控制,顺带聊聊这些能力和后续同步演进的新规范怎么配合落地。无论你是刚入行的新手,还是已经写了几年样式的老手,应该都能从中找到自己没注意到的盲区。

1. CSS3的“核心”到底是什么:先建立技术版图

1.1 为什么说它是一次范式更新,而不是功能堆砌

CSS2.1时代,大家都经历过那种“一个效果要折腾半天”的日子:圆角要用背景图拼接,阴影要靠盒子嵌套,垂直居中要算负margin,多栏布局要float加clearfix,更别说做一个过渡动画还得用JavaScript定时器去改元素样式。

CSS3最本质的变化,是它把大量“以前只能靠图片、脚本、hack才能实现的效果”变成了“声明式的能力”。你只要告诉浏览器“这个元素四个方向圆角各8像素”“这个盒子有一个模糊阴影”“切换状态时在0.3秒内缓动过渡”,浏览器自己就去算了。这意味着前端的关注点从“如何拼出效果”转向“如何描述系统”。

另外要明确一个口径:我们平时嘴上说的“CSS3”,其实不是一个单独的规范,而是一组模块的集合。选择器、背景边框、变换、过渡、动画、媒体查询,各自都有自己的Level 3甚至后续版本。这也是为什么同一个特性在不同浏览器里的支持进度不一样,你只有在实践中逐个验证,才能真正把握它在项目里的可靠性。

1.2 技术优先级:哪些必须精通,哪些了解即可

结合我自己的项目经验,CSS3体系里真正高频率使用、值得投入大量时间理解的技术,可以分成这样几档:

优先级技术点典型场景学习建议
第一档box-sizing、flex、grid几乎所有页面布局必须精通,是布局底座
第一档选择器(结构伪类、属性选择器)精确命中元素、表单状态必须熟练,能大幅减少类名和脚本
第一档transition、animation、transform交互动效、加载反馈必须掌握原理,达到“能设计动画”而非“套模板”
第二档border-radius、box-shadow、渐变卡片、按钮、分割线熟练使用,但要知道边界
第二档媒体查询、CSS变量响应式、主题切换必须掌握,是工程化基础
第三档filter、混合模式、writing-mode特殊滤镜效果、多语言排版了解,偶尔用

判断一个特性是否值得优先学,我有一个很实用的标准:看它能不能帮你“替代旧方案”。如果以前要切图、要写hack、要挂脚本才能实现,现在一条声明就解决,那它就是高价值技术;如果只是“让某个效果稍微好看一点”,且还伴随明显性能代价,那就要谨慎对待。

2. 选择器精度:从“起名字”到“按关系与状态命中”

2.1 结构选择器:用好nth-child系列,别再用一串类名标记位置

很多同学写页面结构时,习惯给列表第一项加class="first",最后一项加class="last”,中间项再来个class="active”。这种“用类名描述位置”的做法在CSS3时代其实已经过时了,因为结构伪类可以直接按元素在父级中的序号命中。

:nth-child()的括号里可以填一个an+b形式的公式,它描述的是“从第b个元素开始,每隔a个元素命中一次”。比如表格隔行变色,最直白的写法是:

tbody tr:nth-child(2n) { background: #f8f8f8; }

这里a=2、b=0,意思是命中第2、4、6……行。如果你想要从第3行开始每两行加一次背景,那就是:nth-child(2n+3),命中的是第3、5、7……行。这个参数里的符号要特别注意,它完全决定命中位置。

还有一个高频坑::nth-child和:nth-of-type看着像,实际语义完全不同。:nth-child(n)只看“元素是不是父级的第n个子节点”,不关心元素类型;:nth-of-type(n)则要先限定类型,再在这个类型里数序号。比如一个div里混着标题、段落、图片,想把第2个段落变色,如果你写p:nth-child(2),只有当p真的是第二个子节点时才生效;正确写法是p:nth-of-type(2),它会在所有p标签里数第二个。这个细节能省掉大量调试时间。

2.2 属性选择器与状态伪类:表单校验和文件列表的利器

属性选择器在CSS3里被增强成了三种匹配方式:以某字符串开头、以某字符串结尾、包含某字符串。别看这几个符号不起眼,实际用途非常大。

比如要区分下载列表里的文件类型,通常HTML里是a标签加后缀名,你不一定想给每个链接都加一个图标类,这时用属性选择器直接匹配href后缀即可:

a[href$=".pdf"]::before { content: "PDF "; } a[href$=".zip"]::before { content: "压缩包 "; }

同理,[attr^="https"]可以专门命中外链,[attr*="tag"]可以命中URL或全局唯一ID中包含特定标识的元素。这些写法把“结构语义”和“样式挂钩”解耦,特别适合后端渲染的模板页面。

状态伪类里,我几乎天天用的是:checked来做自定义开关,用:disabled和:enabled做表单控件样式,用:placeholder-shown判断输入框当前是否有占位内容。:placeholder-shown尤其适合做浮动标签,输入框有内容时隐藏占位文字并让label上移,不需要JavaScript监听input事件。

.input-wrap input:placeholder-shown + label { transform: none; } .input-wrap input:not(:placeholder-shown) + label { transform: translateY(-20px) scale(0.8); }

这种“纯CSS表达状态”的能力,是选择器价值最大的体现。

2.3 :is()、:where()、:not()的组合价值:权重可控的批量命中

:is()和:where()都是选择器列表的“分组器”,可以把一长串重复的选择器结构压缩成一份。它们的核心区别在于权重计算::is()的权重取参数列表中最高权重的那一项,:where()的权重永远是0。

这个差异在覆盖样式时非常有用。比如团队规范里想让所有卡片内的标题风格统一,又不想反复写选择器前缀,可以这样:

/* 权重受参数里最高项影响,可能是0,2,0 */ .card :is(h2, h3, .subtitle) { font-size: 1.25rem; } /* 权重始终为0,方便后续按类名覆盖 */ .card :where(.feature-box, .notice-box) { border: 1px solid #eee; }

:not()在CSS3早期只能传简单选择器,现在则可以传选择器列表。用它做“排除型”样式特别顺手,比如要让所有列表项之间有分割线,但最后一项不要:

.list li:not(:last-child) { border-bottom: 1px solid #eee; }

甚至还能组合出“排除掉特定状态后再命中”的逻辑。这些分组的核心价值,是让CSS更像一门“逻辑语言”,而不是大量重复选择器。

2.4 选择器性能的真相:别再迷信“少用类选择器”

早年很长一段时间里,社区流传“id比class快、class比标签快、少用后代选择器”的说法。这个结论在现代浏览器引擎里已经被大幅淡化了。浏览器匹配选择器是从右往左进行的,真正影响性能的是选择器的“复杂度”——超长的后代选择器、通配符配合深层次结构,才会在大型页面上造成可感知的解析开销。

我见过的真实性能问题,几乎都来自类似. main content . wrapper . item这样的五层组合,而不是.article .title这种普通后代选择器。所以在团队项目里,我更建议关注两点:第一,用BEM之类的命名法让选择器语义清晰,层级控制在两到三层;第二,不要为了“性能”故意把每个元素都挂上一个类名,结构语义比微性能重要得多。CSS3选择器带来的灵活度,本质上是为了减少你为了命中元素而强行写类名的负担。

3. 布局革命:从浮动补丁到flex与grid的理性选型

3.1 盒模型修正:box-sizing是布局的第一块基石

聊布局必须先说盒模型。CSS2.1的默认盒模型是content-box,width只代表内容区宽度,padding和border都要额外加。这直接导致一个经典噩梦:设置子元素width: 50%,再加padding后实际宽度超过父级一半,然后就挤到下一行了。

CSS3普及之后,我做的第一件事就是把全局盒模型改成border-box:

*, *::before, *::after { box-sizing: border-box; }

这样一来,width就是元素从边框到边框的总宽度,padding和border都在声明宽度内部消化。你写width: 50%再加上padding,它就还是父级的50%,不会再撑破布局。这个设置看起来简单,却是所有后续布局技术能够稳定工作的前提,团队规范里必须放在重置样式的第一梯队。

3.2 flex的核心心智:一根主轴上解决问题

flex布局看起来简单,很多人上手就写display: flex,但实际遇到居中和分配不均就乱了,根源在于没理解“主轴”和“交叉轴”这两个概念。

flex容器默认按水平方向排列子项,这个水平方向就是主轴,垂直方向是交叉轴。接下来你要做的所有调整,其实都是在回答两个问题:主轴方向怎么排列,交叉轴方向怎么对齐。主轴由justify-content控制,交叉轴由align-items控制。当flex-direction改为column时,主轴变成垂直方向,justify-content就管垂直排列,很多新手在这里翻车。

常用口诀是:横向排列想居中就justify-content: center,再配一个align-items: center,这就是最简单的水平垂直居中;子项要占满剩余空间就flex: 1;要子项不拉伸就flex: none。另外,flex: 1这个缩写其实是flex: 1 1 0%,意思是“能增长、能收缩、基准为0”,跟flex: 1 1 auto完全是两回事。很多看似“flex失效”的问题,都出在没搞懂这三个子属性在百分比里怎么组合。

3.3 grid的核心心智:二维坐标系里直接摆网格

flex擅长处理“一行或一列”的排列,一旦遇到“既要排行又要排列”的场景,比如卡片墙、工具栏加内容区、仪表盘,flex就需要套很多层才能凑出来,而且动不动要写flex-wrap。grid的价值在于直接用行和列两条轴来定义布局,更像是“画格子”。

我常用的写法是grid-template-columns配合grid-template-areas。网格区域可以把布局结构直接“画”成可视化的字符块,非常适合页面骨架:

.dashboard { display: grid; grid-template-columns: 240px 1fr; grid-template-rows: 60px 1fr; grid-template-areas: "sidebar header" "sidebar content"; height: 100vh; } .sidebar { grid-area: sidebar; } .header { grid-area: header; } .content { grid-area: content; }

这里的1fr是“等分剩余空间”的单位,它和flex: 1有相似之处,但作用对象是网格轨道。当列宽是240px 1fr时,意思是左侧固定240,剩下全部给右侧。grid里的对齐和flex一样有justify-items和align-items,但因为grid是二维的,你还可以用justify-self和align-self单独控制某个单元格里的元素。

日常判断用flex还是grid,我的标准很简单:看这个区域的主结构是一维还是二维。一行里的按钮组、导航项、输入框,用flex;整个页面骨架、卡片墙、需要按行列对齐的内容矩阵,用grid。两者经常嵌套使用,完全没有必要非此即彼。

3.4 经典三栏布局的三种写法对比

用同一个“左右固定、中间自适应”的页面骨架来对比,最能看出技术代际差异。

CSS2.1时代的浮动写法:

.left { float: left; width: 220px; } .right { float: right; width: 220px; } .center { margin: 0 220px; }

这段代码看着短,但浮动会带来父容器高度塌陷,通常还要加clearfix,而且三个栏的DOM顺序必须左右在前、中间在后,这对内容优先的SEO方案很不友好。

flex写法:

.container { display: flex; } .left { flex: 0 0 220px; } .right { flex: 0 0 220px; } .center { flex: 1; }

这里flex: 0 0 220px表示“不增长、不收缩、基准220px”,是关键技巧。flex写法不需要调整DOM顺序,父容器也不会塌陷。

grid写法:

.container { display: grid; grid-template-columns: 220px 1fr 220px; }

一行grid声明完成布局。如果还需要按面积命名,那grid-template-areas会把可读性再提升一层。三种写法的演进逻辑非常清晰:旧方案靠“补丁”,新方案靠“声明”。这也是CSS3整个布局体系的设计哲学。

4. 动效基石:transform、transition、animation的正确配合

4.1 transform:先建立坐标系,再谈属性

transform官方的直译是“变换”,它包含平移、缩放、旋转、倾斜四类基础操作。易学难精的原因在于它的坐标系和叠加顺序。默认情况下,旋转的中心点是元素的中心,即transform-origin为50% 50%。你要做表盘刻度、卡片翻转这类效果时,必须改旋转原点,比如transform-origin: left center表示绕左边中心旋转。

多个变换写在一起时,顺序决定了视觉效果,因为它是按从左到右依次施加的。一个很直观的例子:先平移再旋转,和先旋转再平移,结果完全不同。前者是“元素先移动到一个位置再自转”,后者是“元素先转好方向再朝旋转后的方向移动”。我建议在团队规范里固定一种书写顺序,比如先位移、再旋转、再缩放,这样不同成员的代码可预期。

CSS3里还提供了一个斜切操作skew,以及在3D场景下使用的rotateX、rotateY、translateZ。3D变换的代价是会让元素进入合成层,新手在移动端随便开3D容易遇到白屏或者性能抖动,我的建议是:能用2D表达的效果就别上3D,除非确有必要做透视翻转。

4.2 transition:从状态A到状态B,别过渡“布局属性”

transition的四个核心参数分别是transition-property声明要过渡的属性、transition-duration时长、transition-timing-function缓动函数、transition-delay延迟。它本身不产生动画,只是“监听属性的变化”,一旦属性的值发生变化,它就按你设定的曲线平滑过渡过去。

这里有一个极重要的经验:不要过渡像width、height、top、left、margin这类会触发布局重排(layout)和重绘(paint)的属性。这类过渡在低端手机上能明显感觉到卡顿,因为浏览器每帧都要重新计算布局。绝大多数动画都应该落在transform和opacity这两个属性上,它们可以由合成器独立处理,效率最高。

一个常见场景是悬浮卡片抬起效果。旧写法会去过渡transform或box-shadow,正确,但box-shadow虽然不触发布局,绘制开销比transform高一些,所以更讲究的写法是用一个伪元素承载阴影,只过渡伪元素的opacity:

.card::after { content: ""; position: absolute; inset: 0; box-shadow: 0 12px 24px rgba(0, 0, 0, 0.15); opacity: 0; transition: opacity 0.2s ease; } .card:hover::after { opacity: 1; }

这样每一帧只合成一个透明度值,性能更好。

4.3 animation:关键帧动画的完整控制

animation是transition的升级版:transition只能表达“两种状态间的变化”,animation则可以在多个状态之间来回。核心结构是@keyframes定义关键帧,animation属性控制动画的播放。

@keyframes spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } .spinner { animation: spin 1s linear infinite; }

属性列表里我平时最关注的是animation-timing-function(缓动曲线)、animation-iteration-count(播放次数)和animation-fill-mode(结束时状态)。fill-mode特别实用,很多动画结束后元素会“跳回”起点,就是因为忘记设forwards。比如一个弹窗从透明度0滑入,最终停在可见状态,就必须写animation: fade-in 0.3s ease forwards,否则动画结束计算样式一旦取消,元素立刻归位。

4.4 动效性能与GPU加速:优雅动画的前提

CSS3动画的性能问题,本质上是浏览器渲染管线的分配问题。现代浏览器渲染一帧大致要经过JavaScript、样式计算、布局、绘制、合成几个阶段。opacity和transform的变化可以跳过布局和绘制直接进入合成阶段,这是它们性能好的根本原因。

will-change属性可以用来提前告知浏览器“某个元素接下来会变化,请把它提升到自己的合成层”。但它在业界有滥用嫌疑,因为创建新合成层会占用内存,手机上尤其谨慎。正确的姿势是只在动画开始前加上,动画结束后移除,不要长期挂在元素上。实际项目中我见过的“动画闪烁”“文字模糊”问题,十有八九是合成层叠加过多导致的,这时候先减少will-change和3D变换,往往比加大硬件加速更有效。

5. 视觉细节:圆角、阴影、渐变与滤镜的实践边界

5.1 圆角与边框:从切图到纯CSS的表达

border-radius是CSS3普及度最高的属性之一。它最容易被忽视的能力是用斜杠语法分别设置水平和垂直半径,比如border-radius: 50% / 20%表示横向半径是宽度的50%,纵向半径是高度的20%,这能做出椭圆角效果。胶囊按钮最简单的写法是border-radius: 999px,值足够大时边角就完全圆化,并且随元素尺寸自适应。

和border-radius常一起提的是border-image,但它在实际项目里使用频率极低,因为渐变色边框和自适应边框的需求绕开了它。如果你以后看到border-image的坑,记住一点:它会把四边按九宫格切分,对普通UI按钮来说不太直观,别轻易用于需要内容自适应的情况。

5.2 阴影:层次感的基本盘

box-shadow是最被低估的层次感工具。它的完整语法里包括水平偏移、垂直偏移、模糊半径、扩展半径和颜色。我通常用两层阴影叠加来模拟“悬浮”状态:一层较小模糊的贴近阴影,一层较大模糊的环境阴影,看起来比单层阴影立体得多。

.card { box-shadow: 0 2px 4px rgba(0, 0, 0, 0.08), 0 12px 24px rgba(0, 0, 0, 0.12); }

text-shadow则负责文字立体感,但我越来越少用它,因为现代UI强调扁平简洁,文字阴影大多被semi-bold文字和对比色取代。如果你要做发光字、霓虹效果,text-shadow仍然是最直接的工具。阴影的开销比普通颜色大,大面积模糊配合滚动的页面,在低端设备上会有明显掉帧,所以控制阴影的模糊半径和数量同样是性能意识的一部分。

5.3 渐变作为“背景生产工具”

CSS渐变本质上是图片,浏览器根据参数实时生成。大部分UI需求的纹理背景、氛围渐变、进度条填充,都可以用它实现。线性渐变linear-gradient是最常用的,角度参数、颜色列表、硬性颜色切换点这三个点掌握之后,几乎能画一切规则背景。

一个我经常用的边框渐变技巧,是利用background-clip让背景只显示在文字或边框内部:

.gradient-border { border: 2px solid transparent; background: linear-gradient(#fff, #fff) padding-box, linear-gradient(135deg, #667eea, #764ba2) border-box; }

这里两层背景分别装在padding-box和border-box里,外圈渐变就成了边框渐变色。这种技巧在工作里比专门的border-image好用得多。实际项目中的渐变原则:别让大面积高饱和渐变成为页面主体视觉,它拖累阅读性;用渐变做点缀或氛围,比做背景墙要稳妥。

5.4 filter和混合模式:效果高级,但别常用

filter系列我用得最多的是grayscale(灰度)、brightness(亮度)和blur(模糊)。灰度常用于一键切换“失效状态”或“死亡黑白主题”,亮度用于鼠标悬浮时给暗色图片加高光,blur配合backdrop-filter处理毛玻璃背景。backdrop-filter的坑在于它模糊的是元素背后的所有内容,性能开销明显高于普通filter。

混合模式mix-blend-mode则更偏创意设计,比如文字叠加在图片上时用multiply和overlay能让文字和图片融合。但因为混合模式的渲染依赖目标元素的背景图层,在复杂嵌套和滚动容器里很容易踩“不生效”的坑,我建议只在视觉特定的海报、卡片区域使用,不要全站铺开。

5.5 组合一个真实卡片:视觉能力的协同工作

把这些能力组合到一起,其实就是一个现代卡片组件的标准流程:外层结构使用grid或flex布局,卡片本身带border-radius圆角、双层box-shadow阴影、渐变背景,图片部分用filter处理灰度到彩色的过渡,悬浮状态使用transform做轻微上移,并用transition控制过渡时长。这套组合拳写出来不超过40行CSS,效果却比CSS2.1时代动辄四五张图片的方案优雅得多。核心经验是:每种视觉属性都有自己的职责边界,组合使用时,你必须心里清楚每个值承担的任务,而不是把所有效果都堆上去。

6. 响应式与主题工程:媒体查询、CSS变量与现代流式尺寸

6.1 媒体查询的断点选择:从内容出发,而不是设备列表

媒体查询Media Queries是CSS3里定义响应式的基础能力。常见写法是配合min-width和max-width设置断点。很多新手习惯按iPhone、iPad、笔记本的固定尺寸来写断点,但这样做的问题是设备尺寸日新月异,三个月后又得改。

更稳固的做法是让断点设计服务于内容本身:当导航栏宽度不够塞下所有菜单项,就折叠;当卡片一行只能排下一张,就改为流式排列。开发起来一般是“从小屏往上写”或“从大屏往下写”,团队统一一种方向即可,否则某些样式会被莫名覆盖。我自己习惯用min-width向上兼容的写法,把移动端作为默认样式,再逐步对更大屏幕增强。

6.2 CSS变量:把样式表变成可配置的“设计系统”

自定义属性(俗称CSS变量)虽然不属于最早的CSS3版本,但它是整个CSS生态演进到成熟阶段的重要一环,现在谈现代CSS开发几乎绕不开它。变量通过--name声明,通过var()读取,遵循继承规则:

:root { --color-primary: #2d7ff9; --radius-md: 8px; --space-md: 16px; } .btn { background: var(--color-primary); border-radius: var(--radius-md); padding: var(--space-md); }

变量最大的工程价值在于让主题可配置。你只需要改变:root里的变量值,整站的主题色、间距、圆角体系全部联动。它还天然配合媒体查询实现暗色模式:

:root { --bg: #ffffff; --text: #1f1f1f; } @media (prefers-color-scheme: dark) { :root { --bg: #1f1f1f; --text: #f5f5f5; } } body { background: var(--bg); color: var(--text); }

CSS变量的另一大用途是配合JavaScript做动态交互。比如根节点挂一个data-theme="dark"属性,或者通过脚本实时设置某个CSS变量,都会让界面在运行时切换主题变得极其轻量,不需要重写类名和样式。

6.3 流式尺寸与容器查询:响应式从“整页”走向“元件级”

除了媒体查询整页布局,CSS3后演进出来的尺寸函数也很值得掌握。clamp()可以把“多个环境下的取值规则”压缩成一行:clamp(1rem, 2vw + 0.5rem, 1.5rem)表示取值下限1rem、理想值随视口变化、上限1.5rem。用它设置标题字号,可以避免像逐断点写font-size那样冗长。

容器查询则是比媒体查询更细粒度的响应式能力,它让组件根据“自身所在容器”的宽度来调整内部布局,而不是依赖整个视口。这在卡片被复用到侧栏和主内容区时特别有力。现阶段使用容器查询的浏览器支持已经很普遍,但团队项目中最好提供降级方案:在无支持的环境下用默认样式兜底。

6.4 兼容性与降级策略:先写标准,再补补丁

CSS新特性在项目里落地,最关键的不是“能不能用”,而是“不支持时会发生什么”。我的处理原则是:新能力只用于增强,不可用于必需字段。比如用@supports来做特性检测,当浏览器支持grid时启用grid布局,不支持的场景则保留flex或块级布局兜底:

@supports (display: grid) { .layout { display: grid; grid-template-columns: 1fr 1fr; } }

至于CSS前缀,现代浏览器对标准属性的支持已经很稳定,当年为了兼容而疯狂加-webkit-、-moz-前缀的做法已经过时。现在只有极个别属性需要临时前缀,并且要用autoprefixer这类工具统一处理,手写散落各处的“-webkit-xx: yy;-moz-xx: yy;”是在制造维护地狱。

7. 项目落地中的几条习惯:把CSS3能力变成团队资产

7.1 从“写页面”到“搭规范”的转变

当CSS3能力足够丰富之后,最怕的不是不会用,而是每个人按自己风格随便用,导致代码盘点时发现同一套交互有五种实现。我在团队里的做法是建立一份家常CSS规范,用最短篇幅约束最高频的决策:盒模型一律border-box;布局优先grid,一维小部件用flex;动效属性只允许transform、opacity和自定义变量;视觉颜色一律走CSS变量,禁止在组件里散落魔法数值。规则不需要很多,但每条都要能挡住90%的混乱。

7.2 一个实用的调试顺序:样式出问题时,先怀疑“计算值”

实际工作中遇到的CSS3问题,大约一半不是语法错,而是失灵:“为什么flex没把两个元素分开”“为什么旋转不是绕中心”“为什么动画最后跳回原样”。遇到这些情况,我的排查顺序永远是浏览器DevTools里先看计算样式,再对照“该生效的选择器权重”和“是否被其他覆盖”,最后才怀疑浏览器兼容性。权重和被覆盖的问题占比远大于新特性支持度问题。

7.3 移动端优先的性能红线

最后分享一条长期踩坑换来的经验:在移动端,CSS3能做的事很多,但不是每件事都适合做。阴影要克制,模糊滤镜要慎重,大面积渐变配合滚动要警惕,will-change不要长驻,3D变换不要为了“看起来高级”而滥用。每加入一个视觉属性,都要在真实低端机上跑一遍列表滚动和动画切换,卡顿出现时,第一刀往往是砍视觉而不是加优化。能让代码在复杂场景下依然保持帧率和可读性,才算真正把CSS3用明白了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询