HTML
结构
1 | <html> |
html
:整个网页。head
:网页头部。可以理解成存放给浏览器看的信息,例如CSS。title
:网页标题。
body
:网页主体。可以理解成存放给用户看的信息,例如图片、文字
标签语法
- 标签要成对出现,中间包裹内容
<>
里面放英文字母(标签名)- 结束标签比开始标签多
/
示例代码:
1 | <strong>需要加粗的文字<strong> |
标签的关系
- 父子关系(嵌套关系)
1
2
3<html>
<head></head>
</html> - 兄弟关系(并列关系)
1
2<head></head>
<body></body>
注释
1 | <!-- 我是 HTML 注释 --> |
标题标签
1 | <h1>一级标题</h1> |
特点:
- 文字加粗
- 字号逐渐减小
- 独占一行(换行)
段落标签
1 | <p>段落</p> |
特点:
- 独占一行
- 段落之间存在间隙
文本格式化标签
为文本添加特殊格式,以突出重点。
- 加粗
<strong>加粗</strong>
<b>加粗</b>
- 倾斜
<em>倾斜</em>
<i>倾斜</i>
- 下划线
<ins>下划线</ins>
<u>下划线</u>
- 删除线
<del>删除线</del>
<s>删除线</s>
图像标签
作用
插入图片。
src属性
src
用于指定图像的位置和名称,是<img>
的必填属性。
1 | <img src="图片的URL"> |
其他属性
属性 | 作用 | 说明 |
---|---|---|
alt |
替换文本 | 图片无法显示的时候显示的文字 |
title |
提示文本 | 鼠标悬停在图片上面的时候显示的文字 |
width |
图片的宽度 | 值数字,没有单位 |
height |
图片的高度 | 值数字,没有单位 |
属性语法
- 属性名=“属性值”
- 属性写在尖括号里面,标签名后面,标签名和属性之间用空格隔开,不区分先后顺序
超链接标签
点击跳转到其他页面。
1 | <a href="https://www.baidu.com">跳转到百度</a> |
注意:
href
属性值是跳转地址,是超链接的必须属性。- 默认在当前窗口跳转页面,添加
target="_blank
实现新窗口打开页面。 href
属性值写为#
,表示空链接,页面不会跳转,在当前页面刷新一次。
列表
分类
- 无序列表
(不需要规定顺序) - 有序列表
(需要规定顺序) - 定义列表
无序列表
布局排列整齐的"不需要规定顺序"的区域。
ul
嵌套li
,ul
是无序列表,li
是列表条目。
1 | <ul> |
注意事项:
ul
标签里面只能包含li
标签。li
标签里面可以包含任何内容。
有序列表
布局排列整齐的"需要规定顺序"的区域。
ol
嵌套li
,ol
是有序列表,li
是列表条目。
1 | <ol> |
注意事项:
ol
标签里面只能包含li
标签。li
标签里面可以包含任何内容。
定义列表
dl
嵌套dt
和dd
。
dl
是定义列表,dt
是定义列表的标题,dd
是定义列表的描述详情。
示例代码:
1 | <dl> |
运行结果:
注意事项:
dl
里面只能包含dt
和dd
。dt
和dd
里面可以包含任何内容。
表格
基本使用
table
嵌套tr
,tr
嵌套td
/th
。
标签 | 说明 |
---|---|
table |
表格 |
tr |
行 |
th |
表头单元格 |
td |
内容单元格 |
1 | <table border="1"> |
解释说明:表格默认没有边框线,使用border
属性可以为表格添加边框线。
表格结构标签
用表格结构标签可以把内容划分区域,让表格结构更清晰,语义更清晰。表格结构标签也可以省略。
标签 | 含义 | 说明 |
---|---|---|
thead |
表格头部 | 表格头部内容 |
tbody |
表格主体 | 主要内容区域 |
tfoot |
表格底部 | 汇总信息区域 |
合并单元格
将多个单元格合并成一个单元格。
步骤:
- 明确合并的目标。
- 保留最左最上的单元格,添加属性(取值是数字,表示需要合并的单元格数量)。
- 跨行合并,保留最上单元格,添加属性rowspan。
- 跨列合并,保留最左单元格,添加属性colspan。
- 删除其他单元格。
注意:不能跨表格结构标签(thead
、tbody
、tfoot
)合并单元格。
1 | <table border="1"> |
表单
概述
作用:收集用户信息。
使用场景:
- 登录页面
- 注册页面
- 搜索区域
input
type属性
input
标签的type
属性值不同,功能不同。
1 | <input type="..." > |
type属性值 | 说明 |
---|---|
text | 文本框 用于输入单行文本 |
password | 密码框 |
radio | 单选框 |
checkbox | 多选框 |
file | 上传文件 |
placeholder
占位文本:提示信息,文本框和密码框都可以使用。
1 | <input type="..." placeholder="提示信息"> |
单选框
1 | <input type="radio" name="gender" checked> 男 |
属性 | 作用 | 说明 |
---|---|---|
name |
控件名称 | 控件分组,同组只能选中一个(单选功能)。 |
checked |
默认选中 | 属性名和属性值相同,简写为一个单词。 |
多选框
多选框也叫复选框,默认选中:checked
。
1 | <input type="checkbox" name="have" value="Bike" checked>I have a bike<br/> |
上传文件
默认情况下,文件上传表单控件只能上传一个文件,添加multiple
属性可以实现文件多选功能。
1 | <input type="file" multiple> |
select
select
嵌套option
,select
是下拉菜单整体,option
是下拉菜单的每一项。
默认显示第一项,selected
属性实现"默认选中"功能。
1 | <select> |
textarea
多行输入文本的表单控件。
1 | <textarea>默认内容</textarea> |
label
作用
某个标签的说明文本。
用法一
label
标签只包裹内容,不包裹表单控件。- 设置
label
标签的for
属性值和表单控件的id
属性值相同。
1 | <input type="radio" id="man"> |
用法二
使用label
标签包裹文字和表单控件,不需要属性。
1 | <label><input type="radio"> 女</label> |
扩大点击范围
当一个label
标签与表单控件关联后,用户可以点击label
标签内的任何地方来激活对应的控件。下面是一个简单的例子,展示了如何为一个文本框创建一个带有扩大点击范围的label
标签:
1 | <form> |
在这个例子中,label
标签的for
属性值与输入字段的id
相匹配,这样就建立了两者之间的联系。现在,用户既可以点击"用户名:"这几个字,也可以直接点击输入框本身,以将焦点设置到该输入框上。
同样的方法也适用于其他类型的表单控件。
button
1 | <button type="">按钮</button> |
type 属性值 | 说明 |
---|---|
submit |
提交按钮 点击后可以提交数据到后台(默认功能) |
reset |
重置按钮 点击后将表单控件恢复默认值 |
button |
普通按钮 默认没有功能 一般配合JavaScript使用 |
1 | <!-- form 表单区域 --> |
语义
无语义的布局标签
布局网页,划分网页区域,摆放内容。
div
:独占一行span
:不换行
1 | <div>div 标签,独占一行</div> |
有语义的布局标签
标签名 | 语义 |
---|---|
header |
网页头部 |
nav |
网页导航 |
footer |
网页底部 |
aside |
网页侧边栏 |
section |
网页区块 |
article |
网页文章 |
其他标签
换行
换行:br
水平线
水平线:hr
音频
1 | <audio src="音频的URL"></audio> |
属性 | 作用 | 特殊说明 |
---|---|---|
src (必须属性) |
音频URL | 支持格式:mp3、ogg、wav |
controls |
显示音频控制面板 | |
loop |
循环播放 | |
autoplay |
自动播放 | 为了提升用户体验,浏览器一般会禁用自动播放功能 |
书写HTML5属性时,如果属性名和属性值相同,可以简写为一个单词。
1 | <!-- 在 HTML5 里面,如果属性名和属性值完全一样,可以简写为一个单词 --> |
视频
1 | <video src="视频的 URL"></video> |
属性 | 作用 | 特殊说明 |
---|---|---|
src (必须属性) |
视频URL | 支持格式:mp4、webm.、ogg |
controls |
显示视频控制面板 | |
loop |
循环播放 | |
muted |
静音播放 | |
autoplay |
自动播放 | 为了提升用户体验,浏览器支持在静音状态自动播放 |
1 | <!-- 在浏览器中,想要自动播放,必须有 muted 属性 --> |
字符实体
显示结果 | 描述 | 实体名称 |
---|---|---|
|
空格 | |
< |
小于号 | < |
> |
大于号 | > |
CSS
引入方式
- 内部样式表
CSS代码写在style
标签里面。 - 外部样式表
CSS代码写在单独的CSS文件中。
在HTML使用link
标签引入。1
<link rel="stylesheet" href="./my.css">
- 行内样式
CSS写在标签的style
属性值里。1
<div style="color: red; font-size:20px;">这是 div 标签</div>
文字控制属性
字体大小
属性名:font-size
属性值:文字尺寸,PC端网页最常用的单位px
。
1 | p { |
字体样式(是否倾斜)
属性名:font-style
属性值
- 正常(不倾斜):
normal
。 - 倾斜:
italic
。
行高
line-height
属性名:line-height
属性值
数字 + px
数字(当前标签font-size属性值的倍数)
1 | line-height: 30px; |
单行文字垂直居中
垂直居中技巧:行高属性值等于盒子高度属性值
1 | div { |
字体族
属性名:font-family
属性值:字体名
1 | font-family: 楷体; |
font-family
属性值可以书写多个字体名,各个字体名用逗号隔开,执行顺序是从左向右依次查找。
1 | font-family: Microsoft YaHei, Heiti SC, tahoma, arial, Hiragino Sans GB, "\5B8B\4F53", sans-serif; |
font复合属性
概述
font
是一个复合属性,允许开发者通过单个声明来设置多个与字体相关的CSS属性。
这些属性包括字体风格、字体粗细、字体大小、行高以及字体族。
语法
各个值必须按照特定的顺序书写,且至少需要指定字体大小和字体族两个属性。
1 | selector { |
font-style
:定义字体是否倾斜,可选值为normal
(默认)、italic
或oblique
。font-variant
:定义小型大写字母,通常很少用到,默认值是normal
,另一个可能的值是small-caps
。font-weight
:定义字体的粗细,可以是数字400(正常)或700(加粗),也可以是关键字如normal
、bold
等。font-size
:定义字体大小,单位可以是像素(px)、点(pt)、em、rem等。line-height
:定义行间距,通常是一个无单位的数值或者是与font-size
相同的单位。font-family
:定义字体族,可以是一个具体的字体名或者通用字体族。
注意事项
- 在使用
font
复合属性时,font-size
和font-family
是必需的。 - 如果省略了其他属性,那么它们将被设置为默认值。
font-variant
很少在实践中单独使用,因此如果不需要特别的小型大写样式,通常可以直接省略。
示例
假设我们想要设置网页中所有段落文字的公共样式,使其具有以下特点:
- 斜体显示
- 加粗
- 字号30px
- 行高为字号的2倍
- 使用楷体字体
1 | p { |
italic
表示字体以斜体形式展示。700
是字体重量,表示加粗。30px
设置了字体大小。2
设置了行高为字体大小的两倍。楷体
指定了使用的字体族。
文本缩进
属性名:text-indent
属性值:
- 数字 + px
- 数字 + em
推荐em,1em = 当前标签的字号大小
1 | p { |
文本对齐方式
文本对齐方式,控制内容水平对齐方式。
属性名:text-align
属性值:
left
,左对齐(默认)。center
,居中对齐。right
,右对齐。justify
,两端对齐(每行中的文字和空格会被拉伸,使文本左右边缘都与容器对齐)。
1 | text-align: center; |
注意!text-align
本质是控制内容的对齐方式,属性要设置给内容的父级。
1 | <html> |
运行结果:
文本修饰线
属性名:text-decoration
属性值:
none
无underline
下划线line-through
删除线overline
上划线
color 文字颜色
颜色表示方式 | 属性值 | 说明 |
---|---|---|
颜色关键字 | 颜色英文单词 | red、green、blue… |
rgb表示法 | rgb(r, g, b) | r,g,b表示红绿蓝三原色,取值:0 - 255 |
rgba表示法 | rgba(r, g, b, a) | a表示透明度,取值:0 - 1 |
十六进制表示法 | #RRGGBB | #000000, #ffcc00, 简写:#000, #fc0 |
其实只要属性值为颜色,都可以使用上述四种颜色表示方式。
背景属性
背景图
属性名:background-image
。
属性值:url
(背景图URL)。
注意:背景图默认有平铺(复制)效果。
1 | div { |
平铺方式
属性名:background-repeat
属性值:
repeat
默认选项,表示背景图像会在水平和垂直方向上重复显示。no-repeat
表示背景图像不会重复显示。repeat-x
表示背景图像仅在水平方向上重复显示。repeat-y
表示背景图像仅在垂直方向上重复显示。
1 | div { |
背景图位置
属性名:background-position
属性值:水平方向位置 垂直方向位置
关键字:
关键字 | 位置 |
---|---|
left |
左侧 |
right |
右侧 |
center |
居中 |
top |
顶部 |
bottom |
底部 |
坐标:
- 水平:正数向右;负数向左。
- 垂直:正数向下;负数向上。
1 | div { |
背景图缩放
作用:设置背景图大小
属性名:background-size
属性值:
- 关键字
cover
:等比例缩放背景图片以完全覆盖背景区,可能背景图片部分看不见。contain
:等比例缩放背景图片以完全装入背景区,可能背景区部分空白。
- 百分比:根据盒子尺寸计算图片大小。
- 数字 + 单位。
1 | div { |
背景图固定
作用:背景不会随着元素的内容滚动。
属性名:background-attachment
属性值:
scroll
fixed
local
1 | body { |
背景复合属性
属性名:background
属性值:背景色 背景图 背景图平铺方式 背景图位置/背景图缩放 背景图固定
(空格隔开各个属性值 不区分顺序)
1 | div { |
显示方式
作用
布局网页的时候,根据标签的显示方式选择合适的标签摆放内容。
属性
属性:display
属性值 | 效果 |
---|---|
block | 块级级 |
inline-block | 行内块 |
inline | 行内 |
效果
块级元素
- 独占一行
- 宽度默认是父级的100%
- 添加宽高属性生效
行内元素
- 一行可以显示多个
- 设置宽高属性不生效
- 宽高尺寸由内容撑开
行内块元素
- 一行可以显示多个
- 设置宽高属性生效
- 宽高尺寸也可以由内容撑开
选择器
标签选择器
使用标签名作为选择器,同名标签设置相同的样式。
例如:p
、h1
、div
、a
、img
。
1 | <style> |
类选择器
步骤:
- 定义类选择器,
.类名
。 - 使用类选择器,标签添加
class="类名"
。
1 | <style> |
注意:
- 类名自定义,不要用纯数字或中文,尽量用英文命名。
- 一个类选择器可以供多个标签使用。
- 一个标签可以使用多个类名。
id选择器
步骤:
- 定义id选择器,
#id名
。 - 使用id选择器,
标签添加id="id名"
。
1 | <style> |
注意:
- 同一个id选择器在一个页面只能使用一次。
- 在实际中,id选择器一般配合JavaScript使用,很少用来设置CSS样式。
通配符选择器
通配符选择器:*
,不需要调用,浏览器自动查找页面所有标签,设置相同的样式。
1 | * { |
复合选择器
定义
由两个或多个基础选择器,通过不同的方式组合而成。
后代选择器
定义:选中某元素的后代元素。
语法:父选择器 子选择器 { CSS 属性 }
,父子选择器之间用空格
隔开。
1 | <style> |
子代选择器
定义:选中某元素的子代元素(最近的子级)。
语法:父选择器 > 子选择器 { CSS 属性 }
,父子选择器之间用>
隔开。
注意:子选择器仅是指它的直接后代,而后代选择器是作用于所有子后代元素。
1 | <style> |
并集选择器
定义:选中多组标签设置相同的样式。
语法:选择器1, 选择器2, …, 选择器N { CSS 属性}
,选择器之间用,
隔开。
1 | <style> |
交集选择器
定义:选中同时满足多个条件的元素。
语法:选择器1.选择器2 { CSS 属性 }
,选择器之间连写。
注意:如果交集选择器中有标签选择器,标签选择器必须书写在最前面。
1 | <style> |
伪类选择器
什么是伪类选择器
伪类选择器:伪类表示元素状态,选中元素的某个状态设置样式。
常见伪类选择器
鼠标悬停状态
鼠标悬停状态:选择器:hover { CSS 属性 }
。
1 | <style> |
超链接伪类
选择器 | 作用 |
---|---|
:link |
访问前 |
:visited |
访问后 |
:hover |
鼠标悬停 |
:active |
点击时(激活) |
如果要给超链接设置以上四个状态,需要按L
V
H
A
的顺序书写。
1 | a { |
结构伪类选择器
什么是结构伪类选择器
结构伪类选择器是根据HTML页面中元素之间的关系来定位HTML元素,从而减少对HTML元素的id
属性和class
属性的依赖。
伪类选择器 | 作用 |
---|---|
:first-child |
用来定位一组兄弟元素中的第一个元素 |
:last-child |
用来定位一组兄弟元素中的最后一个元素 |
:nth-child(n) |
用来定位一组兄弟元素中的第 n 个元素 |
:nth-last-child(n) |
用来定位一组兄弟元素中倒序方式的第 n 个元素 |
:first-of-type |
用来定位一组同类型的兄弟元素中的第一个元素 |
:last-of-type |
用来定位一组同类型的兄弟元素中的最后一个元素 |
:nth-of-type(n) |
用来定位一组同类型的兄弟元素中的第 n 个元素 |
:nth-last-of-type(n) |
用来定位一组同类型的兄弟元素中倒序方式的第 n 个元素 |
:only-child |
用来定位一个没有任何兄弟元素的元素 |
:only-of-type |
用来定位一个没有任何同类型兄弟元素的元素 |
:empty |
用来定位一个没有子级元素的元素,并且该元素也没有任何文本内容 |
:root |
用来定位 HTML 页面中的根元素(``) |
:first-child 与 :last-child
:first-child
伪类可以使用:nth-child(n)
伪类改写为:nth-child(1)
。
:last-child
伪类可以使用:nth-last-child(n)
伪类改写为:nth-last-child(1)
。
:first-child
伪类和:last-child
伪类经常会引起误解。例如td:first-child
是用来定位所有<td>
元素中第一个作为子级元素的,而不是定位<td>
元素的第一个子级元素。
示例代码:
1 | <html> |
运行结果:
解释说明:我们使用td:first-child
选择器,那么它会选择每个<tr>
行中第一个出现的<td>
元素,即"单元格1"和"单元格4"。这并不是指<td>
元素内部的第一个子元素,而是指<td>
作为其父元素(这里是<tr>
)的第一个子元素。
:first-of-type 与 :last-of-type
:first-of-type
伪类与:last-of-type
伪类的用法一定要和:first-child
伪类与:last-child
伪类的用法区分开。
以:first-of-type
伪类和:first-child
伪类为例来说明:
:first-of-type
伪类是定位一组同类型的兄弟元素中的第一个元素,不管这个元素在兄弟元素中的位置如何。:first-child
伪类是定位一组兄弟元素中的第一个元素,这些兄弟元素不一定是同类型的。
示例代码:
1 | <html> |
运行结果:
解释说明:
p:first-child
不会选择任何元素,因为第一个<p>
元素不再是其父元素的第一个子元素。p:first-of-type
会选择第一个<p>
元素,因为它仍然是兄弟元素中第一个出现的<p>
类型的元素。
:first-child
关注的是元素的位置,即是否为第一个子元素;而:first-of-type
关注的是元素的类型,即是否为同类型中的第一个元素。
同样的逻辑也适用于:last-child
和:last-of-type
伪类。
:nth-child(n) 与 :nth-last-child(n)
:nth-child(n)
伪类和:nth-last-child(n)
伪类都是CSS3版本新增的选择器,这两个选择器的用法基本上是一致的。区别在于:nth-last-child(n)
伪类是倒序方式定位元素,也就是说,:nth-last-child(n)
伪类是从一组元素的结尾开始的。
以:nth-child(n)
伪类为例进行讲解,:nth-child(n)
伪类中的n
参数的含义具有3种情况:
- 数字值:任意一个大于
0
的正整数。例如#example td:nth-child(1)
表示定位ID为example的父元素下所有<td>
元素中的第一个元素。 - 关键字:
odd
表示奇数,等同于:nth-child(2n)
;even
表示偶数,等同于:nth-child(2n+1)
。 - 格式为
(an+b)
公式:a
表示周期的长度(步长),n
表示计数器(从0开始),而b
则表示偏移值。
:nth-child(n)
伪类与:nth-last-child(n)
伪类和:nth-of-type(n)
伪类与:nth-last-of-type(n)
伪类的区别,类似于:first-of-type
伪类与:last-of-type
伪类和:first-child
伪类与:last-child
伪类的区别。
:empty
:empty
伪类是用来定位没有任何子级元素或文本内容的元素。
示例代码:
1 | <html> |
解释说明:
- 第一个
<div></div>
会有一个红色边框。 - 第二个
<div> </div>
不会有红色边框,因为它包含空白字符。 - 第三个
<div><!-- 这是一个注释 --></div>
也会有一个红色边框,因为注释不影响:empty
伪类的选择。
伪元素选择器
作用:创建虚拟元素(伪元素),用来摆放装饰性的内容。
选择器 | 说明 |
---|---|
::before |
在元素前添加一个伪元元素 |
::after |
在元素后添加一个伪元元素 |
1 | div::before { |
示例代码:
1 | <html> |
解释说明:
.box::before
:在.box
元素的内容之前插入了一个红色的、加粗的文本"开头的伪元素"。因为设置了display: block;
,这个伪元素将会以块级元素的形式出现。.box::after
:在.box
元素的内容之后插入了一个绿色的、加粗的文本"结尾的伪元素"。同样地,由于设置了display: block;
,这个伪元素也是以块级元素的形式出现。
注意事项
content
属性:必须设置content
属性来定义伪元素的内容。如果不需要显示任何内容,可以将content
设为空字符串""
。- 默认显示模式:伪元素默认是行内显示模式
inline
。如果需要改变显示模式,比如改为块级元素block
,可以通过display
属性来实现。 - 权重:伪元素的选择器权重与标签选择器相同,因此在优先级计算时要考虑到这一点。如果需要提高优先级,可以结合类名、ID 或其他选择器来使用。
通过这种方式,伪元素提供了一种灵活的方式来增强网页布局和视觉效果,而不必修改实际的文档结构。
继承 层叠 优先
CSS的三个特性:
- 继承性
- 层叠性
- 优先级
继承性
子级默认继承父级的文字控制属性,注意是文字控制属性。
如果标签有默认文字样式不会继承。例如:a
标签的颜色、标题的字体大小。
常见的文字属性有:
描述 | 属性 |
---|---|
字体大小 | font-size |
字体粗细 | font-weight |
字体倾斜 | font-style |
行高 | line-height |
字体族 | font-family |
字体复合属性 | font |
文本缩进 | text-indent |
文本对齐 | text-align |
修饰线 | text-decoration |
颜色 | color |
层叠性
相同的属性会覆盖:后面的CSS属性覆盖前面的CSS属性。
不同的属性会叠加:不同的CSS属性都生效。
注意:选择器类型相同则遵循层叠性,否则按选择器优先级判断。
1 | <style> |
优先级
什么是优先级
优先级,当一个标签使用了多种选择器时,基于不同种类的选择器的匹配规则。
1 | <style> |
优先级顺序
优先级顺序(从低到高):
- 通配符选择器 (
*
) - 元素(标签)选择器 (例如
p
,div
等) - 类选择器 (
.class
) - 属性选择器 (
[attribute]
) - 伪类选择器 (例如
:hover
,:first-child
等) - ID 选择器 (
#id
) - 行内样式 (直接写在元素的
style
属性中) !important
声明
当多个声明具有相同的权重时,最后定义的样式会覆盖之前的样式。如果使用了!important
标记,那么该声明将拥有最高优先级,除非另一个同样标记为!important
的声明有更高的权重。
1 | <style> |
在上文的例子中,对于<p>
标签内的文本颜色,最终生效的颜色将是紫色,因为.text
类选择器包含了!important
声明,这使得它超越了所有其他没有!important
的声明,包括行内样式。
如果没有!important
声明,那么黄色将会被应用,因为它是由行内样式定义的,而行内样式的优先级高于外部样式表中的ID选择器、类选择器和标签选择器等。
复合选择器(叠加)
复合选择器指的是由多个简单选择器通过组合符(如空格
、>
、+
、~
等)连接而成的选择器。
在计算优先级时,每个简单选择器都有其特定的权重值。这些权重值可以相加来决定复合选择器的整体优先级。
权重计算规则如下:
- 每个
!important
声明增加一个无限大的权重。 - 每个ID选择器(
#id
)增加100的权重。 - 每个类选择器(
.class
)、属性选择器([attribute]
)或伪类(:pseudo-class
)增加10的权重。 - 每个元素(标签)选择器或伪元素(
::pseudo-element
)增加1的权重。 - 通配符选择器(
*
)和组合符本身不增加权重。
当多个选择器结合在一起形成复合选择器时,它们各自的权重会累加起来以确定整个选择器的优先级。
1 | <style> |
在上文,对于<p>
标签内的文本颜色。#main .content
选择器的权重是 110,它将覆盖其他较低权重的选择器,所以文字颜色应该是蓝色。
盒子
组成
- 内容区域:
width
、height
- 内边距:
padding
出现在内容与盒子边缘之间 - 边框线:
border
- 外边距:
margin
出现在盒子外面
1 | div { |
解释说明:background-color
,背景色,padding
区域也会被填充。
边框线
border
属性名:border
属性值:边框线粗细 线条样式 颜色 (不区分顺序)
属性值 | 线条样线式 |
---|---|
solid | 实线 |
dashed | 虚线 |
dotted | 点线 |
1 | div { |
单方向边框线
属性名:border-方位名词
属性值:边框线粗细 线条样式 颜色 (不区分顺序)
1 | div { |
padding
作用:设置内容与盒子边缘之间的距离。
属性名:padding
/padding-方位名词
多值写法:从上开始顺时针赋值,当前方向没有数值则与对面取值相同。
1 | div { |
margin
作用:拉开两个盒子之间的距离
属性名:margin
与padding属性值写法、含义相同。
版心居中:左右margin
值为auto
(盒子要有宽度)
1 | div { |
overflow
作用:控制溢出元素的内容的显示方式。
属性名:overflow
属性值 | 效果 |
---|---|
hidden | 溢出隐藏藏 |
scroll | 溢出滚动动(无论否溢出,都显示示滚动动条位位置置) |
auto | 溢出滚动动(溢出才显示示滚动动条位位置置) |
外边距问题
合并
垂直排列的兄弟元素,上下margin会合并,会取两个margin中的较大值生效。
解决方法:
1 | .one { |
塌陷
父子级的标签,子级的添加上外边距会产生塌陷问题,导致父级一起向下移动。
示例代码:
1 | <html> |
运行结果:
三种解决方法:
- 取消子级
margin
,父级设置padding
通过给父元素添加padding-top
来替代子元素的margin-top
。1
2
3
4
5
6
7
8
9
10.father {
background-color: lightblue;
padding-top: 50px; /* 使用padding代替margin */
}
.son {
width: 100px;
height: 100px;
background-color: orange;
} - 父级设置
overflow: hidden
通过设置父元素的overflow
属性为hidden
,可以创建一个新的块格式化上下文(BFC),从而防止外边距塌陷。1
2
3
4
5
6
7
8
9
10
11.father {
background-color: lightblue;
overflow: hidden; /* 创建新的BFC,防止外边距塌陷 */
}
.son {
margin-top: 50px;
width: 100px;
height: 100px;
background-color: orange;
} - 父级设置
border-top
通过给父元素添加一个非零的border-top
,也可以阻止外边距塌陷。1
2
3
4
5
6
7
8
9
10
11.father {
background-color: lightblue;
border-top: 1px solid transparent; /* 透明边框,不影响视觉效果 */
}
.son {
margin-top: 50px;
width: 100px;
height: 100px;
background-color: orange;
}
圆角
作用:设置元素的外边框为圆角。
属性名:border-radius
属性值:数字+px/百分比
提示:属性值是圆角半径
多值写法:从左上角开始顺时针赋值,当前角没有数值则与对角取值相同。
正圆形状:给正方形盒子设置圆角属性值为"宽高的一半 / 50%"。
1 | img { |
胶囊形状:给长方形盒子设置圆角属性值为"盒子高度的一半"。
1 | div { |
盒子阴影
作用:给元素设置阴影效果
属性名:box-shadow
属性值:X轴偏移量 Y轴偏移量 模糊半径 扩散半径 颜色 内外阴影
注意:
- X轴偏移量 和 Y轴偏移量 必须书写
- 默认是外阴影,内阴影需要添加 inset
1 | div { |
浮动
操作方法
作用:让块元素水平排列。
属性名:float
属性值:
left
:左对齐right
:右对齐
1 | <html> |
特点:
- 浮动后的盒子顶对齐
- 浮动后的盒子具备行内块特点
- 浮动后的盒子脱标,不占用标准流的位置
清除浮动
影响
当一个元素设置了float属性时,该元素会脱离标准流,导致它不会影响其父元素的高度。
如果浮动元素的父元素没有设置明确的高度,并且除了浮动元素之外没有其他内容,那么这个父元素可能会塌陷,即它的高度会缩小到0,从而造成布局错乱。
问题复现
1 | <html> |
额外标签法
在父元素内容的最后添加一个块级元素,设置CSS属性clear: both
。
clear: both;
,使得这个额外的元素不能与任何浮动元素相邻,这样它就会被推到所有浮动元素下面,从而撑开父元素的高度。
1 | <style> |
单伪元素法
:after
伪元素和clear: both;
起到了同样的作用,但它不需要实际的HTML标记,更加语义化且简洁。
- 准备 after 伪元素
1 | .clearfix::after { |
- 父级使用 clearfix 类
1 | <div class="top clearfix"></div> |
双伪元素法
:before
可以帮助修复一些IE6/7中出现的外边距塌陷问题,而:after
则负责清理浮动。这种方式比单伪元素更全面,适用于更多场景。
- 准备 after 和 before 伪元素
1 | /* before 解决外边距塌陷问题 */ |
- 父级使用 clearfix 类
1 | <div class="top clearfix"></div> |
overfow法
通过设置overflow
属性为非visible值,可以强制浏览器创建一个新的块格式化上下文(BFC)。
在一个BFC中,元素的布局不会受到外部浮动的影响,而且该元素也会自动扩展以包围其内部的所有浮动元素,因此解决了高度塌陷的问题。
1 | .top { |
Flex
什么是Flex
Flex,Flex布局,也被称为弹性布局,适合结构化布局场景,提供了强大的空间分布和对齐能力。
Flex布局不会产生浮动布局中脱标现象,布局网页更简单、更灵活。
入门案例
示例代码:
1 | <html> |
运行结果:
组成部分
给父元素设置display: flex
,子元素可以自动挤压或拉伸。
- 弹性容器,Flex Container:设置了
display: flex;
或display: inline-flex;
的元素。 - 弹性项目,Flex Items:弹性容器内的直接子元素。
- 主轴,Main Axis:默认情况下是水平方向,从左到右。可以通过
flex-direction
属性改变方向。 - 侧轴/交叉轴,Cross Axis:与主轴垂直的方向,默认情况下是垂直方向,从上到下。
主轴对齐方式
属性名:justify-content
属性值 | 效果 |
---|---|
flex-start | 默认值,弹性盒子从起点开始依次排列 |
flex-end | 弹性盒子从终点开始依次排列 |
center | 弹性盒子沿主轴居中排列 |
space-between | 弹性盒子沿主轴均匀排列,空白间距均分在弹性盒子之间 |
space-around | 弹性盒子沿主轴均匀排列,空白间距均分在弹性盒子两侧 |
space-evenly | 弹性盒子沿主轴均匀排列,弹性盒子与容器之间间距相等 |
例如,在上文,我们希望三个粉色方块在容器内均匀分布,并且两边有相等的空间,我们可以使用space-between
值。
侧轴对齐方式
align-items
:当前弹性容器内所有弹性盒子的侧轴对齐方式(给弹性容器设置)align-self
:单独控制某个弹性盒子的侧轴对齐方式(给弹性盒子设置)
属性值 | 效果 |
---|---|
stretch | 弹性盒子沿着侧轴线被拉伸至铺满容器(弹性盒子没有设置侧轴方向尺寸则默认拉伸) |
center | 弹性盒子沿侧轴居中排列 |
flex-start | 弹性盒子从起点开始依次排列 |
flex-end | 弹性盒子从终点开始依次排列 |
如果我们要让这些方块在垂直方向上居中,可以设置align-items
为center
。
示例代码:
1 | <style> |
对于单个元素,可以使用align-self
来覆盖align-items
的设置。比如,让其中一个方块靠底部对齐:
1 | .box div:last-child { |
修改主轴方向
主轴默认在水平方向,侧轴默认在垂直方向。
属性名:flex-direction
属性值 | 效果 |
---|---|
row | 水平方向,从左向右(默认) |
column | 垂直方向,从上向下 |
row-reverse | 水平方向,从右向左 |
column-reverse | 垂直方向,从下向上 |
示例代码:
1 | <style> |
运行结果:
弹性伸缩比
作用:控制弹性盒子的主轴方向的尺寸。
属性名:flex
属性值:整数数字,表示占用"父级剩余尺寸的份数"。
比如,我们想让第一个方块占据空间的一半,第二个方块占据空间的二分之一,第三个方块占据空间的二分之一。
1 | <style> |
弹性盒子换行
弹性盒子可以自动挤压或拉伸,默认情况下,所有弹性盒子都在一行显示。
属性名:flex-wrap
属性值
wrap
:换行nowrap
:不换行(默认)
当内容超出容器时,可以通过flex-wrap
来允许弹性盒子换行。如果设置了wrap
,则会根据需要将内容折成多行。
示例代码:
1 | <style> |
行内对齐方式
属性名:align-content
注意:该属性对单行弹性盒子模型无效。
属性值 | 效果 |
---|---|
flex-start | 默认值,弹性盒子从起点开始依次排列 |
flex-end | 弹性盒子从终点开始依次排列 |
center | 弹性盒子沿主轴居中排列 |
space-between | 弹性盒子沿主轴均匀排列,空白间距均分在弹性盒子之间 |
space-around | 弅性盒子沿主轴均匀排列,空白间距均分在弹性盒子两侧 |
space-evenly | 弹性盒子沿主轴均匀排列,弹性盒子与容器之间间距相等 |
定位
概述
作用:灵活的改变盒子在网页中的位置
实现:
- 定位模式:position
- 边偏移:设置盒子的位置
- left
- right
- top
- bottom
相对定位
position: relative
特点:
- 不脱标,占用自己原来位置
- 显示模式特点保持不变
- 设置边偏移则相对自己原来位置移动
相对定位是相对于元素自身原始位置进行偏移,不会影响其他元素的位置。它仍然占据原来的空间。
1 | <html> |
在这个例子中,.relative-box会从其原本应该在的位置向下和向右分别移动20像素和30像素。
绝对定位
position: absolute
使用场景:子级绝对定位,父级相对定位。
特点:
- 脱标,不占位
- 显示模式具备行内块特点
- 设置边偏移则相对最近的已经定位的祖先元素改变位置
- 如果祖先元素都未定位,则相对浏览器可视区改变位置
1 | <html> |
定位居中
实现步骤:
- 绝对定位。
- 水平、垂直边偏移为
50%
。 - 子级向左、上移动自身尺寸的一半。
即:左、上的外边距为尺寸的一半,transform: translate(-50%, -50%)
。
1 | <html> |
固定定位
position: fixed
场景:元素的位置在网页滚动时不会改变
特点:
- 脱标,不占位
- 显示模式具备行内块特点
- 设置边偏移相对浏览器窗口改变位置
固定定位与绝对定位类似,但它相对于浏览器窗口进行定位,即使页面滚动,元素也会保持在相同的位置。
1 | <html> |
堆叠层级z-index
作用:设置定位元素的层级顺序,改变定位元素的显示顺序
属性名:z-index
属性值:整数数字 (默认值为0,取值越大,层级越高)
1 | <html> |