4、CSS3基础:选择器、盒模型、Flexbox布局、Grid布局、响应式设计入门

各位同学好,我是你们的老朋友。今天咱们来聊聊CSS3。说实话,CSS这东西,刚入门时觉得简单,不就是给HTML穿衣服嘛。但干久了你会发现,CSS的水深着呢。我做了这么多年RMC界面,踩过的坑有一半都跟CSS有关。今天这一章,我把最核心的几个知识点给你捋一遍。

4.1 选择器——你得知道怎么“找到”元素

选择器,说白了就是告诉浏览器:“嘿,我要给这个元素加样式”。CSS3里选择器的花样多了不少,但常用的就那么几种。

4.1.1 基础选择器

  • 元素选择器:直接写标签名,比如 div { },所有div都中招。
  • 类选择器:点号开头,比如 .my-class { },只命中class为my-class的元素。
  • ID选择器:井号开头,比如 #my-id { },一个页面里ID是唯一的。

我个人习惯:类选择器用得最多,ID选择器尽量少用。为啥?因为ID的优先级太高了,后面想覆盖样式会很麻烦。我在项目里见过有人用ID写样式,结果改个颜色得找半天,太痛苦了。

4.1.2 组合选择器

有时候你需要更精确地定位。比如“父元素下的子元素”、“紧挨着的兄弟元素”等等。

/* 后代选择器:div里面的所有p */
div p { color: blue; }

/* 子选择器:div的直接子元素p */
div > p { color: red; }

/* 相邻兄弟选择器:紧跟在h2后面的第一个p */
h2 + p { font-weight: bold; }

/* 通用兄弟选择器:h2后面的所有p */
h2 ~ p { font-style: italic; }

你想想看,在RMC界面里,我们经常要控制某个仪表盘区域内的所有数字显示。用后代选择器就特别方便,一个父容器搞定所有子元素。

4.1.3 伪类与伪元素

伪类,比如 :hover:focus,描述的是元素的特殊状态。伪元素,比如 ::before::after,可以在元素内容前后插入东西。

避坑指南:我曾经在RMC项目里用 :nth-child() 来给表格的奇数行和偶数行设置不同背景色。结果表格里有个隐藏行,奇偶顺序全乱了。后来我改用 :nth-of-type(),只计算同类型的元素,问题就解决了。记住,:nth-child 是所有子元素一起数,:nth-of-type 只数同类型的。

4.2 盒模型——每个元素都是一个盒子

CSS里每个元素都可以看作一个盒子。这个盒子从内到外依次是:内容区(content)、内边距(padding)、边框(border)、外边距(margin)。

嗯,这里要注意一个经典问题:标准盒模型 vs IE盒模型

  • 标准盒模型width 只包含内容区宽度,不包含padding和border。
  • IE盒模型(也叫怪异盒模型):width 包含内容区 + padding + border。

为什么会这样?说白了就是历史遗留问题。现在我们都用 box-sizing: border-box; 来统一成IE盒模型。我个人建议,所有项目一开始就全局设置:

* {
  box-sizing: border-box;
}

这样你设置一个宽度,就是最终显示出来的宽度,不用再算padding和border。我在做RMC界面时,经常要精确控制仪表盘的大小,用border-box省心多了。

4.3 Flexbox布局——一维布局的利器

Flexbox,全称Flexible Box,弹性盒子。它解决的是“在一行或一列里怎么排列元素”的问题。说白了,就是让子元素在父容器里自动伸缩、对齐、排序。

4.3.1 基本用法

.container {
  display: flex;
  justify-content: center;  /* 主轴对齐 */
  align-items: center;      /* 交叉轴对齐 */
  flex-wrap: wrap;          /* 是否换行 */
}

在RMC界面里,Flexbox用得特别多。比如一排仪表盘,每个仪表盘宽度不一样,但又要垂直居中。用Flexbox,一行代码搞定。

我遇到过:一个监控面板,左边是设备列表,右边是实时数据。用Flexbox做两栏布局,左边固定宽度,右边自适应。代码就几行,而且响应式也好做。

4.3.2 子项属性

.item {
  flex: 1;           /* 伸缩比例 */
  align-self: flex-end;  /* 单独对齐 */
  order: 2;          /* 排序,数值越小越靠前 */
}

你想想看,有时候某个仪表盘的数据特别重要,想让它排在最前面。用 order 属性,不用改HTML结构,直接调整显示顺序,多方便。

4.4 Grid布局——二维布局的王者

Grid布局,网格布局。它比Flexbox更强大,能同时控制行和列。Flexbox是一维的,Grid是二维的。如果你要做整个页面的布局,Grid是首选。

4.4.1 基本用法

.container {
  display: grid;
  grid-template-columns: 1fr 2fr 1fr;  /* 三列,比例1:2:1 */
  grid-template-rows: auto 200px;      /* 两行,第一行自适应,第二行固定200px */
  gap: 10px;                           /* 间距 */
}

在RMC界面里,Grid布局特别适合做仪表盘的大屏展示。比如一个4x4的网格,每个格子放一个监控图表。用Grid,几行代码就搭好了骨架。

避坑指南:我曾经用Grid做响应式布局,直接写死了列数。结果在小屏上,内容挤成一团。后来我改用 auto-fillminmax,让列数自动适应屏幕宽度。代码是这样的:

grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));

这样每个格子最小200px,如果屏幕够宽就多放几列,不够就自动换行。完美!

4.4.2 网格区域

你可以给每个网格区域起个名字,然后让元素“住”进去。

.container {
  grid-template-areas:
    "header header header"
    "sidebar main main"
    "footer footer footer";
}

.header { grid-area: header; }
.sidebar { grid-area: sidebar; }
.main { grid-area: main; }
.footer { grid-area: footer; }

这样布局一目了然,改起来也方便。我在做RMC界面时,经常用这种方式来搭页面骨架。

4.5 响应式设计入门——一套代码,多屏适配

响应式设计,说白了就是让页面在不同屏幕上都好看。核心就三个东西:流式布局弹性图片媒体查询

4.5.1 媒体查询

媒体查询可以针对不同的屏幕宽度,应用不同的样式。

/* 默认样式:大屏 */
.container {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
}

/* 屏幕宽度小于768px时:变成单列 */
@media (max-width: 768px) {
  .container {
    grid-template-columns: 1fr;
  }
}

嗯,这里要注意:媒体查询的断点怎么选?我一般用三个断点:

设备类型 屏幕宽度 布局建议
手机 < 768px 单列布局
平板 768px - 1024px 两列布局
桌面 > 1024px 三列或更多

警告:不要用设备型号来定断点,要用内容。比如你的内容在600px时开始换行不好看,那就把断点设在600px。我见过有人照着iPhone的尺寸写断点,结果换了台安卓手机就崩了。

4.5.2 弹性图片

img {
  max-width: 100%;
  height: auto;
}

这样图片就不会超出容器,而且会按比例缩放。在RMC界面里,监控截图、设备图片都要这么处理。

4.6 本章知识体系

下面这张图,是我自己画的,把本章的核心知识点串起来了。你看一眼,心里就有数了。

CSS3 核心知识体系 选择器 基础选择器 元素 / 类 / ID 组合选择器 后代 / 子 / 兄弟 盒模型 content / padding border / margin box-sizing border-box 推荐 Flexbox 一维布局 主轴 / 交叉轴 justify-content align-items / flex Grid布局 二维布局 / 网格区域 响应式设计 媒体查询 / 弹性图片

好了,这一章的内容就到这儿。CSS3的基础就这些,但每一个点都值得你花时间去练。别光看,打开编辑器写几行代码,感受一下。下一章咱们聊点更实用的东西。


公众号:蓝海资料掘金营,微信deep3321