为网页添加样式
术语解释
<style>
h1 {
color: red;
background-color: lightblue;
text-align: center;
}
</style>CSS 规则 = 选择器 + 声明块
简单选择器:
- 元素选择器
- 类选择器
- ID 选择器 #
- 通配符选择器 *
- 属性选择器
- [属性名] ([href])
- [属性名=属性值] ([href="https://www.baidu.com"])
- [属性名^=属性值] 以属性值开头
- [属性名$=属性值] 以属性值结尾
- [属性名*=属性值] 包含属性值
- [属性名~=属性值] 包含属性值,以空格分隔 ([class~="b"])
- [属性名|=属性值] 包含属性值,以-分隔
- [属性名^=属性值] 以属性值开头
- 伪类选择器
- :hover 鼠标悬停 (a:hover{color: red;})
- :active 鼠标点击
- :link 超链接未访问的状态
- :visited 超链接已访问的状态
- :focus 元素获得焦点
- :first-child 第一个子元素
- :last-child 最后一个子元素
- :nth-child(n) 第 n 个子元素
- :nth-last-child(n) 倒数第 n 个子元素
- :nth-of-type(n) 第 n 个类型元素
- :nth-last-of-type(n) 倒数第 n 个类型元素
- :only-child 只有一个子元素
- :only-of-type 只有一个类型元素
- :empty 没有子元素
- 伪元素选择器
- ::first-letter 第一个字母
- ::first-line 第一行
- ::before 元素之前 (span::before{content: "《";})
- ::after 元素之后(span::after{content: "》";})
组合选择器
- 并且
- 后代元素(空格)
- 子元素(>)
- 相邻兄弟元素(+)(当前元素的下一个)
- 通用兄弟元素(~)(当前元素后面的所有)
并列选择器
多个选择器之间用逗号隔开 语法糖:多个选择器共享同一个声明块
声明块
出现在大括号中,包含一个或多个声明。 每个声明由属性和值组成,用冒号分隔,用分号结束。
CSS 代码书写位置
- 内部样式表 (在 head 标签中)
- 外部样式表 (在外部的 css 文件中)[推荐]
- 外部样式可以解决多个页面共享样式的问题
- 有利于游览器缓存,提高页面加载速度
- 有利于代码分离,使代码更易于维护和阅读
- 内联样式 (在标签的 style 属性中)
常见样式声明
- color (元素内部的文字颜色)
- 预设值:定义好的单词
- 三原色,色值:每个颜色可以使用0-255之间的数字表示
- rgb():红绿蓝
- rgba():红绿蓝加透明度
- hex:十六进制(#红绿蓝)#008c8c、#000、#f40(两位相同就可以简写)
background-color (元素的背景颜色)
font-size (元素内部字体大小)
- 单位:px(像素),简单理解为文字的高度占多少个像素
- em: 相对单位,相对于父元素的字体大小,每个元素必须有字体大小,如果没有声明,则直接使用父元素的字体大小,如果没有父元素(html)那么使用基准大小
- 大小:12px、14px、16px
- 继承:子元素会继承父元素的字体大小
font-weight (元素内部字体粗细)
- bold = 700
- normal = 400
font-family(文字类型)
- 字体:宋体、微软雅黑、黑体、楷体等
- 继承:子元素会继承父元素的字体
- 字体类型:
- 衬线字体(serif):有笔画的字体,如宋体、楷体等,多用于印刷,打印
- 非衬线字体(sans-serif):没有笔画的字体,如微软雅黑、黑体等,多用于网页
- 等宽字体:每个字符的宽度相等,如Courier New等
- 可以写多个比如 font-faily: 宋体,黑体,sans-serif。当没有时会选择下一个
font-style(文字样式)通常用它设置斜体
- italic:斜体
- normal:正常
i 元素默认是斜体,通常用它表示一个图标(icon)
- text-decoration(文字装饰)
- underline:下划线
- line-through:删除线
- overline:上划线
- none:没有装饰
del 已删除的文字 s 过期的文字
- text-indent(文字缩进)
- 单位:px(像素)
- 缩进:2em(缩进2个文字的宽度)
- line-height(每行文本的高度,这个值越大,每行文本的间距越大)
- 用法1:设置行高为容器的高度,可以让单行文本垂直居中
- 用法2:行高可以设置为纯数字,表示相对当前元素的字体大小
- width
- height
- letter-spacing(文字间距)
- text-align(文字对齐)
- left:左对齐
- right:右对齐
- center:居中对齐
- justify:两端对齐
层叠
声明冲突:同一个样式,多次应用到同一个元素上
层叠:解决声明冲突的过程,游览器自动处理(权重计算)
1. 比较重要性
重要性从高到底:
- 作者样式表中的!important样式
- 作者样式表的普通样式
- 浏览器默认样式
2. 比较特殊性
看选择器,总体规则:选择器选中的范围越窄,特殊性越高 具体规则:通过选择器计算出一个4位数 (x x x x)
- 千位:如果是内联样式,千位为1,否则为0
- 百位:等于选择器中的id选择器的数量
- 十位:等于类选择器、属性选择器、伪类选择器的数量
- 个位:元素选择器、伪元素选择器的数量
特殊性从高到底:
- 内联样式
- id选择器
- 类选择器、属性选择器、伪类选择器
- 元素选择器、伪元素选择器
3. 比较源次序
代码书写顺序:后面的样式会覆盖前面的样式
应用
- 重置样式表 (书写一些作者样式,覆盖游览器的默认样式) 重置样式表 -> 游览器的默认样式 常见的重置样式表:
- normalize.css
- reset.css
- meyer.css
- 爱恨法则
- L:link
- V:visited
- H:hover
- A:active
继承
子元素会继承父元素的某些CSS属性 通常:跟文字内容相关的属性都会被继承
属性值的计算过程
一个元素一个元素依次渲染,顺序按照页面文档的树形目录结构进行
渲染每个元素的前提条件:该元素的所有CSS属性必须有值
一个元素,从所有属性都没有值,到所有的属性都有值,这个计算过程,叫做属性值计算过程
属性值计算过程简介:
- 确定声明值,参考样式表中没有冲突的声明,作为CSS属性
- 层叠冲突:对样式表有冲突的声明使用层叠规则,确定CSS属性值
- 使用继承:对仍然没有值的属性,若可以继承,则继承父元素的值
- 使用默认值:对没有值的属性,使用默认值
特殊的两个CSS取值
- inherit:手动(强制)继承父元素的值
- initial:使用默认值
盒模型
box: 盒子,每个元素在页面中都会生成一个矩形区域(盒子)
盒子类型:
- 行盒,display等于inline的元素
- 块盒,display等于block的元素
行盒在页面中不换行,块盒独占一行
游览器默认样式表设置的块盒: 容器元素、h1-h6、p 常见的行盒:span a img video audio
盒子的组成部分
无论是行盒还是块盒,每个盒子都由以下几个部分组成:
- 内容区域(content)
- width、height 设置的是盒子内容的宽高
- 内边距区域(padding)
- 盒子边框到盒子内容的距离
- padding 简写属性: 上 右 下 左
- 填充盒: 内容区域 + 内边距区域
- 边框区域(border)
- 边框 = 边框样式 + 边框宽度 + 边框颜色
- 边框样式: border-style
- 边框宽度: border-width
- 边框颜色: border-color
- 边框 + 填充 + 内容 = 边框盒
- 外边距区域(margin)
- 边框到其他盒子的距离
盒模型的应用
改变宽高范围
默认情况下,width 和 height 设置的是内容盒宽高
页面重构师:将 psd 文件(设计搞)制作为静态页面 衡量设计稿尺寸的时候,往往使用的是边框盒,但设置 width 和 height,则设置的是内容盒
<style>
div {
width: 256px;
height: 200px;
background-color: pink;
border: 1px solid red;
padding: 10px;
/* 改变宽高的影响范围 */
box-sizing: border-box;
}
</style>
<div>我是div</div>改变这种情况的方法
- 精确计算
- CSS3: box-sizing(默认值:content-box)
改变背景覆盖的范围
默认情况下,背景覆盖边框盒 可以通过 background-clip: border-box;
溢出处理
<style>
div {
border: 1px solid red;
padding: 20px;
width: 200px;
height: 200px;
overflow: hidden;
}
</style>
<div>我是div</div>overflow: 控制内容溢出边框盒后的处理方式
断词规则
word-break:会影响文字在什么位置被截断换行
- normal,普通。CJK 字符(文字位置截断),非 CJK 字符(单词位置截断)
- break-all:截断所有,所有字符都可能被截断
- keep-all:保持所有,所有字符都不会被截断,只能在单词之间截断
空白处理
单行文本的处理
<style>
li {
border: 1px solid red;
line-height: 2px;
padding-left: 10px;
margin: 1em 0;
width: 20px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
</style>
<ul>
<li>lsdadsadssdasdafjgiaghadjwaopd</li>
</ul>white-space: nowrap;
行盒的盒模型
常见的行盒:包含具体内容的元素 span、a、strong、em 等
显著特点
- 盒子沿着内容延伸
- 宽度和高度由内容决定(不能设置宽高) ,调整行盒的宽高,应该使用字体大小、行高、字体类型间接调整
- 内边距(填充区) 水平方向有效,垂直方向尽会影响背景,不会实际占据空间
- 边框:水平方向有效,垂直方向不会实际占据空间
- 外边距(margin):水平方向有效,垂直方向不会实际占据空间
行块盒
display:inline-block 的盒子
- 不独占一行
- 但盒模型中所有尺寸都有效
经常用于做分页
空白折叠
空白折叠发生在行盒(行块盒)内部 或 行盒(行块盒)之间
可替换元素 和 非可替换元素
大部分元素,页面上显示的结果,取决于元素的内容 成为非可替换元素 少部分元素,页面上显示的结果,取决于元素的属性 成为可替换元素
可替换元素: img(object-fit:fill)、video、audio 等 绝大部分可替换元素为行盒
可替换元素类似于行块盒,盒模型中所有尺寸都有效
常规流
盒模型:规定单个盒子的规则
视觉格式化模型:页面中的多个盒子排列规则
视觉格式化模型,大体上将页面中的盒子排列分为三种方式:
- 常规流
- 浮动
- 定位
常规流布局
常规流、文档流、普通文档流、常规文档流
所有元素,默认情况下,都属于常规流布局
总体规则:块盒独占一行,行盒水平依次排列
包含块(containing block):每个盒子都有它的包含块,包含块决定了盒子排列区域
绝大部分情况下:盒子的包含块,为其父元素的内容盒
块盒
- 每个块盒的总宽度,必须刚好等于包含块的宽度 (宽度的默认值是auto:将剩余空间吸收掉) margin 的取值也可以是auto,将剩余的空间吸收掉 wigth 吸收能力强于margin ( 当width和margin都为auto时)
若宽度、边框、内边距、外边距计算后,改剩余空间被margin-right全部吸收
在常规流中,块盒在其包含块中居中,可以定宽,然后左右margin设置为auto(margin:0 auto) 2. 每个块盒垂直方向上的auto值 height 的默认值是auto,适应内容的高度 margin:auto 表示0
- 百分比取值 padding、宽高、margin 都可以使用百分比取值 以上所有百分比相对于包含块的宽度。 高度的百分比:
- 包含块的高度是否取决于子元素,设置百分比无效
- 包含块的高度不取决于子元素的高度,百分比相对于父元素高度
- 上下外边距的合并 两个常规流块盒,上下外边距会合并,合并后的外边距为较大的那个值 (父子元素也会合并)
浮动
视觉格式化模型,大体将文档分为以下三个方式:1.常规流 2.浮动 3.定位
应用场景
- 文字环绕
- 横向排列 (兼容性好)
浮动的基本特点
修改 float 的属性为:
- left:左浮动,元素靠上靠左
- right:右浮动,元素靠上靠右
- 默认值为 none
- 当一个元素浮动后,会强制为块盒(更改为 block)
- 浮动元素的包含块,和常规流一样,为父元素的内容盒
盒子尺寸
- 宽度为 auto 时,适应内容宽度
- 高度为 auto 时,与常规流一致,适应内容高度
- margin 为 auto 时为 0
- 边框、内边距、百分比设置与常规流一致
盒子排列
- 左浮动的盒子会靠上靠左
- 右浮动的盒子会靠上靠右
- 浮动盒子在包含块中排列时会避开常规流盒子
- 常规流块盒在排列时会无视浮动盒子(常规流盒子在后面时)
- 行盒在排列时会避开浮动盒子 (做文字环绕效果 将图片的 float 设置为 left 或 right)
如果文字在行盒中,游览器会自动生成一个匿名行盒,将文字包裹起来
- 外边距合并不会发生
高度坍塌
高度坍塌的根源:常规流的盒子的自动高度,不考虑浮动盒子的高度 解决方法:清除浮动,css 属性 clear
- 默认值 none
- left:清除左浮动,改元素必须出现在前面所有左浮动盒子的下方
- right:清除右浮动,改元素必须出现在前面所有右浮动盒子的下方
- both:清除左右浮动,改元素必须出现在前面所有浮动盒子的下方
定位
视觉格式化模型,大体上将页面中的盒子排列分为三种方式:
- 常规流
- 浮动
- 定位
定位: 手动控制元素在包含块中的精准位置
涉及的 CSS 属性:position
position 属性
- 默认值:static 静态定位(不定位)
- relative 相对定位
- absolute 绝对定位
- fixed 固定定位
一个元素,只要 position 取值不是 static,就认为该元素是一个定位元素 定位元素会脱离文档流(相对定位除外)
一个脱离了文档流的元素:
- 文档流中的元素摆放时,会忽略脱离了文档流的元素
- 文档流中元素计算自动高度时,会忽略脱离了文档流的元素
相对定位
不会导致元素脱离文档流,只是让元素在原来位置上进行偏离
可以通过四个 CSS 属性对设置相对定位的元素进行偏移
- top
- bottom
- left
- right
盒子的偏移不会影响到其他盒子的位置
绝对定位
- 宽高为 auto,适应内容
- 包含块变化:找祖先元素中第一个定位元素,该元素的填充盒为其包含块。若找不到,则它的包含块为整个网页(初始化包含块)
固定定位
其他情况盒绝对定位完全相同
包含块不同:固定为视口(viewport)
定位下的居中
某个方向居中:
- 定宽(高)
- 将左右(上下)距离设置为 0
- 将左右(上下)margin 设置为 auto 绝对定位和固定定位中当 margin 设置为 auto 时,会自动吸收剩余空间
多个定位元素重叠时
堆叠上下文(stacking context) 设置 z-index ,该值越大通常情况下越靠近用户 只有定位元素设置 z-index 才有效 z-index 可以是负数,如果是负数,则遇到常规流,浮动元素,则会被覆盖
补充
- 绝对定位、固定定位一定是块盒
- 绝对定位、固定定位元素一定不是浮动元素
- 没有外边距合并
更多的选择器
更多的伪元素选择器
- first-child (选中第一个子元素) 例如 a:first-child 选中的是a元素,并且a元素是第一个子元素
- first-of-type
- last-child (选中最后一个子元素)
- nth-child (选中指定第 n 个子元素) 例如 a:nth-child(5) ; even(关键字)等同于2n;odd 等同于2n+1
- nth-of-type (选中第几个某类元素) 例如 a:nth-of-type(2) 选中的是a元素,并且a元素是第二个a元素
更多的伪元素选择器
- first-letter (选中元素中的第一个字母)
- first-line (选中元素中第一行的文字)
- selection (选中被用户选中的文字) p::selection