css
盒模型
盒模型由四个部分组成:内容content
、内边距padding
、边框border
、外边距margin
- 标准盒模型:
width = content
- IE 盒模型:
width = content + padding + border
盒模型可通过box-sizing
设置,支持到 IE8
box-sizing: content-box
标准盒模型,默认值box-sizing: border-box
IE 的怪异盒模型
padding 特性
- 行内元素的内边距对左、右、下起作用
- 行内元素的外边距只对左、右起作用
- 给行内元素加上绝对定位后,行内元素的内边距和外边距对上下左右均起作用
margin 特性
1、给子元素设置 margin-top 后,父元素也跟着子元素一块向下移动
一个元素如果没有padding-top
和border-top
,那么这个元素的上边距会和其内部文档流中的第一个子元素的上边距重叠
解决办法:给父元素设置 border-top
或者 padding-top
2、margin: 0 auto;
会让元素水平居中
3、外边距合并
当两个垂直外边距相遇时,它们将形成一个外边距。合并后的外边距的高度等于两个发生合并的外边距的高度中的较大者。
解决方法:
- 统一设置 margin-top 或者 margin-bottom,不要混合使用
- 设置其中一个元素为 BFC
BFC 规范
块级格式化上下文:block formatting context
CSS 2.1 规范中的一个概念,它是一个独立容器,决定了元素如何对其内容进行定位,以及与其他元素的关系和相互作用。
简单说,BFC 是一个独立的布局环境,可以理解为一个容器,在这个容器中按照一定规则进行元素摆放,并且不会影响其它环境中的元素。
BFC 特性和创建条件
让处于 BFC 内部的元素与外部的元素相互隔离,使内外元素的定位不会相互影响
特性:
- 内部的 Box 会在垂直方向,从顶部开始一个接一个地放置
- Box 垂直方向的距离由 margin 决定。属于同一个 BFC 的两个相邻 Box 的 margin 会发生叠加
- 每个元素的 margin box 的左边,与包含块 border box 的左边相接触(对于从左往右的格式化,否则相反)。即使存在浮动也是如此
- BFC 的区域不会与 float box 叠加
- BFC 就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素,反之亦然
- 计算 BFC 的高度时,浮动元素也参与计算
BFC 由以下之一创建:
- 根元素
- 浮动元素 float,值为 left|right|inherit,不能是 none
- 使用
position: absolute;
或position: fixed;
的元素 - 使用 overflow ,值为:hidden|auto|scroll ,不能是 visible
display: flex
display: inline-block
- 表格单元格:
display: table-cell
- 表格标题:
display: table-caption
BFC 作用
- 解决 margin 重叠的问题
同一个 BFC 下的两个相邻的盒子会出现垂直 margin 重叠的问题,通常可以为其中一个盒子添加一个父元素,并使其触发 BFC,即可解决这个问题
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<style>
.box {
/* 关键点 */
overflow: auto;
}
p {
margin: 30px;
height: 30px;
background-color: #f00;
}
</style>
</head>
<body>
<div class="box">
<p>1</p>
</div>
<p>2</p>
<p>3</p>
</body>
</html>
- 浮动带来的布局问题
在同一个 BFC 下即使有元素浮动,BFC 下元素的最左边边缘总是会与包含它的盒子左边相接触,那么就会出现浮动元素遮盖了其他元素的情况。
试想,在一个 BFC 内如果存在一个 float 元素和一个 div,浮动元素会遮盖住 div,此时,如果给这个 div 构建一个新的 BFC,由于 BFC 特性,内外不相互影响,此时 div 会被 float 元素挤开
比如下面这个例子,绿色盒子会因为浮动遮盖住红色的盒子,但由于两个盒子都在同一个 BFC(body 元素)下,根据 BFC 特 性,红色盒子会与包含块相接,此时只要让红色盒子触发 BFC,我们为红色盒子添加一个触发 BFC 的条件overflow:hidden
,此时红色盒子由于 BFC 的特性隔离开绿色,这样就可以通过 float 元素的方式实现两栏布局
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<style>
body {
position: relative;
}
.green {
width: 30px;
height: 30px;
background-color: #0f0;
float: left;
}
.red {
width: 50px;
height: 50px;
background-color: #f00;
overflow: hidden;
}
</style>
</head>
<body>
<div class="green"></div>
<div class="red"></div>
</body>
</html>
- 清除浮动
在触发 BFC 后,这个盒子的高度将包含浮动元素的高度。当一个父元素中包含了浮动元素,而浮动元素超出了父元素,此时为父元素创建 BFC,那么浮动元素就会包裹进这个 BFC,解决了父元素中高度塌陷的问题
如下示例,两个 div 由于设置了float:left
使其浮动,导致了父元素高度的坍塌,此时给父元素添加一个overflow:hidden
属性值,使其触发 BFC,由于 BFC 下的盒子会包含浮动元素的高度,
因此盒子就被撑了起来
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<style>
.parent {
border: 2px solid #f00;
overflow: hidden;
}
.child {
height: 30px;
border: 1px solid #0f0;
float: left;
}
</style>
</head>
<body>
<div class="parent">
<div class="child">child1</div>
<div class="child">child2</div>
</div>
</body>
</html>
IFC 指的是行级格式化上下文,布局规则:
- 行级上下文内部的盒子会在水平方向,一个接一个地放置
- 当一行不够的时候会自动切换到下一行
- 行级上下文的高度由内部最高的内联盒子的高度决定
CSS 选择器
- 通配符:
*
- id 选择器:
#id
- class 选择器:
.class
- 元素选择器:
p
、a
等 - 后代选择器:
p span
、div a
等 - 一级子元素选择器:选择元素的直接子元素,如
div > span
作用于第一级子元素,而后代选择器会作用于全部子孙元素 - 伪类选择器:
a:hover
等 - 属性选择器:
input[type="text"]
等 - 相邻元素选择器:如
.box1 ~ .box2
选择器权重
1、样式优先级算法:
- 就近原则,同权重情况下样式定义最近者为准
- 载入样式以最后载入的定位为准
2、优先级为:
!important
> 行内样式 > #id > .class > 元素和伪元素 >*
> 继承 > 默认- 内联样式表(标签内部)> 嵌入样式表(当前文件中)> 外部样式表(外部文件中)
3、权重的规则:
!important
:最高权重- 行内样式:1000
- id 选择器:100
- class 选择器:10
- 标签选择器:1
如:
div {}
,权重为 1.class1 {}
,权重为 10#id1 {}
,权重为 100#id1 div {}
,权重为 100 + 1 = 101.class1 div {}
,权重为 10 + 1 = 11.class1 .class2 div {}
,权重为 10 + 10 + 1 = 21
伪类、伪元素
- 伪类用于当已有的元素处于某个状态时,为其添加样式
- 伪元素用于创建不在文档树中的元素,并为其添加样式
伪类
伪类是选择器的一种,用于选择处于特定状态的元素,用一个冒号表示
:hover
鼠标悬浮状态:focus
元素本身获得焦点:focus-within
元素本 身及子元素获得焦点:root
选择文档的根元素,即 html 元素:first-child
父元素的第一个子元素:last-child
父元素的最后一个子元素:nth-child(n)
父元素的第 n 个子元素:nth-child(odd)
父元素下所有奇数索引位置的子元素:nth-child(even)
父元素下所有偶数索引位置的子元素:nth-last-child(n)
父元素的倒数第 n 个子 元素:only-child
父元素的唯一子元素:first-of-type
同级同类型元素中第一个元素:last-of-type
同级同类型元素中最后一个 元素:nth-of-type(n)
同级同类型元素中第 n 个元 素:nth-last-of-type(n)
同级同类型元素中倒数第 n 个元素:only-of-type
同级同类型元素中唯一的元素:empty
向没有子元素(包括文本内容)的元素添加样式:not
不处于某个状态:checked
单/复选框开关选中的状态:disabled
禁用状态:valid
校验通过状态:invalid
校验不通过状态:target
URL 的锚点:link
访问过的链接:visited
未访问过的链接:placeholder-shown
输入框有占位符时的情况(即用户还未输入时)
伪元素
用两个冒号表示
::before
::after
::selection
被用户选中的部分::placeholder
输入框的占位符文本
例如,给激活的菜单项底部添加下划线
.menu-active::after {
content: '';
position: absolute;
bottom: 1px;
left: 50%;
width: 30px;
height: 3px;
transform: translateX(-15px);
background-color: #3c82f3;
}
CSS 变量
CSS 变量(也称为自定义属性)是一种在 CSS 中定义并重复使用的值的方式
- 使用两个横线
--
前缀来定义变量 - 可以在任何 CSS 属性中使用,更加灵活和可维护
- 可快速更改整个网站的样式
例如,以下代码定义了一个名为primary-color
的变量,并将其用作背景颜色和字体颜色的值:
:root {
--primary-color: #007bff; /* 定义全局变量 */
}
body {
background-color: var(--primary-color); /* 引用全局变量 */
color: var(--primary-color);
}
:root是什么
:root{}
是一个 CSS 伪类选择器,用于选取文档树的根元素,即 html 元素。通常用于定义全局 CSS 变量和全局样式
由于根元素是文档中唯一的元素,因此在 :root 中定义的任何样式都将应用于整个文档中的所有元素,除非被覆盖或继承覆盖
var()函数
var() 函数是用于引用 CSS 变量的 CSS 函数,它接受一个参数,即要引用的 CSS 变量的名称,并且还可以接受一个可选参数,即当引用的变量未定义时要使用的备用值。例如:
button {
background-color: var(--main-color, #ccc);
}
css 变量只能在:root中定义吗
CSS 变量可以在任何选择器中定义,但变量的作用域将限制在定义它们的规则块内
在 :root 选择器中定义的变量可以在任何规则块中引用。在其他选择器中定义的变量通常用于当前元素和子元素的样式,不能在父元素和兄弟元素中使用
如何通过 js 更改 css 变量
document.documentElement.style.setProperty('--primary-color', '#ff6347');
使用 css 变量有什么需要注意的地方
-
兼容性:CSS 变量是 CSS3 中的特性,不是所有的浏览器都支持。在使用 CSS 变量之前,需要仔细考虑浏览器兼容性问题,并提供备用方案
-
作用域:CSS 变量的作用域是它们被定义的规则块的作用域,即它们只在定义它们的规则块中可见
-
命名规范:变量的名称需要有意义和明确,并避免与现有样式属性冲突。变量名称需要使用双连字符
--
前缀,并且不能以数字开头 -
变量的值类型:注意变量值的类型和它们被引用的属性的类型是否相匹配。比如变量值是 color 类型,就不能用在 width 上
-
动态更新:CSS 变量的值可以在运行时通过 js 动态更新,这可能会导致样式的意外更改
position 定位
relative
相对定位,元素占据文档位置,可以有偏移absolute
绝对定位,元素不占位置,相对于父元素定位fixed
固定在视窗某一位置sticky
“粘”在视窗某一位置
上下左右的偏移距离:top
、left
、bottom
、right