HTML笔记总结

前端知识点总结


HTML5

超文本标记语言 Hyper Text Markup Language,是一种用于创建网页的标准标记语言。您可以使用 HTML 来建立自己的 WEB 站点,HTML 在浏览器上运行,由浏览器来解析代码。

<!DOCTYPE html>    <!--声明当前HTML文档的类型-->
<html lang="en">    <!--整个HTML文档的根标签-->
    <head>    <!--HTML文档的头部标签,子标签可以引用脚本、样式表、提供元信息-->
        <meta charset="UTF-8"> 
        <title>Title</title>    <!--网页的标题,显示在浏览器的标题栏或标签页上--->
    </head>
    <body>    <!--HTML文档的主体,标签包含界面上的所有显示内容。-->
    </body>
</html>

注释标签

注释是用来给开发人员看的,浏览器在解析时,会忽略注释里的内容,使用<!-- 注释内容 -->的格式来表示一个注释。

<!-- 我是HTML里的注释,浏览器在看到我的时候不会解析 -->

结构标签

h1~h6

包含h1~h6系列一共六个标签。被 h 系列标签修饰的文字,字体会加粗,大小会变化。h 系列标签具有标题的语义,搜索引擎在看到这些标签时,会特别留意这些标签。所以当你只是想把文字加粗变大,不要轻易使用h1标签,请使用CSS样式来完成

<h1>我是h1标题</h1>  <!-- 字号默认2倍 32px -->
<h2>我是h2标题</h2>
<h3>我是h3标题</h3>
<h4>我是h4标题</h4>
<h5>我是h5标题</h5>
<h6>我是h6标题</h6>

p

p标签用来表示段落,它是一个行内元素,一个标签独占一行。

<p>
    9月15日,苹果最新发布的iPhone11系列手机13日正式启动预约。
</p>

hr

hr标签用来显示一个分割线如下图。这是一个单标签,可以设置他的宽度、颜色、对齐方式


<hr width="" color="" align="" >

br

br标签是单标签,默认状态下段落文本里的换行和多个空白是会被解析成一个空格的!可以使用br来对文本进行强制换行。

<p>
    我是第一行<br>
    我是第二行
</p>

div

div标签是一个无语义的标签,独占一行,一般结合CSS进行界面布局,看做一个小盒子容器,容纳其他网页元素。

<div>
    <p>
        我是一段文字
    </p>
</div>

span

span是一个无语义的标签,一般结合CSS来对段落文字中的一些特别项进行样式的设置。

<p>
    我是很<span>特殊</span>的文字
</p>

特殊符号

1个受字体大小影响的空格 &nbsp;   等于一个字大小的空格 &emsp;
小于号 &lt;	大于号 &gt;
emoji表情:星星: &#11088;
参考地址:https://www.runoob.com/charsets/ref-emoji.html

语义修饰标签

加粗:	<b></b> <strong>范例1</strong>		
倾斜: <i></i> <em>范例2</em>				
下划线:<u>范例3</u> 						
删除线:<del>范例4</del>					
上标: 范例<sup>5</sup>				
下标:	范例<sub>6</sub>					

范例1范例2范例3范例4 范例5 范例6


超链接标签

在网页中经常会显示大量的可以用鼠标点击的元素,鼠标悬停在他们身上时,一般浏览器会在左下角给出他们的链接地址

<a href="http://www.baidu.com" target="_blank">百度</a>
<a href="#abc">点我去对应标题</a>

不同状态下的超链接,显示的效果也是不一样的,超链接的状态分为四种,如果想更改每种状态下超链接的样式,请点击此处:

  • 未访问状态(超链接对应的URL从未访问过)
  • 已访问状态(超链接对应的URL地址以前访问过,即历史记录里存在)
  • 鼠标悬停 (鼠标放上去但不点击)
  • 激活状态(鼠标点击超链接不松手)
属性 取值 含义
href 任意URL地址 点击标签后跳转的链接地址
href #abc 点击标签后跳转到当前页面上id="abc"的元素,通常用来制作目录
target _self 默认值,表示在浏览器的当前选项卡打开超链接
target _blank 在浏览器中开启一个新的选项卡打开超链接

图片标签

<img  src="" alt="" title="" width="" height="">
属性 取值 含义
src url 加载时的图片URL地址,也可以用本地文件名
alt 文字 当图片加载失败时,图片会裂开并显示的文字
title 文字 当鼠标悬停到图片上时显示的文字
width 数字,单位像素px 用来指定图片的宽度
height 数字,单位像素px 用来指定图片的高度

图片的大小更改宽高其中一个时,另一条边会等比例缩放,如果同时设置两个,图片有可能比例不对会变形

img 标签如果需要多个注意中间不要有空格或换行,会让图片左右多出一个空格缝隙,而且由于英语4线3格的问题,欧洲人要给pjgy等字母书写时留下第四条线的空间,所以图片的下边默认对齐的是第三条线,会导致图片下方出现缝隙,下一行无法和上一行紧贴着,想解决这个问题请点击 元素显示类型转换 查看


列表标签

有序列表

有序列表使用 <ol> 标签来表示,里面每一个列表项使用 <li> 标签 (全称list item,列表项)来表示。

<ol type="" start="">
    <li>起床</li>
    <li>洗漱</li>
    <li>吃饭</li>
    <li>出门</li>
    <li>上班</li>
</ol>
属性 取值 描述
type a 表示小写字母编号
type A 表示大写字母编号
type i 表示小写罗马数字编号
type I 表示大写罗马数字编号
type 1 表示数字编号(默认值)
start 1,2,3.. 指定序号的开始值
reversed 规定了列表的条目采用倒序


无序列表

无序列表使用 <ul> 标签来表示,和有序列表一样,无序列表里的列表项同样使用 <li> 标签来表示。

<ul type="">
    <li>啤酒</li>
    <li>咖啡</li>
    <li>橙汁</li>
</ul>
属性 取值 描述
type disc 显示实心圆(默认值)
type circle 显示空心圆
type square 显示正方形

自定义列表

自定义列表使用 <dl> 标签来表示,用于术语定义以及描述,通常用来展示词汇表或者元数据 (键-值对列表)。定义列表里的每一个列表项使用<dt>表示,同时,每一个 <dt> 列表项一般都会再跟一个 <dd> 标签对 <dt> 进行说明。

<dl>
    <dt>CPU</dt>
    <dd>中央处理器作为计算机系统的运算和控制核心,是信息处理、程序运行的最终执行单元</dd>
    <dt>内存</dt>
    <dd>内存是计算机中重要的部件之一,它是与CPU进行沟通的桥梁</dd>
    <dt>硬盘</dt>
    <dd>电脑硬盘是计算机最主要的存储设备</dd>
</dl>

表格标签

使用<table>来显示一个表格,其他与表格相关的标签都需要作为<table>标签的子标签。<table> 标签下的常见子标签如下:

  • <caption>标签用来表示表格的标题。
  • <tr>标签作为 table 标签的子标签,表示一行
  • <th>标签放在 <tr> 标签下,一般作为 <table> 标签的第一行,表示表头
  • <td>标签放在 <tr> 标签下,作为 <tr> 标签的子标签,表示单元格或者一列
  • rolspan 属性属于 <td> 标签,表示此单元格合并几行。不管合并几个都要删除被合并的 <td> 标签!
  • colspan 属性属于 <td> 标签,表示此单元格合并几列。不管合并几个都要删除被合并的 <td> 标签!见下方代码:
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
    </head>
    <body>
        <table border="1px" cellspacing="0px" cellpadding="1px">
            <caption>收入表</caption>
            <tr>
                <th>姓名</th>
                <th>年龄</th>
                <th>收入</th>
            </tr>
            <tr>
                <td>丁一</td>
                <td>25</td>
                <td>300</td>
            </tr>
            <tr>
                <td>王二</td>
                <td>23</td>
                <td>100</td>
            </tr>
            <tr>
                <td rowspan="2">张三</td>
                <td>20</td>
                <td>200</td>
            </tr>
            <tr>
                <td colspan="2">50</td>    <!--这一行本该有3个td,但是第一个被张三合并了,第三个被自己合并了-->
            </tr>
        </table>
    </body>
</html>

属性 取值 含义
border 数字,单位像素px 表格最外面的边框粗细,一般为1px
cellspacing 数字,单位像素px 每个单元格之间的间距,一般为0px
cellpadding 数字,单位像素px 单元格中的文字与单元格边界的距离

表单标签

<form>标签用来向服务器提交数据,所有需要被提交给服务器的数据,都可以放在 <form> 标签里,当点击 <form> 表单里的提交按钮时,会将 <form> 表单里用户输入的所有数据都提交给指定的服务器来处理。

<form action="" method="">
    <!-- 在这里放入input/select/textarea等子标签,用来让用户输入内容 -->
    <input type="" name="" value="">
    <select>
        <option></option>
    </select>
</form>
属性 取值 含义
action url 表示当点击提交按钮时,form表单里的数据要提交给的某一个服务器地址
method get或post 表示向服务器提交数据时的方式,get一般用来提交想查询的内容,post一般用来提交账号密码

表单内的元素input/select/textarea标签必须添加 name 属性


下拉选择框标签

<select> 标签用来在 <form> 表单里显示一个下拉选择框,每个选项使用 <option> 标签表示。

<select name="select">
    <option value="河北">河北</option>
    <option value="河南" selected>河南</option> 	<!-- selected 属性用来将某个待选项设置为默认选中 -->
    <option value="湖南">湖南</option>
    <option value="湖北">湖北</option>
    <option value="北京">北京</option>
</select>


输入标签

<input>标签是最常用的标签之一,经常出现在<form>表单里,让用户在页面上输入数据。根据属性值 type 的不同,<input>标签在界面上显示的样式和作用也不同。

属性 取值 描述
type text 默认值,显示一个普通的文本输入框
type button 显示一个普通按钮
type submit 显示一个提交按钮,点击时,会提交所在form表单里的数据
type image 根据src属性指定的图片路径,加载显示一张图片
type reset 显示一个重置按钮,点击时,会重置所在form表单里的数据
type radio 显示一个单选框,多个相关联的单选框name属性值要一样,否则无法实现单选
type checkbox 显示一个复选框,多个相关联的复选框name属性值要一样
type file 显示一个文件按钮,点击时可以选择电脑上的文件
type password 显示一个密码输入框,当用户输入时,会显示成为密文***
type number 显示一个输入框,用户只能输入数字、正负号和字母e,其他非数字无法输入
type email 显示一个文本输入框,用户输入的内容要符合电子邮箱地址,否则点击提交按钮时会出现错误提示,无法提交数据
type tel 控制用户输入手机号,当用户使用手机访问网页,点击文本框时,会弹出拨号键盘
type date 选择生日
type color 选择一个颜色
name 任意文本 设置input的名称,当提交给服务器时,会作为key提交
value 任意文本 如果需要用户输入信息,则不需要设置value,如果是单选多选或者用户可以点击选择的则需要提前填给对应选项
checked 当type为radio或者checkbox时,用来设置默认选中
autofocus 设置当打开页面时,文本输入框是否自动获取焦点
autocomplete 设置是否自动补全,注意,只有input标签设置了name属性以后,autocomplete才有效
required 表示该输入框必须要填写,否则无法提交
readonly 表示该输入框里的数据不可修改
disabled 表示禁用文本输入框,多用于按钮
max/min 当type为number时,用来设置最大值和最小值区间
placeholder 当input的类型为输入框时,用来在输入框中显示提示信息

label

想要将文本和选择框关联在一起 ( 点字也可以选择 ) ,你需要给 input 一个 id 属性。然后把 id 传递给 for 属性。

<label for="cheese">Do you like cheese?</label>
<input type="checkbox" name="peas" id="cheese" value="yes">

另外,你也可以将 input 直接放在 label 里,这种情况就不需要 forid 属性了,因为这时关联是隐含的:

<label>
    Do you like peas?
    <input type="checkbox" name="peas" value="yes">
</label>

音视频标签

<audio src="" controls autoplay loop muted></audio>
<video src="" controls autoplay loop muted poster=""></video>
属性 取值 描述
src 文件路径 播放文件
controls 播放控件
autoplay 自动播放(chrome不支持)
loop 循环播放
muted 静音播放
poster 文件路径 视频封面

CSS3

层叠样式表 Cascading Style Sheets ,用于渲染HTML元素标签的样式

使用方式

1.行内样式表

直接在HTML标签里使用style属性来给元素设置属性。

<!-- 使用style属性来设置标签的样式 -->
<span style="color:red;">我是文字</span>

2.内部样式表

<head>标签里,添加 <style>标签,通过选择器找到要操作的元素,再使用CSS属性给找到的元素添加样式。

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style type="text/css">
            span {
                color:red;
            }
        </style>
    </head>
    <body>
        <span>我是内容</span>
    </body>
</html>

3.外部样式表

将CSS样式写入到一个单独的.css文件,再在<head>标签里,使用 <link>标签,将 test.css 文件导入到HTML文档里。

test.css

span{
    color:red;
}

test.html

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <link rel="stylesheet" type="text/css" href="test.css">    <!--引入上面的css文件里的样式-->
    </head>
    <body>
    	<span>我是内容</span>
    </body>
</html>

对比

三种CSS的使用各有优缺点,可以根据各自的特点,结合实际情况选择适合的方式

方式 优点 缺点
行内样式 如果样式重复,行内样式的优先级要高于其他两种 只能手动的给每一个标签设置样式,不能一次性给多个标签设置样式
内部样式 通过选择器同时给多个标签设置相同的样式 只能在当前HTML文档里使用,不能够给其他文件使用
外部样式 同时让多个HTML文档使用同一份样式表利用率高 会产生新的文件,不便于项目管理

选择器

选择器的核心理念是只能由上往下查找!

通配符选择器

使用 * 表示通配符选择器,用来选择网页中的所有标签。

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            * {          /*选择所有标签*/
                color:blue;
            }
        </style>
    </head>
    <body>
        <span>我是内容</span>	<!--此时所有文字都会变成蓝色-->
        <p>我是一个p</p>
        <div>我是一个div</div>
    </body>
</html>

标签选择器

使用标签的名字作为选择器,给相同名字的所有标签同时增加样式。

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            p {
                color:red;
            }
        </style>
    </head>
    <body>
        <p>我是一个p</p>		<!--所有p标签文字变红色-->
        <p>我也是一个p</p>
    </body>
</html>

类选择器

使用 .类名 作为类选择器,使用前需要先给相同样式的标签,按照特点进行分类,样式相同的属性值 class 要相同!

类名可以不止一个,多个类名用空格隔开,如果样式冲突以优先级高的为准!

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            /* 使用 .类名 的形式找到对应类的标签,对同一类的标签设置同样的样式 */
            .chinese {
                color:red;
            }
            .english {
                color:blue;
            }
            .number{
                color:green;
            }
        </style>
    </head>
    <body>
        <!-- 先把所有的标签按照特点进行分类 -->
        <p class="chinese">我是中文</p>
        <p class="english">I am English</p>
        <p class="number">45</p>
        <p class="english">hello</p>
        <p class="number">100</p>
        <p class="chinese">你好</p>
    </body>
</html>

id选择器

使用 #id值 作为 id 选择器,使用前要给指定的元素添加全文档唯一的 id 值,。

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            /* 使用 #id值 的形式,给指定的元素设置样式 */
            #three{
                color:red;
            }
        </style>
    </head>
    <body>
        <p>我是第一个p</p>
        <p>我是第二个p</p>
        <!-- 先给指定的标签设置 id 属性,注意 id 对应的值在全文档里应该是唯一的,不能重复 -->
        <p id="three">我是第三个p</p>
        <p>我是第四个p</p>
    </body>
</html>

并集选择器

多个选择器之间使用 逗号 , 进行分隔,表示同时给多个选择器对应的元素设置样式。

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            /* 同时找到p标签和class=number的标签 */
            .number,p{
                color:red;
            }
        </style>
    </head>
    <body>
        <p>我是一个p</p>
        <span class="number">45</span>
        <div class="number">100</div>
        <span>我是一个普通的span</span>
    </body>
</html>

交集选择器

多个选择器按照优先级由小到大,从左往右连写在一起,可以给同时满足所有条件的元素增加样式。

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            /* 找到标签名为span同时class=number的标签 */
            span.number{
                color:blue;
            }
        </style>
    </head>
    <body>
        <p>我是一个p</p>
        <span class="number">45</span>
        <div class="number">100</div>
        <span>我是一个普通的span</span>
    </body>
</html>

后代选择器

1.选择器之间使用 空格 进行分隔,表示左边的元素包含右边的元素。

2.选择器之间使用大于号 > 连接,表示左右必须是父子关系

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            /* 同时选择了father里的p和son里的p */
            .father p{
                color:blue;
            }
            /* 只能选择father里的p,不能选择son里的p,因为son里的p不是儿子,是孙子 */
            .father>p{
                color:red;
            }
        </style>
    </head>
    <body>
        <div class="father">
            <p>我是father里的p</p>			   <!--father的儿子-->
            <div class="son">
                <p>我是son里的p</p>			   <!--father的孙子-->
            </div>
        </div>
        <p>我是father外面,和father同级的p</p>   <!--father的兄弟-->
    </body>
</html>

兄弟选择器

1.两个选择器之间使用加号 + 连接,表示与它相邻的并且在它后面的那个兄弟元素

2.两个选择器之间使用加号 ~ 连接,表示与它同级的并且在它后面的所有兄弟元素

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            /* 与.number相邻在它后面的span */
            .number+span{
                color:blue;
            }
            /* 所有在.number后面的兄弟span */
            .number~span{
                color:red;
            }
        </style>
    </head>
    <body>
        <span>我是span</span>				<!--不在.number后面-->
        <div class="number">234</div>
        <span>我是span</span>				<!--与.number相邻并且在它后面-->
        <p>我是p</p>
        <div class="number">456</div>
        <p>我也是p</p>
        <span>我是span</span>		  <!--与.number不相邻,但还是兄弟-->
    </body>
</html>

伪类选择器

选择器 例子 描述
:link a:link 选择所有未被访问过的链接。
:visited a:visited 选择所有已访问的链接。
:hover a:hover 选择鼠标悬停上方的链接。
:active a:active 选择鼠标点击时的链接。
:checked input:checked 选择每个被选中的 <input> 元素。
:focus input:focus 选择获得焦点的 <input> 元素。
:disabled input:disabled 选择每个被禁用的 <input> 元素。
:enabled input:enabled 选择每个已启用的 <input> 元素。
:in-range input:in-range 选择具有指定范围内的值的 <input> 元素。
:out-of-range input:out-of-range 选择值在指定范围之外的 <input> 元素。
:invalid input:invalid 选择所有具有无效值的 <input> 元素。
:empty p:empty 选择没有子元素的 <p> 元素。
:first-child p:first-child 选择作为同级元素中第一个元素的 <p>
:first-of-type p:first-of-type 选择作为同级<p>元素中的第一个 <p>
:last-child p:last-child 选择作为同级元素中最后一个元素的 <p>
:last-of-type p:last-of-type 选择作为同级<p>元素中的最后一个 <p>
:nth-child(n) p:nth-child(2) 选择作为同级元素中第二个元素的<p>
:nth-of-type(n) p:nth-of-type(2) 选择作为同级<p>元素中的第二个<p>
:only-child p:only-child 选择作为唯一子元素的<p>
:only-of-type p:only-of-type 选择作为同级元素中唯一的 <p> 元素
:not(selector) :not(p) 选择每个非 <p> 元素的元素。
:root root 选择元素的根元素。

选择器的权重/优先级

!important -10000 > 行内样式-1000 > id选择器-100 > 类选择器-10 > 标签选择器-1 > 通配符选择器

如果选择器的描述较多,多个选择器数值之间相加,以大的为准;如果最后数值一样,谁在css中靠后谁优先

! important 用来提高一个样式的优先级


元素显示类型

行内元素

例如:a b strong i em u del span

  • 横向排列
  • 不能设置宽高,没有自己的形状,它的大小只能根据包含的内容决定
  • 基本遵循盒子模型,但是上下方向会失效

块级元素(盒子)

例如:div p h1 ul li table

  • 竖向排列,每个元素独占一行
  • 可以设置宽高,都为矩形
  • 遵循盒子模型,一般作为其他元素的容器

行内-块元素

例如:img input

同时具备二者特点,既能横向排列,还能设置宽高


元素类型转换

属性 取值 描述
display inline 转换为行内元素
display block 转换为块级元素
display inline-block 转换为行内块元素
display none 让元素不显示

图片标签在显示时具备行内元素 横向排列 的特点,所以它所在的那一行是可以放置 qpgjy 等字母的,由于图片下边默认对齐的是英语4线3格的第三条线,所以图片下方会留有缝隙,如果不想要缝隙,只需要把 img 的类型转换为块级元素,让图片独占一行就可以解决这个问题,代码如下:

img{
    display: block;
}

字体属性

属性 取值 描述
font-family 系统可用字体 设置文字的字体
font-size 像素 设置字体的大小,默认16px
font-style italic 设置字体倾斜
font-weight 数字,关键词 设置字体的粗细,一般用 bold加粗,lighter更细
font 设置所有与字体相关的属性 而且属性必须要按照顺序去写
color red ; #FF0000 ; 设置文字的颜色

段落格式属性

属性 取值 描述
text-align center / left / right / justify 水平居中 / 左对齐 / 右对齐 / 分散两端对齐
text-indent 像素 / 2em 表示文字的缩进距离, 可以直接用像素或者用1em就是一个字的大小
line-height 像素 设置行高,如果行高和所处区域高度一样就是垂直居中
text-decoration underline / overline / line-through 设置下划线 / 上划线 / 删除线
text-transform capitalize / uppercase / lowercase 转换英文为 单词首字母大写 / 全部大写 / 全部小写
letter-spacing 像素 单个字母或汉字之间的间距
word-spacing 像素 每个单子之间的间距 ( 单词的判定以空格划分 )

背景属性

属性 取值 描述
background-color 颜色取值 设置背景颜色
background-image url(图片路径) 设置一张背景图片
background-size 宽度 高度 ;
cover / contain
设置背景图片的大小,cover是图片的最短边刚好超出盒子(多余裁剪)
contain是图片的最长边刚好超出盒子(覆盖不完整)
background-repeat repeat / no-repeat 设置背景图片是否重复
background-position 关键字或者px值 设置背景图片的位置
background-attachment fixed 设置背景图片固定在浏览器窗口中
background 设置所有与背景相关的属性 设置所有的背景相关属性

阴影属性

属性 取值 描述
text-shadow 1px 1px 1px red 文本阴影: x轴偏移 y轴偏移 影子模糊度 影子颜色
box-shadow 1px 1px 1px blue 盒子阴影: x轴偏移 y轴偏移 影子模糊度 影子颜色
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            div{
                width: 150px;
                height: 50px;
                text-shadow:5px 5px 2px green;
                box-shadow: 3px 3px 1px gray;
            }
        </style>
    </head>
    <body>
        <div>我是盒子里的文字</div>
    </body>
</html>


列表属性

属性 取值 描述
list-style-type disc(实心圆) / circle(空心圆) /
square(实心方块) / none(去掉符号)
列表每一项前的符号样式
list-style-image url() [可以不写] 用图片替换符号
list-style-position outside(默认) / inside 如果是 outside 符号在内边距里,如果是 inside 符号在 li 里
list-style 前三个属性值简写
<!-- 案例一:符号为inside在li里 -->
<style type="text/css">
    ul{
        list-style: square inside;   
    }
    li{
        background-color: red;
    }
</style>
<ul>
    <li>吃饭</li>
    <li>睡觉</li>
    <li>打豆豆</li>
</ul>


<!-- 案例二:取消每一项的符号 -->
<style type="text/css">
    ul{
        list-style: none;   
    }
</style>
<ul>
    <li>吃饭</li>
    <li>睡觉</li>
    <li>打豆豆</li>
</ul>


溢出属性

属性 取值 描述
overflow visible(默认) 溢出时在父元素外正常显示
overflow hidden 溢出部分隐藏
overflow scroll 强制增加滚动条,即使不溢出
overflow auto 溢出增加滚动条,不溢出不增加
white-space nowrap 长文本溢出不换行,直到遇到br标签
text-overflow ellipsis 溢出的文本变为省略号
<!--省略号案例-->
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <style type="text/css">
            p{
                width: 200px;
                height: 50px;
                background-color: yellow;
                white-space: nowrap;        /* 1.先把文字变成1行 */
                overflow: hidden;           /* 2.隐藏溢出的部分 */
                text-overflow: ellipsis;    /* 3.变为省略号 */
           	}
        </style>
    </head>
    <body>
        <p>
            华为新手机双11惊爆价998!华为新手机双11惊爆价998!
        </p>
    </body>
</html>

透明度属性

属性 取值 描述
opacity 0~1 的小数 让背景和其中的文字一同透明,0 是完全透明 , 1 是不透明,搭配过渡动画可以实现逐渐显示或隐藏


浮动

所谓的标准流就是网页中的默认元素排列是垂直方向,每个元素独占一行,从上向下排列。如果想让盒子能够水平排列,就需要让他们浮动。

浮动的特性:

1.浮动元素会脱离标准流 (浮动的盒子不再保留原先的位置)

2.浮动的元素会在一行内显示并且元素顶部对齐

3.浮动的元素是互相贴靠在一起的(不会有缝隙),如果父级宽度装不下这些浮动的盒子,多出的盒子会在下一行对齐。

属性 取值 描述
float left / right / none( 默认 ) 左浮动 / 右浮动 / 不浮动 ( 默认 )

清除浮动

如果一个盒子浮动后,与它位置相关的其它盒子不想受到这个浮动元素带来的影响,就可以选择清除浮动。

影响1:在下图中蓝盒子由于红盒子浮动,出现在红盒子的下方,让蓝盒子清除浮动后,蓝盒子会认为红色没有浮动,所以按照标准排列,放在红盒子下方第二行。代码如下:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <style type="text/css">
            .a{
                width:100px;
                height:100px;
                background-color:red;
                float:left;
            }
            .b{
                width:150px;
                height:150px;
                background-color:blue;
                clear:left;
            }
        </style>
    </head>
    <body>
        <div class="a"></div>
        <div class="b"></div>
    </body>
</html>

影响2:当我们不写父元素的高度,想让子元素撑开父元素时,自动计算高度时,如果父元素里的子盒子全部浮动,那么子盒子就不在占用父元素里的位置,最后导致父元素的高度为 0 缩起来,父元素后面的标准流盒子会跟着向上移动。如图,红色线为父元素的边框,由于高度是0,所以边框合在了一起,黄色子盒子正在浮动,黑色是父元素下方的标准流盒子,已经紧挨父元素上来了。

解决方案 :额外标签法

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <style type="text/css">
            .father {
                width: 300px;
                /*没有设置高度,以最后一个子元素的位置来决定里面高度*/
                background-color: deepskyblue;
            }

            .son {
                width: 100px;
                height: 100px;
                background-color: yellow;
                float: left;
            }
            /*这个额外添加的标签没有大小不占空间,但是会清除浮动,所以一定会跟在son的后面*/
            .extra {
                clear: left;
            }
            
            .blackbox {
                height: 150px;
                background-color: black;
            }
        </style>
    </head>
    <body>
        <div class="father">
            <div class="son"></div>
            <!--最后增加的空标签,它的位置决定父元素计算的高度,由于清除浮动所以前面的son会占第一行而它只能在第二行-->
            <!--又因为它作为最后一个子元素本身没有高度,所以父元素计算完它前面的元素高度后就结束了-->
            <div class="extra"></div> 
        </div>
        <div class="blackbox"></div>
    </body>
</html>

属性 取值 描述
clear left / right / both 清除左浮动 / 清除右浮动 / 全部

盒子模型

盒子模型是css布局的基石,它规定了网页元素如何显示以及元素间的相互关系。css定义所有的元素都可以拥有像盒子一样的外形和平面空间,即都包含边框、内边距、外边距、内容,这就是盒模型。

属性 取值 描述
padding 1/2/3/4个数字 同时设置4个方向内边距,根据取值的数量,分别对应写法:
4周 --- 上下 | 左右 --- 上 | 左右 | 下 --- 上 | 右 | 下 | 左
padding-left / right / top / bottom 像素 单独设置一个方向内边距
margin 1/2/3/4个数字 同时设置4个方向外边距,根据取值的数量,分别对应写法:
4周 --- 上下 | 左右 --- 上 | 左右 | 下 --- 上 | 右 | 下 | 左
margin-left / right / top / bottom 像素 单独设置一个方向外边距
border 1px solid black 同时设置4个方向边框的粗细、样式、颜色,更多样式请参考:边框特性
border-left / right / top / bottom 1px solid black 单独设置一个方向的边框
box-sizing content-box
border-box
标准盒 content-box 宽高是内容空间,不计算内边距和边框;
怪异盒 border-box 宽高是最终大小,计算完内边距和边框的

内边距特性

内边距是 content 内容与 border 边框之间的距离,它的本质是通过在盒子外增加空间实现的,会改变盒子最终的大小!

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <style type="text/css">
            div{
                width: 100px;
                height: 100px;
                padding: 50px;
                background-color: deepskyblue;
            }
        </style>
    </head>
    <body>
        <div>我是里面的文字部分</div>
    </body>
</html>

可以看到原来100px边长的盒子,增加了一圈50px内边距后,边长已经变为200px !


边框特性

边框与内边距一样,同样是在盒子外增加一圈线,也会改变盒子的大小!

属性 取值 描述
border-style solid 实线
border-style dashed 虚线
border-style dotted 点状线
border-style double 双实线
border-radius 像素 边框圆角弧度


外边距特性

外边距可以看作是盒子外的一圈空气墙,虽然不改变盒子的大小,但它和盒子绑定在一起是需要占用实际空间的,也就是说假如盒子边长50px,左右外边距10px,那么盒子的width就是70px,而剩余空间宽度是 60px 的话,这个盒子是放不进去的!

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <style type="text/css">
            .box {
                width: 200px;
                height: 150px;
                background-color: yellow;
            }
            .box div {
                width: 50px;
                height: 50px;
                background-color: red;
                float: left;
                margin: 10px;
            }
        </style>
    </head>
    <body>
        <div class="box">
            <div></div>
            <div></div>
            <div></div>
        </div>
    </body>
</html>

浮动带给外边距的影响

<!-- 外边距在默认状态下,取的是两者中的最大值-->
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <style type="text/css">
            .a {
                width: 100px;
                height: 100px;
                background-color: red;
                margin-bottom: 50px;
            }

            .b {
                width: 100px;
                height: 100px;
                background-color: blue;
                margin-top: 100px;
            }
        </style>
    </head>
    <body>
        <div class="a"></div>
        <div class="b"></div>
    </body>
</html>

<!-- 如果元素浮动了,那么外边距取两者之和-->
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <style type="text/css">
            .a {
                width: 100px;
                height: 100px;
                background-color: red;
                float: left;
                margin-right: 50px;
            }

            .b {
                width: 100px;
                height: 100px;
                background-color: blue;
                float: left;
                margin-left: 100px;
            }
        </style>
    </head>
    <body>
        <div class="a"></div>
        <div class="b"></div>
    </body>
</html>


网页初始化

网页中的 body 元素默认是带一圈 8px 的外边距,会让我们写的任何元素都无法贴紧浏览器窗口。

image-20221118205905763

而且不少网页元素都是有默认内外边距的,比如:p h1 ul 我们利用 * 通配符选择器取消所有元素初始边距!

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <style type="text/css">
            * {
                margin: 0px;
                padding: 0px;
            }
        </style>
    </head>
    <body>
    </body>
</html>

盒子水平居中

目前的学习中,盒子只能水平居中,因为在网页默认设置中,如果 margin-topmargin-bottom 设置为 auto,则会自动被计算为0px,所以无法垂直居中。后面会开专题解决此问题!留坑~

<style type="text/css">
    div {
        width: 100px;
        height: 100px;
        background-color: yellow;
        margin: 0px auto;
        /* 上下为0px  左右auto自动计算 */
    }
</style>

嵌套盒子中的外边距BUG

在元素嵌套中,如果子元素想利用 margin-top 向下移动,那么会触发外边距合并的BUG,导致子元素和父元素同时向下
正确效果: 触发BUG后的效果:

<!--错误示范!!!-->
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <style type="text/css">
            .father {
                width: 200px;
                height: 200px;
                background-color: yellow;
            }

            .son {
                width: 100px;
                height: 100px;
                background-color: red;
                margin-top: 50px;		/* 问题在这!问题在这!问题在这!*/
            }
        </style>
    </head>
    <body>
        <div class="father">
            <div class="son"></div>
        </div>
    </body>
</html>

解决方案一

既然子元素的 margin-top 不能用,还可以对父元素设置 padding-top 但是要注意内边距的特性,会让父盒子上方增加高度,如果想维持父盒子的最终大小不变,需要从父盒子的原有高度中减去增加的 padding-top , 代码如下:

<style type="text/css">
    .father{
        width: 200px;
        height: 150px;  		/* 200px - 50px = 150px */
        background-color: yellow;
        padding-top: 50px;
    }
    .son{
        width: 100px;
        height: 100px;
        background-color: red;
    }
</style>

解决方案二

给父元素增加上边框 border-top ,但是要注意边框和内边距一样,会让父盒子上方增加高度,如果想维持父盒子的最终大小不变,需要从父盒子的原有高度中减去增加的 border-top ,代码如下:

<style type="text/css">
    .father{
        width: 200px;
        height: 199px;				/* 200px - 1px = 199px */
        background-color: yellow;
        border-top: 1px solid yellow;		/* 增加的上边框也会增大盒子高度 */
    }
    .son{
        width: 100px;
        height: 100px;
        background-color: red;
        margin-top: 50px;		/* 此时会从父元素上边框开始计算50px就不会让父元素向下移动 */
    }
</style>

解决方案三

让子元素浮动,有可能导致父元素高度丢失,解决方案点击此处,代码如下:

<style type="text/css">
    .father{
        width: 200px;
        height: 200px;
        background-color: yellow;
    }
    .son{
        width: 100px;
        height: 100px;
        background-color: red;
        float: left;		/*浮动后不占空间,父元素如果没有设置高度会出问题*/
        margin-top: 50px;
    }
</style>

定位

1.为什么使用定位

场景1:某个元素可以自由的在一个盒子内移动位置,并且压住其他盒子.

场景2:当我们滚动窗口的时候,盒子是固定屏幕某个位置的。

定位也是用来布局的,它由两部分组成:

定位 = 定位模式 position + 偏移 (left right top bottom)

定位模式 用于指定一个元素在文档中的定位方式。偏移则决定了该元素的最终位置。

属性 取值 描述
position static (默认) 静态定位,相当于无定位,元素框正常生成
position relative 相对定位,元素原本所占的空间仍保留
position absolute 绝对定位,元素框从标准文档流完全删除,并相对于其父元素定位
position fixed 固定定位,让元素不随网页的滚动而移动,像小广告一样固定在浏览器中
position sticky 粘性定位,css3新属性,随页面滚动后实现吸附效果
left 数字 设置和左边界的距离
right 数字 设置和右边界的距离
top 数字 设置和上边界的距离
bottom 数字 设置和下边界的距离
z-index 整数 设置显示优先级,谁的值大网页就优先显示谁

相对定位 relative

相对定位的特点:(务必记住)

1.偏移参考对象是自身原来所在的位置

2.移动后原来的位置空间仍然是保留的,不允许后面的元素补上来。因此,相对定位没有脱离网页!

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>Document</title>
        <style>
            div {
                width: 100px;
                height: 100px;
            }

            .box1 {
                background: red;
            }

            .box2 {
                background: blue;
                position: relative;
                left: 80px;
                top: 120px;
            }
        </style>
    </head>
    <body>
        <div class="box1"></div>
        <div class="box2"></div>
        <div class="box1"></div>
    </body>
</html>

绝对定位 absolute

绝对定位的特点:(务必记住)

1.完全脱离网页标准流 (相比于浮动更加完全,浮动是盖不住文字的,而绝对定位会直接遮住下面的文字)

2.当父元素没有定位时,偏移的参考对象是浏览器窗口的第一屏四周边界

3.当父元素相对定位时,偏移的参考对象是==父元素的边界==
定位口诀 —— “子绝父相”—— 子元素是绝对定位的话,父元素要用相对定位

疑问:为什么在布局时,子元素使用绝对定位时,父元素就要用相对定位?为什么不也用绝对定位呢?

观察下图,思考一下在布局时,左右两个方向的箭头图片 以及 父盒子 的定位方式。


固定定位 fixed

固定定位的特点:(务必记住)

1.完全脱离文档流

2.不跟随页面的滚动条一起移动,经常用作页面中的导航栏或广告

3.固定位置的参考对象是浏览器窗口


粘性定位 sticky

粘性定位的特点:

1.吸附位置的参考对象是浏览器窗口

2.必须添加 top 、bottom 、left 、right 其中一个才有效果

3.粘性定位像相对定位一样,不脱离文档流,吸附后仍然占有原先位置

4.兼容性较差 IE 不支持

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Document</title>
        <style>
            * {
                margin: 0;
                padding: 0;
            }

            .header {
                background: yellow;
                width: 100%;
                height: 200px;
            }

            .nav {
                background: red;
                width: 500px;
                height: 100px;
                margin: 0 auto;
                position: sticky;
                /* 粘性定位到某一位置 */
                top: 0px;
            }

            .footer {
                height: 2000px;
                background: green;
            }
        </style>
    </head>
    <body>
        <div class="header"></div>``
        <div class="nav"></div>
        <div class="footer"></div>
    </body>
</html>

过渡动画

transition 允许监控的css属性值在一定时间内平滑的过渡变换,这种效果可以在鼠标改变元素状态时触发,以过渡动画的效果逐渐改变这些css属性值。

属性 取值 描述
transition-property 任意单一属性或all 需要增加过渡动画的css属性
transition-duration X s 动画持续时间
transition-delay X s 动画发生前延迟时间
transition-timing-function linear (匀速) 动画类型,见下图
transition 复合属性 属性 持续时间 延迟时间 动画类型

<!--实操案例-->
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style type="text/css">
            div{
                width: 100px;
                height: 100px;
                background-color: yellow;
                transition: all 2s 0.5s linear;
            }
            /* 鼠标悬停在div上时触发宽、高和背景色的变化 */
            div:hover{
                width: 200px;
                height: 200px;
                background-color: red;
            }
        </style>
    </head>
    <body>
        <div></div>
    </body>
</html>

关键帧动画

animation 动画可以设置多个时间节点来精确控制一组动画的变换,相比较过渡动画,本身是自动运行的不需要触发条件。

属性 取值 描述
animatiion-name @keyframes的名字 (必要) 动画名称
animatiion-duration X s (必要) 动画时间
animatiion-delay X s 延迟时间
animatiion-timing-function linear (匀速) / ease (默认) 动画类型
animatiion-iteration-count 整数 / inifinite(无限) 循环次数
animatiion-direction normal 正常 / reverse 反向
alternate 交替 / alternate-reverse 反向交替
运动方向
animatiion-play-state running 播放 / paused 暂停 播放状态
animatiion-fill-mode none(默认) 动画执行之前和之后不会应用动画中的任何一帧
backwards 动画在延迟等待时应用第一帧画面
forwards 动画在结束后维持最后一帧画面
both 二者兼顾
animation 复合属性,除了play-state都可以写

animation-fill-mode 属性规定当动画未播放时元素显示的样式。
(动画不播放有两种情形:当动画完成后不播放时 或当 动画有设置延迟时间未开始播放时)

使用方式:

@keyframes 动画名称{
    from{}    /*动画开始*/
    to{}      /*动画结束*/
}

制作动画时我们需要关注的只有两点,1.是发生的变化 2.是每个变化之间所用的时间百分比

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <style type="text/css">
            div{
                width: 100px;
                height: 100px;
                background-color: black;
                animation: abc 4s;    /* 动画总时间4s */
            }
            /* 动画刚开始由红色变为绿色耗时25%:1s,
               由绿色变黄色耗时50%:2s,
               由黄色变蓝色耗时25%:1s,
               动画结束由蓝色 瞬间变为 默认黑色 */
            @keyframes abc{
                0%{background-color: red;}	/*可以用from代替*/
                25%{background-color: green;}
                75%{background-color: yellow;}
                100%{background-color: blue;}	/*可以用to代替*/ 
            }
        </style>
    </head>
    <body>
        <div></div>
    </body>
</html>

案例1:轮播图

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <style type="text/css">
            * {
                margin: 0px;
                padding: 0px;
            }

            .show {
                width: 600px;
                height: 336px;
                border: 5px solid black;
                border-radius: 10px;
                margin: 100px auto;
                overflow: hidden;
            }
            /* 让所有图片横向排列 */
            img {
                display: block;
                width: 600px;
                height: 336px;
                float: left;
            }
            /* 装图片的超长盒子向左平移 */
            .film {
                width: 9999px;
                height: 336px;
                animation: abc 8s linear infinite;
            }
            /* 鼠标悬停轮播图区域暂停动画 */
            .show:hover .film {
                animation-play-state: paused;
            }
		   /* 每张图片经历播放和切换两个过程,动画时长10s 
            20%:2s的时间位置不变用来观看,5%:0.5s的时间平移切换下一张 */	
            @keyframes abc {
                0% {
                    transform: translateX(0px);
                }

                20% {
                    transform: translateX(0px);
                }

                25% {
                    transform: translateX(-600px);
                }

                45% {
                    transform: translateX(-600px);
                }

                50% {
                    transform: translateX(-1200px);
                }

                70% {
                    transform: translateX(-1200px);
                }

                75% {
                    transform: translateX(-1800px);
                }

                95% {
                    transform: translateX(-1800px);
                }

                100% {
                    transform: translateX(-2400px);
                }
            }
        </style>
    </head>
    <body>
        <!-- 轮播图展示框 -->
        <div class="show">
            <!-- 胶卷 -->
            <div class="film">
                <img src="code/img/1.jpg">
                <img src="code/img/2.jpg">
                <img src="code/img/3.jpg">
                <img src="code/img/4.jpg">
                <!--重复的图片是为了两次动画切换之间的衔接没有闪烁-->
                <img src="code/img/1.jpg">    
            </div>
        </div>
    </body>
</html>

案例2:逐帧动画

需要在 animation属性中添加值 steps(n,[end|start] )
n 表示每次变化时使用的帧数,帧数越多画面越平滑; 但是需要选择动画的哪一帧看不到,
end 表示看不到动画的最后一个画面,start 表示看不到动画的第一个画面,比如下图中,steps(3,end)
代表两次变化之间用 50%:1.5s 切换3个画面,但是最后的绿色看不到,黄色→绿色只经过了2个画面,最后一帧消失了

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <style type="text/css">
            * {
                margin: 0px;
                padding: 0px;
            }
            
            div {
                width: 200px;
                height: 300px;
                background: black;
                animation: abc 3s steps(3, end) infinite;
            }
            
            @keyframes abc {
                0% {
                    background-color: red;
                }
                50% {
                    background-color: yellow;
                }
                100% {
                    background-color: green;
                }
            }
        </style>
    </head>
    <body>
        <div></div>
    </body>
</html>


<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <style type="text/css">
            * {
                margin: 0px;
                padding: 0px;
            }

            div {
                width: 200px;
                height: 300px;
                background: url(code/charector.png);    /*精灵图:由7个小图组成,每个小图180px*/
                animation: abc 1s steps(7, end) infinite;    /*从0平移到-1260均分7步,那么每个移动的画面就是瞬移180px */
            }
            /* 本来从第1张开始想看到最后1张只需要向左平移-1080px,由于最后一帧看不到,所以要把背景再向左平移180px*/
            /* 此时动画结束的最后一帧就是右边背景图(平铺)的第1张,而下次动画也从第1张开始,就正好衔接上了 */
            @keyframes abc {
                0% {
                    background-position: 0px;
                }
                100% {
                    background-position: -1260px;
                }
            }
        </style>
    </head>
    <body>
        <div></div>
    </body>
</html>


2D变换

transform可以实现元素的位移、旋转、缩放等效果。

平移

相比于 margin 和 position,使用 translate 不会影响其它元素的位置,而且浏览器不会重新加载,所以效率和实用性非常高。

<style>
    div {
        width: 200px;
        height: 200px;
        background-color: red;
        transition: all 2s;
    }
    div:hover {
        transform: translate(100px, 100px);    /* 沿着x、y轴进行平移 左上为负,右下为正 */
    }
</style>

旋转

<style>
    div {
        width: 200px;
        height: 200px;
        background-color: red;
        transition: all 2s;
    }
    div:hover {
        transform: rotateZ(90deg);    /* 围绕Z轴旋转顺时针为正逆时针为负,deg是角度,Z轴垂直于电脑屏幕 */
    }
</style>

<style>
    div {
        width: 200px;
        height: 200px;
        background-color: red;
        transition: all 2s;
    }
    div:hover {
        transform: rotateZ(90deg);   
        transform-origin: right bottom;    /* 改变旋转中心 */
    }
</style>

缩放

<style>
    div {
        width: 200px;
        height: 200px;
        background-color: red;
        transition: all 2s;
    }
    div:hover {
        transform: scale(1.5,1.5);    /* 把x轴、y轴放大1.5倍 如果为负数会颠倒*/
    }
</style>

复合效果

<style>
    div {
        width: 200px;
        height: 200px;
        background-color: red;
        margin: 100px;
        transition: all 2s;
    }
    div:hover {
        transform: translate(100px,100px) rotate(90deg) scale(-1);
    }
</style>

3D变换

/* 3d平移就是沿着Z轴向眼睛平移,但是Z轴垂直于屏幕所以看不到效果,需要结合景深或者旋转观察 */
transform: translateZ(100px);
/* 景深:实现远小近大的效果,这条属性需要写给被平移元素的父盒子上,代表默认距离眼睛1000px,离眼睛越近越大 */
perspective: 1000px;


/* 3d旋转就是围绕x轴或y轴旋转 */
transform: rotateX(360deg);
transform: rotateY(360deg);


/* 3d缩放就是在Z轴上缩放,但是单独使用没有效果 */
transform: scaleZ(5) rotateX(45deg);


案例:旋转骰子

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <style type="text/css">
            * {
                margin: 0px;
                padding: 0px;
            }

            .box {
                width: 500px;
                height: 600px;
                border: 5px solid gray;
                margin: 100px auto;
                transform-style: preserve-3d;
                position: relative;
                animation: dr 5s linear infinite alternate;
            }

            .box div {
                width: 300px;
                height: 300px;
                margin: -150px;
                position: absolute;
                left: 50%;
                top: 50%;
                opacity: 0.9;
            }

            p {
                font-size: 30px;
                text-align: center;
                height: 100px;
                line-height: 100px;
                word-spacing: 50px;
            }

            .box div:nth-child(1) {
                background-color: red;
                transform: translateZ(150px);
            }

            .box div:nth-child(2) {
                background-color: orange;
                transform: translateX(-150px) rotateY(-90deg);
            }

            .box div:nth-child(3) {
                background-color: yellow;
                transform: translateY(-150px) rotateX(90deg);
            }

            .box div:nth-child(4) {
                background-color: green;
                transform: translateY(150px) rotateX(-90deg);
            }

            .box div:nth-child(5) {
                background-color: cyan;
                transform: translateX(150px) rotateY(90deg);
            }

            .box div:nth-child(6) {
                background-color: blue;
                transform: translateZ(-150px) rotateY(180deg);
            }

            @keyframes dr {
                from {
                    transform: rotateX(0deg) rotateY(0deg);
                }

                to {
                    transform: rotateX(360deg) rotateY(180deg)
                }
            }
        </style>
    </head>
    <body>
        <div class="box">
            <div>
                <p></p>
                <p>&#9899;</p>
                <p></p>
            </div>
            <div>
                <p></p>
                <p>&#9899; &#9899;</p>
                <p></p>
            </div>
            <div>
                <p>&#9899;</p>
                <p>&#9899;</p>
                <p>&#9899;</p>
            </div>
            <div>
                <p>&#9899; &#9899;</p>
                <p></p>
                <p>&#9899; &#9899;</p>
            </div>
            <div>
                <p>&#9899; &#9899;</p>
                <p>&#9899;</p>
                <p>&#9899; &#9899;</p>
            </div>
            <div>
                <p>&#9899; &#9899;</p>
                <p>&#9899; &#9899;</p>
                <p>&#9899; &#9899;</p>
            </div>
        </div>
    </body>
</html>

flex弹性布局

优势与对比

传统布局中我们通常使用浮动与定位解决问题


布局原理

采用 flex 属性布局的元素通常为父元素,我们把它叫做 container(容器)。当添加了 flex 属性后,它的子元素会自动变为容器里的 item(项目)。flex 布局给 item 带来的主要影响有以下几点:

  1. 子元素 item 类似于浮动既可以横向排列也可以纵向排列
  2. 行内元素会自动转变为块级元素
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <style type="text/css">
            .box {
                width: 400px;
                height: 100px;
                background-color: yellow;
                /* 只需要给父元素增加此属性就可改变为弹性布局 */
                display: flex;
            }

            .item {
                width: 100px;
                height: 30px;
                background-color: red;
            }
        </style>
    </head>
    <body>
        <div class="box">
            <div class="item">111</div>
            <div class="item">222</div>
            <div class="item">333</div>
        </div>
    </body>
</html>

容器属性

主轴方向

flex 布局中,分为主轴和侧轴两个方向,不同于平常的x轴、y轴,主轴侧轴是可以随时改变的,子元素 item排列顺序总是跟随主轴方向,确定了主轴以后,剩下的另一个方向就是侧轴。在默认情况下,主轴是横向水平向右 , 侧轴是纵向垂直向下。

主轴的方向取值共有4种:

属性 取值 描述
flex-direction row (默认) 水平从左向右
flex-direction column 垂直从上向下
flex-direction row-reverse 水平从右向左
flex-direction column-reverse 垂直从下向上

子元素换行

默认情况下,子元素会在主轴方向上一直排列不会换行,如果放不下了,会自动压缩子元素的宽高,让子元素原来设置的宽高全部失效。换行后在不设置 align-content 的情况下,默认排列方式为:平分侧轴方向上的长度,以每一行为单位,项目在每一行中遵循 align-items 属性。

属性 取值 描述
flex-wrap nowrap (默认) 不换行
flex-wrap wrap 换行

复合属性

flex-flow 同时设置主轴方向 flex-direction 和是否换行 flex-wrap

flex-flow:row wrap;

主轴排列方式

justify-content 设置子元素 item 在主轴上的对齐方式,一定要确定好主轴的方向,不论是哪个方向起点都是 start , 终点都是 end

属性 取值 描述
justify-content flex-start (默认) 从主轴起点开始,与起点对齐
justify-content flex-end 从主轴终点开始,与终点对齐
justify-content center 在主轴方向上居中
justify-content space-between 在主轴方向上两端对齐
justify-content space-around 空白环绕,中间空白大小相等,两侧空白是中间的一半
justify-content space-evenly 空白环绕,每个空白大小相等
/* 弹性布局 */
display: flex;
/* 主轴方向 */
flex-direction: row; 
/* 主轴排列方式 */
justify-content: flex-start;
观察下列图片理解不同的排列方式,主轴方向时,元素的顺序不会有变化,永远是123,如果主轴变为了row-reverse,就是321,
column同理,元素会变成竖着的123,但排列方式是不变的,只不过是纵向去看的,建议动手实战!


侧轴排列方式(单行或单列)

align-items 设置的是在侧轴方向上只有一行或一列元素时,项目的排列方式

属性 取值 描述
align-items flex-start (默认) 在侧轴方向对齐起点
align-items flex-end 在侧轴方向对齐终点
align-items center 在侧轴方向居中
align-items stretch 在不设置 item 大小时默认会拉伸元素撑满侧轴


侧轴排列方式(多行)

align-content 在没有项目换行时是无法生效的,它只能作用于已经换行的所有项目。

属性 取值 描述
align-content flex-start (默认) 从侧轴起点开始,与起点对齐
align-content flex-end 从主轴终点开始,与终点对齐
align-content center 在主轴方向上居中
align-content space-between 在主轴方向上两端对齐
align-content space-around 空白环绕,中间空白大小相等,两侧空白是中间的一半
align-content space-evenly 空白环绕,每个空白大小相等

项目属性


posted @ 2022-12-04 19:24  不尽人意的K  阅读(155)  评论(0编辑  收藏  举报