三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

CSS核心概念与实战:从盒模型到Flex/Grid布局的完整指南

CSS核心概念与实战:从盒模型到Flex/Grid布局的完整指南

1. 项目概述:为什么CSS是前端开发的基石?

如果你刚接触网页开发,可能会觉得HTML是骨架,JavaScript是大脑,那CSS是什么?我干了这么多年,可以很肯定地告诉你,CSS是网页的“皮相”和“气质”。一个只有HTML的页面,就像毛坯房,能住,但毫无美感;而CSS就是那个精装修的设计师,决定了这个房子是北欧极简风,还是中式古典风,亦或是赛博朋克风。最近我看到很多新手在搜“CSS零基础快速入门”,也看到热词里充满了各种具体问题,比如“css flex布局”、“css动画”、“css选择器”,这恰恰说明大家已经从“知道有这么个东西”的阶段,进入了“我该怎么用它解决实际问题”的实战阶段。

这个教程的目的,就是帮你跨过这个门槛。我不会给你罗列一本厚厚的CSS属性字典,那只会让你望而生畏。我会从一个从业者的角度,带你理解CSS的核心设计思想,然后手把手教你用最常用、最实用的20%的属性和技巧,去解决80%的样式问题。你会发现,那些看似复杂的“css涟漪光圈扩散”效果,或者让人头疼的“css flex:1是什么意思”,其背后的逻辑都是一脉相承的。学完这篇,你不仅能写出样式,更能理解为什么这么写,以及当效果不如预期时,该如何像侦探一样排查问题。这,才是真正意义上的“入门”。

2. 核心思想:理解CSS的“层叠”与“盒模型”

在动手写第一行CSS代码之前,我们必须先建立两个最核心的认知模型。这就像学武功先学心法,心法通了,招式学起来才快。

2.1 层叠样式表:为什么叫“层叠”?

CSS的全称是Cascading Style Sheets,关键词是“Cascading”(层叠)。你可以把它想象成一层层的透明薄膜。最底层是浏览器的默认样式(比如<h1>字体很大、<a>是蓝色带下划线),然后是我们写的作者样式,最后是用户可能设置的自定义样式(比如调大字体)。这些“薄膜”一层层叠上去,最终我们看到的效果,是所有这些层共同作用的结果。

但层叠不是简单的覆盖,它有一套精确的优先级计算规则,我称之为“CSS权力游戏”:

  1. 重要性(!important):这是“尚方宝剑”,优先级最高,但滥用会导致样式难以维护,我个人的经验是,除非是为了覆盖第三方库的样式,否则尽量不用。
  2. 来源:作者样式(我们写的) > 用户样式 > 浏览器默认样式。
  3. 选择器特异性:这是日常开发中最常较量的部分。它的权重计算像一个四位数的得分:(内联样式, ID选择器, 类/伪类/属性选择器, 元素/伪元素选择器)。
    • 内联样式(如style=“color: red;”)得分是 (1,0,0,0)。
    • #header .nav a:hover这个选择器,包含1个ID、1个类、1个伪类、1个元素,得分是 (0,1,2,1)。
    • 得分从高位到低位比较,高位数字大的胜出。所以 (0,1,0,0) 的优先级远高于 (0,0,12,0)。很多新手写的样式不生效,八成是输在了选择器特异性上。
  4. 代码顺序:当来源和特异性完全相同时,后定义的样式会覆盖先定义的。

注意:理解特异性是调试CSS的基石。当你发现样式没按预期渲染,第一个就应该打开浏览器开发者工具,看看你写的规则是否被更高特异性的规则覆盖了。

2.2 盒模型:一切元素的本质都是“盒子”

CSS看待页面上的每一个元素(无论是<div><p>还是<span>),都将其视为一个矩形的盒子。这个盒子由内到外,由四部分组成:

  • 内容区(Content):显示文本、图片等的区域,尺寸由widthheight设定。
  • 内边距(Padding):内容区与边框之间的透明区域,用于增加内容周围的留白。
  • 边框(Border):包裹内边距和内容区的边界线。
  • 外边距(Margin):盒子与其他盒子之间的透明区域,用于控制盒子间的距离。

这里有一个至关重要的概念:标准盒模型。当我们设置一个元素的width: 200px;时,在标准盒模型下,这200px仅仅指内容区的宽度。这个元素在页面上实际占据的总宽度是:width + padding-left + padding-right + border-left + border-right + margin-left + margin-right。这经常导致新手疑惑:“我明明设了200px宽,为什么实际占的空间远不止200px?”

为了解决这个问题,CSS3引入了box-sizing属性。将其设置为border-box后,width: 200px;就变成了**整个盒子可见宽度(内容+内边距+边框)**的总和。内容区会自动收缩以适应这个总宽度。在现代开发中,我几乎会在所有项目的全局样式中加上* { box-sizing: border-box; },这能让布局计算变得直观得多。

3. 从选择器开始:精准定位你的目标元素

写CSS就像给网页元素下命令,而选择器就是你的“点名册”。点对了名,命令才能生效。

3.1 基础选择器:构建你的词汇库

  • 元素选择器:直接使用HTML标签名,如p { color: blue; }会给所有段落上色。
  • 类选择器(.):最常用、最灵活的选择器。在HTML中定义class=“highlight”,在CSS中用.highlight { background: yellow; }来选中。一个元素可以有多个类,用空格分隔。
  • ID选择器(#):选择具有特定id属性的元素,如#header { height: 60px; }。ID在页面中应该是唯一的,特异性很高,通常用于标识页面中唯一的顶级结构,如页头、页脚。
  • 通配符选择器(*):匹配所有元素。常用于全局重置,如上面提到的box-sizing设置,但需谨慎使用,以免造成性能负担。

3.2 进阶选择器:组合与关系

掌握了单词,就要学造句。通过组合和描述元素间的关系,可以更精确地命中目标。

  • 后代选择器(空格)#nav ul li a会选择ID为nav的元素内部,所有ul里的li里的a标签。这是一种“包含”关系。
  • 子元素选择器(>)#nav > ul > li只选择作为#nav直接子元素的ul,以及作为该ul直接子元素的li。这比后代选择器更严格。
  • 相邻兄弟选择器(+)h1 + p会选择紧跟在h1后面的第一个p元素。常用于为特定顺序的元素添加特殊样式。
  • 通用兄弟选择器(~)h1 ~ p会选择h1后面所有的同级p元素。

3.3 伪类与伪元素:选择“状态”与“特定部分”

这是CSS强大而精妙的地方。

  • 伪类:用于选择处于特定状态的元素,最常见的就是链接状态。
    • :link未访问链接
    • :visited已访问链接(出于隐私考虑,现代浏览器对此状态可用的样式限制极多)
    • :hover鼠标悬停
    • :focus获得焦点(如输入框被点击时)
    • :active被激活时(如鼠标按下未松开)
    • 结构伪类如:first-child(第一个子元素)、:nth-child(n)(第n个子元素)也非常强大,可以轻松实现斑马纹表格等效果。
  • 伪元素:用于选择元素的某个特定部分,并用CSS为其创建虚拟内容。
    • ::before在元素内容插入虚拟内容。
    • ::after在元素内容插入虚拟内容。
    • 它们必须配合content属性使用,即使内容为空content: “”;。这是实现小图标、清除浮动等效果的利器。

实操心得:关于热词中提到的“css中lang伪类选择器”,它写作:lang(en),用于选择带有特定语言的元素(如<html lang=“en”>)。这在多语言网站中为不同语言设置特定字体或引号样式时非常有用,但日常单语言项目中用得不多。

4. 布局革命:Flexbox与Grid,告别浮动与定位的苦海

早期CSS布局主要靠floatposition,过程如同用螺丝刀组装家具,繁琐且容易出错。Flexbox和Grid的出现,就像给了你电动螺丝刀和设计图纸,让复杂布局变得轻而易举。

4.1 Flexbox:一维布局的终极解决方案

Flexbox(弹性盒子)专为处理一维布局(要么行,要么列)而设计。它通过将容器设为display: flex;,将其直接子元素变为“弹性项目”来工作。

核心概念(容器属性):

  • flex-direction:定义主轴方向。row(默认,水平)、column(垂直)、row-reversecolumn-reverse
  • justify-content:定义项目在主轴上的对齐方式。flex-start(起始)、flex-end(末尾)、center(居中)、space-between(两端对齐,项目间间隔相等)、space-around(每个项目两侧间隔相等)。
  • align-items:定义项目在交叉轴上的对齐方式。stretch(默认,拉伸填满)、flex-startflex-endcenterbaseline(基线对齐)。
  • flex-wrap:定义是否换行。nowrap(默认,不换行)、wrap(换行)。

项目属性:

  • flex-grow:定义项目的放大比例,默认为0(不放大)。如果所有项目flex-grow为1,则等分剩余空间。
  • flex-shrink:定义项目的缩小比例,默认为1(空间不足时等比缩小)。设为0则禁止缩小。
  • flex-basis:定义项目在分配多余空间之前的默认大小。可以是像素值或百分比。
  • flex:是flex-growflex-shrinkflex-basis的简写。flex: 1这个热词问题,它等价于flex: 1 1 0%。意思是:可以放大(1),可以缩小(1),初始尺寸为0。这会让该项目根据容器的剩余空间动态伸缩,是实现等分布局或占满剩余空间的常用写法。
  • align-self:允许单个项目有与其他项目不一样的对齐方式,覆盖align-items

实操场景:导航栏、卡片列表、垂直居中(只需在容器上设置display: flex; justify-content: center; align-items: center;,这是史上最简单的垂直居中方案)。

4.2 CSS Grid:二维布局的王牌

如果说Flexbox是强大的“线”,那么Grid就是精密的“网”。它专为二维布局(同时处理行和列)而生,堪称布局系统的终极形态。

核心概念:将容器设置为display: grid;,你就拥有了一张可以自定义的网格。

  • 定义网格
    .container { display: grid; grid-template-columns: 100px 1fr 2fr; /* 三列:第一列固定100px,第二列占1份剩余空间,第三列占2份 */ grid-template-rows: 80px auto; /* 两行:第一行高80px,第二行自动高度 */ gap: 20px; /* 热词中的`css gap`,设置行与列之间的间隙,比用margin方便得多 */ }
  • 放置项目: 项目可以通过grid-columngrid-row来指定自己占据网格的哪些区域。
    .item-header { grid-column: 1 / 4; /* 从第1条列线开始,到第4条列线结束(即跨越三列) */ grid-row: 1; /* 占据第1行 */ } .item-sidebar { grid-column: 1; grid-row: 2; } .item-main { grid-column: 2 / 4; grid-row: 2; }
    你还可以使用命名的网格区域(grid-template-areas),让布局代码像画图一样直观。

Flexbox vs Grid 如何选?我的经验法则是:如果布局明显是一维的(比如导航栏、工具栏、瀑布流列表),用Flexbox。如果布局是二维的,有明显的行和列规划(比如整个页面的主体结构、仪表盘、图库),用Grid。两者并不互斥,经常可以嵌套使用,比如用Grid搭建页面骨架,内部用Flexbox排列内容。

5. 样式美化:颜色、字体与背景的艺术

布局是骨架,样式美化才是赋予网页灵魂的关键。

5.1 颜色与渐变

  • 颜色表示法
    • 关键词:red,blue,transparent(透明)。
    • 十六进制:#ff0000(红),#fff(白色的简写)。
    • RGB/RGBA:rgb(255, 0, 0)rgba(255, 0, 0, 0.5)(最后一个参数是透明度,0-1之间)。
    • HSL/HSLA:hsl(0, 100%, 50%)(色相,饱和度,明度),更符合人类直觉。
  • 渐变(Gradient):热词中“css 字体渐变”通常是通过background-clip: text;配合背景渐变实现的。
    .gradient-text { background: linear-gradient(to right, #ff8a00, #da1b60); -webkit-background-clip: text; /* 兼容Webkit内核浏览器 */ background-clip: text; color: transparent; /* 将文字本身颜色设为透明,露出背景渐变 */ }
    背景渐变本身使用linear-gradient()(线性渐变)或radial-gradient()(径向渐变)函数。

5.2 字体与排版

  • 字体栈(font-family):指定一组按优先级排列的字体族。font-family: “Helvetica Neue”, Helvetica, Arial, sans-serif;浏览器会从左到右查找可用字体。
  • Web字体:使用@font-face规则引入自定义字体(如Google Fonts上的字体),打破“网页安全字体”的限制。
  • 文字样式
    • text-align:对齐方式。
    • line-height:行高,对于单行文本垂直居中有奇效(设置与height相同)。
    • text-decoration:下划线、删除线等。
    • text-shadow:文字阴影,创造立体感。
    • writing-mode:热词中的“css文字竖着排列”,可以通过writing-mode: vertical-rl;(垂直,从右到左)实现。

5.3 背景与边框

  • 背景background是一个简写属性,包含颜色、图片、位置、大小、重复方式等。background-size: cover/contain;是控制背景图缩放的关键。热词问的“css contain与scale-down 区别”:contain会缩放图片以使其完全适应内容区,可能留白;cover会缩放图片以完全覆盖内容区,可能裁剪;scale-down会比较contain和图片原始大小,取较小的那个来显示。
  • 边框border: 1px solid #ccc;是简写。你可以单独设置每一边的边框。border-radius用于制作圆角,设置为50%即可得到圆形。利用边框技巧,可以画出三角形、梯形等形状。
  • 盒子阴影box-shadow: h-offset v-offset blur spread color inset;参数依次是水平偏移、垂直偏移、模糊半径、扩散半径、颜色、内阴影。这是创造层次感和立体感最重要的属性之一。

6. 动起来:Transform、Transition与Animation

静态页面是杂志,有了动画就成了电影。CSS提供了三种主要的动画工具。

6.1 Transform(变形)

改变元素的形状、位置,但不影响文档流(旁边的元素不会因此移动)。

  • translate(x, y):移动。translateX(50px)translateY(-10%)。这是实现元素居中或微调的利器。
  • rotate(deg):旋转。rotate(45deg)
  • scale(x, y):缩放。scale(1.2)放大1.2倍。
  • skew(x-deg, y-deg):倾斜。

可以组合使用:transform: translateX(50px) rotate(15deg);

6.2 Transition(过渡)

让元素样式的变化平滑地发生,而不是瞬间跳变。

.button { background-color: blue; transition: background-color 0.3s ease-in-out; /* 属性 时长 缓动函数 */ } .button:hover { background-color: red; /* 鼠标悬停时,背景色会在0.3秒内平滑地从蓝过渡到红 */ }

transition可以监听多个属性,用逗号分隔。缓动函数(easing function)如easeease-inease-outcubic-bezier(),决定了变化的速度曲线,是让动画看起来“自然”的关键。

6.3 Animation(动画)

比Transition更强大,可以定义复杂的、多关键帧的动画序列。

  1. 定义关键帧
    @keyframes bounce { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-20px); } }
  2. 应用动画
    .ball { animation: bounce 1s infinite ease-in-out; /* 动画名 时长 迭代次数 缓动函数 */ }
    热词中的“css动画旋转”可以这样实现:@keyframes spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } },然后应用animation: spin 2s linear infinite;

热词“css涟漪光圈扩散”实现思路:通常用多个逐渐放大的、透明的圆环来实现。可以为一个元素(如按钮)添加多个::after伪元素,为每个伪元素设置不同的animation-delay(动画延迟),让它们依次执行放大和淡出的动画,形成涟漪扩散的视觉效果。

7. 响应式设计与实用技巧

现代网页必须在手机、平板、电脑等各种尺寸的屏幕上都能良好显示,这就是响应式设计。

7.1 媒体查询(Media Queries)

媒体查询是响应式设计的核心语法,它允许我们根据设备的特性(如屏幕宽度)来应用不同的CSS规则。

/* 默认样式(移动设备优先) */ .container { padding: 10px; } /* 当屏幕宽度至少为768px时(平板及以上) */ @media (min-width: 768px) { .container { padding: 20px; } } /* 当屏幕宽度至少为1024px时(桌面端) */ @media (min-width: 1024px) { .container { padding: 40px; } }

实操心得:我强烈推荐采用“移动设备优先”的策略。先为小屏幕编写核心样式,然后通过min-width媒体查询逐步增强大屏幕的体验。这比先做桌面版再裁剪要更高效、更健壮。

7.2 相对单位与视口单位

  • 相对单位
    • %:相对于父元素的对应属性。
    • em:相对于当前元素的字体大小。2em就是当前字体大小的2倍。
    • rem:相对于根元素(<html>)的字体大小。这是我最推荐的用于间距、尺寸的单位,因为它只依赖一个根基准,计算简单,易于维护。通常我会设置html { font-size: 62.5%; },这样1rem就等于10px(因为浏览器默认字体大小通常是16px,16*0.625=10),计算起来非常方便。
  • 视口单位
    • vw:视口宽度的1%。50vw等于视口宽度的一半。
    • vh:视口高度的1%。
    • vmin/vmax:视口较小/较大尺寸的1%。这些单位非常适合制作全屏轮播图、标题等。

7.3 实用CSS技巧与常见问题排查

  1. 垂直居中

    • 单行文本:line-height等于height
    • 绝对定位元素:top: 50%; left: 50%; transform: translate(-50%, -50%);
    • Flexbox:容器设置display: flex; justify-content: center; align-items: center;(首选)。
    • Grid:容器设置display: grid; place-items: center;
  2. 清除浮动:旧式布局遗留问题。父元素包含浮动子元素时,会高度塌陷。解决方案:

    • 现代方案:直接使用Flexbox或Grid布局,从根本上避免浮动。
    • 传统方案:在父元素末尾添加一个伪元素。
    .clearfix::after { content: “”; display: block; clear: both; }
  3. CSS变量(自定义属性):定义可复用的值。

    :root { --primary-color: #007bff; --spacing-unit: 8px; } .button { background-color: var(--primary-color); padding: calc(var(--spacing-unit) * 2); /* 可以进行计算 */ }

    修改变量值(如通过JavaScript或媒体查询),所有使用该变量的地方都会自动更新,极大提升了主题切换和响应式设计的效率。

  4. 常见问题排查表: | 现象 | 可能原因 | 排查步骤 | | :--- | :--- | :--- | | 样式不生效 | 1. 选择器特异性不够
    2. 样式被更高优先级规则覆盖
    3. 拼写错误或语法错误 | 1. 打开浏览器开发者工具(F12),检查元素,查看应用的样式规则及被覆盖的规则(带删除线的)。
    2. 检查CSS文件是否成功加载。 | | 布局错乱,元素位置不对 | 1. 盒模型计算问题(未用border-box
    2. 浮动或定位未清除
    3. Flex/Grid容器属性设置错误 | 1. 为元素添加临时边框border: 1px solid red;可视化其占据的空间。
    2. 检查容器的display属性是否正确设置。 | | 动画不执行 | 1. 关键帧名称拼写错误
    2. 动画属性拼写错误
    3.display: none;的元素无法应用过渡/动画 | 1. 检查@keyframes名称与animation-name是否一致。
    2. 尝试先应用一个简单的动画(如改变颜色)测试。 | | 在不同设备上显示不一致 | 1. 未做响应式处理
    2. 视口(viewport)未正确设置 | 1. 确保HTML头部有<meta name=“viewport” content=“width=device-width, initial-scale=1.0”>
    2. 使用媒体查询针对不同断点调整样式。 |

8. 实战:构建一个简单的响应式卡片组件

让我们综合运用以上知识,构建一个热词中提到的“html css网页制作成品”——一个简单的响应式卡片组件。

HTML结构 (index.html):

<!DOCTYPE html> <html lang=“zh-CN”> <head> <meta charset=“UTF-8”> <meta name=“viewport” content=“width=device-width, initial-scale=1.0”> <title>CSS实战 - 响应式卡片</title> <link rel=“stylesheet” href=“style.css”> </head> <body> <div class=“card-container”> <article class=“card”> <div class=“card__image”> <img src=“https://picsum.photos/400/300?random=1” alt=“示例图片”> </div> <div class=“card__content”> <h3 class=“card__title”>CSS Flex布局深入解析</h3> <p class=“card__desc”>本文将详细讲解Flexbox的核心概念、属性及应用场景,帮助你彻底掌握一维布局。</p> <div class=“card__meta”> <span class=“card__tag”>前端</span> <span class=“card__date”>2023-10-27</span> </div> <a href=“#” class=“card__button”>阅读全文</a> </div> </article> <!-- 可以复制多个.card来查看布局效果 --> </div> </body> </html>

CSS样式 (style.css):

/* 1. 全局重置与基础设置 */ * { margin: 0; padding: 0; box-sizing: border-box; /* 使用border-box盒模型,布局计算更直观 */ } body { font-family: -apple-system, BlinkMacSystemFont, “Segoe UI”, Roboto, sans-serif; line-height: 1.6; color: #333; background-color: #f5f7fa; padding: 20px; min-height: 100vh; display: flex; justify-content: center; align-items: flex-start; /* 卡片容器顶部对齐 */ } /* 2. 卡片容器 - 使用Flexbox实现响应式排列 */ .card-container { display: flex; flex-wrap: wrap; /* 允许换行 */ gap: 30px; /* 使用gap属性轻松设置卡片间距 */ justify-content: center; /* 卡片居中 */ max-width: 1200px; /* 限制最大宽度 */ width: 100%; } /* 3. 单个卡片样式 */ .card { background: white; border-radius: 12px; /* 圆角 */ overflow: hidden; /* 防止图片溢出圆角 */ box-shadow: 0 5px 15px rgba(0, 0, 0, 0.08); /* 添加阴影,增加层次感 */ transition: transform 0.3s ease, box-shadow 0.3s ease; /* 添加悬停动画 */ flex: 1 1 300px; /* 关键!flex-grow:1, shrink:1, basis:300px。卡片可伸缩,基础宽度300px */ max-width: 400px; /* 最大宽度限制 */ display: flex; flex-direction: column; /* 卡片内部采用垂直Flex布局 */ } .card:hover { transform: translateY(-5px); /* 悬停时轻微上浮 */ box-shadow: 0 15px 30px rgba(0, 0, 0, 0.12); } /* 4. 卡片图片区域 */ .card__image { width: 100%; height: 200px; overflow: hidden; } .card__image img { width: 100%; height: 100%; object-fit: cover; /* 让图片覆盖整个区域,可能裁剪,保持比例 */ transition: transform 0.5s ease; } .card:hover .card__image img { transform: scale(1.05); /* 悬停时图片轻微放大 */ } /* 5. 卡片内容区域 */ .card__content { padding: 24px; flex-grow: 1; /* 让内容区域占据剩余空间,保证按钮在底部 */ display: flex; flex-direction: column; } .card__title { font-size: 1.4rem; margin-bottom: 12px; color: #2c3e50; line-height: 1.3; } .card__desc { color: #666; margin-bottom: 20px; flex-grow: 1; /* 描述文字占据剩余空间,将元信息和按钮推到底部 */ } /* 6. 卡片元信息(标签和日期) */ .card__meta { display: flex; justify-content: space-between; align-items: center; margin-bottom: 20px; font-size: 0.9rem; } .card__tag { background: #e3f2fd; color: #1976d2; padding: 4px 10px; border-radius: 20px; /* 胶囊形状 */ font-weight: 500; } .card__date { color: #95a5a6; } /* 7. 卡片按钮 */ .card__button { display: inline-block; background: linear-gradient(to right, #4776E6, #8E54E9); /* 渐变背景 */ color: white; text-decoration: none; padding: 12px 24px; border-radius: 6px; text-align: center; font-weight: 600; transition: all 0.3s ease; border: none; cursor: pointer; /* 使用Flexbox让按钮在容器内水平居中(如果内容宽度不定) */ align-self: flex-start; /* 或 center,取决于设计 */ } .card__button:hover { background: linear-gradient(to right, #3960c7, #7c48cf); box-shadow: 0 4px 12px rgba(142, 84, 233, 0.3); } /* 8. 响应式调整 - 媒体查询 */ @media (max-width: 768px) { .card { flex-basis: 100%; /* 在平板及以下,卡片占满一行 */ max-width: 100%; } .card-container { gap: 20px; } body { padding: 15px; } } @media (max-width: 480px) { .card__content { padding: 18px; } .card__title { font-size: 1.2rem; } }

这个组件用到了哪些核心知识?

  1. Flexbox布局.card-container使用Flexbox实现卡片的自动换行和对齐;.card内部也使用Flexbox进行垂直排列和内容区域的空间分配。
  2. 响应式设计:通过媒体查询@media,在屏幕变小时调整卡片的flex-basis和内边距。
  3. CSS Grid的替代:这里用Flexbox的flex-wrapgap实现了类似网格的响应式效果。对于更复杂的二维布局,可以改用Grid。
  4. 过渡与变形:卡片和图片的悬停效果使用了transitiontransform
  5. 盒模型与盒阴影:使用border-box,并通过border-radiusbox-shadow美化卡片。
  6. 相对单位:使用rem%px混合单位,平衡灵活性与精确控制。
  7. BEM命名规范:类名采用了.block__element--modifier的格式,提高CSS的可读性和可维护性。

把这个HTML和CSS代码分别保存为文件,用浏览器打开HTML文件,你就得到了一个具有悬停动画、响应式布局、美观现代的卡片组件。调整浏览器窗口大小,观察卡片如何自动排列。这只是一个起点,你可以在此基础上修改颜色、尺寸、动画,甚至结合CSS Grid来创建更复杂的布局。动手实践,是掌握CSS最快的方式。

← 返回列表