尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

CSS核心知识梳理:从选择器、盒模型到动画实战

CSS核心知识梳理:从选择器、盒模型到动画实战 1. 先捋清楚CSS的知识版图想把CSS学好最怕的就是东一榔头西一棒子。今天学个选择器明天看个动画后天又去折腾居中结果三个月过去知识点全是散的写页面还是靠猜。我刚开始学CSS的时候就是这个状态后来花了不少时间把整个知识体系重新梳理了一遍才终于有一种通了的感觉。这篇记录就是按照我自己踩过的坑、总结过的套路来写的把CSS里最高频、最容易出错、也最常用的知识点串起来适合刚入门不久、或者写了一段时间但总觉得基础不扎实的同学。CSS这门语言说白了就是给HTML化妆的。但它不是简单的涂个颜色、改个字号那么肤浅它背后有一套完整的规则选择器决定了给谁化妆盒模型决定了妆面占多大地方定位和布局决定了妆化在哪个位置动画和过渡则决定了这个妆怎么动起来。这四个层次恰好就是CSS从入门到精通的四条主线。这篇文章不会按教科书顺序平铺直叙而是按照我在实际开发中真正用得上的顺序来组织。先从让你能选中任何元素的选择器讲起再到绕不开的盒模型然后是让无数新手抓狂的居中问题接着是字体和文本这些细节控的最爱最后用几个进阶玩法收尾——渐变、动画、剪裁效果、甚至原子化CSS的思路。每个部分我都会给出能直接复制的代码也会说明背后为什么要这么写这样才能做到既知其然又知其所以然。2. 基础层选择器、样式引入与盒模型2.1 选择器从ID、类到各种进阶玩法CSS选择器是这门语言的起点它决定了你的样式规则作用在哪些元素上。基础阶段最常用的就是ID选择器和类选择器。ID选择器用#开头比如#header它的特点是唯一性——一个页面里同一个ID只能用一次所以ID选择器通常用来定位页面里独一无二的模块比如顶部导航、侧边栏、底部版权区。类选择器用.开头比如.btn它可以无限复用想给多少个元素加样式就加多少个这是日常开发中使用频率最高的选择器。但光会这两个是不够的实际项目里你还会频繁用到这些标签选择器p、h1、ul这类作用是给某类标签设定统一的默认样式通配符选择器*经常用来做样式重置后代选择器div p选择某个元素内部的所有匹配元素子元素选择器div p只选直接子元素不考虑更深的嵌套。等你用熟了not选择器会是你的好帮手。它允许你排除某些元素比如你想给所有段落加左边距但最后一段不加就可以写成p:not(:last-child) { margin-left: 20px; }这个在列表、卡片组、表格行里都特别常用比给每个元素单独加类名要省事得多。另外还有一组伪类和伪元素也非常关键:hover鼠标移入、:focus聚焦、::before和::after在元素内部生成额外内容这几个在后续做鼠标移入交互、装饰性视觉效果的时候是绝对绕不开的。2.2 样式引入的三种方式以及HBuilder里的配置逻辑CSS有三种引入方式行内样式、内嵌样式、外部样式表。行内样式就是直接写在标签的style属性里比如div stylecolor: red好处是优先级最高坏处是没法复用、代码混乱只适合临时调试。内嵌样式是把style标签放在HTML文件的head里适合单页面的小项目。外部样式表则是把CSS单独存成一个.css文件再用link标签引入这是工程化项目的标配。三者的优先级记住一个口诀就行行内 内嵌 外部但在同等优先级下后写的规则会覆盖先写的规则所以外部样式表里同一个类如果被定义了两次后面那次生效。实际开发里我强烈建议全程使用外部样式表把结构和样式彻底分离。你想想一个几十个页面的网站如果每个页面都内嵌一堆样式后期改一个主题色就得全局搜索替换而用外部文件改一个变量就能全局生效。经常有初学者在HBuilder这类编辑器里写CSS发现样式不生效十有八九是引入路径写错了。HBuilder里新建的CSS文件默认放在css目录下HTML文件在根目录引用时应该写link relstylesheet hrefcss/style.css。如果CSS文件是新建在HTML同级的文件夹里路径就要从HTML文件所在位置出发去计算多一层目录就多写一层。还有一个小坑link标签一定放在head里面而且要放在title之后、想在页面加载时尽快渲染样式别放到body里去了否则会出现先裸奔再穿衣服的闪屏现象。2.3 盒模型一切布局的地基盒模型是CSS里最核心、最容易让新手翻车的基础概念。任何一个HTML元素在渲染时都会被浏览器画成一个矩形盒子这个盒子从内到外依次是内容区content、内边距padding、边框border、外边距margin。打个比方你买了一个带包装的快递内容区是商品本身padding是填充的泡沫border是快递纸箱margin是快递箱和邻居快递箱之间的距离。盒模型有两个版本区别在于计算元素总宽度时是否把padding和border算进去。标准盒模型下你设置width: 200px这个200px只是content的宽度实际占据的总宽度还要加上padding和border。怪异盒模型IE盒模型下width: 200px就是整个元素内容paddingborder的总宽度。现代开发统一用box-sizing: border-box也就是怪异盒模型这样设置宽度时心里更有数不会出现明明设了200px实际占了240px的情况。在移动端适配和多列布局里盒模型理解不到位会非常痛苦。比如两个盒子里各占50%宽度只要每个盒子加了padding或border总宽度就会超过父容器导致换行或者错位。用border-box就能避免这种问题。我在写布局时几乎都会在最前面加一条全局规则* { box-sizing: border-box; }这样做的好处是后面的所有计算都基于设置了多宽就是多宽省心不少。但也要注意*通配符选择器会给所有元素统一设置性能上略有损耗团队项目里如果有性能洁癖的人也可以用html, body, div, p, ul, li这种列举的方式不过大多数场景下*就够用了。3. 文本与字体那些看着简单却总在踩坑的知识点3.1 字体设置的底细CSS里设置字体最基础的是font-family、font-size、font-weight、line-height这几个属性。但字体这块有个很重要的坑字体是分族的不同操作系统、不同浏览器对同一款字体的支持情况不一样。所以font-family通常要写一串回退字体比如body { font-family: PingFang SC, Microsoft YaHei, Helvetica Neue, Arial, sans-serif; }这段的意思是优先用苹方如果系统没有就退到微软雅黑再没有就退到Helvetica最后退到系统默认的无衬线字体。千万别只写一个字体名否则在用户机器上没装这个字体时页面会突然变得很难看。字体渐变是另一个看着唬人、实际很简单的效果。文字本身不能直接设置渐变背景但你可以先给文字设成透明然后背景用渐变最后用background-clip: text把背景裁剪成文字的形状.gradient-text { background: linear-gradient(90deg, #ff6b6b, #ffd93d); -webkit-background-clip: text; background-clip: text; color: transparent; }这个技巧在标题、Logo、活动文案上特别好用效果比纯色字显得精致得多。不过要注意background-clip: text的兼容性在现代浏览器里已经没有大问题但考虑到某些场景建议加上-webkit-前缀同时保留color: transparent作为兜底。3.2 删除线、下划线和文字装饰删除线对应的属性是text-decoration: line-through它可以用来表示价格从原价变成折扣价或者表示某条内容已经完成、作废。这个属性看着简单真要做好看还是有讲究的。默认的删除线是一条紧贴文字的细线既不美观也不灵活。想做出更精致的删除线效果可以改用背景模拟。比如给文字外面画一个伪元素或者直接在文字上用background-size控制线条宽度.del-price { text-decoration: none; background: linear-gradient(to right, #999, #999) no-repeat center; background-size: 100% 1px; color: #999; }这样线条的粗细、颜色、位置都能自由调整比默认的删除线自然很多。删除线还有一个常见的隐藏坑默认的删除线会穿过某些字母或文字的中间由于不同字体字形不同可能会盖住笔画影响辨识度。如果遇到这种情况改用背景模拟法通常能解决。3.3 文字外描边让标题更有力文字外描边在CSS里实现方式有好几种最直接的是用text-stroke.outline-text { -webkit-text-stroke: 2px #333; color: transparent; }这个属性目前大多数浏览器都支持但需要加-webkit-前缀。它能让文字呈现空心字或者描边字的效果常见于海报式标题、游戏风格的UI、引导页大标题等场景。如果你想要更精细的控制比如描边带渐变、或者做双层描边我推荐用多重text-shadow来模拟.outline-shadow { text-shadow: 0 0 3px #333, 0 0 3px #333, 0 0 3px #333, 0 0 3px #333; }用四个方向的投影模拟出描边感。这个方法的好处是兼容性极好而且在文字边缘能做出光晕效果非常适合霓虹灯风格的标题。缺点是对性能有一点要求大段文字慎用标题和关键词用没问题。3.4 文本对齐和段落分割线文本对齐这种方式在CSS里是一个看着都会、一写就乱的领域。水平居中很简单text-align: center就能搞定但垂直居中就没有那么统一了需要看你的场景是哪一种。如果是单行文字在固定高度的容器里居中最老土也最稳定的方法是给容器设line-height等于容器高度。如果是多行文本垂直居中那就要依赖弹性布局flex或者网格布局grid了。这个话题我在下一节会详细展开这里先放一个最常用的flex方案.container { display: flex; align-items: center; justify-content: center; height: 200px; }段落分割线这个需求也很有意思比如你想在正文中间插入一条装饰性的水平线或者在两个区块之间加个间隔线。最简单的写法是直接用border-bottom但如果你想要的是文字在线的中间那种效果比如—— 关于我们 ——用伪元素来做最舒服.divider { display: flex; align-items: center; color: #999; } .divider::before, .divider::after { content: ; flex: 1; height: 1px; background: #ddd; } .divider::before { margin-right: 16px; } .divider::after { margin-left: 16px; }这个结构写一次后面就能到处复用比各种奇技淫巧靠谱得多。4. 布局与定位从居中到固定定位4.1 彻底搞懂水平垂直居中怎么让一个元素在页面上水平垂直居中可能是CSS社区里被问得最多的问题没有之一。这里我总结几套方案你自己按场景选。方案一flex弹性布局。父容器设置display: flex; justify-content: center; align-items: center;子元素就居中了。这在绝大多数场景下都是最优解简洁、稳定、兼容性好。我几乎90%的居中需求都是用flex解决的。方案二绝对定位transform。适用于不知道元素自身宽高的场景.center { position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); }原理是先让元素左上角对准父容器中心再用translate把它往回挪自身尺寸的一半。这个方案的核心在于transform: translate是以元素自身宽高为基准的所以你不需要知道元素具体多大都能完美居中。方案三CSS Grid。给父容器设置display: grid; place-items: center;一句话搞定。Grid的place-items实际上是align-items和justify-items的简写在需要同时处理水平垂直居中时效率极高。屏幕上也经常遇到input在表单里怎么居中的问题。其实input本身是个行内块元素如果只是水平居中在父容器上加text-align: center就行因为行内块会像文字一样被对齐。但如果你想让input在页面上水平垂直居中还是要看父容器是不是设置了flex或grid然后按上面方案选一种。4.2 固定定位与侧边栏布局怎么让一个元素固定在页面左右边这个问题对应的是CSS里的position: fixed。它可以让元素相对于浏览器视口固定即使页面滚动它也纹丝不动。最常见的应用就是侧边栏、顶栏、悬浮按钮、回到顶部按钮。比如.sidebar { position: fixed; left: 20px; top: 50%; transform: translateY(-50%); width: 60px; height: 200px; }这段代码能让侧边栏一直挂在窗口左侧中间位置。需要注意的是position: fixed的参照物是视口但如果某个祖先元素设置了transform、perspective或filterfixed会变成相对那个祖先定位这是很多CSS老手都会踩的坑。如果你发现某个fixed元素原地不动的预期失效了优先检查它的父级有没有加transform之类的属性。position: sticky也是现在很常用的定位方式它像是relative和fixed的结合体元素在滚动到某个阈值之前是普通流状态滚到阈值后吸在顶部。做吸顶导航、表头固定时用sticky比用JS监听滚动简单得多性能还好。不过sticky有个重要条件父容器不能有overflow: hidden或overflow: auto否则粘性定位不生效。4.3 让table水平居中以及传统布局的补救方案关于table居中这个问题老开发应该都知道新同学反而容易懵。要table在页面里水平居中最简单的方法是给table的外层容器加.table-wrapper { display: flex; justify-content: center; }或者用传统写法给table自身设置margin: 0 auto。但这里有个细节margin: 0 auto对table生效的前提是table不能是默认的display: table自动撑满状态你最好给它一个明确的宽度。现代布局方式里如果你想做一个真正语义化的table同时能自由控制宽度、间距和边框业界早就把table布局换成了flex或grid布局所以除非你是在改造老代码否则新项目里我更推荐直接用div模拟表格功能。表格本身还有几个高频样式需求合并边框用border-collapse: collapse可以去掉双边框单元格英文不换行要加white-space: nowrap表格内容过长省略号除了设置宽度还要给td加overflow: hidden; text-overflow: ellipsis; white-space: nowrap;这三个固定搭配少一个都不行。4.4 控制容器内文本位置的几种思路怎么调整CSS容器里的文本位置这个问题关键看容器是块级、行内块还是弹性容器。如果是块级容器文本水平位置用text-align控制垂直位置则要么靠padding内边距调整要么靠line-height要么把容器变成flex后用align-items控制。我举个最典型的场景一个按钮文字要在按钮内水平和垂直都居中。按钮默认是行内块元素如果用老的思路会设置text-align: center加line-height等于按钮高度。但现在推荐的做法是直接把按钮变成flex容器.btn { display: inline-flex; align-items: center; justify-content: center; height: 40px; padding: 0 20px; }这样不管按钮里放的是文字、图标还是文字加图标都能自动保持居中不再需要为高度和行高的差值做各种近似计算。这个方法尤其在构建组件库、做通用UI时非常有价值因为内容一旦变长变短传统方案就会乱掉而flex方案天然自适应。5. 视觉效果与动画渐变、涟漪和打点5.1 鼠标移入事件Hover不只是变个颜色CSS里的鼠标移入事件对应的伪类就是:hover。它最容易被人忽略的价值在于你可以利用它做出一整套交互反馈而不是简单地改一下颜色。比如卡片在鼠标移入时轻微上浮、加上阴影变深的效果.card { transition: transform 0.3s ease, box-shadow 0.3s ease; } .card:hover { transform: translateY(-6px); box-shadow: 0 12px 24px rgba(0, 0, 0, 0.1); }鼠标移入还有一个高频需求是显示隐藏在角落的按钮或信息。这个用:hover配合opacity和visibility来实现要注意的是opacity: 0只是看不见但仍占位、仍能响应事件所以最好同时设置visibility: hidden来让它在不可见时也不响应鼠标。在导航栏场景下鼠标移入下拉菜单展开也是:hover的经典用法。只要给父级li设置position: relative给子菜单设置绝对定位并默认隐藏父级hover时子菜单显示就行。整个交互不需要一行JavaScript纯CSS就能完成。5.2 涟漪光圈扩散效果涟漪光圈扩散是很多现代UI里常见的动效比如点击按钮时泛开一圈波纹。CSS实现这个效果的原理并不复杂主要是用keyframes动画配合transform: scale从0到更大的值同时控制透明度从有到无。下面是一个点击后扩散的实现思路.ripple { position: relative; overflow: hidden; } .ripple::after { content: ; position: absolute; left: 50%; top: 50%; width: 0; height: 0; border-radius: 50%; background: rgba(255, 255, 255, 0.5); transform: translate(-50%, -50%); opacity: 0; } .ripple:active::after { width: 200px; height: 200px; opacity: 1; transition: width 0.5s ease-out, height 0.5s ease-out, opacity 0.5s ease-out; }这个写法在按钮点击时产生一个从中心扩散的圆形光圈。实际项目中为了让涟漪从鼠标点击的位置扩散还需要JavaScript配合设置伪元素的定位或者直接改用多个小元素。但如果你只需要一个放在那里自动循环扩散的光圈比如地图定位点的那种效果用纯CSS动画就能写得很漂亮keyframes ripple-wave { 0% { transform: scale(0); opacity: 0.8; } 100% { transform: scale(3); opacity: 0; } } .ripple-dot { width: 20px; height: 20px; border-radius: 50%; background: rgba(255, 80, 80, 0.6); animation: ripple-wave 2s infinite ease-out; }这种动态效果特别适合活动页面、地图标记、直播状态点等场景能很好地抓住用户视线。使用动画时要注意性能尽量对transform和opacity做动画避免对width、height、top、left做大量动画因为前者由GPU合成更快后者会引发重排容易造成页面卡顿。5.3 打点加载、两行省略和优惠券圆切打点加载这个效果很多网页都用加载时显示加载中...然后三个点依次出现。纯CSS实现方式是用:nth-child或animation-delay来让三个点依次闪烁或位移。最简版本.dot { animation: blink 1.4s infinite both; } .dot:nth-child(2) { animation-delay: 0.2s; } .dot:nth-child(3) { animation-delay: 0.4s; } keyframes blink { 0%, 80%, 100% { opacity: 0; } 40% { opacity: 1; } }加上animation-delay让3个小圆点错开节奏就能形成流畅的打点加载动画。两行超出省略号是一个超高频需求。单行超出省略我相信大家都背过那三件套white-space: nowrap; overflow: hidden; text-overflow: ellipsis;。但两行省略号没有对应的纯属性得靠-webkit-line-clamp.ellipsis-2 { overflow: hidden; display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; }这个方案目前现代浏览器都支持这也是热搜里css 两行超出...的答案。要注意的是display: -webkit-box会让元素变成类似flex的老式盒模型部分场景下可能影响其他布局属性所以最好单独抽一个类来用。优惠券圆切这个需求在我的购物类项目里做过好几次指的是优惠券左右两端有两个半圆形的缺口形成那种撕下来的锯齿或弧边效果。传统做法是左右各放一个圆形伪元素背景色和页面背景一致覆盖在券的左右两侧。但如果你券的背景是渐变色这种方法就露馅了因为盖上去的圆形色块没法精确匹配渐变。更优雅的方案是用CSS的mask遮罩让券的左右两侧挖掉两个半圆.coupon { background: linear-gradient(135deg, #ff7a59, #ff5e3a); -webkit-mask: radial-gradient(circle at left center, transparent 16px, black 16px), radial-gradient(circle at right center, transparent 16px, black 16px); mask: radial-gradient(circle at left center, transparent 16px, black 16px), radial-gradient(circle at right center, transparent 16px, black 16px); mask-size: 50% 100%, 50% 100%; mask-position: left center, right center; mask-repeat: no-repeat; }这个写法的核心思路是用两个圆形径向渐变作为遮罩层圆形内部透明、外部是纯色最终作用于券的背景上左右两端就自然抠出了两个半圆。效果非常干净比用伪元素盖色的方案灵活得多。5.4 平移和其他动画核心CSS动画的入门一定绕不开transition和keyframes。transition适合做鼠标移入、状态切换时的平滑过渡比如颜色变化、阴影变化、尺寸变化。keyframes则适合做更复杂的、多阶段变化的动画比如平移、旋转、缩放组合。平移对应的是transform: translateX(...)和translateY(...)。它特别适合做跑马灯、弹窗滑入、轮播图横向移动等效果。要注意的是transform是复合属性如果你想同时做平移和旋转就写在同一个transform里比如transform: translate(100px, 50px) rotate(45deg)而不是分开写两行因为后者会被后者覆盖。动画参数里有几个值得重点揣摩的值ease先快后慢、ease-in加速、ease-out减速、cubic-bezier自定义贝塞尔曲线。追求更自然的动效我会推荐cubic-bezier(0.22, 0.61, 0.36, 1)这种缓入缓出曲线它在运动开始和结束时都有比较人性化的缓冲不会像linear那样生硬。5.5 用CSS实现table居中、input居中流程化前面我分开讲过table和input的居中这里把它们汇总成一个居中问题解决流程先判断容器是否是flex或grid容器如果是直接用justify-content和align-items如果不是看元素是不是有固定宽高的块级元素是的话用margin: auto水平垂直都可以配合绝对定位达成不是的话转换为flex容器再说)。这个流程你走熟了以后遇到任何居中需求基本都能几秒钟定位到解法不用每次去搜索引擎翻答案。6. 从零到落地的几个实操建议6.1 利用HBuilder快速搭建CSS项目HBuilder的HTML/CSS/JavaScript开发配置我用下来最大的感受是零配置友好。新建一个项目选基本HTML项目HBuilder会自动生成index.html、css/style.css和js/main.js这样的目录结构。在index.html里它默认就引好了样式和脚本文件写代码直接跑挺省事。不过有几个小坑要注意HBuilder的显示浏览器按钮默认用的是HBuilder内置浏览器移动端样式可能和Chrome有细微差异。我建议在HBuilder的外部浏览器配置里指定Chrome路径直接使用Chrome调试这样Console面板和Elements面板都是你熟悉的界面。如果你是在学习阶段用HBuilder写CSS最舒服的是它有代码提示和错误高亮输入属性和值的时候能大幅降低拼写错误率。CSS拼写错误是新手最常见的问题比如background-color写成backgroud-color浏览器不会报错但样式就是不生效排查起来特别费时间。6.2 原子性CSS从背样式名到用样式类热搜里出现的原子性CSS是现在大型项目里非常流行的一种思路它的核心思想是把某个单一属性或单一视觉功能提取成一个独立的类比如.mt-20 { margin-top: 20px; }、.text-center { text-align: center; }然后通过组合这些原子类来构建界面。手写原子类有很多工具比如Tailwind CSS算是这个思想的集大成者。不过我建议在学习阶段先理解它的思路就好不必急着引入。写传统CSS时你可能一个类名要做很多事情比如div classcard.../div这个.card里可能包含背景、内边距、字体大小、圆角、阴影等等一堆规则。而原子化CSS的思路则是div classbg-white rounded-lg shadow p-4 text-base.../div每个类只负责一件事组合起来就能快速拼出一个完整的视觉样式。它的好处是开发效率高、样式可控性强坏处是HTML会变得有点长而且如果中间状态的样式要覆盖可能比传统CSS稍绕。实际使用中我建议不要纯原子化也不建议纯语义化而是两者结合全局的排放规则、颜色、间距用原子类复杂的交互组件仍然写成独立的语义化类这样维护起来最舒服。6.3 用CSS入门到精通的思路来组织你自己的知识库我发现很多同学收藏了一大堆CSS从入门到精通系列文章但看完就忘原因在于他们没有把知识转化成自己的笔记。我的建议是准备一个自己习惯的笔记工具然后按照下面的路径来整理先建几个顶级分组比如选择器盒模型布局字体与文本动画实战套路。每学一个新的知识点先用自己的话记录下来然后配一个能跑通的最小代码片段最后标注这个知识点常错的地方。久而久之这本笔记就是你的独家CSS兵器库。我个人记录知识点时特别强调最少案例。每个知识点只保存一个最小可运行的HTMLCSS文件这比记一堆理论要管用得多。比如position: sticky我不写它是什么我只保存一个滚动到顶部吸住的完整页面代码。下次要用直接打开复制改改就行。6.4 整理一份高频CSS快捷键和代码模板在HBuilder或VS Code里写CSS善用快捷方式可以提升很大的效率。比如在VS Code里输入bgc再按Tab会展开成background-color输入df展开成display: flex。HBuilder也有类似的代码块补全。另外把这些高频模板配置成自定义代码片段是另一个提升效率的方式。我自己会在HBuilder里配几个常用代码片段flex居中、按钮重置、两行省略号、涟漪动画、清除浮动。这些模板可以直接调用不用每次都重新敲。你可以根据自己的使用频率定制原则是重复超过三次的代码就应该存成模板。7. 常见问题与排查技巧实录7.1 样式没生效的排查顺序CSS不生效是每个人都会遇到的事而且原因千奇百怪。我总结了一个固定的排查顺序遇到样式问题时直接按顺序检查很少有漏网之鱼第一检查选择器有没有写错。特别是类名和ID名大小写是否完全一致标签名是否拼写正确。第二检查语法有没有问题比如少了大括号、少了分号。一行报错可能导致后面的规则全部失效这时打开浏览器开发者工具的Console面板CSS语法错误一般会直接标出来。第三检查优先级是否有更高优先级的选择器覆盖了你的规则。这时可以在Elements面板中右键点击元素选择检查看元素最终计算出的样式来自哪个文件哪一行。第四检查是否有样式被缓存。外部CSS文件更新后浏览器经常用缓存按CtrlF5强制刷新解决。我见过太多这样的情况改了半天代码结果页面不刷新或者用的还是旧缓存白忙一场。所以强制刷新一定要养成习惯。7.2 盒模型计算超宽的常见原因两个flex子项各占50%但一行放不下这个问题我见得太多了。最常见的原因是子项设置了padding和border而父容器又没有把子项的box-sizing设为border-box。解决方式前面提到过全局设置box-sizing: border-box就行。另一个常见原因是用width配合flex的flex-basis交错使用时实际宽度超出了父容器。解决办法是尽量用flex: 1或flex-basis: 0而非固定宽度让浏览器自己计算。7.3 动画失效或卡顿的排查思路动画不生效第一步看是不是浏览器不支持某个属性比如background-clip: text需要特定的前缀gap在某些旧版浏览器里不支持。第二步看是不是初始状态和结束状态过于相似导致视觉效果不明显。第三步看是不是动画设置在错误的元素上比如你给父容器加了动画但真正该动的是子元素。卡顿的话优先优化动画属性用transform和opacity组合替代width、height的动画。7.4 我搜到的CSS代码为什么在我这里不运行的元问题这个问题的答案其实特别简单但非常重要CSS的兼容性取决于用户的浏览器而不是你的代码本身。同样一段-webkit-line-clamp: 2在Chrome里运行正常在部分老版本的浏览器上可能就是无效的。所以你在复制到项目里的代码时一定要先通过Can I Use这类网站确认一下目标用户群体常用的浏览器是否支持。如果你的官网主要用户来自国内那Chrome内核的浏览器占绝大多数大部分现代CSS特性都能用但如果你需要兼容更老的环境就需要额外处理。7.5 高频问题速查表问题描述关键属性和套路文字水平居中text-align: center块级元素水平居中margin: 0 auto 明确宽度任意元素水平垂直居中flex容器 justify-content: center; align-items: center单行文字在固定高度容器中垂直居中line-height 容器高度元素固定在页面左侧/右侧position: fixed; left/top元素滚动到顶部后吸顶position: sticky; top: 0文本超出两行显示省略号-webkit-line-clamp: 2组合写法文字删除线text-decoration: line-through或背景模拟文字渐变背景渐变 background-clip: textcolor: transparent鼠标移入动效:hovertransition组合优惠券两端圆切缺口mask径向渐变遮罩图片或元素移动transform: translate(x, y)加载打点动画animationanimation-delay错开节奏表格水平居中flex容器或margin: 0 autoinput居中父容器flex 子项align-items/justify-content段落分割线伪元素 左右自动填充线我平时把这套速查表存在笔记里写页面遇到问题先翻表比自己硬想高效得多。最后再多说一个实际经验CSS的学习曲线其实并没有那么陡它最大的特点是反馈快——改一行代码刷新浏览器马上能看到结果。所以别怕动手多试把基础的知识点扎扎实实过一遍很快你就能从一个只会写静态样式的初学者变成能随手写出细腻交互、流畅动效的CSS选手。
返回列表