文章目录
学习资料
【尚硅谷前端html+css零基础教程,2023最新前端开发html5+css3视频-哔哩哔哩】
HTML4
开发者文档
w3c官网:www.w3c.org
W3School:www.w3cschool.cn
MDN:developer.mozilla.org —— 平常用的最多
HTML标准结构
文档声明
-
作用:告诉浏览器当前网页的版本。
-
写法:
旧写法:要依网页所用的HTML版本而定,写法有很多。具体有哪些写法请参考:W3C官网-文档声明 (了解即可,千万别背!)
新写法:一切都变得简单了! W3C 推荐使用 HTML5的写法。
<!DOCTYPE html> 或 <!DOCTYPE HTML> 或 <!doctype html>
-
注意:文档声明,必须在网页的第一行,且在 html 标签的外侧。
字符编码
- 平时编写代码时,统一采用
UTF-8 编码
(最稳妥)。 - 为了让浏览器在渲染
html
文件时,不犯错误,可以通过meta
标签配合charset
属性指定字符编码。
<head>
<meta charset="UTF-8"/>
</head>
设置语言
- 主要作用:
(1)让浏览器显示对应的翻译提示。
(2)有利于搜索引擎优化
。 - 具体写法:
<html lang="zh-CN">
标签
排版标签
标签名 | 标签含义 | 单 / 双标签 |
---|---|---|
h1 - h6 | 标题 | 双 |
p | 段落 | 双 |
div | 没有任何含义,用于整体布局 | 双 |
h1
最好写一个,h2 - h6
能适当多写 。h1 - h6
不能互相嵌套,例如:h1
标签中最好不要写h2
标签了。p
标签很特殊!它里面不能有:h1 - h6
、p
、div
标签。
语义化标签
- 概念:用特定的标签,去表达特定的含义。
- 原则:标签的默认效果不重要(后期可以通过
CSS
随便控制效果),语义最重要! - 举例:对于
h1
标签,效果是文字很大 (不重要),语义是网页主要内容 (很重要)。 - 优势:
-
- 代码结构清晰可读性强。
-
- 有利于
SEO
(搜索引擎优化)。
- 有利于
-
- 方便设备解析(如屏幕阅读器、盲人阅读器等)。
块级元素 与 行内元素
-
块级元素:独占一行(排版标签都是块级元素)。
-
行内元素:不独占一行(目前只学了:
input
,稍后会学习更多)。 -
使用规则:
- 块级元素 中
能
写 行内元素(简单记:块级元素中几乎什么都能写)。 - 行内元素 中
能
写 行内元素,但不能
写 块级元素。 - 一些特殊的规则:
h1~h6
不能互相嵌套。p
中不要写块级元素。
我们以后还会学到一些特殊的规则,但不会很多。
- 块级元素 中
-
备注说明:
marquee
元素设计的初衷是:让文字有动画效果,但如今我们可以通过CSS
来实现了,而且还可以实现的更加炫酷,所以marquee
标签已经:过时了(废弃了),不推荐使用。我们只是在开篇的时候,用他做了一个引子而已,在后续的学习过程中,这些已经废弃的标签,我们直接跳过。
文本标签
- 用于包裹:词汇、短语等。
- 通常写在排版标签里面。
- 排版标签更宏观(大段的文字),文本标签更微观(词汇、短语)。
- 文本标签通常都是行内元素。
常用的:
标签名 | 标签语义 | 单 / 双 标签 |
---|---|---|
em | 要着重阅读的内容 | 双 |
strong | 十分重要的内容(语气比em要强) | 双 |
span | 没有语义,用于包裹短语的通用容器 | 双 |
生活中的例子:div
是大包装袋,span
是小包装袋。
图片标签
img
标签,常用属性:-
src
:图片路径
-
alt
:图片描述
-
width
:图片宽度
-
height
:图片高度
超链接
常用属性
a
标签,常用属性:-
href
:要跳转的具体位置
-
target
:跳转时如何打开页面,常用值:_self
在本页签中打开,_blank
在新页签中打开。
注意点:
- 代码中多个空格、多个回车,都会被浏览器解析成一个空格!
- 虽然
a
是行内元素,但a
元素可以包裹除它自身外的任何元素!- 若浏览器无法打开文件,则会引导用户下载。
- 若想强制触发下载,请使用
download
属性,属性值即为下载文件的名称。
跳转锚点
什么是锚点? —— 网页中的一个标记点。
具体使用方式:
第一步设置锚点:
<!-- 第一种方式:a标签配合name属性 -->
<a name="test1"></a>
<!-- 第二种方式:其他标签配合id属性 -->
<h2 id="test2">我是一个位置</h2>
注意点:
- 具有
href
属性的a
标签是超链接,具有name
属性的a
标签是锚点。name
和id
都是区分大小写的,且id
最好别是数字开头。
第二步:跳转锚点
<!-- 跳转到test1锚点 -->
<a href="#test1">去test1锚点</a>
<!-- 跳到本页面顶部 -->
<a href="#">回到顶部</a>
<!-- 跳转到其他页面锚点 -->
<a href="demo.html#test1">去demo.html页面的test1锚点</a>
唤起指定应用
通过a
标签,可以唤起设备应用程序。
<!-- 唤起设备拨号 -->
<a href="tel:10010">电话联系</a>
<!-- 唤起设备发送邮件 -->
<a href="mailto:10010@qq.com">邮件联系</a>
<!-- 唤起设备发送短信 -->
<a href="sms:10086">短信联系</a>
列表
有序列表
概念:有顺序或侧重顺序的列表
<ol>
<li>把冰箱门打开</li>
<li>把大象放进去</li>
<li>把冰箱门关上</li>
</ol>
无序列表
概念:无顺序或不侧重顺序的列表
<ul>
<li>成都</li>
<li>上海</li>
</ul>
列表嵌套
概念:列表中某项内容,又包含一个列表(注意:嵌套时,请务必把结构写完整)。
<h2>我想去的几个城市</h2>
<ul>
<li>成都</li>
<li>
<span>上海</span>
<ul>
<li>外滩</li>
<li>杜莎夫人蜡像馆</li>
</ul>
</li>
</ul>
注意:
li
标签最好写在ul
或ol
中,不要单独使用。
自定义列表
- 概念:所谓自定义列表,就是一个包含
术语名称
以及术语描述
的列表。 - 一个
dl
就是一个自定义列表,一个dt
就是一个术语名称,一个dd
就是一个术语描述(可以有多个)。
<h2>如何高效的学习</h2>
<dl>
<dt>做好笔记</dt>
<dd>笔记是我们以后复习的一个抓手</dd>
<dt>多加练习</dt>
<dd>别怕出错</dd>
</dl>
表格
基本结构
一个完整的表格由:表格标题、表格头部、表格主体、表格脚注,四部分组成。
- 表格涉及到的标签:
-
table
:表格
-
caption
:表格标题
-
thead
:表格头部
-
tbody
:表格主体
-
tfoot
:表格脚注
-
tr
:每一行
-
th
、td
:每一个单元格(备注:表格头部中用th
,表格主体、表格脚注中用:td
)
具体编码:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>表格</title>
</head>
<body>
<table border="1">
<!-- 表格标题 -->
<caption>学生信息</caption>
<!-- 表格头部 -->
<thead>
<tr>
<th>姓名</th>
<th>性别</th>
<th>年龄</th>
<th>民族</th>
<th>政治面貌</th>
</tr>
</thead>
<!-- 表格主体 -->
<tbody>
<tr>
<td>张三</td>
<td>男</td>
<td>18</td>
<td>汉族</td>
<td>团员</td>
</tr>
<tr>
<td>李四</td>
<td>女</td>
<td>20</td>
<td>满族</td>
<td>群众</td>
</tr>
<tr>
<td>王五</td>
<td>男</td>
<td>19</td>
<td>回族</td>
<td>党员</td>
</tr>
<tr>
<td>赵六</td>
<td>女</td>
<td>21</td>
<td>壮族</td>
<td>团员</td>
</tr>
</tbody>
<!-- 表格脚注 -->
<tfoot>
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
<td>共计:4人</td>
</tr>
</tfoot>
</table>
</body>
</html>
常用属性
table
:表格-
width
:设置表格宽度
-
height
:设置表格最小高度,表格最终高度可能比设置的值大。
-
border
:设置表格边框宽度。
-
cellspacing
:设置单元格之间的间距。
thead
:表格头部-
height
:设置表格头部高度。
-
align
:设置单元格的水平对齐方式,可选值:left
左对齐、center
中间对齐、right
右对齐
-
- valign:设置单元格的垂直对齐方式,可选值:
top
顶部对齐、middle
中间对齐、bottom
底部对齐
- valign:设置单元格的垂直对齐方式,可选值:
tbody
:表格主体:常用属性与thead
相同tr
:行:常用属性与thead
相同tfoot
:表格脚注:常用属性与thead
相同td
:普通单元格-
width
:设置单元格的宽度,同列所有单元格全都受影响
-
heigth
:设置单元格的高度,同行所有单元格全都受影响
-
align
:设置单元格的水平对齐方式
-
valign
:设置单元格的垂直对齐方式
-
rowspan
:指定要跨的行数
-
colspan
:指定要跨的列数
th
:表头单元格:常用属性与td
相同
注意点:
<table>
元素的border
属性可以控制表格边框,但border
值的大小,并不控制单元格边框的宽度,只能控制表格最外侧边框的宽度,这个问题如何解决?—— —— 后期靠CSS
控制。- 给某个
th
或td
设置了宽度之后,他们所在的那一列的宽度就确定了。- 给某个
th
或td
设置了高度之后,他们所在的那一行的高度就确定了。
具体编码:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>表格_常用属性</title>
</head>
<body>
<table border="1" width="500" height="300" cellspacing="0">
<!-- 表格标题 -->
<caption>学生信息</caption>
<!-- 表格头部 -->
<thead height="50" align="center" valign="middle">
<tr>
<th width="50" height="50" align="right" valign="bottom">姓名</th>
<th>性别</th>
<th>年龄</th>
<th>民族</th>
<th>政治面貌</th>
</tr>
</thead>
<!-- 表格主体 -->
<tbody height="520" align="center" valign="middle">
<tr height="50" align="center" valign="middle">
<td>张三</td>
<td>男</td>
<td>18</td>
<td>汉族</td>
<td>团员</td>
</tr>
<tr>
<td>李四</td>
<td>女</td>
<td>20</td>
<td>满族</td>
<td>群众</td>
</tr>
<tr>
<td>王五</td>
<td>男</td>
<td>19</td>
<td>回族</td>
<td>党员</td>
</tr>
<tr>
<td align="right" valign="top">赵六</td>
<td>女</td>
<td>21</td>
<td>壮族</td>
<td>团员</td>
</tr>
</tbody>
<!-- 表格脚注 -->
<tfoot height="50" align="center" valign="middle">
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
<td>共计:4人</td>
</tr>
</tfoot>
</table>
</body>
</html>
跨行与跨列
rowspann
:指定要跨的行数colspan
:指定要跨的列数
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width= , initial-scale=1.0">
<title>表格_跨行与跨列</title>
</head>
<body>
<table border="1" cellspacing="0">
<caption>课程表</caption>
<thead>
<tr>
<th>项目</th>
<th colspan="5">上课</th>
<th colspan="2">活动与休息</th>
</tr>
</thead>
<tbody>
<tr>
<td>星期</td>
<td>星期一</td>
<td>星期二</td>
<td>星期三</td>
<td>星期四</td>
<td>星期五</td>
<td>星期六</td>
<td>星期日</td>
</tr>
<tr>
<td rowspan="4">上午</td>
<td>3-2</td>
<td>3-3</td>
<td>3-4</td>
<td>3-5</td>
<td>3-6</td>
<td>3-7</td>
<td rowspan="4">休息</td>
</tr>
<tr>
<td>4-2</td>
<td>4-3</td>
<td>4-4</td>
<td>4-5</td>
<td>4-6</td>
<td>4-7</td>
</tr>
<tr>
<td>5-2</td>
<td>5-3</td>
<td>5-4</td>
<td>5-5</td>
<td>5-6</td>
<td>5-7</td>
</tr>
<tr>
<td>6-2</td>
<td>6-3</td>
<td>6-4</td>
<td>6-5</td>
<td>6-6</td>
<td>6-7</td>
</tr>
<tr>
<td rowspan="2">下午</td>
<td>7-2</td>
<td>7-3</td>
<td>7-4</td>
<td>7-5</td>
<td>7-6</td>
<td>7-7</td>
<td rowspan="2">休息</td>
</tr>
<tr>
<td>8-2</td>
<td>8-3</td>
<td>8-4</td>
<td>8-5</td>
<td>8-6</td>
<td>8-7</td>
</tr>
</tbody>
</table>
</body>
</html>
常用标签补充
br
:换行
hr
:分隔
pre
:按原文显示(一般用于在页面中嵌入大段代码)
注意点:
- 不要用
<br>
来增加文本之间的行间隔,应使用后面即将学到的CSS margin
属性。<hr>
的语义是分隔,如果不想要语义,只是想画一条水平线,那么应当使用CSS
完成。
表单
基本结构
form
:表单-
action
:用于指定表单的提交地址
-
target
:用于控制表单提交后,如何打开页面,常用值:_self
:在本窗口打开、_blank
:在新窗口打开
-
method
:请求方式,可选值:get
、post
提交按钮
<input type="submit" value="点我提交表单">
<button>点我提交表单</button>
注意:
button
标签type
属性的默认值是submit
。button
不要指定name
属性。input
标签编写的按钮,使用value
属性指定按钮文字。
重置按钮
<input type="reset" value="点我重置">
<button type="reset">点我重置</button>
注意点:
button
不要指定name
属性。input
标签编写的按钮,使用value
属性指定按钮文字。
禁用表单控件
给表单控件的标签设置disabled
即可禁用表单控件。
input
、textarea
、button
、select
、option
都可以设置disabled
属性
label标签
label
标签可与表单控件相关联,关联之后点击文字,与之对应的表单控件就会获取焦点。
两种与label
关联方式如下:
1、让label
标签的for
属性的值等于表单控件的id
。
2、把表单控件套在label
标签的里面。
fieldset 与 legend 的使用(了解即可)
fieldset
可以为表单控件分组、legend
标签是分组的标题
框架标签
iframe
:框架(在网页中嵌入其他文件)-
name
:框架名字,可以与target
属性配合。
-
width
:框架的宽度。
-
height
:框架的高度。
-
frameborder
:是否显示边框,值:0或者1。
iframe
标签的实际应用:
- 在网页中嵌入广告。
- 与超链接或表单的
target
配合,展示不同的内容。
HTML全局属性
id
:给标签指定唯一标识,注意:id
是不能重复的。class
:给标签指定类名,随后通过CSS
就可以给标签设置样式。style
:给标签设置CSS
样式。dir
:内容的方向,值:ltr
、rtl
,注意不能在<head>
、<html>
、<meta>
、<script>
、<style>
、<title>
中使用。title
:给标签设置一个文字提示,一般超链接和图片用的比较多。lang
:给标签指定语言,注意不能在<head>
、<html>
、<meta>
、<script>
、<style>
、<title>
中使用。
meta 元信息
- 配置字符编码
<meta charset="utf-8">
- 针对
IE
了浏览器的兼容性配置<meta http-equiv="X-UA-Compatible" content="IE=edge">
- 针对移动端的配置(移动端课程中会详细讲解)
<meta name="viewport" content="width=device-width, initial-scale=1.0">
- 配置网页关键字
<meta name="keywords" content="8-12个英文逗号隔开的单词/词语">
- 配置网页描述信息
<meta name="description" content="80字以内的一段话,与网站内容相关">
- 针对搜索引擎爬虫配置
<meta name="robots" content="此处可选值见下表">
- 配置网页作者
<meta name="author" content="tony">
- 配置网页生成工具
<meta name="generator" content="Visual Studio Code">
- 配置定义网页版权信息
<meta name="copyright" content="2023-2027@版权所有">
- 配置网页自动刷新(如下代码含义:10秒去百度)
<meta http-equiv="refresh" content="10;url=http://www.baidu.com">
CSS3
CSS简介
CSS
的全称为:层叠样式表(Cascading Style Sheets
)。
CSS
也是一种标记语言,用于给HTML
结构设置样式,例如:文字大小、颜色、元素宽高等等。
简单理解:
CSS
可以美化HTML
,让HTML
更漂亮。
核心思想:HTML
搭建结构,CSS
添加样式,实现了:结构与样式的分离。
CSS的编写位置
行内样式
写在标签的style
属性中,(又称:内联样式)。
语法:
<h1 style="color:red;font-size:60px;">欢迎来到尚硅谷学习</h1>
注意点:
style
属性的值不能随便写,写要符合CSS
语法规范,是名:值;
的形式。- 行内样式表,只能控制当前标签的样式,对其他标签无效。
存在的问题:
书写繁琐、样式不能复用、并且没有体现:出结构与样式分离的思想,不推荐大量使用,只有对当前元素添加简单样式时,才偶尔使用。
内部样式
写在html
页面内部,将所有的CSS
代码提取出来,单独放在<style>
标签中。
语法:
<style>
h1 {
color: red;
font-size: 40px;
}
</style>
注意点:
<style>
标签理论上可以放在HTML
文档的任何地方,但一般都放在<head>
标签中。- 此种写法:样式可以复用、代码结构清晰。
存在的问题:
- 并没有实现,结构与样式完全分离。
- 多个
HTML
页面无法复用样式。
外部样式
写在单独的.css
文件中,随后在HTML
文件中引入使用。
语法:
1、新建一个扩展名为.css
的样式文件,把所有CSS
代码都放入此文件中。
h1 {
color: red;
font-size: 40px;
}
2、在HTML
文件中引入.css
文件。
<link rel="stylesheet" href="./xxx.css">
注意点:
<link>
标签要写在<head>
标签中。<link>
标签属性说明:href
引入的文档来自于哪里,rel
(relation:关系)说明引入的文档于当前文档之间的关系。- 外部样式的优势:样式可以复用、结构清晰、可触发浏览器的缓存机制,提高访问速度,实现了结构于样式的完全分离。
- 实际开发中,几乎都使用外部样式,这是最推荐的使用方式!
样式表的优先级
优先级规则:行内样式 > 内部样式 = 外部样式
- 内部样式、外部样式,这二者的优先级相同,且:后面的 会覆盖 前面的(简记:“后来者居上”)。
- 同一个样式表中,优先级也和编写顺序有关,且:后面的 会覆盖 前面的(简记:“后来者居上”)。
- 行内样式
-
- 优点:优先级最高
-
- 缺点:结构于样式未分离、代码结构混乱、样式不能复用
-
- 使用频率:很低
-
- 作用范围:当前标签
- 内部样式
-
- 优点:样式可复用、代码结构清晰
-
- 缺点:结构于样式未彻底分离、样式不能多页面复用
-
- 使用频率:一般
-
- 作用范围:当前页面
- 外部样式
-
- 优点:样式可多页面复用、代码结构清晰、可触发浏览器的缓存机制、结构与样式彻底分离
-
- 缺点:需要引入才能使用
-
- 使用频率:最高
-
- 作用范围:多个页面
语法规范
CSS
语法由两部分构成:
选择器:找到要添加样式的元素。
声明块:设置具体的样式(声明块是由一个或多个声明组成的),声明的格式为:属性名: 属性值;
备注1:最后一个声明后的分号理论上能省略,但最好还是写上。
备注2:选择器与声明块之间,属性名与属性值之间,均有一个空格,理论上能省略,但最好还是写上。
注释的写法:
/* 给h1元素添加样式 */
h1 {
/* 设置文字颜色为红色 */
color: red;
/* 设置文字大小为40px */
font-size: 40px;
}
代码风格
展开风格 —— —— 开发时推荐,便于维护和调试
h1 {
color: red;
font-size: 40px;
}
紧凑风格 —— —— 项目上线时推荐,可减少文件体积。
h1{color:red;font-size:40px;}
备注:
项目上线时,我们会通过工具将【展开风格】的代码,变成【紧凑风格】,这样可以减少文件体积,节约网络流量,同时也能让用户打开网页时速度更快。
选择器
基本选择器
通配选择器
作用:可以选中所有的HTML
元素。
语法:
* {
属性名: 属性值;
}
举例:
* {
/* 选中所有元素 */
color: orange;
font-size: 40px;
}
备注:目前来看通配选择器貌似有点鸡肋,但后面清除样式时,会对我们有很大帮助,后面会详细讲。
元素选择器
作用:为页面中 某种元素 统一设置样式。
语法:
标签名 {
属性名: 属性值;
}
举例:
/* 选中所有h1元素 */
h1 {
color: orange;
font-size: 40px;
}
/* 选中所有p元素 */
p {
color: blue;
font-size: 60px;
}
备注:元素选择器无法实现差异化设置,例如上面的代码中,所有的p
元素效果都一样。
类选择器
作用:根据元素的class
值,来选中某些元素。
class
翻译过来有:种类、类别的含义,所以class
值,又称:类名。
语法:
.类名 {
属性名: 属性值;
}
举例:
/* 选中所有class值为speak的元素 */
.speak {
color: red;
}
/* 选中所有class值为answer的元素 */
.answer {
color: blue;
}
注意点:
- 元素的
class
属性不带.
,但CSS
的类选择器要带.
。 class
值,是我们自定义的,按照标准:不要使用纯数字、不要使用中文、尽量使用英文与数字的组合,若由多个单词组成,使用-
做连接,例如:left-menu
,且命名要有意义,做到“见名知意”。- 一个元素不能写多个
class
属性,下面错误实例
:<!-- 该写法错误,元素的属性不能重复,后写的会失效 --> <h1 class="speak" class="big">你好啊</h1>
- 一个元素的
class
属性,能写多个值,要用空格隔开,例如:<!-- 该写法正确,class属性,能写多个值 --> <h1 class="speak big">你好啊</h1>
ID选择器
作用:根据元素的id
属性值,来精准的选中某个元素。
语法:
#id值 {
属性名: 属性值;
}
举例:
/* 选中id值为earthy的那个元素 */
#earthy {
color: red;
font-size: 60px;
}
注意:
id
属性值:尽量由字母、数字、**下划线(_
)、短杠(_
)组成,最好以字母开头、不要包含空格、区分大小写。
一个元素只能拥有一个id
属性,多个元素的id
属性值不能相同。
一个个元素可以同时拥有id
和class
属性。
基本选择器总结
- 通配选择器
-
- 特点:选中所有标签,一般用于清除样式。
-
- 用法:
* {color:red}
- 用法:
- 元素选择器
-
- 特点:选中所有同种标签,但不能差异化选择。
-
- 用法:
h1 {color:red}
- 用法:
- 类选择器
-
- 特点:选中所有特定类名(
class
值)的元素 —— ——使用频率很高
。
- 特点:选中所有特定类名(
-
- 用法:
.say {color:red}
- 用法:
- ID选择器
-
- 特点:选中特定
id
值的那个元素(唯一的)。
- 特点:选中特定
-
- 用法:
#earthy {color:red}
- 用法:
复合选择器
交集选择器
作用:选中同时符合
多个条件的元素。
交集有并且的含义(通俗理解:即…又… 的意思),例如:年轻
且
长得帅。
语法:选择器1选择器2选择器3...选择器n {}
举例:
/* 选中:类名为beauty的p元素,为此种写法用的非常多!!! */
p.beauty {
color: blue;
}
/* 选中:类名包含rich和beauty的元素 */
.rich.beauty{
color: green;
}
注意:
- 有标签名,标签名必须写在前面。
id
选择器、理论上可以作为交集的条件,但实际应用中几乎不用 —— —— 因为没有意义。。- 交集选择器不可能出现两个选择器,因为一个元素,不可能即是
p
元素又是span
元素。 - 用的最多的交集选择器是:元素选择器配合类名选择器,例如:
p.beauty
。
并集选择器
作用:选中多个选择器对应的元素,又称:分组选择器。
所谓并集就是或者的含义(通俗理解:要么…要么…的意思),例如:给我转10万块钱
或者
我报警。
语法:选择器1,选择器2,选择器3,...选择器n {}
多个选择器通过
,
连接,此处,
的含义就是:或。
举例:
/* 选中id为peiqi,或类名为rich,或类名为beauty的元素 */
#peiqi,
.rich,
.beauty {
font-size: 40px;
background-color: skyblue;
width: 200px;
}
注意:
1、并集选择器,我们一般竖着写。
2、任何形式的选择器,都可以作为并集选择器的一部分。
3、并集选择器,通常用于集体声明,可以缩小样式表体积。
HTML元素间的关系
后代选择器
作用:选中指定元素中,符合要求的后代元素。
语法:选择器1 选择器2 选择器3 ...... 选择器n {}
(先写祖先,在写后代)
选择器之间,用空格隔开,空格可以理解为:“
xxx
中的”,其实就是后代的意思。
选择器1234...n
,可以是我们之前学的任何一种选择器。
举例:
/* 选中ul中的所有li */
ul li {
color: red;
}
/* 选中ul中所有li中的a */
ul li a {
color: orange;
}
/* 选中类名为subject元素中的所有li */
.subject li {
color: blue;
}
/* 选中类名为subject元素中所有类名为front-end的li */
.subject li .front-end {
color: blue;
}
注意:
1、后代选择器,最终选择的是后代,不选中祖先。
2、儿子、孙子、重孙子,都算是后代。
3、结构一定要符合之前讲的HTML
嵌套要求,例如:不能p
中写h1 ~ h6
。
子代选择器
作用:选中指定元素中,符合要求的子元素(儿子元素)。(先写父,在写子)
子代选择器:子元素选择器、子选择器
语法:选择器1>选择器2>选择器3> ...... 选择器n {}
选择器之间,用
>
隔开,>
可以理解为:“xxx
的子代”,其实就是儿子的意思。
选择器1234 ...n
,可以是我们之前学的任何一种选择器。
举例:
/* div中的子代a元素 */
div>a {
color: red;
}
/* 类名为persons的元素中子代a元素 */
.persons>a{
color: red;
}
注意:
1、子代选择器,最终选择的是子代,不是父级。
2、子、孙子、重孙子、重重孙子 … 统称后代!
,子就是指儿子。
兄弟选择器
相邻兄弟选择器
作用:选中指定元素后,符合条件的相邻兄弟元素。
所谓相邻,就是紧挨着他的下一个,简记:睡在我下铺的兄弟。
语法:选择器1+选择器2 {}
示例:
/* 选中div相邻的兄弟p元素 */
div+p {
color: red;
}
通用兄弟选择器
作用:选中指定元素后,符合条件的所有兄弟元素。(简记:睡在我下铺的所有兄弟)
语法:选择器1~选择器2 {}
示例:
/* 选中div后的所有的兄弟p元素 */
div~p {
color: red;
}
注意:两种兄弟选择器,选择的是下面的兄弟。
属性选择器
作用:选中属性值符合一定要求的元素。
语法:
1、[属性名]
选中具有某个属性的元素。
2、[属性名="值"]
选中包含某个属性,且属性值等于指定值的元素。
3、[属性名^="值"]
选中包含某个属性,且属性值以指定的值开头的元素。
4、[属性名$="值"]
选中包含某个属性,且属性值以指定的值结尾的元素。
5、[属性名*="值"]
选择包含某个属性,属性值包含指定值的元素。
伪类选择器
作用:选中特殊状态的元素。
如何理解“伪”?—— 虚假的,不是真的。
如何理解“伪类”?—— 像类(class
),但不是类,是元素的一种特殊状态。
动态伪类
:link
超链接未被访问的状态。:visited
超链接访问过的状态。:hover
鼠标悬停在元素上的状态。:active
元素激活的状态。什么是激活?—— —— 按下鼠标不松开。
注意点:遵循LVHA
的顺序,即:link
、visited
、hover
、active
。:focus
获取焦点的元素。表单类元素才能使用
:focus
伪类。
当用户:点击元素,触摸元素,或通过键盘的“tab
”键等方式,选择元素时,就是获取焦点。
结构伪类
常用
:first-child
所有兄弟元素中的第一个。:last-child
所有兄弟元素中的最后一个。:nth-child(n)
所有兄弟元素中的第n个。:first-of-type
所有同类型兄弟元素中的第一个。:last-of-type
所有同类型兄弟元素中的最后一个。:nth-of-type(n)
所有同类型兄弟元素中的第n个。
了解即可
:nth-last-child(n)
所有兄弟元素中的倒数第n个。:nth-last-of-type(n)
所有同类型兄弟元素中的倒数第n个。:only-child
选中没有兄弟的元素(独生子女)。:only-of-type
选择没有同类型兄弟的元素。:root
根元素。:empty
内容为空元素(空格也算内容)。
关于n
的值:
0
或不写
:什么都选不中 —— —— 几乎不用。n
:选中所有子元素 —— —— 几乎不用。1~正无穷的整数
:选中对应序号的子元素。2n
或even
:选中序号为偶数的子元素。2n+1
或odd
:选中序号为奇数的子元素。-n+3
:选中的是前3
个。
否定伪类
:not(选择器)
:排除满足括号中条件的元素。
UI伪类
:checked
被选中的复选框或单选按钮。:enable
可用的表单元素(没有disabled
属性)。:disabled
不可用的表单元素(有disabled
属性)。
目标伪类(了解)
:target
选中锚点指向的元素。
语言伪类(了解)
:lang()
根据指定的语言选择元素(本质是看lang
属性的值)。
伪元素选择器
作用:选中元素中的一些特殊位置。
常用伪元素:
::first-letter
选中元素中的第一个文字。
::first-line
选中元素中的第一行文字。
::selection
选中被鼠标选中的内容。
::placeholder
选中输入框的提示文字。
::before
在元素最开始的位置,创建一个子元素(必须用content
属性指定内容)。
::after
在元素最后的位置,创建一个子元素(必须用content
属性指定内容)。
选择器优先级
通过不同的选择器,选中相同的元素,并且为相同的样式名设置不同的值时,就发生了样式的冲突。
到底应用哪个样式,此时就需要看优先级了。
简单描述:
行内样式
>
ID选择器>
类选择器>
元素选择器>
通配选择器
CSS三大特性
层叠性
概念:如果发生了样式冲突,那就会根据一定的规则(选择器的优先级),进行样式的层叠(覆盖)。
什么是样式冲突?—— —— 元素的同一个样式名,被设置了不同的值,这就是冲突。
继承性
概念:元素会自动拥有其父元素,或其祖先元素上所设置的某些样式。
规则:优先继承离得近的。
常见的可继承属性:
text-??
,font-??
,line-??
、color
…
备注:参考MDN
官网,可查询属性是否可被继承。
优先级
简单聊:!important
>
行内样式 >
ID选择器 >
类选择器 >
元素选择器 >
*
>
继承的样式
详细聊:需要计算权重。
计算权重时需要注意:
并集选择器的每一个部分是分开算的!
颜色的表示
表示方式一:颜色名
编写方式:直接使用颜色对应的英文单词,编写比较简单,比如:
红色:red
绿色:green
蓝色:blue
紫色:purple
橙色:orange
灰色:gray
…
颜色这种方式,表达的颜色比较单一,所以用的并不多。
表示方式二:rgb 或 rgba
编写方式:使用 红、黄、蓝 这三种光的三原色进行组合。
r
表示 红色
g
表示 绿色
b
表示 蓝色
a
表示 透明度
小规律:
- 若三种颜色值相同,呈现的是灰色,值越大,灰色越浅。
rgb(0,0,0)
是黑色,rgb(255,255,255)
是白色。- 对于
rgba
来说,前三位的rgb
形式要保持一致,要么都是0~255
的数字,要么都是百分比
。
表示方式三:HEX 或 HEXA
HEX
的原理于rgb
一样,依然是通过:红、绿、蓝
进行组合,只不过要用6个数字,分成3组来表达,格式为:#rrggbb
注意点:
IE
浏览器不支持HEXA
,但支持HEX
。
表示方式四:HSL 或 HSLA
HSL
是通过:色相、饱和度、亮度,来表示一个颜色的,格式为:hsl(色相,饱和度,亮度)
常用字体属性
字体大小
属性名:font-size
语法:
div {
font-size: 40px;
}
注意点:
Chrome
浏览器支持的最小文字为12px
,默认的文字大小为16px
,并且0px
会自动消失。- 不同浏览器默认的字体大小可能不一致,所以最好给一个明确的值,不要用默认大小。
- 通常以给
body
设置font-size
属性,这样body
中的其他元素就都可以继承了。
字体族(设置使用的字体)
属性名:font-family
语法:
div {
font-family: "STCaiyun","Microsoft YaHei",sans-serif
}
注意点:
- 使用字体的英文名兼容性会更好,具体的英文名可百度自行查询。
- 如果字体名包含空格,必须使用引号包裹起来。
- 可以设置多个字体,按照从左到右的顺序逐个查找,找到就用,没有找到就使用后面的,且通常在最后写上
serif
(衬线字体)或sans-serif
(非衬线字体)。windows
系统中,默认的字体就是微软雅黑。
字体风格(正常、斜体)
属性名:font-style
常用值:
normal
:正常(默认值)italic
:斜体(使用字体自带的斜体效果)oblique
:斜体(强制倾斜产生斜体效果)
实现斜体时,更推荐使用italic
。
语法:
div {
font-style: italic;
}
字体粗细
属性名:font-weight
常用值:
lighter
:细normal
:正常bold
:粗bolder
:很粗(多数字体不支持)
数值:
100~1000
且无单位,数值越大,字体越粗(或一样粗,具体看字体设计时的精确程度)。100~300
等同于lighter
,400~500
等同于normal
,600
及以上等同于bold
。
语法:
div {
font-weight: bold;
}
div {
font-weight: 600;
}
字体复合写法
属性名:font
可以把上述字体样式合并成一个属性。
编写规则:
字体大小
、字体族
必须都写上。字体族
必须是最后一位
、字体大小
必须是倒数第二位
。- 各个属性间用空格隔开。
实际开发中更推荐复合写法,但这也不是绝对的,比如只想设置字体大小,那就直接用font-size
属性。
常用文本属性
文本颜色
属性名:color
可选值:
- 颜色名
rgb
或rgba
HEX
或HEXA
(十六进制)HSL
或HSLA
开发中常用的是:rgb/rgba
或 HEX/HEXA
(十六进制)。
举例:
div {
color: rgb(112,45,78);
}
文本间距
字母间距:letter-spacing
单词间距:word-spacing
(通过空格识别词)
属性值为像素(px
),正值让间距增大,负值让间距缩小。
文本修饰(无装饰线、下划线、上划线、删除线、虚线、波浪线)
属性名:text-decoration
可选值:
none
:无装饰线(常用)underline
:下划线(常用)overline
:上划线line-through
:删除线
可搭配如下值使用:
dotted
:虚线wavy
:波浪线- 也可以指定颜色
举例:
a {
text-decoration: none;
}
文本缩进
属性名:text-indent
属性值:css
中的长度单位,例如:px
举例:
div {
text-indent: 40px;
}
后面我们会学习
css
中一些新的长度单位,目前我们只知道像素(px
)。
文本对齐_水平
属性名:text-align
常用值:
left
:左对齐(默认值)right
:右对齐center
:居中对齐
举例:
div {
text-align: center;
}
行高
属性名:line-height
可选值:
normal
:由浏览器根据文字大小决定一个默认值。- 像素(
px
)。- 数字:参考自身
font-size
的倍数(很常用)。- 百分比:参考自身
font-size
的百分比。
备注:由于字体设计原因,文字在一行中,并不是绝对垂直居中,若一行都是文字,不会太影响观感。
举例:
div {
line-height: 60px;
line-height: 1.5;
line-height: 150%;
}
注意事项:
line-height
过小会怎样?—— —— 文字产生重叠,且最小值是0
,不能为负数。line-height
是可以继承的,且为了能更好的呈现文字,最好写数值。line-height
和height
是什么关系?
设置了height
,那么高度就是height
的值。
不设置height
的时候,会根据line-height
计算高度。
应用场景:
- 对于多行文字,控制行与行之间的距离。
- 对于单行文字:让
height
等于line-height
,可以实现文字垂直居中。
备注:由于字体设计原因,靠上述办法实现的居中,并不是绝对的垂直居中,但如果一行中都是文字,不会影响观感。
文本对齐_垂直
依靠 height 与 line-height
顶部:无需任何属性,在垂直方向上,默认就是顶部对齐。
居中:对于单行文字,让height
=line-height
即可。
问题:多行文字垂直居中怎么办? —— —— 后面我们用定位去做。
底部:对于单行文字,目前一个临时的方式:让line - height = (height × 2) - font-size - x
。
备注:x
是根据字体族,动态决定的一个值。
问题:垂直方向上的底部对齐,更好的解决办法是什么?—— —— 后面我们用定位去做。
vertical-align 同一行元素之间垂直对齐方式
属性名:vertical-align
作用:用于指定同一行元素之间,或表格单元格内文字的垂直对齐方式。
常用值:
baseline
(默认值):使元素的基线与父元素的基线对齐。top
:使元素的顶部与其所在行的顶部对齐。middle
:使元素的中部与父元素的基线加上父元素字母 x 的一半对齐。bottom
:使元素的底部与其所在行的底部对齐。
特别注意:vertical-align
不能控制块元素。
列表相关属性
设置列表符号
属性名:list-style-type
作用:设置列表符号
常用值:
none
:不显示前面的标识(很常用!)square
:实心方块disc
:圆形decimal
:数字lower-roman
:小写罗马字upper-roman
:大写罗马字lower-alpha
:小写字母upper-alpha
:大写字母
设置列表符号的位置
属性名:list-style-position
作用:设置列表符号的位置
常用值:
inside
:在li
的里面outside
:在li
的外边
自定义列表符号
属性名:list-style-image
作用:自定义列表符号
属性值:url(图片地址)
复合属性
属性名:list-style
作用:复合属性
属性值:没有数量、顺序的要求
注意
列表相关的属性,可以作用在 ul
、ol
、li
元素上。
表格相关属性
边框相关属性
边框宽度
属性名:border-width
作用:边框宽度
属性值:CSS
中可用的长度值
边框颜色
属性名:border-color
作用:边框颜色
属性值:CSS
中可用的颜色值
边框风格
属性名:border-style
作用:边框风格
属性值:
none
:默认值solid
:实线dashed
:虚线dotted
:点线double
:双实线
边框复合属性
属性名:border
作用:边框复合属性
属性值:没有数量、顺序的要求
注意
- 以上
4
个边框相关的属性,其他元素也可以用,这是我们第一次遇见它们。 - 在后面的盒子模型中,我们会详细讲解边框相关的知识。
表格独有属性
设置列宽度
属性名:table-layout
作用:设置列宽度
属性值:
auto
:自动,列宽根据内容计算(默认值)。fixed
:固定列宽,平均分。
单元格间距
属性名:border-spacing
作用:单元格间距
属性值:
CSS
中可用的长度值。- 生效的前提:单元格边框不能合并。
合并单元格边框
属性名:border-collapse
作用:合并单元格边框
属性值:
collapse
:合并separate
:不合并
隐藏没有内容的单元格
属性名:empty-cells
作用:隐藏没有内容的单元格
属性值:
show
:显示,默认hide
:隐藏
生效前提,单元格不能合并。
设置表格标题位置
属性名:caption-side
作用:设置表格标题位置
属性值:
top
:上面(默认值)bottom
:在表格下面
注意
以上5
个属性,只有表格才能使用,即<table>
标签。
背景属性
设置背景颜色
属性值:background-color
作用:设置背景颜色
属性值:符合CSS
中颜色规范的值,默认背景颜色是transparent
透明色。
设置背景图片
属性值:background-image
作用:设置背景图片
属性值:url(图片的地址)
设置背景重复方式
属性值:background-repeat
作用:设置背景重复方式
属性值:
repeat
:重复,铺满整个元素,默认值。repeat-x
:只在水平方向重复。repeat-y
:只在垂直方向重复。no-repeat
:不重复。
设置背景图位置
属性值:background-position
作用:设置背景图位置
属性值:
通过关键字设置位置
写两个值,用空格隔开
水平:left
、center
、right
垂直:top
、center
、bottom
如果只写一个值,另一个方向的值取center
通过长度指定坐标位置
以元素左上角,为坐标原点,设置图片左上角的位置。
两个值,分别是x
坐标和y
坐标。
只写一个值,会被当做x
坐标,y
坐标取center
。
复合属性
属性值:background
作用:复合属性
属性值:没有数量和顺序要求
鼠标属性
属性值:cursor
作用:设置鼠标光标的样式
属性值:
pointer
:小手move
:移动图标text
:文字选择器crosshair
:十字架wait
:等待help
:帮助
扩展:自定义鼠标图标
/* 自定义鼠标光标 */
cursor: url("./arrow.png"),pointer;
盒子模型
长度单位
px
:像素。em
:相对元素font-size
的倍数。rem
:相对根字体大小,html标签就是根。%
:相对父元素计算。
注意:
CSS
中设置长度,必须加单位,否则样式无效!
元素的显示模式
块元素(block)
又称:块级元素
特点:
- 在页面中
独占一行
,不会与任何元素共用一行,是从上到下排列的。- 默认宽度:撑满
父元素
。- 默认高度:由
内容
撑开。可以
通过CSS
设置宽高。
- 主体结构标签:
<thml>
、<body>
- 排版标签:
<h1> ~ <h6>
、<hr>
、<p>
、<pre>
、<div>
- 列表标签:
<ul>
、<ol>
、<li>
、<dl>
、<dt>
、<dd>
- 表格相关标签:
<table>
、<tbody>
、<thead>
、<tfoot>
、<tr>
、<caption>
<form>
与<option>
行内元素(inline)
又称:内联元素
特点:
- 在页面中
不独占一行
,一行中不能容纳下的行内元素,会在下一行继续从左到右排列。- 默认宽度:由
内容
撑开。- 默认高度:由
内容
撑开。无法
通过CSS
设置宽高。
- 文本标签:
<br>
、<em>
、<strong>
、<sup>
、<sub>
、<del>
、<ins>
<a>
与<label>
行内块元素(inline-block)
又称:内联块元素
特点:
- 在页面中
不独占一行
,一行中不能容纳下的行内元素,会在下一行继续从左到右排列。- 默认宽度:由
内容
撑开。- 默认高度:由
内容
撑开。可以
通过CSS
设置宽高。
- 图片:
<img>
- 单元格:
<td>
、<th>
- 表单控件:
<input>
、<textarea>
、<select>
、<button>
- 框架标签:
<iframe>
注意
元素早期只分为:行内元素、块级元素,区分条件也只有一条:“是独占一行”,如果按照这种分类方式,行内块元素应该算作行内元素。
修改元素显示模式
通过CSS
中的display
属性可以修改元素的默认显示模式,常用值如下:
none
:元素会被隐藏。block
:元素将作为块级元素显示。inline
:元素将作为内联元素显示。inline-block
:元素将作为行内块元素显示。
盒子模型的组成
CSS
会把所有的HTML
元素都看成一个盒子,所有的样式也都是基于这个盒子。
- margin(外边距):盒子与外界的距离。
- border(边框):盒子的边框。
- padding(内边距):紧贴内容的补白区域。
- content(内容):元素中文本或后代元素都是它的内容。
盒子大小 = content
+ 左右 padding
+ 左右 border
注意:外边距margin
不会影响盒子的大小,但会影响盒子的位置。
盒子内容区(content)
属性名:
width
功能:设置内容区域宽度
属性值:长度
属性名:
max-width
功能:设置内容区域的最大宽度
属性值:长度
属性名:
min-width
功能:设置内容区域的最小宽度
属性值:长度
属性名:
height
功能:设置内容区域的高度
属性值:长度
属性名:
max-height
功能:设置内容区域的最大高度
属性值:长度
属性名:
min-height
功能:设置内容区域的最小高度
属性值:长度
注意:
max-width
、min-width
一般不与width
一起使用。
max-height
、min-height
一般不与height
一起使用。
关于默认宽度
所谓的默认宽度,就是不设置width
属性时,元素呈现出来的宽度。
总宽度 = 父的content
- 自身的左右margin
。
内容区的宽度 = 父的content
- 自身的左右margin
- 自身的左右border
- 自身的左右padding
。
盒子的内边距
属性名:
padding-top
功能:上内边距
属性值:长度
属性名:
padding-right
功能:右内边距
属性值:长度
属性名:
padding-bottom
功能:下内边距
属性值:长度
属性名:
padding-left
功能:左内边距
属性值:长度
属性名:
padding
功能:复合属性
属性值:长度,可以设置 1~4 个值
padding
复合属性的使用规则:
padding: 10px;
四个方向内边距都是10px
。padding: 10px 20px;
上10px
,左右20px
。(上下、左右)padding: 10px 20px 30px;
上10px
,左右20px
,下30px
。(上、左右、下)padding: 10px 20px 30px 40px
上10px
,右20px
,下30px
,左40px
。(上、右、下、左)
注意点:
padding
的值不能为负数。- 行内元素的左右内边距是没问题的,上下内边距不能完美的设置。
- 块级元素、行内块元素,四个方向内边距都可以完美设置。
盒子的边框
属性名:
border-style
功能:边框线风格、复合了四个方向的边框风格
属性值:solid
:实线、dashed
:虚线、dotted
:点线、double
:双实线 …
属性名:
border-width
功能:边框线宽度、复合了四个方向的边框宽度
属性值:长度,默认3px
属性名:
border-color
功能:复合属性
属性值:值没有顺序和数量要求。
属性名:
border-left
、border-left-style
、border-left-width
、border-left-color
功能:分别设置各个方向的边框
属性值:同上
属性名:
border-right
、border-right-style
、border-right-width
、border-right-color
功能:分别设置各个方向的边框
属性值:同上
属性名:
border-top
、border-top-style
、border-top-width
、border-top-color
功能:分别设置各个方向的边框
属性值:同上
属性名:
border-bottom
、border-bottom-style
、border-bottom-width
、border-bottom-color
功能:分别设置各个方向的边框
属性值:同上
边框相关属性共 20
个。
border-style
、border-width
、border-color
其实也是复合属性。
盒子的外边距
margin 语法
属性名:
margin-left
功能:左外边距
属性值:长度值
属性名:
margin-right
功能:右外边距
属性值:长度值
属性名:
margin-top
功能:上外边距
属性值:长度值
属性名:
margin-bottom
功能:下外边距
属性值:长度值
属性名:
margin
功能:复合属性,可以写1~4
个值,规律同padding
(顺时针)
属性名:长度值
margin 注意事项
- 子元素的
margin
,是参考父元素的content
计算的。(因为父亲的content
中承装着子元素)。- 上
margin
、左margin
:影响自己的位置;下margin
、右margin
:影响后面兄弟元素的位置。- 块级元素、行内块元素,均可以完美地设置四个方向的
margin
;但行内元素,左右margin
可以完美设置,上下margin
设置无效。margin
的值也可以是auto
,如果给一个块级元素设置左右margin
都为auto
,该块级元素会在父元素中水平居中。margin
的值可以是负值。
margin 塌陷问题
什么是 margin 塌陷?
第一个子元素的上margin
会作用在父元素上,最后一个子元素的下margin
会作用在父元素上。
如何解决 margin 塌陷?
方案一:给父元素设置不为 0 的 padding
。
方案二:给父元素设置宽度不为 0 的 border
。
方案三:给父元素设置 css 样式 overflow:hidden
。
margin 合并问题
什么是 margin 合并?
上面兄弟元素的下外边距和下面兄弟元素的上外边距会合并,取一个最大的值,而不是相加。
如何解决 margin 合并?
无需解决,布局的时候上下兄弟元素,只给一个设置上下外边距就可以了。
处理内容溢出
属性名:
overflow
功能:溢出内容的处理方式
属性值:
visible
:显示,默认值
hidden
:隐藏
scroll
:显示滚动条,不论内容是否溢出
auto
:自动显示滚动条,内容不溢出不显示
属性名:
overflow-x
功能:水平方向溢出内容的处理方式
属性值:同overflow
属性名:
overflow-y
功能:垂直方向溢出内容给的处理方式
属性值:同overflow
注意:
1、overflow-x
、overflow-y
不能一个是hidden
,一个是visible
,是实验性属性,不建议使用。
2、overflow
常用的值是hidden
和auto
,除了能溢出的显示方式,还可以解决很多疑难杂症。
隐藏元素的两种方式
visibility 属性
visibility
属性默认值是show
,如果设置为hidden
,元素会隐藏。
元素看不见了,还占有原来的位置(元素的大小依然保持)。
display 属性
设置display:none
,就可以让元素隐藏。
彻底地隐藏,不但看不见,也不占用任何位置,没有大小宽高。
样式的继承
有些样式会继承,元素如果本身设置了某个样式,就使用本身设置的样式;但如果本身没有设置某个样式,会从父元素开始一级一级继承(优先继承离得近的祖先元素)。
会继承的 css 属性
字体属性、文本属性(除了 vertical-align)、文字颜色 等。
不会继承的 css 属性
边框、背景、内边距、外边距、宽高、溢出方式 等。
一个规律:能继承的属性,都是不影响布局的,简单说:都是和盒子模型没关系的。
默认样式
元素一般都写默认的样式,例如:
1、<a>
元素:下划线、字体颜色、鼠标小手。
2、<h1> ~ <h6>
元素:文字加粗、文字大小、上下外边距。
3、<p>
元素:上下外边距。
4、<ul>
、ol
元素:左内边距。
5、body
元素:8px
外边距(4个方向)。
…
优先级:元素的默认样式 > 继承的样式,所以如果要重置元素的默认样式,选择器一定要直接选择器到该元素。
布局小技巧
1、行内元素、行内块元素,可以被父元素当做文本处理。
即:可以像处理文本对齐一样,去处理:行内、行内块在父元素中的对齐。
例如:text-align
、line-height
、text-indent
等。
2、如何让子元素,在父亲中水平居中
:
若子元素为
块元素
,给父元素加上:margin: 0 auto;
若子元素为行内元素、行内块元素
,给父元素加上:text-align:center;
3、如何让子元素,在父亲中垂直居中
:
若子元素为
块元素
,给子元素加上:margin-top
,值为:(父元素content
- 子元素盒子总高)/
2
若子元素为行内元素、行内块元素
:
- 让父元素的
height
=line-height
,每个子元素都加上:vertical-align:middle;
- 补充:若想绝对垂直居中,父元素
font-size
设置为0
元素之间的空白问题
产生原因:
行内元素、行内块元素,彼此之间的换行会被浏览器解析为一个空白字符。
解决方案:
方案一:去掉换行和空格(不推荐)。
方案二:给父元素设置font-size:0
,再给需要显示的文字的元素,单独设置字体大小(推荐)。
行内块的幽灵空白问题
产生原因:
行内块元素与文本的基线对齐,而文本的基线与文本最低端之间是有一定距离的。
解决方案:
方案一:给行内块设置vertical
,值不为baseline
即可,设置为middel
、bottom
、top
均可。
方案二:若父元素中只有一张图片,设置图片为display:block
。
方案三:给父元素设置font-size:0
。如果该行内块内部还有文本,则需单独设置font-size
。
浮动
浮动的简介
在最初,浮动是用来实现文字环绕图片效果的,现在浮动是主流的页面布局方式之一。
语法:float: left;
、float: right;
元素浮动后的特点
- 脱离文档流。
- 不管浮动前是什么元素,浮动后:默认宽与高都是被内容撑开(尽可能小),而且可以设置宽高。
- 不会独占一行,可以与其他元素共用一行。
- 不会
margin
合并,也不会margin
塌陷,能够完美的设置四个方向的margin
和padding
。 - 不会像行内块一样被当做文本处理(没有行内块的空白问题)。
浮动后会有哪些影响
对兄弟元素的影响
后面的兄弟元素,会占据浮动元素之前的位置,在浮动元素的下面;对前面的兄弟无影响。
对父元素的影响
不能撑起父元素的高度,导致父元素高度塌陷,但父元素的宽度依然束缚浮动的元素。
解决浮动产生的影响(清除浮动)
解决方案:
方案一:给父元素指定高度。
方案二:给父元素也设置浮动,带来其他影响。
方案三:给父元素设置overflow:hidden
。
方案四:在所有浮动元素的最后面,添加一个块级元素,并给该块级元素设置clear:both
。
方案五:给浮动元素的父元素,设置伪元素,通过伪元素清除浮动,原理与方案四相同。===>推荐使用
.parent::after {
content: "";
display: block;
clear: both;
}
布局中的一个原则:设置浮动的时候,兄弟元素要么全都浮动,要么全都不浮动。
浮动样例
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>浮动小练习</title>
<style>
* {
margin: 0;
padding: 0;
}
.leftfix {
float: left;
}
.rightfix {
float: right;
}
.clearfix::after {
content: '';
display: block;
clear: both;
}
.container {
width: 960px;
margin: 0 auto;
text-align: center;
}
.log {
width: 200px;
}
.banner1 {
width: 540px;
margin: 0 10px;
}
.banner2 {
width: 200px;
}
.log,.banner1,.banner2 {
height: 80px;
line-height: 80px;
background-color: #ccc;
}
.menu {
height: 30px;
background-color: #ccc;
margin-top: 10px;
line-height: 30px;
}
.item1,.item2 {
width: 368px;
height: 198px;
line-height: 198px;
border: 1px solid black;
margin-right: 10px;
}
.content {
margin-top: 10px;
}
.item3,.item4,.item5,.item6 {
width: 178px;
height: 198px;
line-height: 198px;
border: 1px solid black;
margin-right: 10px;
}
.bottom {
margin-top: 10px;
}
.item7,.item8,.item9 {
width: 198px;
height: 128px;
line-height: 128px;
border: 1px solid black;
}
.item8 {
margin: 10px 0;
}
.footer {
height: 60px;
background-color: #ccc;
margin-top: 10px;
line-height: 60px;
}
</style>
</head>
<body>
<div class="container">
<!-- 头部 -->
<div class="page-header clearfix">
<div class="log leftfix">logo</div>
<div class="banner1 leftfix">banner1</div>
<div class="banner2 leftfix">banner2</div>
</div>
<!-- 菜单 -->
<div class="menu">菜单</div>
<!-- 内容区 -->
<div class="content clearfix">
<!-- 左侧 -->
<div class="left leftfix">
<!-- 上 -->
<div class="top clearfix">
<div class="item1 leftfix">栏目一</div>
<div class="item2 leftfix">栏目二</div>
</div>
<!-- 下 -->
<div class="bottom clearfix">
<div class="item3 leftfix">栏目三</div>
<div class="item4 leftfix">栏目四</div>
<div class="item5 leftfix">栏目五</div>
<div class="item6 leftfix">栏目六</div>
</div>
</div>
<!-- 右侧 -->
<div class="right rightfix">
<div class="item7">栏目七</div>
<div class="item8">栏目八</div>
<div class="item9">栏目九</div>
</div>
</div>
<!-- 页脚 -->
<div class="footer">页脚</div>
</div>
</body>
</html>
定位
相对定位
如何设置相对定位?
给元素设置position:relative
即可实现相对定位。
可以使用left
、right
、top
、bottom
四个属性调整位置。
相对定位参考点在哪里?
相对自己原来的位置
相对定位的特点:
- 不会脱离文档流,元素位置的变化,只是视觉效果上的变化,不会对其他元素产生任何影响。
- 定位元素的显示层级比普通元素高,无论什么定位,显示层级都是一样的。
- 默认规则是:
-
- 定位的元素会盖在普通元素之上。
-
- 都发生定位的两个元素,后写的元素会盖在先写的元素之上。
left
不能和right
一起设置,top
和bottom
不能一起设置。- 相对定位的元素,也能继续浮动,但不推荐这样做。
- 相对行为的元素,也能通过
margin
调整位置,但不推荐这样做。
注意:绝大多数情况下,相对定位,会与绝对定位配合使用。
绝对定位
如何设置绝对定位
给元素设置position:absolute
即可实现绝对定位。
可以使用left
、right
、top
、bottom
四个属性调整位置。
绝对定位的参考点在哪里?
参考他的包含块
。
什么是包含块?
- 对于没有脱离文档流的元素:包含块就是父元素。
- 对于脱离文档流的元素:包含块是第一个拥有定位属性的祖先元素(如果所有祖先都没定位,那包含块就是整个页面)。
绝对定位元素的特点:
- 脱离文档流,会对后面的兄弟元素、父元素有影响。
left
不能和right
一起设置,top
和bottom
不能一起设置。- 绝对定位、浮动不能同时设置,如果同时设置,浮动失效,以定位为主。
- 绝对定位的元素,也能通过
margin
调整位置,但不推荐这样做。 - 无论是什么元素(行内、行内块、块级)设置为绝对定位之后,都变成了定位元素。
何为定位元素? —— —— 默认宽、高都被内容所撑开,且能自由设置宽高。
固定定位
如何设置为固定定位?
给元素设置position:fixed
即可实现固定定位。
可以使用left
、right
、top
、bottom
四个属性调整位置。
固定定位的参考点在哪里?
参考他的视口
什么是视口?—— —— 对于
PC
浏览器来说,视口就是我们看网页的那扇“窗户”。
固定定位元素的特点
- 脱离文档流,会对后面的兄弟元素、父元素有影响。
left
不能和right
一起设置,top
和bottom
不能一起设置。- 固定定位和浮动不能同时设置,如果同时设置,浮动失效,以固定定位为主。
- 固定定位的元素,也能通过
margin
调整位置,但不推荐这样做。 - 无论是什么元素(行内、行内块、块级)设置为固定定位之后,都变成了定位元素。
粘性定位
如何设置为粘性定位?
给元素设置position:sticky
即可实现粘性定位。
可以使用left
、right
、top
、bottom
四个属性调整位置,不过最常用的是top
值。
粘性定位的参考点在哪里?
离他最近的一个拥有“滚动机制”的祖先元素,即便这个祖先不是最近的真实可滚动祖先。
粘性定位元素的特点
- 不会脱离文档流,他是一种专门用于窗口滚动时新的定位方式。
- 最常用的值是
top
值。 - 粘性定位和浮动可以同时设置,但不推荐这样做。
- 粘性定位的元素,也能通过
margin
调整位置,但不推荐这样做。
粘性定位和相对定位的特点基本一致,不同的是:粘性定位可以在元素到达某个位置时将其固定。
定位层级
- 定位元素的显示层级比普通元素高,无论什么定位,显示层级都是一样的。
- 如果位置发生重叠,默认情况是:后面的元素,会显示在前面元素之上。
- 可以通过 css 属性
z-index
调整元素的显示层级。 z-index
的属性值是数字,没有单位,值越大显示层级越高。- 只有定位的元素设置
z-index
才有效。 - 如果
z-index
值大的元素,依然没有覆盖掉z-index
值小的元素,那么请检查包含块的层级。
定位的特殊应用
注意
- 发生固定定位、绝对定位后,元素都变成了定位元素,默认宽高被内容撑开,且依然可以设置宽高。
- 发生相对定位后,元素依然是之前的显示模式。
- 以下所说的特殊应用,只针对 绝对定位 和 固定定位 的元素,不包括相对定位的元素。
让定位元素的宽充满包含块
- 块宽想与包含块一致,可以给定位元素同时设置
left
和right
和0
。 - 高度想与包含块一致,
top
和bottom
设置为0
。
让定位元素在包含块中居中
方案一:
left:0;
right:0;
top:0;
bottom:0;
margin:auto;
方案二:
left:50%;
top:50%;
margin-left:负的宽度一半;
margin-top:负的高度一半;
注意:该定位元素必须设置宽高!!
布局
版心
- 在
PC
端网页中,一般都会有一个固定宽高且水平居中的盒子,来显示网页的主要内容,这是网页的版心。 - 版心的宽度一般是
960 ~ 1200
像素之间。 - 版心可以是一个,也可以是多个。
常用类名
顶部导航条:topbar
页头:header
、page-header
导航:nav
、navigator
、navbar
搜索框:search
、search-box
横幅、广告、宣传图:banner
主要内容:content
、main
侧边栏:aside
、sidebar
页脚:footer
、page-footer
重置默认样式
默认样式
很多元素都有默认样式,比如:
p
元素有默认的上下margin
。h1~h6
标题也有上下margin
,且字体加粗。body
元素有默认的8px
外边距。- 超链接有默认的文字颜色和下划线。
ul
元素有默认的左pading
。- … …
在早期,元素默认样式,能够让我们快速的绘制网页,但如今网页的设计越来越复杂,内容越来越多,而且很精细,这些默认样式会给我们绘制页面带来麻烦,而且这些默认样式,在不同的浏览器上呈现出来的效果也不一样,所以我们需要重置这些默认样式。
重置默认样式 - 方案一:使用全局选择器
* {
margin: 0;
padding: 0;
......
}
此种方法,在简单案例中可以用一下,但实际开发中
不会使用
,因为*
选择器的所有元素,而并不是所有的元素都有默认样式;而且我们重置时,有时候是需要做特定处理的,比如:想让a
元素的文字是灰色,其他元素文字是蓝色。
重置默认样式 - 方案二:reset.css【推荐】
选择到具有默认样式的元素,清空其默认的样式。
经过
reset
后的网页,好似“一张白纸”,开发人员可根据设计稿,精细的去添加具体的样式。
重置默认样式 - 方案三:Normalize.css
Normalize.css
是一种最新方案,它在清除默认样式的基础上,保留了一些有价值的默认样式。
相对于reset.css
,Normalize.css
有如下优点:
- 保护了有价值的默认样式,而不是完全去掉它们。
- 为大部分HTML元素提供一般化的样式。
- 新增对
HTML5
元素的设置。 - 对并集选择器的使用比较谨慎,有效避免调试工具杂乱。
备注:
Normalize.css
的重置,和reset.css
相比,更加的温和,开发时可根据实际情况进行选择。
HTML5
新增语义化标签
新增布局标签
标签名:header
语义:整个页面或部分区域的头部
单/双标签:双
标签名:footer
语义:整个页面或部分区域的底部
单/双标签:双
标签:nav
语义:导航
单/双标签:双
标签:article
语义:文章、帖子、杂志、新闻、博客、评论等
单/双标签:双
标签:section
语义:页面中的某段文字或文章中的某段文字(里面文字通常里面会包含标题)
单/双标签:双
标签:aside
语义:侧边栏
单/双标签:双
标签:main
语义:文档的主要内容(WHATWG
没有语义,IE
不支持),几乎不用
单/双标签:双
标签:hgroup
语义:包裹连续的标题,如文章主标题、副标题的组合(W3C
将其删除)
单/双标签:双
关于article
和section
:
artical
里面可以有多个section
。section
强调的是分段或分块,如果你想将一块内容分成几段的时候,可使用section
元素。article
比section
更强调独立性,一块内容如果比较独立、比较完整,应该使用article
元素。
新增状态标签
meter 标签(电量、磁盘用量等…)
语义:定义已知范围内的标量测量。也被称为gauge
(尺度),双标签,例如:电量、磁盘用量等。
常用属性如下:
属性:high
值:数值
描述:规定高值
属性:low
值:数值
描述:规定低值
属性:max
值:数值
描述:规定最大值
属性:min
值:数值
描述:规定最小值
属性:optimum
值:数值
描述:规定最优值
属性:value
值:数值
描述:规定当前值
<meter max="100" min="0" value="90" low="10" high="20" optimum="90"></meter>
progress标签(进度条)
语义:显示某个任务完成的进度的指示器,一般用于表示进度条,双标签,例如:工作完成进度等。
常用属性如下:
属性:max
值:数值
描述:规定目标值。
属性:value
值:数值
描述:规定当前值
<progress max="100" value="20"></progress>
示例
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>02_新增状态标签</title>
</head>
<body>
<span>手机电量:</span>
<meter max="100" min="0" value="90" low="10" high="20" optimum="90"></meter>
<meter max="100" min="0" value="19" low="10" high="20" optimum="90"></meter>
<meter max="100" min="0" value="9" low="10" high="20" optimum="90"></meter>
<br>
<span>当前进度:</span>
<progress max="100" value="20"></progress>
</body>
</html>
新增列表标签
datalist标签(搜索关键词提示)
标签名:datalist
语义:用于搜索框的关键词提示
单/双标签:双
<form action="#">
<input type="text" list="mydata">
<button>搜索</button>
</form>
<datalist id="mydata">
<option value="周杰伦">周杰伦</option>
<option value="周冬雨">周冬雨</option>
<option value="马冬梅">马冬梅</option>
<option value="温兆伦">温兆伦</option>
</datalist>
details标签(展示问题和答案)
标签名:details
语义:用于展示问题和答案,或对专有名词进行解释
单/双标签:双
标签名:summary
语义:写在details
的里面,用于指定问题或专有名词
单/双标签:双
<details>
<summary>如何一夜暴富?</summary>
<p>来到尚硅谷学习前端</p>
</details>
示例
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>新增列表标签</title>
</head>
<body>
<form action="#">
<input type="text" list="mydata">
<button>搜索</button>
</form>
<datalist id="mydata">
<option value="周杰伦">周杰伦</option>
<option value="周冬雨">周冬雨</option>
<option value="马冬梅">马冬梅</option>
<option value="温兆伦">温兆伦</option>
</datalist>
<hr>
<details>
<summary>如何一夜暴富?</summary>
<p>来到尚硅谷学习前端</p>
</details>
</body>
</html>
新增文本标签
ruby(文本注音)
标签名:ruby
语义:包裹需要注音的文字
单/双标签:双
标签名:rt
语义:写注音,rt
标签写在ruby
的里面
单/双标签:双
<ruby>
<span>魑</span>
<rt>chi</rt>
</ruby>
mark(标记)
标签名:mark
语义:标记
单/双标签:双
注意:
W3C
建议mark
用于标记搜索结果中的关键字。
<p>Lorem ipsum <mark>dolor</mark>, sit amet consectetur adipisicing elit. Maiores, cupiditate.</p>
示例
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>新增文本标签</title>
</head>
<body>
<div>
<ruby>
<span>魑</span>
<rt>chi</rt>
</ruby>
<ruby>
<span>魅</span>
<rt>mei</rt>
</ruby>
</div>
<hr>
<p>Lorem ipsum <mark>dolor</mark>, sit amet consectetur adipisicing elit. Maiores, cupiditate.</p>
</body>
</html>
表单控件新增属性
placeholder
:提示文字(注意:不是默认值,value
是默认值),适用于文字输入类的表单控件。
required
:表示该输入项必填,适用于除按钮外其他表单控件。
autofocus
:自动获取焦点,适用于所有表单控件。
autocomplete
:自动完成,可以设置on
或off
,适用于文字输入类的表单控件,注意:密码输入框、多行输入框不可用。
pattern
:填写正则表达式,适用于文本输入类表单控件,注意:多行输入不可用,且空的输入框不会验证,往往与required
配合。
input 新增属性值
email
:邮箱类型的输入框,表单提交时会验证格式,输入为空则不验证格式。
url
:url类型的输入框,表单提交时会验证格式,输入为空则不验证格式。
number
:数字类型的输入框,表单提交时会验证格式,输入为空则不验证格式。
search
:搜索类型的输入框,表单提交时不会验证格式。
tel
:电话类型的输入框,表单提交时不会验证格式,在移动端使用时,会唤起数字键盘。
range
:范围选择框,默认值为50,表单提交时不会验证格式。
color
:颜色选择框,默认值为黑色,表单提交时不会验证格式。
date
:日期选择框,默认值为空,表单提交时不会验证格式。
month
:月份选择框,默认值为空,表单提交时不会验证格式。
week
:周选择框,默认值为空,表单提交时不会验证格式。
time
:时间选择框,默认值为空,表单提交时不会验证格式。
datetime-local
:日期+时间选择框,默认值为空,表单提交时不会验证格式。
form 标签新增属性
novalidate
:如果给form
标签设置了该属性,表单提交的时候不再进行验证。
新增视频标签
<video>
标签用来定义视频,它是双标签。
属性:src
值:URL地址
描述:视频地址
属性:width
值:像素值
描述:设置视频播放器的宽度
属性:height
值:像素值
描述:设置视频播放器的高度
属性值:controls
值:无
描述:向用户显示视频控件(比如播放/暂停按钮)
属性值:muted
值:无
描述:视频静音
属性值:autoplay
值:无
描述:视频自动播放
属性值:loop
值:无
描述:循环播放
属性值:poster
值:URL地址
描述:视频封面
属性值:preload
值:auto
/metadata
/none
描述:视频预加载,如果使用autoplay
,则忽略该属性;none
:不预加载视频;metadata
:仅预先获取视频的元数据(例如长度);auto
:下载这个视频文件,即使用户不希望使用它。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>01_新增视频标签</title>
<style>
video {
width: 600px;
}
</style>
</head>
<body>
<video src="./小电影.mp4" controls muted loop poster="./封面.png" preload="auto"></video>
</body>
</html>
新增音频标签
<audio>
标签用来定义音频,它是双标签。
属性:src
值:URL地址
描述:音频地址
属性:controls
值:无
描述:向用户显示音频控件(比如播放/暂停按钮)
属性:autoplay
值:无
描述:音频自动播放
属性:muted
值:无
描述:音频静音
属性:loop
值:无
描述:循环播放
属性:preload
值:auto
/metadata
/none
描述:音频预加载,如果使用autoplay
,则忽略该属性;none
:不预加载音频;metadata
:仅预先获取音频的元数据(例如长度);auto
:可以下载整个音频文件,即使用户不希望使用它。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>02_新增音频标签</title>
</head>
<body>
<audio src="./小曲.mp3" controls></audio>
</body>
</html>
新增全局属性(了解)
contenteditable
:表示元素是否可被用户编辑,可选值:true
可编辑、false
不可编辑
draggable
:表示元素可以被拖动,可选值:true
可拖动、false
不可拖动
hidden
:隐藏元素
spellcheck
:规定是否对元素进行拼写和语法检查,可选值:true
检查、false
不检查
contextmenu
:规定元素的上下文菜单,在用户鼠标右键点击元素时显示
data-*
:用于存储页面的私有定制数据
HTML5兼容性处理
添加元信息,让浏览器处于最优渲染模式。
<!-- 设置IE总是使用最新的文档模式进行渲染 -->
<meta html-equiv="X-UA-Compatible" content="IE=Edge">
<!-- 优先使用 webkit(Chromium)内核进行渲染,针对360等壳浏览器 -->
<meta name="renderer" content="webkit">
使用html5shiv
让低版本浏览器认识H5
的语义化标签。
<!--[if lt ie 9]>
<script src="../sources/js/html5shiv.js"></script>
<![endif]-->
扩展
lt
小于
lte
小于等于
gt
大于
gte
大于等于
!
逻辑非
CSS3
新增长度单位
rem
根元素字体大小的倍数,只与根元素字体大小有关。vm
视口宽度的百分之多少,10vw
就是视口宽度的10%
。vh
视口高度的百分之多少,10vh
就是视口高度的10%
。vmax
视口宽高中大的那个的百分之多少。(了解即可)vmin
视口宽高中小的那个的百分之多少。(了解即可)
新增颜色设置方式
CSS3
新增了三种颜色设置方式,分别是rgba
、hsl
、hsla
,由于之前CSS2
中详细讲解,此处略过。
新增选择器
CSS3
新增的选择器有:动态伪类、目标伪类、语言伪类、UI
伪类、结构伪类、否定伪类、伪元素;这些在CSS2
中已经详细讲解,此处略过。
新增盒子模型相关属性
box-sizing 怪异盒模型
使用box-sizing
属性可以设置盒模型的两种类型
可选值:content-box
含义:width
和height
设置的盒子内容区的大小。(默认值)
可选值:border-box
含义:width
和height
设置的盒子总大小。(怪异盒模型)
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>01_box-sizing</title>
<style>
.box1 {
width: 200px;
height: 200px;
background-color: deepskyblue;
padding: 5px;
border: 5px solid black;
margin-bottom: 20px;
}
.box2 {
width: 200px;
height: 200px;
background-color: gray;
padding: 5px;
border: 5px solid black;
box-sizing: border-box;
}
</style>
</head>
<body>
<div class="box1"></div>
<div class="box2"></div>
</body>
</html>
resize 调整盒子大小
使用resize
属性可以控制是否允许用户调节元素尺寸。
值:none
含义:不允许用户调整元素大小。(默认)
值:both
含义:用户可以调节元素的宽度和高度。
值:horizontal
含义:用户可以调节元素的宽度。
值:vertical
含义:用户可以调节元素的高度。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>02_resize</title>
</head>
<style>
.box1 {
width: 400px;
height: 400px;
background-color: orange;
resize: both;
overflow: scroll;
}
.box2 {
width: 800px;
height: 600px;
background-color: skyblue;
}
</style>
<body>
<div class="box1">
<div class="box2">123</div>
</div>
</body>
</html>
box-shadow 调整盒子阴影
使用box-shadow
属性为盒子添加阴影。
语法:
box-shadow: h-shadow v-shadow blur spread color inset;
各个值的含义:
值:h-shadow
含义:水平阴影的位置,必须填写,可以为负值
值:v-shadow
含义:垂直阴影的位置,必须填写,可以为负值
值:blur
含义:可选,模糊距离
值:spread
含义:可选,阴影的外延值
值:color
含义:可选,阴影的颜色
值:inset
含义:可选,将外部阴影改为内部阴影
默认值:box-shadow:none
表示没有阴影。
示例:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>03_box-shadow</title>
</head>
<style>
.box1 {
width: 400px;
height: 400px;
background-color: orange;
margin: 0 auto;
margin-top: 100px;
font-size: 40px;
/* 写两个值,含义:水平位置 垂直位置 */
/* box-shadow: 10px 10px; */
/* 写三个值,含义:水平位置 垂直位置 阴影的颜色 */
/* box-shadow: 10px 10px blue; */
/* 写三个值,含义:水平位置 垂直位置 模糊程度 */
/* box-shadow: 10px 10px 20px; */
/* 写四个值,含义:水平位置 垂直位置 模糊程度 阴影的颜色 */
/* box-shadow: 10px 10px 20px blue; */
/* 写五个值,含义:水平位置 垂直位置 模糊程度 外延值 阴影的颜色 */
/* box-shadow: -10px -10px 20px 10px blue; */
/* 写六个值,含义:水平位置 垂直位置 模糊程度 外延值 阴影的颜色 内阴影 */
/* box-shadow: 10px 10px 20px 10px blue inset; */
position: relative;
top: 0;
left: 0;
transition: 1s linear all;
}
.box1:hover {
box-shadow: 0px 0px 20px black;
top: -1px;
left: 0;
}
</style>
<body>
<div class="box1">你好啊</div>
</body>
</html>
opacity 调整盒子透明度
opacity
属性能为整个元素添加透明效果,值是0
到1
之间的小数,0
是完全透明,1
表示完全不透明。
opacity
与rgba
的区别?
opacity
是一个属性,设置的是整个元素(包括元素里的内容)的不透明度。
rgba
是颜色的设置方式,用于设置颜色,它的透明度,仅仅是调整颜色的透明度。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<style>
.box1 {
width: 200px;
height: 200px;
background-color: orange;
font-size: 40px;
opacity: 0.1;
font-weight: bold;
}
.box2 {
position: relative;
}
h1 {
position: absolute;
top: 100px;
left: 0;
background-color: black;
color: white;
width: 400px;
line-height: 100px;
text-align: center;
font-size: 40px;
opacity: 0.5;
}
</style>
<body>
<div class="box1">你好啊</div>
<div class="box2">
<img src="./你瞅啥.jpg" alt="">
<h1>你瞅啥</h1>
</div>
</body>
</html>
新增背景相关属性
background-origin 设置背景图的原点
语法:
padding-box
: 从padding
区域开始显示背景图像。—— —— 默认值border-box
:从border
区域开始显示背景图像。content-box
:从content
区域开始显示背景图像。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>01_background-origin</title>
</head>
<style>
.box1 {
width: 400px;
height: 400px;
background-color: skyblue;
margin: 0 auto;
font-size: 40px;
padding: 50px;
border: 50px dashed rgba(255,0,0);
background-image: url('./bg01.jpg');
background-repeat: no-repeat;
background-origin: border-box;
}
</style>
<body>
<div class="box1">你好啊</div>
</body>
</html>
background-clip 设置背景图的向外裁剪的区域
语法:
border-box
: 从border
区域开始向外裁剪背景。—— —— 默认值padding-box
: 从padding
区域开始向外裁剪背景。content-box
: 从content
区域开始向外裁剪背景。text
: 背景图只呈现在文字上。
注意:若值为
text
,那么backgroun-clip
要加上-webkit-
前缀。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>02_background-clip</title>
</head>
<style>
.box1 {
width: 400px;
height: 400px;
background-color: skyblue;
margin: 0 auto;
font-size: 40px;
padding: 50px;
border: 50px dashed rgba(255,0,0);
background-image: url('./bg02.jpg');
background-repeat: no-repeat;
background-origin: border-box;
background-clip: content-box;
}
</style>
<body>
<div class="box1">你好啊</div>
</body>
</html>
background-size 设置背景图的尺寸
语法:
-
用长度值指定背景图片大小,不允许负值。
background-size: 300px 200px;
-
用百分比指定背景图片大小,不允许负值。
background-size: 100% 100%;
-
auto
:背景图片的真实大小。—— —— 默认值 -
contain
:将背景图片等比缩放,使背景图片的宽或高,与容器的宽或高相等,再将完整背景图片包含在容器内,但要注意:可能会造成容器里部分区域没有背景图片。background-size: contain;
-
cover
:将背景图片等比缩放,直到完全覆盖容器,图片会尽可能全的显示在元素上,但要注意:背景图片有可能显示不完整。—— —— 相对比较好的选择。background-size: cover;
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>03_background-size</title>
</head>
<style>
.box1 {
width: 400px;
height: 400px;
background-color: skyblue;
font-size: 40px;
border: 1px solid black;
background-image: url('./bg03.jpg');
background-repeat: no-repeat;
background-size: cover;
}
</style>
<body>
<div class="box1"></div>
</body>
</html>
background 复合属性
语法:
background: color url repeat position / size origin clip
注意:
origin
和clip
的值如果一样,如果只写一个值,则origin
和clip
都设置;如果设置了两个值,前面的是origin
,后面的clip
。size
的值必须写在position
值的后面,并且用/
分开。
多背景图
CSS3
允许元素设置多个背景图片
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>05_多背景图</title>
</head>
<style>
div {
width: 400px;
height: 400px;
border: 1px solid black;
background: url('./bg-lt.png') no-repeat left top,
url('./bg-rt.png') no-repeat right top,
url('./bg-lb.png') no-repeat left bottom,
url('./bg-rb.png') no-repeat right bottom;
}
</style>
<body>
<div></div>
</body>
</html>
新增边框相关属性
边框圆角
在CSS3
中,使用border-radius
属性可以将盒子变为圆角。
同时设置四个角的圆角:
border-radius:10px;
分开设置每个角的圆角(几乎不用):
属性名:border-top-left-radius
作用:设置左上角圆角半径:一个值是正圆半径,两个值分别是椭圆的x
半径、y
半径。
属性名:border-top-right-radius
作用:设置右上角圆角半径:一个值是正圆半径,两个值分别是椭圆的x
半径、y
半径。
属性名:border-bottom-right-radius
作用:设置右下角圆角半径:一个值是正圆半径,两个值分别是椭圆的x
半径、y
半径。
属性名:border-bottom-left-radius
作用:设置左下角圆角半径:一个值是正圆半径,两个值分别是椭圆的x
半径、y
半径。
分别设置每个圆角,综合写法(几乎不用):
border-radius: 左上角x 右上角x 右下角x 左下角x / 左上角y 右上角y 右下角y 左下角y
示例:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>01_边框圆角</title>
</head>
<style>
div {
width: 400px;
height: 400px;
border: 2px solid black;
margin: 0 auto;
/* border-radius: 10px; */
border-radius: 10%;
}
</style>
<body>
<div></div>
</body>
</html>
边框外轮廓(了解)
outline-width
:外轮廓的宽度。outline-color
:外轮廓的颜色。outline-style
:外轮廓的风格。-
none
:无轮廓
-
dotted
:点状轮廓
-
solid
:实现轮廓
-
double
:双线轮廓
outline-offset
:设置外轮廓与边框的距离,正负值都可以设置。注意:
outline-offset
不是outline
的子属性,是一个独立的属性。outline
:复合属性outline:50px solid blue;
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>02_边框外轮廓</title>
</head>
<style>
.box1 {
width: 400px;
height: 400px;
padding: 10px;
border: 10px solid black;
background-color: gray;
font-size: 40px;
margin: 0 auto;
margin-top: 100px;
/* outline-width: 20px;
outline-color: orange;
outline-style: solid; */
outline-offset: 30px;
outline: 20px solid orange;
}
</style>
<body>
<div class="box1">你好啊</div>
<div>Lorem ipsum dolor sit, amet consectetur adipisicing elit. Illo adipisci animi, consequuntur dolor voluptate recusandae corrupti dolores est laborum quis?</div>
</body>
</html>
新增文本属性
文本阴影
在CSS3
中,我们可以使用text-shadow
属性给文本添加阴影。
语法:
text-shadow: h-shadow v-shadow blur color;
值:h-shadow
描述:必须写,水平阴影的位置,允许负值。
值:v-shadow
描述:必须写,垂直阴影的位置,允许负值。
值:blur
描述:可选,模糊的距离。
值:color
描述:可选,阴影的颜色。
默认值:text-shadow:none
表示没有阴影。
示例:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>01_文本阴影</title>
</head>
<style>
body {
background-color: black;
}
h1 {
font-size: 80px;
text-align: center;
color: white;
/* text-shadow: 3px 3px; */
/* text-shadow: 3px 3px red; */
/* text-shadow: 3px 3px 10px red; */
/* text-shadow: 0px 0px 15px black; */
text-shadow: 0px 0px 20px red;
}
</style>
<body>
<h1>红浪漫洗浴欢迎您的光临</h1>
</body>
</html>
文本换行
在CSS3
中,我们可以使用white-space
属性设置文本换行方式。
常用值如下:
值:normal
含义:文本超出边界自动换行,文本中的换行被浏览器识别为一个空格。(默认值)
值:pre
含义:原样输出,与pre
标签的效果相同。
值:pre-wrap
含义:在pre
效果的基础上,超出元素边界自动换行。
值:pre-line
含义:在pre
效果的基础上,超出元素边界自动换行,且只识别文本中的换行,空格会忽略。
值:nowrap
含义:强制不换行。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>02_文本换行</title>
</head>
<style>
div {
width: 400px;
height: 400px;
border: 1px solid black;
font-size: 20px;
}
.box1 {
white-space: normal;
}
.box2 {
white-space: pre;
}
.box3 {
white-space: pre-wrap;
}
.box4 {
white-space: pre-line;
}
.box5 {
white-space: nowrap;
}
</style>
<body>
<div class="box1">
normal
山回路转不见君
雪上空留马行处
山回路转不见君 山回路转不见君山回路转不见君山回路转不见君山回路转不见君山回路转不见君
雪上空留马行处
</div>
<br>
<div class="box2">
pre
山回路转不见君
雪上空留马行处
山回路转不见君 山回路转不见君山回路转不见君山回路转不见君山回路转不见君山回路转不见君
雪上空留马行处
</div>
<br>
<div class="box3">
pre-wrap
山回路转不见君
雪上空留马行处
山回路转不见君 山回路转不见君山回路转不见君山回路转不见君山回路转不见君山回路转不见君
雪上空留马行处
</div>
<br>
<div class="box4">
pre-line
山回路转不见君
雪上空留马行处
山回路转不见君 山回路转不见君山回路转不见君山回路转不见君山回路转不见君山回路转不见君
雪上空留马行处
</div>
<br>
<div class="box5">
nowrap
山回路转不见君
雪上空留马行处
山回路转不见君 山回路转不见君山回路转不见君山回路转不见君山回路转不见君山回路转不见君
雪上空留马行处
</div>
</body>
</html>
文本溢出
在CSS3
中,我们可以使用text-overflow
属性设置文本内容溢出时的呈现模式。
常用值如下:
值:clip
含义:当内联内容溢出时,将溢出部分裁切掉。(默认值)
值:ellipsis
含义:当内联内容溢出块容器时,将溢出部分替换为 ...
。
注意:要使得
text-overflow
属性生效,块容器必须显式定义overflow
为非visible
值,一般都写hidden
。
white-space
为nowrap
值。
示例:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>03_文本溢出</title>
</head>
<style>
ul {
width: 400px;
height: 400px;
border: 1px solid black;
font-size: 20px;
list-style: none;
padding-left: 0;
padding-right: 10px;
}
li {
margin-bottom: 10px;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
</style>
<body>
<ul>
<li>焦点访谈: 隐形冠军 匠心打造 分毫必争</li>
<li>我,嫁到日本才发现,女性活得真憋屈,体毛不能有,放屁也不自由</1i>
<li>高洪波无缘!足协盟主热门人选曝光,3选1,冷门人物或成黑马杀出</li>
<li>《狂飙》爆火以后“疯驴子”被骂上热搜:跪着赚钱丢人吗</li>
<li>气温猛降15C,冷空气再来袭! 这些地方迎大范围降雨!“虚高”气温大跳水!!!!!</i>
</ul>
</body>
</html>
文本修饰
-
CSS3
升级了text-decoration
属性,让其变成了复合属性。text-decoration: text-decoration-line || text-decoration-style || text-decoration-color
-
子属性及其含义:
-
text-decoration-line
:设置文本装饰线的位置
-
-
none
:指定文字无装饰(默认值)
-
-
-
underline
:指定文字的装饰是下划线
-
-
-
overline
:指定文字的装饰是上划线
-
-
-
line-through
:指定文字的装饰是贯穿线
-
-
text-decoration-style
:文本装饰线条的形状
-
-
solid
:实线(默认)
-
-
-
double
:双线
-
-
-
dotted
:点状线条
-
-
-
dashed
:虚线
-
-
-
wavy
:波浪线
-
-
text-decoration-color
:文本装饰线条的颜色
示例:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>04_文本修饰</title>
<style>
h1 {
font-size: 100px;
/* text-decoration-line: overline;
text-decoration-style: dashed;
text-decoration-color: blue; */
text-decoration: overline dashed blue;
}
</style>
</head>
<body>
<h1>你好啊,欢迎来到尚硅谷学习</h1>
</body>
</html>
文本描边(极度不常用)
注意:文字描边功能仅webkit
内核浏览器支持。
-webkit-text-stroke-width
:设置文字描边的宽度,写长度值。-webkit-text-stroke-color
:设置文字描边的颜色,写颜色值。-webkit-text-stroke
:复合属性,设置文字描边宽度和颜色。
示例:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=文本, initial-scale=1.0">
<title>05_文本描边</title>
</head>
<style>
h1 {
font-size: 100px;
/* -webkit-text-stroke-color: red; */
/* -webkit-text-stroke-width: 3px; */
-webkit-text-stroke: 3px red;
color: transparent;
}
</style>
<body>
<h1>先生您好,欢迎光临红浪漫!</h1>
</body>
</html>
新增渐变
线性渐变
-
多个颜色之间的渐变,默认从上到下渐变。
background-image: linear-gradient(red,yellow,green);
-
使用关键词设置线性渐变的方向。
background-image: linear-gradient(to right top,red,yellow,green);
-
使用角度设置线性渐变的方向。
background-image: linear-gradient(20deg,red,yellow,green);
-
调整开始渐变的位置。
background-image: linear-gradient(red 50px,yellow 100px,green);
径向渐变
-
多个颜色之间的渐变,默认从圆心四散。(注意:不一定是正圆,要看容器本身宽高比)
background-image: radial-gradient(red,yellow,green);
-
使用关键词调整渐变圆的圆心位置。
background-image: radial-gradient(at right top,red,yellow,green);
-
使用像素值调整渐变圆的圆心位置。
background-image: radial-gradient(at 100px 50px,red,yellow,green);
-
调整渐变形状为正圆。
background-image: radial-gradient(circle,red,yellow,green);
-
调整形状的半径。
background-image: radial-gradient(100px,red,yellow,green); background-image: radial-gradient(50px 100px,red,yellow,green);
-
调整开始渐变的位置。
background-image: radial-gradient(red 50px,yellow 100px,green 150px);
重复渐变
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>03_重复渐变</title>
</head>
<style>
.box {
width: 300px;
height: 200px;
border: 1px solid black;
float: left;
margin-left: 30px;
font-size: 40px;
}
.box1 {
background-image: repeating-linear-gradient(red 50px,yellow 100px,green 150px);
}
</style>
<body>
<div class="box box1">重复线性渐变</div>
</body>
</html>
Web字体
基本用法
可以通过@font-face
指定字体的具体地址,浏览器会自动下载该字体,这样就不依赖用户电脑上的字体了。
-
语法(简写方式)
@font-face { font-family: "情书字体"; src: url('./方正手迹.ttf'); }
-
语法(高兼容性写法)
@font-face { font-family: 'atguigu'; font-display: swap; src: url('webfont.eot'); /* IE9 */ src: url('webfont.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ url('webfont.woff2') format('woff2'), url('webfont.woff') format('woff'), /* chrome、firefox */ url('webfont.ttf') format('truetype'), /* chrome、firefox、opera、Safari, Android, iOS 4.2+*/ url('webfont.svg#webfont') format('svg'); /* iOS 4.1- */ }
定制字体
- 中文的字体文件很大,使用完整的字体文件不现实,通常针对某几个文字进行单独定制。
- 可使用阿里
Web
字体定制工具:https://www.iconfont.cn/webfont#!/webfont/index
示例
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>01_web字体</title>
</head>
<style>
@font-face {
font-family: "情书字体";
src: url('./font1/方正手迹.ttf');
}
@font-face {
font-family: 'atguigu';
font-display: swap;
src: url('./font2/webfont.eot'); /* IE9 */
src: url('./font2/webfont.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
url('./font2/webfont.woff2') format('woff2'),
url('./font2/webfont.woff') format('woff'), /* chrome、firefox */
url('./font2/webfont.ttf') format('truetype'), /* chrome、firefox、opera、Safari, Android, iOS 4.2+*/
url('./font2/webfont.svg#webfont') format('svg'); /* iOS 4.1- */
}
.t1 {
font-size: 100px;
font-family: '情书字体';
}
.t2 {
font-size: 100px;
font-family: 'atguigu';
}
</style>
<body>
<h1 class="t1">春风得意马蹄疾,不信人间有别离</h1>
<h1 class="t2">春风得意马蹄疾,不信人间有别离</h1>
</body>
</html>
字体图标
- 相比图片更加清晰。
- 灵活性高,更方便改变大小、颜色、风格等。
- 兼容性好,
IE
也能支持。
字体图标的具体使用方式,每个平台不尽相同,最好参考平台使用指南。
阿里巴巴图标官网地址:https://www.iconfont.cn/
2D变换
前提:二维坐标系如下图所示
2D位移
2D
位移可以改变元素的位置,具体使用方式如下:
- 先给元素添加转换属性
transform
- 编写
transform
的具体值,相关可选值如下:值 含义 translateX
设置水平方向位移,需指定长度值;若指定的是百分比,是参考自身宽度的百分比。 translateY
设置垂直方向位移,需指定长度值;若指定的是百分比,是参考自身高度的百分比。 translate
一个值代表水平方向,两个值代表:水平和垂直方向。 - 注意点:
- 位移与相对定位很相似,都不脱离文档流,不会影响到其它元素。
- 与相对定位的区别:相对定位的百分比值,参考的是其父元素;定位的百分比值,参考的是其自身。
- 浏览器针对位移有优化,与定位相比,浏览器处理位移的效率更高。
transform
可以链式编写,例如:transform: translateX(30px) translateY(40px);
- 位移对行内元素无效。
- 位移配合定位,可实现元素水平垂直居中
.box { position: absolute; left: 50%; top: 50%; transform: translate(-50%,-50%); }
2D缩放
2D
缩放是指:让元素放大或缩小,具体使用方式如下:
-
先给元素添加转换属性
transform
-
编写
transform
的具体值,相关可选值如下:值 含义 scaleX
设置水平方向的缩放比例,值为一个数字, 1
表示不缩放,大于1
放大,小于1
缩小。scaleY
设置垂直方向的缩放比例,值为一个数字, 1
表示不缩放,大于1
放大,小于1
缩小。scale
同时设置水平方向、垂直方向的缩放比例,一个值代表同时设置水平和垂直缩放;两个值分别代表:水平缩放、垂直缩放。 -
注意点:
scale
的值,是支持写负数的,但几乎不用,因为容易让人产生误解。- 借助缩放,可实现小于
12px
的文字。
示例:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>02_缩放</title>
</head>
<style>
.outer {
width: 200px;
height: 200px;
border: 2px solid black;
margin: 0 auto;
margin-top: 100px;
}
.inner {
width: 200px;
height: 200px;
background-color: deepskyblue;
transform: scale(1.5);
}
</style>
<body>
<div class="outer">
<div class="inner">你好啊</div>
</div>
</body>
</html>
2D旋转
2D
旋转是指:让元素在二维平面内,顺时针旋转或逆时针旋转,具体使用方法如下:
- 先给元素添加转换属性
transform
- 编写
transform
的具体值,相关可选值如下:值 含义 rotate
设置旋转角度,需指定一个角度值 deg
,正值顺时针,负值逆时针。
注意:
rotateZ(20deg)
相当于rotate(20deg)
,当然到了3D
变换的时候,还能写:rotate(x,x,x)
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>03_旋转</title>
</head>
<style>
.outer {
width: 200px;
height: 200px;
border: 2px solid black;
margin: 0 auto;
margin-top: 100px;
}
.inner {
width: 200px;
height: 200px;
background-color: deepskyblue;
transform: rotate(30deg);
}
</style>
<body>
<div class="outer">
<div class="inner">你好啊</div>
</div>
</body>
</html>
2D扭曲(了解)
2D
扭曲是指:让元素在二维平面内被“拉扯”,进而“走形”,实际开发几乎不用,了解即可,具体使用方式如下:
- 先给元素添加转换属性
transform
- 编写
transform
的具体值,相关可选值如下:值 含义 skewX
设置元素在水平方向扭曲,值为角度值,会将元素的左上角、右下角 拉扯
。skewY
设置元素在垂直方向扭曲,值为角度值,会将元素的左上角、右下角 拉扯
。skew
一个值代表 skewX
,两个值分别代表:skewX
、skewY
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>04_扭曲_了解</title>
</head>
<style>
.outer {
width: 200px;
height: 200px;
border: 2px solid black;
margin: 0 auto;
margin-top: 100px;
}
.inner {
width: 200px;
height: 200px;
background-color: deepskyblue;
transform: skew(30deg,30deg);
}
</style>
<body>
<div class="outer">
<div class="inner">你好啊</div>
</div>
</body>
</html>
2D多重变换
多个变换,可以同时使用一个transform
来编写。
注意点:多重变换时,建议最后旋转。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>05_多重变换</title>
</head>
<style>
.outer {
width: 200px;
height: 200px;
border: 2px solid black;
margin: 0 auto;
margin-top: 100px;
}
.inner {
width: 200px;
height: 200px;
background-color: deepskyblue;
transform: translate(100px,100px) rotate(30deg);
}
</style>
<body>
<div class="outer">
<div class="inner">你好啊</div>
</div>
</body>
</html>
2D变换原点
- 元素变换时,默认的原点是元素的中心,使用
transform-origin
可以设置变换的原点。 - 修改变换原点对位移没有影响,对旋转和缩放会产生影响。
- 如果提供两个值,第一个用于横坐标,第二个用于纵坐标。
- 如果只提供一个,若是像素值,表示横坐标,纵坐标取
50%
;若是关键词,则另一个坐标取50%
。transform-origin:50% 50%
,变换原点在元素的中心位置,百分比是相对于自身。—— —— 默认值transform-origin: left top
,变换原点在元素的左上角。transform-origin: 50px 50px
,变换原点距离元素左上角50px 50px
的位置。transform-origin:0
,只写一个值的时候,第二个值默认为50%
。
3D变换
开启3D空间
重要原则:元素进行3D
变换的首要操作:父元素
必须开启3D
空间!
使用transform-style
开启3D
空间,可选值如下:
flat
:让子元素位于此元素的二维平面内(2D
空间)—— —— 默认值preserve-3d
:让子元素位于此元素的三维空间内(3D
空间)
设置景深
何为景深?—— —— 指观察者与z=0
平面的距离,能让发生3D
变换的元素,产生透视效果,看起来更加立体。
使用perspective
设置景深,可选值如下:
none
:不指定透视 —— —— (默认值)长度值
:指定观察者距离z=0
平面的距离,不允许负值。
注意:perspective
设置给发生3D
变换元素的父元素
!
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>01_3D空间与景深</title>
</head>
<style>
.outer {
width: 200px;
height: 200px;
border: 2px solid black;
margin: 0 auto;
margin-top: 100px;
/* 开启3D空间 */
transform-style: preserve-3d;
/* 设置景深(有了透视效果,近大远小) */
perspective: 500px;
}
.inner {
width: 200px;
height: 200px;
background-color: deepskyblue;
transform: rotateX(50deg);
}
</style>
<body>
<div class="outer">
<div class="inner">你好啊</div>
</div>
</body>
</html>
透视点位置
所谓透视点位置,就是观察者位置,默认的透视点在元素的中心。
使用perspective-origin
设置观察者位置(透视点的位置),例如:
/* 相对坐标轴往右偏移400px,往下偏移300px(相当于人蹲下300像素,然后向右移动400像素看元素) */
perspective-origin: 400px 300px;
注意:通常情况下,我们不需要调整透视点位置。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>02_透视点的位置</title>
</head>
<style>
.outer {
width: 200px;
height: 200px;
border: 2px solid black;
margin: 0 auto;
margin-top: 100px;
/* 开启3D空间 */
transform-style: preserve-3d;
/* 设置景深(有了透视效果,近大远小) */
perspective: 500px;
/* 设置透视点位置:相对坐标轴往右偏移400px,往下偏移300px(相当于人蹲下300像素,然后向右移动400像素看元素) */
perspective-origin: 400px 300px;
}
.inner {
width: 200px;
height: 200px;
background-color: deepskyblue;
transform: rotateX(50deg);
}
</style>
<body>
<div class="outer">
<div class="inner">你好啊</div>
</div>
</body>
</html>
位移
3D
位移是在2D
位移的基础上,可以让元素沿z
轴位移,具体使用方式如下:
- 先给元素添加转换属性
transform
- 编写
transform
的具体值,3D
相关可选值如下:值 含义 translateZ
设置 z
轴位移,须指定长度值,正值向屏幕外,负值向屏幕里,且不能写百分比。translate3d
第1个参数对应 x
轴,第2个参数对应y
轴,第3个参数对应z
轴,且均不能省略。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>02_透视点的位置</title>
</head>
<style>
.outer {
width: 200px;
height: 200px;
border: 2px solid black;
margin: 0 auto;
margin-top: 100px;
/* 开启3D空间 */
transform-style: preserve-3d;
/* 设置景深(有了透视效果,近大远小) */
perspective: 500px;
/* 设置透视点位置:相对坐标轴往右偏移400px,往下偏移300px(相当于人蹲下300像素,然后向右移动400像素看元素) */
perspective-origin: 400px 300px;
}
.inner {
width: 200px;
height: 200px;
background-color: deepskyblue;
transform: translate3d(50%,50%,50%);
box-shadow: 0px 0px 10px black;
}
</style>
<body>
<div class="outer">
<div class="inner">你好啊</div>
</div>
</body>
</html>
旋转
3D
旋转是在2D
旋转的基础上,可以让元素沿x
轴和y
轴旋转,具体使用方式如下:
- 先给元素添加转换属性
transform
- 编写
transform
的具体值,3D
相关可选值如下:值 含义 rotateX
设置 x
轴旋转角度,需指定一个角度值(deg
),面对x
轴正方向:正值顺时针,负值逆时针。rotateY
设置 y
轴旋转角度,需指定一个角度值(deg
),面对y
轴正方向:正值顺时针,负值逆时针。rotate3d
前 3
个参数分别表示坐标轴x
,y
,z
,第4
个参数表示旋转的角度,参数不允许省略。例如:transform: rotate3d(1,1,1,30deg)
,意思是:x
、y
、z
分别旋转30
度。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>04_旋转</title>
</head>
<style>
.outer {
width: 200px;
height: 200px;
border: 2px solid black;
margin: 0 auto;
margin-top: 100px;
/* 开启3D空间 */
transform-style: preserve-3d;
/* 设置景深(有了透视效果,近大远小) */
perspective: 500px;
/* 设置透视点位置:相对坐标轴往右偏移400px,往下偏移300px(相当于人蹲下300像素,然后向右移动400像素看元素) */
perspective-origin: 400px 300px;
}
.inner {
width: 200px;
height: 200px;
background-color: deepskyblue;
/* transform: rotateX(315deg); */
/* transform: rotateX(-35deg); */
transform: rotate3d(1,1,1,30deg);
}
</style>
<body>
<div class="outer">
<div class="inner">你好啊</div>
</div>
</body>
</html>
缩放
3D
缩放是在2D
缩放的基础上,可以让元素沿z
轴缩放,具体使用方式如下:
- 先给元素添加转换属性
transform
- 编写
transform
的具体值,3D
相关可选值如下:值 含义 scaleZ
设置 z
轴方向的缩放比例,值为第一个数字,1
表示不缩放,大于1
放大,小于1
缩小。scale3d
第1个参数对应 x
轴,第2个参数对应y
轴,第3个参数对应z
轴,参数不允许省略。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>05_缩放</title>
</head>
<style>
.outer {
width: 200px;
height: 200px;
border: 2px solid black;
margin: 0 auto;
margin-top: 100px;
/* 开启3D空间 */
transform-style: preserve-3d;
/* 设置景深(有了透视效果,近大远小) */
perspective: 500px;
/* 设置透视点位置:相对坐标轴往右偏移400px,往下偏移300px(相当于人蹲下300像素,然后向右移动400像素看元素) */
perspective-origin: 400px 300px;
}
.inner {
width: 200px;
height: 200px;
background-color: deepskyblue;
/* transform: scaleZ(4) rotateY(45deg); */
transform: scale3d(1.5,1.5,1) rotateY(45deg);
}
</style>
<body>
<div class="outer">
<div class="inner">你好啊</div>
</div>
</body>
</html>
多重变换
多个变换,可以同时使用一个transform
来编写。
transform: translateZ(100px) scaleZ(3) rotetaY(40deg);
注意点:多重变换时,建议最后旋转。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>06_多重变换</title>
</head>
<style>
.outer {
width: 200px;
height: 200px;
border: 2px solid black;
margin: 0 auto;
margin-top: 100px;
/* 开启3D空间 */
transform-style: preserve-3d;
/* 设置景深(有了透视效果,近大远小) */
perspective: 500px;
/* 设置透视点位置:相对坐标轴往右偏移400px,往下偏移300px(相当于人蹲下300像素,然后向右移动400像素看元素) */
perspective-origin: 400px 300px;
}
.inner {
width: 200px;
height: 200px;
background-color: deepskyblue;
/* transform-origin: 202px 180px; */
/* transform: rotateX(-45deg); */
transform: translateZ(100px) scaleZ(1) rotateY(45deg);
}
</style>
<body>
<div class="outer">
<div class="inner">你好啊</div>
</div>
</body>
</html>
过渡
过渡可以在不使用Flash
动画,不使用javaScript
的情况下,让元素从一种样式,平滑过渡为另一种样式。
transition-property 定义哪个属性需要过渡
作用:定义哪个属性需要过渡,只有在该属性中定义的属性(比如宽、高、颜色等)才会有过渡效果。
常用值:
none
:不过渡任何属性。all
:过渡所有能过渡的属性。具体某个属性名
,例如:width
、heigth
,若有多个以逗号分隔。
不是所有的属性都能过渡,值为数字,或者值能转为数字的属性,都支持过渡,否则不支持过渡。
常见的支持过渡的属性有:颜色、长度值、百分比、z-index
、opacity
、2D
变换属性、3D
变换属性、阴影。
语法:
/* 设置哪个属性需要过渡效果 */
transition-property: width,height,background-color;
/* 让所有能过渡的属性,都过渡 */
transition-property: all;
transition-duration 设置过渡的持续时间
作用:设置过渡的持续时间,即:一个状态过渡到另外一个状态耗时多久。
常用值:
0
:没有任何过渡时间 —— —— 默认值。s
或ms
:秒或毫秒。列表
:- 如果想让所有属性都持续一个时间,那就写一个值。
- 如果想让每个属性持续不同的时间那就写一个时间的列表。
语法:
/* 设置过渡时间 */
transition-duration: 1s,5s,1s;
/* 设置一个时间,所有人都用 */
transition-duration: 1s;
transition-property 与 transition-duration 示例
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>01_基本使用</title>
</head>
<style>
.box1 {
width: 200px;
height: 200px;
background-color: orange;
opacity: 0.5;
/* 设置哪个属性需要过渡效果 */
/* transition-property: width,height,background-color; */
/* 让所有能过渡的属性,都过渡 */
transition-property: all;
/* 设置过渡时间 */
/* transition-duration: 1s,5s,1s; */
/* 设置一个时间,所有人都用 */
transition-duration: 1s;
}
.box1:hover {
width: 400px;
height: 400px;
background-color: green;
transform: rotate(45deg);
box-shadow: 0px 0px 20px black;
opacity: 1;
}
</style>
<body>
<div class="box1"></div>
</body>
</html>
transition-delay 过渡延时
作用:指定开始过渡的延时时间,单位:s
或ms
。
transition-timing-function 设置过渡的类型
作用:设置过渡的类型。
常用值:
ease
:平滑过渡 —— —— 默认值linear
:线性过渡ease-in
:慢 -> 快ease-out
:快 -> 慢ease-in-out
:慢 -> 快 -> 慢step-start
:等同于steps(1, start)
step-end
:等同于steps(1, end)
steps(integer,?)
:接受两个参数的步进函数,第一个参数必须为正整数,指定函数的步数。第二个参数取值可以是start
或end
,指定每一步的值发生变化的时间点。第二个参数默认值为end
。cubic-bezie(number,number,number,number)
:特定的贝塞尔曲线类型。
在线制作贝塞尔曲线:https://cubic-bezier.com
示例:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>02_高级使用</title>
</head>
<style>
.outer {
width: 1300px;
height: 900px;
border: 1px solid black;
}
.outer:hover .box {
width: 1300px;
}
.box {
width: 200px;
height: 100px;
/* 让所有能过渡的属性,都过渡 */
transition-property: all;
/* 设置一个时间,所有人都用 */
transition-duration: 1s;
/* 过渡延迟 */
/* transition-delay: 2s; */
}
.box1 {
background-color: skyblue;
transition-timing-function: ease;
}
.box2 {
background-color: orange;
transition-timing-function: linear;
}
.box3 {
background-color: gray;
transition-timing-function: ease-in;
}
.box4 {
background-color: tomato;
transition-timing-function: ease-out;
}
.box5 {
background-color: green;
transition-timing-function: ease-in-out;
}
.box6 {
background-color: purple;
transition-timing-function: step-start;
}
.box7 {
background-color: deepskyblue;
transition-timing-function: step-end;
}
.box8 {
background-color: chocolate;
transition-timing-function: steps(20,end);
}
.box9 {
background-color: rgb(18,78,34);
transition-timing-function: cubic-bezier(.88,1.03,.78,1.24);
}
</style>
<body>
<div class="outer">
<div class="box box1">ease(慢,快,慢)</div>
<div class="box box2">linear(匀速)</div>
<div class="box box3">ease-in(慢,快)</div>
<div class="box box4">ease-out(快,慢)</div>
<div class="box box5">ease-in-out(慢,快,慢)</div>
<div class="box box6">step-start不考虑过渡的时间,直接就是终点</div>
<div class="box box7">step-end考虑过渡时间,但无过渡效果,过渡时间到了以后,瞬间到达终点</div>
<div class="box box8">steps分布过渡</div>
<div class="box box9">贝塞尔曲线</div>
</div>
</body>
</html>
transition 复合属性
如果设置了一个时间,表示duration
;如果设置了两个时间,第一是duration
,第二个是delay
;其他值没有顺序要求。
transition: 1s 1s linear all;
示例:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=, initial-scale=1.0">
<title>过渡复合属性</title>
</head>
<style>
.outer {
width: 1000px;
height: 100px;
border: 1px solid black;
}
.inner {
width: 100px;
height: 100px;
background-color: orange;
transition: 1s 1s linear all;
}
.outer:hover .inner {
width: 1000px;
}
</style>
<body>
<div class="outer">
<div class="inner"></div>
</div>
</body>
</html>
多列布局
作用:专门用于实现类似于报纸的布局。
常用属性如下:
column-count
:指定列数,值是数字。
column-width
:指定列宽,值是长度。
columns
:同时指定列宽和列数,复合属性;值没有数量和顺序要求。
column-gap
:设置列边距,值是长度。
column-rule-style
:设置列与列之间边框的风格,值与border-style
一致。
column-rule-width
:设置列与列之间边框的宽度,值是长度。
column-rule-color
:设置列与列之间边框的颜色。
column-rule
:设置列边框,复合属性。
column-span
:指定是否跨列,值:none
、all
。
伸缩盒模型
伸缩盒模型简介
2009
年,W3C
提出了一种新的盒子模型 —— ——Flexible Box
(伸缩盒模型,又称:弹性盒子)。- 它可以轻松的控制:元素分布方式、元素对齐方式、元素视觉方式 … …
- 截止目前,除了在部分
IE
浏览器不支持,其他浏览器均已全部支持。 - 伸缩盒模型的出现,逐渐演变出了一套新的布局方案 —— ——
flex
布局。
小贴士:
- 传统布局是指:基于传统盒状模型,主要靠:
display
属性+position
属性+float
属性。flex
布局目前在移动端应用比较广泛,因为传统布局不能很好的呈现在移动设备上。
伸缩容器、伸缩项目
- 伸缩容器:开启了
flex
的元素,就是:伸缩容器。- 给元素设置:
display:flex
或display:inline-flex
,该元素就变为了伸缩容器。 display:inline-flex
很少使用,因为可以给多个伸缩容器的父容器,也设置为伸缩容器。- 一个元素可以同时是:伸缩容器、伸缩项目。
- 给元素设置:
- 伸缩项目:伸缩容器所有
子元素
自动成为了:伸缩项目。- 仅伸缩容器的
子元素
成为了伸缩项目,孙子元素、重孙子元素等后代,不是伸缩项目。 - 无论原来是那种元素(块、行内块、行内),一旦成为了伸缩项目,全都会“块状化”。
- 仅伸缩容器的
示例:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>01_伸缩容器_伸缩项目</title>
</head>
<style>
.outer {
width: 600px;
height: 600px;
background-color: #888;
/* 将该元素变为了伸缩容器(开启了flex布局) */
display: flex;
}
.inner {
width: 200px;
height: 200px;
background-color: skyblue;
border: 1px solid black;
box-sizing: border-box;
}
.inner3 {
display: flex;
}
</style>
<body>
<div class="outer">
<div class="inner">1</div>
<div class="inner">2</div>
<div class="inner inner3">
<div>a</div>
<div>b</div>
<div>c</div>
</div>
</div>
</body>
</html>
主轴与侧轴
- **主轴:**伸缩项目沿着主轴排列,主轴默认是水平的,默认方向是:从左到右(左边是起点,右边是终点)。
- **侧轴:**与主轴垂直的就是侧轴,侧轴默认是垂直的,默认方向是:从上到下(上边是起点,下边是终点)。
主轴方向
属性名:flex-direction
常用值如下:
row
:主轴方向水平从左到右 —— —— 默认值。row-reverse
:主轴方向水平从右到左。column
:主轴方向垂直从上到下。column-reverse
:主轴方向垂直从下到上。
注意:改变了主轴的方向,侧轴方向也随之改变。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>02_主轴方向</title>
</head>
<style>
.outer {
width: 1000px;
height: 600px;
background-color: #888;
margin: 0 auto;
/* 伸缩模型相关属性-start */
/* 将该元素变为了伸缩容器(开启了flex布局) */
display: flex;
/* 调整主轴方向,水平从左到右,默认 */
/* flex-direction: row; */
/* 调整主轴方向,水平从右到左 */
/* flex-direction: row-reverse; */
/* 调整主轴方向,垂直从上到下 */
/* flex-direction: column; */
/* 调整主轴方向,垂直从下到上 */
flex-direction: column-reverse;
}
.inner {
width: 200px;
height: 200px;
background-color: skyblue;
border: 1px solid black;
box-sizing: border-box;
}
</style>
<body>
<div class="outer">
<div class="inner">1</div>
<div class="inner">2</div>
<div class="inner">3</div>
</div>
</body>
</html>
主轴换行方式
属性名:flex-wrap
常用值如下:
-
nowrap
:默认值,不换行。
-
wrap
:自动换行,伸缩容器不够自动换行。
-
wrap-reverse
:反向换行。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>03_主轴换行方式</title>
</head>
<style>
.outer {
width: 1000px;
height: 600px;
background-color: #888;
margin: 0 auto;
/* 伸缩模型相关属性-start */
/* 将该元素变为了伸缩容器(开启了flex布局) */
display: flex;
/* 调整主轴方向,水平从左到右,默认 */
flex-direction: row;
/* 主轴换行方式,不换行,默认值 */
/* flex-wrap: nowrap; */
/* 主轴换行方式,换行 */
/* flex-wrap: wrap; */
/* 主轴换行方式,反向换行 */
flex-wrap: wrap-reverse;
}
.inner {
width: 200px;
height: 200px;
background-color: skyblue;
border: 1px solid black;
box-sizing: border-box;
}
</style>
<body>
<div class="outer">
<div class="inner">1</div>
<div class="inner">2</div>
<div class="inner">3</div>
<div class="inner">4</div>
<div class="inner">5</div>
<div class="inner">6</div>
<div class="inner">7</div>
<div class="inner">8</div>
<div class="inner">9</div>
<div class="inner">10</div>
<div class="inner">11</div>
</div>
</body>
</html>
flex-flow复合属性
flex-flow
是一个复合属性,复合了flex-direction
和flex-wrap
两个属性,值没有顺序要求。
flex-flow: row wrap;
示例:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>04_flex-flow</title>
</head>
<style>
.outer {
width: 1000px;
height: 600px;
background-color: #888;
margin: 0 auto;
/* 伸缩模型相关属性-start */
/* 将该元素变为了伸缩容器(开启了flex布局) */
display: flex;
/* 调整主轴方向,水平从左到右,默认 */
/* flex-direction: row; */
/* 主轴换行方式,换行 */
/* flex-wrap: wrap; */
flex-flow: row wrap;
}
.inner {
width: 200px;
height: 200px;
background-color: skyblue;
border: 1px solid black;
box-sizing: border-box;
}
</style>
<body>
<div class="outer">
<div class="inner">1</div>
<div class="inner">2</div>
<div class="inner">3</div>
<div class="inner">4</div>
<div class="inner">5</div>
<div class="inner">6</div>
<div class="inner">7</div>
<div class="inner">8</div>
<div class="inner">9</div>
<div class="inner">10</div>
<div class="inner">11</div>
</div>
</body>
</html>
主轴对齐方式
属性名:justify-content
常用值如下:
flex-start
:主轴起点对齐。—— —— 默认值。flex-end
:主轴终点对齐。center
:居中对齐。space-between
:均匀分布,两端对齐(最常用)。space-around
:均匀分布,两端距离是中间距离的一半。space-evenly
:均匀分布两端距离与中间距离一致。
示例:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>05_主轴对齐方式</title>
</head>
<style>
.outer {
width: 1000px;
height: 600px;
background-color: #888;
margin: 0 auto;
/* 伸缩模型相关属性-start */
/* 将该元素变为了伸缩容器(开启了flex布局) */
display: flex;
/* 调整主轴方向,水平从左到右,默认 */
flex-direction: row;
/* 主轴换行方式,换行 */
flex-wrap: wrap;
/* 主轴的对齐方式,主轴的起始位置 */
justify-content: flex-start;
/* 主轴的对齐方式,主轴的结束位置 */
/* justify-content: flex-end; */
/* 主轴的对齐方式,中间对齐 */
/* justify-content: center; */
/* 主轴的对齐方式,项目均匀的分布在一行中,项目与项目之间的距离,是项目边缘的一倍 */
/* justify-content: space-around; */
/* 主轴的对齐方式,项目均匀的分布在一行中,项目与项目之间的距离是相等的,项目距边缘没有距离 */
/* justify-content: space-between; */
/* 主轴的对齐方式,项目均匀的分布在一行中 */
/* justify-content: space-evenly; */
}
.inner {
width: 200px;
height: 200px;
background-color: skyblue;
border: 1px solid black;
box-sizing: border-box;
}
</style>
<body>
<div class="outer">
<div class="inner">1</div>
<div class="inner">2</div>
<div class="inner">3</div>
</div>
</body>
</html>
侧轴对齐方式
只有一行的情况
所需属性:align-items
常用值如下:
flex-start
:侧轴的起点对齐。flex-end
:侧轴的终点对齐。center
:侧轴的中点对齐。baseline
:伸缩项目的第一行文字的基线对齐。stretch
:如果伸缩项目未设置高度,将占满整个容器的高度。—— —— (默认值)。
多行的情况
所需属性:align-content
常用值如下:
flex-start
:与侧轴的起点对齐。flex-end
:与侧轴的终点对齐。center
:与侧轴的中点对齐。space-between
:与侧轴两端对齐,中间平均分布。space-around
:伸缩项目间的距离相等,比距边缘大一倍。space-evenly
:在侧轴上完全平分。stretch
:占满整个侧轴 —— —— 默认值。
示例:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>07_侧轴对齐方式_多行</title>
</head>
<style>
.outer {
width: 1000px;
height: 900px;
background-color: #888;
margin: 0 auto;
/* 伸缩模型相关属性-start */
/* 将该元素变为了伸缩容器(开启了flex布局) */
display: flex;
/* 调整主轴方向,水平从左到右,默认 */
flex-direction: row;
/* 主轴换行方式,换行 */
flex-wrap: wrap;
/* 主轴的对齐方式,主轴的起始位置 */
justify-content: flex-start;
/* 侧轴的对齐方式(多行)侧轴的起始位置对齐 */
align-content: flex-start;
/* 侧轴的对齐方式(多行)侧轴的结束位置对齐 */
/* align-items: flex-end; */
/* 侧轴的对齐方式(多行)侧轴的中间位置对齐 */
/* align-items: center; */
/* 侧轴的对齐方式(多行),伸缩项目之间的距离是相等的,且是边缘距离的2倍 */
/* align-content: space-around; */
/* 侧轴的对齐方式(多行),伸缩项目之间的距离是相等的,且边缘没有距离 */
/* align-content: space-between; */
/* 侧轴的对齐方式(多行),伸缩项目之间的距离是相等的 */
/* align-content: space-evenly; */
/* 侧轴的对齐方式(多行),拉伸 */
/* align-content: stretch; */
}
.inner {
width: 200px;
height: 200px;
background-color: skyblue;
border: 1px solid black;
box-sizing: border-box;
}
.inner2 {
height: 300px;
}
.inner3 {
height: 100px;
}
</style>
<body>
<div class="outer">
<div class="inner">1</div>
<div class="inner inner2">2</div>
<div class="inner inner3">3</div>
<div class="inner">4</div>
<div class="inner">5</div>
<div class="inner">6</div>
<div class="inner">7</div>
<div class="inner">8</div>
<div class="inner">9</div>
<div class="inner">10</div>
<div class="inner">11</div>
</div>
</body>
</html>
flex-basis 基准长度
概念:flex-basis
设置的是主轴方向的基准长度,会让宽度或高度失效。
备注:主轴横向:宽度失效;主轴纵向:高度失效。
作用:浏览器根据这个属性设置的值,计算主轴上是否有多余空间,默认值auto
,即:伸缩项目的宽或高。
flex-grow(伸)
概念:flex-grow
定义伸缩项目的放大比例,默认为0
,即:纵使主轴存在剩余空间,也不拉伸(放大)。
规则:
- 若所有伸缩项目的
flex-grow
值都为1
,则:它们将等分剩余空间(如果有空间的话)。 - 若三个伸缩项目的
flex-grow
值分别为:1
、2
、3
,则:分别瓜分到:1/6
、2/6
、3/6
的空间。
示例:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>10_伸缩项目_伸</title>
</head>
<style>
.outer {
width: 1000px;
height: 900px;
background-color: #888;
margin: 0 auto;
/* 伸缩模型相关属性-start */
/* 将该元素变为了伸缩容器(开启了flex布局) */
display: flex;
/* 调整主轴方向,水平从左到右,默认 */
flex-direction: row;
/* 主轴换行方式,换行 */
flex-wrap: wrap;
/* 主轴的对齐方式,主轴的起始位置 */
justify-content: flex-start;
}
.inner {
width: 200px;
height: 200px;
background-color: skyblue;
border: 1px solid black;
box-sizing: border-box;
flex-grow: 1;
}
/* .inner1 {
flex-grow: 1;
} */
.inner2 {
/* flex-grow: 2; */
width: 300px;
}
/* .inner3 {
flex-grow: 3;
} */
</style>
<body>
<div class="outer">
<div class="inner inner1">1</div>
<div class="inner inner2">2</div>
<div class="inner inner3">3</div>
</div>
</body>
</html>
flex-shrink(缩)
概念:flex-shrink
定义了项目的压缩比例,默认为1
,即:如果空间不足,该项目将会缩小。
收缩项目的计算,略微复杂一点,我们拿一个场景举例:
例如:
三个收缩项目,宽度分别为:200px
、300px
、200px
,它们的flex-shrink
值分别为:1
、2
、3
若想刚好容纳下三个项目,需要总宽度为700px
,但目前容器只有400px
,还差300px
,所以每个人都要收缩一下才可以放下,具体收缩的值,这样计算:
- 计算分母:
(200*1) + (300*2) + (200*3) = 1400
- 计算比例:
- 项目一:
(200*1) / 1400 = 比例值1
- 项目二:
(300*2) / 1400 = 比例值2
- 项目三:
(200*3) / 1400 = 比例值3
- 项目一:
- 计算最终收缩大小:
- 项目一需要收缩:
比例值1 * 300
- 项目二需要收缩:
比例值2 * 300
- 项目三需要收缩:
比例值3 * 300
- 项目一需要收缩:
示例:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>11_伸缩项目_缩</title>
</head>
<style>
.outer {
width: 600px;
height: 900px;
background-color: #888;
margin: 0 auto;
/* 伸缩模型相关属性-start */
/* 将该元素变为了伸缩容器(开启了flex布局) */
display: flex;
/* 调整主轴方向,水平从左到右,默认 */
flex-direction: row;
/* 主轴换行方式,换行 */
/* flex-wrap: wrap; */
/* 主轴的对齐方式,主轴的起始位置 */
justify-content: flex-start;
/* 侧轴的对齐方式 */
align-content: flex-start;
}
.inner {
width: 200px;
height: 200px;
background-color: skyblue;
border: 1px solid black;
box-sizing: border-box;
/* 可以拉伸 */
flex-grow: 1;
/* 可以压缩 */
flex-shrink: 1;
}
.inner2 {
width: 300px;
}
</style>
<body>
<div class="outer">
<div class="inner inner1">1</div>
<div class="inner inner2">2</div>
<div class="inner inner3">3</div>
</div>
</body>
</html>
flex复合属性
flex
是复合属性,复合了:flex-grow
、flex-shrink
、flex-basis
三个属性,默认值为0 1 auto
。
- 如果写
flex:1 1 auto
,则可简写为:flex:auto
- 如果写
flex:1 1 0
,则可简写为:flex:1
- 如果写
flex:0 0 auto
,则可简写为:flex:none
- 如果写
flex:0 1 auto
,则可简写为:flex:0 auto
—— —— 即flex
初始值。
示例:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>12_flex复合属性</title>
</head>
<style>
.outer {
width: 600px;
height: 900px;
background-color: #888;
margin: 0 auto;
/* 伸缩模型相关属性-start */
/* 将该元素变为了伸缩容器(开启了flex布局) */
display: flex;
/* 调整主轴方向,水平从左到右,默认 */
flex-direction: row;
/* 主轴换行方式,换行 */
/* flex-wrap: wrap; */
/* 主轴的对齐方式,主轴的起始位置 */
justify-content: flex-start;
/* 侧轴的对齐方式 */
align-content: flex-start;
}
.inner {
width: 200px;
height: 200px;
background-color: skyblue;
border: 1px solid black;
box-sizing: border-box;
/* 可以拉伸 */
/* flex-grow: 1; */
/* 可以压缩 */
/* flex-shrink: 1; */
/* 基准长度 */
/* flex-basis: 100px; */
/* 可以拉伸 可以压缩 不设置基准长度,可简写为:flex:auto */
/* flex: 1 1 auto; */
/* flex:auto; */
/* 可以拉伸 可以压缩 设置基准长度为0,可简写为:flex:1 */
/* flex: 1 1 0; */
flex:1;
/* 不可以拉伸 不可以压缩 不设置基准长度,可简写为:flex:none */
/* flex: 0 0 auto; */
/* flex:none; */
/* 不可以拉伸 可以压缩 不设置基准长度,可简写为:flex:0 auto */
/* flex: 0 1 auto; */
/* flex:0 auto; */
}
</style>
<body>
<div class="outer">
<div class="inner inner1">1</div>
<div class="inner inner2">2</div>
<div class="inner inner3">3</div>
</div>
</body>
</html>
项目排序
order
属性定义项目的排列顺序。数值越小,排列越靠前,默认为0
。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>13_项目排序与单独对齐</title>
</head>
<style>
.outer {
width: 600px;
height: 900px;
background-color: #888;
margin: 0 auto;
/* 伸缩模型相关属性-start */
/* 将该元素变为了伸缩容器(开启了flex布局) */
display: flex;
/* 调整主轴方向,水平从左到右,默认 */
flex-direction: row;
/* 主轴换行方式,换行 */
/* flex-wrap: wrap; */
/* 主轴的对齐方式,主轴的起始位置 */
justify-content: flex-start;
/* 侧轴的对齐方式 */
align-content: flex-start;
}
.inner {
width: 200px;
height: 200px;
background-color: skyblue;
border: 1px solid black;
box-sizing: border-box;
/* 可以拉伸 可以压缩 设置基准长度为0,可简写为:flex:1 */
flex: 1 1 0;
}
.inner1 {
order: 3;
}
.inner2 {
order: 2;
}
.inner3 {
order: 1;
}
</style>
<body>
<div class="outer">
<div class="inner inner1">1</div>
<div class="inner inner2">2</div>
<div class="inner inner3">3</div>
</div>
</body>
</html>
单独对齐
通过align-self
属性,可以单独调整某个伸缩项目的对齐方式。
默认值为auto
,表示继承父元素的align-items
属性。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>13_项目排序与单独对齐</title>
</head>
<style>
.outer {
width: 600px;
height: 900px;
background-color: #888;
margin: 0 auto;
/* 伸缩模型相关属性-start */
/* 将该元素变为了伸缩容器(开启了flex布局) */
display: flex;
/* 调整主轴方向,水平从左到右,默认 */
flex-direction: row;
/* 主轴换行方式,换行 */
/* flex-wrap: wrap; */
/* 主轴的对齐方式,主轴的起始位置 */
justify-content: flex-start;
/* 侧轴的对齐方式 */
align-content: flex-start;
}
.inner {
width: 200px;
height: 200px;
background-color: skyblue;
border: 1px solid black;
box-sizing: border-box;
/* 可以拉伸 可以压缩 设置基准长度为0,可简写为:flex:1 */
flex: 1 1 0;
}
.inner2 {
align-self: center;
}
</style>
<body>
<div class="outer">
<div class="inner inner1">1</div>
<div class="inner inner2">2</div>
<div class="inner inner3">3</div>
</div>
</body>
</html>
响应式布局
媒体类型
值:all
含义:检测所有设备。
值:screen
含义:检测电子屏幕,包括:电脑屏幕、平板屏幕、手机屏幕等。
值:print
含义:检测打印机。
语法:
@media 值 {
/* css样式 */
}
示例:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>01_媒体查询_媒体类型</title>
</head>
<style>
h1 {
width: 600px;
height: 400px;
line-height: 400px;
background-image: linear-gradient(30deg,red,yellow,green);
margin: 0 auto;
text-align: center;
font-size: 100px;
color: white;
text-shadow: 0 0 10px black;
}
/* 只有在打印机或打印预览才应用的样式 */
@media print {
h1 {
background: transparent;
}
}
/* 只有在屏幕上才应用的样式 */
@media screen {
h1 {
font-family: "宋体";
}
}
/* 一直都应用的样式 */
@media all {
h1 {
color: red;
}
}
</style>
<body>
</body>
<h1>新年快乐</h1>
</html>
媒体特性
值:width
含义:检测视口宽度。
值:max-width
含义:检测视口最大宽度。
值:min-width
含义:检测视口最小宽度。
值:height
含义:检测视口高度。
值:max-height
含义:检测视口最大高度。
值:min-height
含义:检测视口最小高度。
值:device-width
含义:检测设备屏幕的宽度。
值:max-device-width
含义:检测设备屏幕的最大宽度。
值:min-device-width
含义:检测设备屏幕的最小宽度。
值:orientation
含义:检测视口的旋转方向(是否横屏):1. portrait
视口处于纵向,即高度大于等于宽度;2. landscape
视口处于横向,即宽度大于高度。
语法:
@media (值) {
/* css样式 */
}
示例:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>02_媒体查询_媒体特性</title>
</head>
<style>
* {
margin: 0;
padding: 0;
}
h1 {
height: 200px;
background-color: gray;
text-align: center;
line-height: 200px;
font-size: 100px;
}
/* 检测到视口的宽度为800px时,应用如下样式 */
@media (width:800px) {
h1 {
background-color: green;
}
}
/* 检测到视口的宽度小于等于700px时,应用如下样式 */
@media (max-width:700px) {
h1 {
background-color: orange;
}
}
/* 检测到视口的宽度大于等于900px时,应用如下样式 */
@media (min-width:900px) {
h1 {
background-color: deepskyblue;
}
}
/* 检测到视口的高度等于800px时,应用如下样式 */
/* @media (height:800px) {
h1 {
background-color: yellow;
}
} */
/* 检测到屏幕的宽度等于1536时,应用如下样式 */
/* @media (device-width:1536px) {
h1 {
color: white;
}
} */
</style>
<body>
<h1>你好啊</h1>
</body>
</html>
运算符
值:and
含义:并且
值:,
或or
含义:或
值:not
含义:否定
值:not
含义:否定
值:only
含义:肯定
示例:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>03_媒体查询_运算符</title>
</head>
<style>
* {
margin: 0;
padding: 0;
}
h1 {
height: 200px;
background-color: gray;
text-align: center;
line-height: 200px;
font-size: 100px;
}
/* 且运算符 */
/* @media (min-width:700px) and (max-width:800px) {
h1 {
background-color: orange;
}
} */
/* @media screen and (min-width:700px) and (max-width:800px) {
h1 {
background-color: orange;
}
} */
/* 或运算符 */
/* @media (min-width:700px) or (max-width:800px) {
h1 {
background-color: orange;
}
} */
/* @media screen and (min-width:700px) or (max-width:800px) {
h1 {
background-color: orange;
}
} */
/* 否定运算符 */
/* @media not screen {
h1 {
background-color: orange;
}
} */
/* 肯定运算符,不加only也是肯定,这个主要为了处理ie不乱上样式,因为ie识别不了only就不会处理了 */
@media only screen {
h1 {
background-color: orange;
}
}
</style>
<body>
<h1>你好啊</h1>
</body>
</html>
常见阈值
在实际开发中,会将屏幕划分成几个区间,例如:
结合外部样式的用法
用法一
<link rel="stylesheet" media="具体的媒体查询" mystylesheet.css>
用法二
@media screen and (max-width:768px) {
/* CSS-Code; */
}
@media screen and (min-width:768px) and (max-width:1200px) {
/* CSS-Code; */
}
BFC
什么是BFC
W3C
上对BFC
的定义:浮动、绝对定位元素、不是块盒子的块容器(如
inline-blocks
、table-cells
和table-captions
),以及overflow
属性的值除visible
以外的块盒,将其内容建立新的块格式化上下文。MDN
上对BFC
的描述:块格式化上下文(Block Formatting Context,BFC)
是Web
页面的可视CSS
渲染的一部分,是块盒子的布局过程发生的区域,也是浮动元素与其他元素交互的区域。- 更加通俗的描述:
BFC
是Block Formatting Context
(块级格式上下文),可以理解成元素的一个"特异功能"
。- 该
"特异功能"
,在默认的情况下处于关闭状态;当元素满足了某些条件后,该"特异功能"
被激活。 - 所谓激活
"特异功能"
,专业点说就是:该元素创建了BFC
(又称:开启了BFC
)。
开启了BFC能解决什么问题
- 元素开启
BFC
后,其子元素不会再产生margin
塌陷问题。 - 元素开启
BFC
后,自己不会被其他浮动元素所覆盖。 - 元素开启
BFC
后,就算其子元素浮动,元素自身高度也不会塌陷。
如何开启BFC
- 根元素
- 浮动元素
- 绝对定位、固定定位的元素
- 行内块元素
- 表格单元格:
table
、thead
、tbody
、tfoot
、th
、td
、tr
、caption
overflow
的值不为visible
的块元素- 伸缩项目
- 多列容器
column-span
为all
的元素(即使该元素没有包裹在多列容器中)display
的值,设置为flow-root