一、CSS 基础问题
1. 什么是 CSS?
CSS(Cascading Style Sheets,层叠样式表)是一种用于描述网页展示样式的语言。主要作用是:控制网页的外观和布局。
2. CSS 主要作用有哪些?
设置样式,布局和定位,动画效果,响应式设计等;
3. CSS 怎么添加到网页中?
- 行内样式:
p style="font-size: 12px; ">行内样式:</p>
- 嵌入样式:
<style type="text/css"> h1 {font-size:16px;} </style>
- 链接样式:
link href="styles.css" rel="stylesheet" type="text/css" />
- @import 指令:
@import url(css/styles2.css)
4. CSS 的三大特性
css 三大特性:层叠、继承、优先级。
- 层叠性:行内、嵌入、外链等应用到某个元素时,按照特定的规则叠加确定最终使用哪个值。
- 继承性:某些样式可以被子元素继承,简化样式、提高代码重用性,优化代码量。
- 优先级:!important 最大,来源优先级(行内-嵌入-外链),选择器优先级(id>class>element)
5. 你是怎么判断元素使用哪个样式?
根据层叠性: css 样式来源,层叠规则,计算特指度。(下面 6、7、8)
6. CSS 样式来源?
- 浏览器默认样式表:
- 用户默认样式表:一个作用是修正浏览器默认样式表。
- 外链样式表
- 嵌入样式
- 行内样式
7. CSS 层叠规则
- 层叠规则一:根据 css 样式来源,找到每个元素和属性的所有声明。
- 层叠规则二:按照顺序和权重排序。浏览器依次检查 5 个来源,并设定匹配的属性。如果匹配的属性在下一个来源也有定义,则更新该属性。最终属性被设定成什么值,就用什么值来显示。
- 层叠规则三:按特指度排序。(看 8)
- 层叠规则四:顺序决定权重。特指度也相同,则位置最靠下(或后声明)的规则胜出。
简单点说,先找到所有声明,合并、覆盖,算特指度,特指度一样,后写胜出。
8. CSS 计算特指度
引用《css 权威指南》
“ICE”公式计算:
- 选择符中有一个 ID,就在 I 的位置上加 1;
- 选择符中有一个类,就在 C 的位置上加 1;
- 选择符中有一个元素(标签)名,就在 E 的位置上加 1;
- 得到一个三位数。
P 0-0-1特指度=1
p.largetext 0-1-1特指度=11
p#largetext 1-0-1特指度=101
body p#largetext 1-0-2特指度=102
body p#largetext ul.mylist 1-1-3特指度=113
body p#largetext ul.mylist li 1-1-4特指度=114
查理版简单层叠要点三条规则:
- 规则一:包含 ID 的选择符胜过包含类的选择符,包含类的选择符胜过包含标签名的选择符。
- 规则二:如果几个不同来源都为同一个标签的同一个属性定义了样式,行内样式胜过嵌入样式,嵌入样式胜过链接样式。在链接的样式表中,具有相同特指度的样式,后声明的胜过先声明的。
- 规则三:设定的样式胜过继承的样式,此时不用考虑特指度(即显式设定优先)。
9. CSS 选择器有哪些类型,以及优先级?
- 1、
!important
:不建议别人使用。 - 2、ID 选择器:如
#idName
; - 3、类选择器:如
.className
; - 4、元素选择器:如
p
,div
等; - 5、属性选择器:如
[type="text"]
- 伪类:一个冒号(:)表示伪类,如
:hover
、:first-child
、:nth-child(n)
等; - 伪元素:两个冒号(::)表示 CSS3 新增的伪元素,如
p::first-letter
)。
10 . CSS 元素哪些可以继承,哪些不行?
- 可继承:主要文本相关属性,如文字颜色与大小(
color
、font-size
等),列表样式(list-style
),可见性(visibility
); - 不可继承:大多数 CSS 属性是不可继承的,比如宽高、定位,背景相关属性(
background
) - 控制继承:强制继承父元素(
color: inherit;
),强制设置默认值(color: initial;
),父元素有就继承,没有使用默认值(color: unset;
)
11.常用的布局方案?
- table:数据表格,邮件等;
- 传统布局(
float
):盒模型、清除浮动、居中、BFC
等问题; - Flexbox:一维布局,居中、响应式等问题;
- grid:二维布局
- position 布局:relative 相对谁,居中问题。
- 响应式布局:媒体查询(
@media (min-width: 600px)
),em、rem、vw、vh
等问题;
11.说说什么是 CSS 盒子模型?
CSS 盒子模型包含内容区域(Content)、内边距(padding)、边框(border)和外边距(margin)。盒子模型的总宽度和高度的计算方式取决于使用的盒子模型的类型box-sizing: content-box|border-box|inherit;
。外边距由较宽的外边距决定两个元素最终离多远。
+-----------------------+
| Margin |
| +---------------+ |
| | Border | |
| | +-------+ | |
| | | Padding | |
| | | +---+ | |
| | | | | | | Content
| | | +---+ | |
| | +-------+ |
| +---------------+ |
+-----------------------+
- content-box: 默认值。总宽度 =
width
+padding-left
+padding-right
+border-left
+border-right
; - border-box :总宽度 =
width
- inherit 指定 box-sizing 属性的值,应该从父元素继承
12.怎么浮动,浮动有什么问题,怎么清除浮动?
浮动属性允许元素向左(left
)或右(right
)浮动,使其在其包含块的文本流周围。一般来说,浮动的元素都会被从其原本的流位置移除。
浮动问题:
- 脱离文档流,导致布局问题。
- 父容器高度塌陷(即父元素无法包围浮动的子元素)。
清除浮动
- 方法一:为父元素添加
overflow:hidden
,BFC
? - 方法二:浮动后面添加
<div style="clear: both;"></div>
- 方法三:伪元素清除浮动
.container::after {
content: '';
display: block;
clear: both;
}
12. 什么是 BFC
BFC
全称:Block Formatting Context
, 名为 “块级格式化上下文”。作用有 3 条
- 包含内部浮动:解决 float 引起的父容器高度塌陷问题;
- 排除外部浮动: 解决重叠问题,设置自适应两栏布局。
- 阻止外边距重叠:避免
margin
重叠问题.
怎样触发 BFC
- overflow: hidden
- display: inline-block
- position: absolute
- position: fixed
- display: table-cell
- display: flex
13. 什么是 Flexbox
Flexbox(Flexible Box Layout)一维布局。只需将容器的 display
属性设置为 flex
或 inline-flex
13-1 flex 容器的主要属性:
flex-direction
: 定义主轴的方向(row
,row-reverse
,column
,column-reverse
)。flex-wrap
: 控制子元素是否换行(nowrap
,wrap
,wrap-reverse
)。flex-flow
: 是flex-direction
和flex-wrap
的简写。justify-content
: 在主轴上对齐子元素(flex-start
,flex-end
,center
,space-between
,space-around
)。align-items
: 在交叉轴上对齐子元素(flex-start
,flex-end
,center
,baseline
,stretch
)。align-content
: 在多行上对齐(flex-start
,flex-end
,center
,space-between
,space-around
,stretch
)。
13-2 子元素的主要属性有哪些?
flex-grow
: 定义项目的增长比例(默认为0
)。flex-shrink
: 定义项目的缩小比例(默认为1
)。flex-basis
: 定义项目在分配多余空间之前,占据的主轴空间(默认为auto
)。flex
: 是flex-grow
,flex-shrink
, 和flex-basis
的简写,方便用于快速定义。align-self
: 允许单个项目有不同的对齐方式,覆盖align-items
。
13-3 flex 响应式设计
可以使用 flex-grow
和 flex-shrink
属性
14. 如何实现两列布局?
- 使用 float:
float: left;
- 使用 flex:
display: flex;
- 使用 grid:
display: grid;
15. 如何实现三列布局?
- 固定宽度:两边使用 float,中间使用 margin
- 固定宽度:两边使用 absolute,中间使用 margin 或者 absolute
- flex:
display: flex;
,中间使用flex-grow
和flex-shrink
属性。 - 使用 display: table 实现:
display: table
,三列设置display: table-cell;
- 使用 display: grid 实现:
display: grid; grid-template-columns: 300px auto 300px;
- 圣杯布局:中间先加载,左中右三个元素分别左浮动,负边距定位设置;
- 双飞翼布局:中间先加载,左中右三个元素分别左浮动,负边距定位设置;
16. em
、rem
、vw
、 vh
em
:相对父元素的字体大小,适合细致控制间距和排版。rem
:相对根元素的字体大小,使用更为一致,便于管理全局样式。vw
:根据视口宽度调整,适合响应式布局。vh
:根据视口高度调整,适合适应屏幕的元素高度。
17. CSS 响应式设计
CSS 响应式设计是一种网页设计方法,网页能够根据不同设备的屏幕尺寸、分辨率和方向,自动调整布局和样式。可以使用流体网格布局、百分比尺寸、视口单位、媒体查询、Flexbox 布局和 Grid 布局等。
- 媒体查询:
@media (min-width: 600px)
; - 流式布局:
em
、rem
、 百分比(Bootstrap 的 12 栅格)等相对单位设定; vw
和vh
方案- flex 方案
- grid 方案
17. 居中对齐
17-1 行内元素水平居中
text-align: center; line-height: 300px;
display: table-cell;vertical-align: middle;
17-2 块级元素水平居中
-
宽高已知:
margin: auto;
-
宽高未知:
display: inline-block;
-
使用定位属性:
1、【宽高已知】父position: relative;
子position: absolute;left: 50%;top: 50%; margin-left: -50px; margin-top:-50px;
2、【宽高未知】父position: absolute;left: 50%;top: 50%; transform: translateX(-50%); transform: translateY(-50%);
-
flexbox:
display: flex;justify-content: center;
17-3 已知高度和宽度的元素,水平垂直居中
方案一:top: 0; right: 0; bottom: 0; left: 0; margin: auto;
方案二:left: 50%; top: 50%; margin-left: 元素宽度的一半 px; margin-top: 元素高度的一半 px;
17-4 未知高度和宽度的元素,水平垂直居中
方案一:left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);
方案二:justify-content: center; align-items: center;
方案三:display: grid;justify-self: center;align-self: center;
18. 什么是 CSS3?
CSS 第三个版本,css3 提供了一系列新特性和功能,比如动画、渐变、圆角、阴影等功能,还有响应式设计、模块化设计等。
19. CSS3 的新特性有哪些?
- 选择器:新增的选择器如
:nth-child()
、:nth-of-type()
、:not()
等。 - 背景:支持多个背景层、背景大小、背景修饰等。
- 边框:圆角边框(
border-radius
)、阴影(box-shadow
)等。 - 文本:文本阴影(
text-shadow
)、字体平滑(font-smoothing
)等。 - 渐变:线性渐变(
linear-gradient
)和径向渐变(radial-gradient
)。 - 动画:关键帧动画(
@keyframes
)和过渡(transition
)。 - 媒体查询:用于响应式设计,能够根据设备的不同特性调整样式。
20. 举例说明你用过哪些 CSS3 的新特性?
- 圆角:
border-radius
设置圆角 - 渐变背景:
background: linear-gradient(to right, red, blue);
- 过渡:
transition: background-color 0.5s ease;
- 动画:
@keyframes
加animation: example 2s infinite
- 模块化设计:
@import url(css/styles2.css)
- 媒体查询
二、进阶问题
21. 什么是 CSS 预处理器?有哪些常用的预处理器?
CSS 预处理器为 CSS 的编写提供了增强功能,如变量、嵌套、混合、继承等。比如:less 和 sass
21-1 Less 和 Sass 在语法上有些共性,比如下面这些:
- 混入(Mixins)——class 中的 class;
- 参数混入——可以传递参数的 class,就像函数一样;
- 嵌套规则——Class 中嵌套 class,从而减少重复的代码;
- 运算——CSS 中用上数学;
- 颜色功能——可以编辑颜色;
- 名字空间(namespace)——分组样式,从而可以被调用;
- 作用域——局部修改样式;
- JavaScript 赋值——在 CSS 中使用 JavaScript 表达式赋值。
21-2 less 和 sass 的区别
- Less 是基于 JavaScript,是在客户端处理的。
- Sass 是基于 Ruby 的,是在服务器端处理的。
- 关于变量在 Less 和 Sass 中的唯一区别就是 Less 用@,Sass 用$。
- 输出设置,Less 没有输出设置,Sass 提供 4 中输出选项:nested, compact, compressed 和 expanded。
- Sass 支持条件语句,可以使用 if{}else{},for{}循环等等,而 Less 不支持。
22. 什么是 PostCSS
是一个用 JavaScript 工具和插件转换 CSS 代码的工具:
- 增强代码的可读性:为 CSS 规则添加特定厂商的前缀;
- 兼容性:将最新的 CSS 语法转换成大多数浏览器都能理解的语法;
- 代码检查:通过使用 stylelint 强化一致性约束并避免样式表中的错误。
- 模块化
- 可以使用插件实现各种功能
23. 重排(reflow)和重绘(repaint)
-
重排(reflow):元素的的位置和尺寸大小变化;
-
重绘(Repaints):外观发生改变,但没有改变布局;
重绘不一定导致重排,但重排一定会导致重绘。
优化:减少重排次数:样式集中改变 ,使用 absolute 或 fixed 脱离文档流,优化动画等
24. 什么是合成层,什么是硬件加速?
当你使用某些 CSS 属性(如 transform、filter、opacity 等)时,浏览器会将这些元素提升到一个单独的合成层。这意味着这些元素的渲染不会影响其他部分的渲染,从而提高性能。
- GPU 加速:合成层使用 GPU 来加速渲染,提高动画流畅性和页面交互速度。
- 合成与重排:合成层可以减少重排和重绘;
一些常用的能够触发合成层的 CSS 属性包括:
transform
:如transform: translateZ(0);
,transform: translate3d(0, 0, 0)
;opacity
:在透明度变化时,也会触发合成层。filter
:使用 CSS 滤镜会使元素提升到合成层。will-change:transform
;video
、canvas
、iframe
等。
三、浏览器渲染流程
- 解析 HTML:浏览器首先从服务器下载 HTML 文档,构建 DOM 树,同时下载 CSS 文件;
- 解析 CSS: 浏览器将 CSS 规则解析成 CSSOM 树;
- 构建渲染树: CSSOM 树与 DOM 树一起生成渲染树;
- 布局:计算每个节点在屏幕上的位置和大小。
- 绘制:将渲染树中的元素转化为屏幕上的像素。
- 合成:如果页面中的某些元素使用了 CSS 变换、透明度或滤镜等属性,浏览器可能会将这些元素提升到合成层。
- 显示:绘制内容呈现给用户,浏览器将图形缓冲区中的内容发送到屏幕上。
四、兼容性问题
- 浏览器:
{margin: 0; padding: 0;}
- 图片空隙:
img{display: block;}
- input 重置
- CSS3 兼容前缀
。。。
五、CSS 优化
CSS 优化是指通过一些技术和最佳实践来提高 CSS 的效率、可维护性和加载性能,从而改善网页的响应速度和用户体验。以下是一些常用的 CSS 优化技巧:
- 合并和最小化 CSS 文件
- 使用 CSS 预处理器
- 减少选择器的复杂性,以提高匹配速度。
- 使用简短的属性名,来减少代码量
- 避免使用过多的通用选择器:避免使用通用选择器,因为它们会遍历所有的 DOM 元素。
- 缓存静态资源
- 响应式设计使用
media
属性进行条件加载 - 使用 CSS 图像精灵,将多个小图像合并为一张大图
- 避免使用 CSS 表达式
- 对于动画和变化,可以使用
transform
和opacity
属性来利用 GPU 加速,减少重排和重绘的次数。 - 使用 CSS variables 来定义重复的值,使样式表更加灵活和可维护。
- 将关键 CSS(首屏渲染所需的 CSS)内联到 HTML 中,或提取到一个小的 CSS 文件中,以减小首次渲染时间。
- 资源优化:CDN,压缩、webp
点个关注:谢谢!