前端学习-HTML/CSS刷题笔记02
1 外边距折叠
用处:当一个页面包含了多个段落,如果没有外边距折叠,从第二个段落开始,所有段落的间距都是最上方段落的上外边距的两倍,有了外边距折叠,段落间距才会相等。
如何去除外边距折叠:给目标盒子设置以下属性:
- display: inline-block
- float属性值不是"none"的元素
- 绝对定位
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
* {
margin: 0;
padding: 0;
}
.top,
.bottom {
width: 100px;
height: 100px;
margin: 10px;
/* 方法1: */
/* display: inline-block; */
}
.top {
background-color: skyblue;
}
.bottom {
background-color: pink;
/* 方法3: */
/* position: absolute; */
/* 方法2: */
float: left;
}
</style>
</head>
<body>
<!-- 现在给类名为"top"、"bottom"两个盒子都设置宽度、高度且都为"100px"、都设置外边距且都为"10px",可以添加任意颜色便于区分两个盒子。 -->
<section class="top"></section>
<section class="bottom"></section>
<script>
</script>
</body>
</html>
2 浮动
了解浮动
浮动盒子可以向左、右移动,直到它的外边沿接触父级的外边沿或另一个浮动盒子的外边沿。浮动盒子会脱离常规文档流,所以文档流中的元素几乎认为浮动盒子不存在。
现在给"body"标签设置宽度为300px,再给类名为"left"、"center"、"right"的盒子(左、中、右盒子)皆设置宽度、高度且都为100px,三个盒子的颜色可以自定义以便于观测。继续给中间盒子设置"float: left"属性,此时中间盒子已经是一个浮动盒子,不再占据流中的位置空间,右盒子上升到了浮动盒子的区域并且被浮动盒子覆盖住了。现在再给左、右盒子皆设置"float: left"属性,此时三个盒子水平排列在一行上。重设左盒子的宽度、高度皆为120px,可以观察到因为"body"盒子较窄,所以右盒子被迫换行并且因为左盒子的高度超过了中间盒子,右盒子被卡在了中间盒子下方。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
* {
margin: 0;
padding: 0;
}
body {
width: 300px;
height: 300px;
}
.left,
.center,
.right {
width: 100px;
height: 100px;
float: left;
}
.left {
width: 120px;
height: 120px;
background-color: red;
}
.center {
background-color: pink;
}
.right {
background-color: skyblue;
}
</style>
</head>
<body>
<div class="left"></div>
<div class="center"></div>
<div class="right"></div>
</body>
</html>
清除浮动
要点:
- 文本被浮动元素覆盖后,会识别到浮动盒子并且绕开浮动盒子。
- 没有清除浮动时,父级元素的高度不会将浮动元素高度计算进去
- 使用clear来清除浮动
- 清除浮动后,非浮动元素位置会发生变化
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
* {
margin: 0;
padding: 0;
}
.media {
width: 100px;
height: 100px;
float: left;
background-color: skyblue;
}
.clear-left {
clear: left;
}
</style>
</head>
<body>
<section>
<div class="media"></div>
<p>hello</p>
<p class="clear-left">universe</p>
</section>
</body>
</html>
3 定位
static
在流中的元素定位属性值默认都为"static",即没有定位。
此时元素会忽略"top"、"bottom"、"left"、"right"和"z-index"定位属性。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
* {
margin: 0;
padding: 0;
}
section {
width: 100px;
height: 100px;
background-color: black;
/* 以下语句无效 */
left: 10px;
}
</style>
</head>
<body>
<section></section>
</body>
</html>
inherit
要点:
- 子元素设置position:inherit属性时,继承父元素的定位position属性
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
* {
margin: 0;
padding: 0;
}
.outer {
width: 100px;
height: 100px;
background-color: black;
/* left: 10px; */
position: relative;
}
.inner {
width: 80px;
height: 80px;
background-color: red;
position: inherit;
left: 10px;
}
</style>
</head>
<body>
<section class="outer">
<section class="inner">
</section>
</section>
</body>
</html>
absolute
要点:
- position:absolute; 绝对定位元素默认位置为当前绝对定位盒子在流中的位置(也就是,元素会从流中出来,但位置还是不变,可能会覆盖后面的元素)
- 绝对定位元素的父级是距离该元素最近的定位祖先,也就是"position"属性不为"static"的最近任意祖先。如果没有这个定位祖先,那么绝对定位元素就相对于文档的根元素"html"进行定位。
<!DOCTYPE html>
<html>
<head>
<meta charset=utf-8>
<style type="text/css">
* {
margin: 0;
padding: 0;
}
.outer,
.middle,
.inner {
width: 100px;
height: 100px;
padding-left: 10px;
}
.outer {
background-color: greenyellow;
}
.middle {
background-color: skyblue;
position: absolute;
}
.inner {
background-color: pink;
position: absolute;
left: 0;
}
</style>
</head>
<body>
<div class="outer">
<div class="middle">
<div class="inner">
</div>
</div>
</div>
</body>
</html>
z-index
决定元素的堆叠顺序,拥有更高堆叠顺序的元素总是会处于堆叠顺序较低的元素的上面。
z-index可以设置为负数,且该属性只能作用于定位元素。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
* {
margin: 0;
padding: 0;
}
img {
position: absolute;
left: 0;
top: 0;
z-index: -1;
}
</style>
</head>
<body>
<h1>The countdown to Christmas starts here.</h1>
<img src="https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fuploads.xuexila.com%2Fallimg%2F1912%2F1135-191202143454.jpg&refer=http%3A%2F%2Fuploads.xuexila.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1639984107&t=eca951193e736a17eb96278117bcfb1f" width="100">
<p>由于图像的 z-index 是 -1,因此它在文本的后面出现。</p>
</body>
</html>
relative
要点:
- 相对定位元素,不会从流中出来
- 通过"top"、"right"、"bottom"和"left"属性使元素相对于初始位置进行移动
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
* {
margin: 0;
padding: 0;
}
.left {
width: 100px;
height: 100px;
background-color: black;
}
.center {
width: 100px;
height: 100px;
background-color: pink;
position: relative;
left: 50px;
top: 50px;
}
.right {
width: 100px;
height: 100px;
background-color: greenyellow;
}
</style>
</head>
<body>
<div class="left"></div>
<div class="center"></div>
<div class="right"></div>
</body>
</html>
fixed
要点:
- 衍生于absolute,但absolute父级是上一个非static的祖先冤死,fixed的父级是视口
- 固定定位可以用来创建始终停留在窗口相同位置的元素。比如:固定侧栏、固定顶栏等
- 固定定位也不在流中,要注意是否有遮挡其他元素
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
* {
margin: 0;
padding: 0;
}
nav {
position: fixed;
width: 200px;
background-color: pink;
top: 0;
}
section {
margin-top: 1rem;
}
</style>
</head>
<body>
<nav><br /></nav>
<section>1<br />2<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /></section>
</body>
</html>
flex
要点:
-
Flexbox,也就是Flexible Box Layout模块,是CSS提供的用于布局的一套新属性
-
包含针对容器、容器直接子元素(弹性项)的两类属性
给容器的属性 -
属性flex-direction: row; 默认为row:水平排列,并且根据各自的内容宽度进行了收缩
-
属性justify-content: flex-start;默认为flex-start;修改为justify-content: center后:
-
辅轴(与主轴对应的另一方向的轴)(flex-direction: row;下主轴为水平)
-
控制辅轴对齐方式的"align-items"属性默认为"stretch"即拉伸,会占满"ul"的所有高度空间;修改为align-items: center:
<!DOCTYPE html>
<html>
<head>
<meta charset=utf-8>
<style type="text/css">
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
nav ul {
height: 2rem;
list-style: none;
display: flex;
justify-content: center;
align-items: center;
}
nav ul li {
border: 1px solid black;
}
nav ul li:first-child {
font-size: 1.2rem;
}
</style>
</head>
<body>
<nav>
<ul>
<li>home</li>
<li>spaceships</li>
<li>planets</li>
<li>stars</li>
</ul>
</nav>
</body>
</html>
给弹性项(子元素)的属性
- flex-grow:比如有4个子元素,flex-grow分别设为1,2,3,4,则这4个元素在主轴方向进行拉伸,按照1:2:3:4分配父元素剩余空间
看以下的例子:-
主轴为column,父元素高度300px
-
box1,box2,box3,box4原高度约19px
-
给box1,box2,box3,box4的flex-grow分别设置1,2,3,4,4个元素按照1:2:3:4分配父元素剩余高度300px-4*19px
-
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
#content {
display: flex;
height: 300px;
flex-flow: column;
align-items: stretch;
}
.box1 {
flex-grow: 1;
}
.box2 {
flex-grow: 2;
}
.box3 {
flex-grow: 3;
}
.box4 {
flex-grow: 4;
}
</style>
</head>
<body>
<div id="content">
<div class="box1" style="background-color:red;">A</div>
<div class="box2" style="background-color:lightblue;">B</div>
<div class="box3" style="background-color:yellow;">C</div>
<div class="box4" style="background-color:brown;">D</div>
</div>
</body>
</html>
- flex-shrink:和flex-grow相同原理,但分配的是溢出的空间
- 以下例子水平方向溢出200px,按1:2:3:4分配后,分别为80px,60px,40px,20px
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
#content {
display: flex;
width: 200px;
flex-flow: row;
align-items: stretch;
}
.box {
width: 100px;
}
.box1 {
flex-shrink: 1;
}
.box2 {
flex-shrink: 2;
}
.box3 {
flex-shrink: 3;
}
.box4 {
flex-shrink: 4;
}
</style>
</head>
<body>
<div id="content">
<div class="box box1" style="background-color:red;">A</div>
<div class="box box2" style="background-color:lightblue;">B</div>
<div class="box box3" style="background-color:yellow;">C</div>
<div class="box box4" style="background-color:brown;">D</div>
</div>
</body>
</html>
- flex-basis
- 相当于设置子元素在主轴方向上的长度(如果flex-flow: column;设置高度;如果flex-flow: row;设置宽度)
- 和height、width的区别:优先级高于height、width;如果设置的flex-basis的值不为auto,那么height/width设置什么值都无效
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
#content {
display: flex;
width: 200px;
/* height: 200px; */
flex-flow: row;
align-items: stretch;
}
.box {
width: 100px;
flex-basis: 100px;
}
.box1 {
flex-shrink: 1;
}
.box2 {
flex-shrink: 2;
}
.box3 {
flex-shrink: 3;
}
.box4 {
flex-shrink: 4;
}
</style>
</head>
<body>
<div id="content">
<div class="box box1" style="background-color:red;">A</div>
<div class="box box2" style="background-color:lightblue;">B</div>
<div class="box box3" style="background-color:yellow;">C</div>
<div class="box box4" style="background-color:brown;">D</div>
</div>
</body>
</html>
优化布局方式
- 缩放布局混乱:给父元素添加display: flex;和flex-wrap: wrap;变为弹性盒子、换行
- 设置宽度,防止每行宽度不同:给弹性项添加flex: 1 0 auto;
- 防止某个元素由于缩放宽度变为整行:max-width: 10rem;
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
* {
margin: 0;
padding: 0;
font-size: 12px;
box-sizing: border-box;
}
nav ul {
padding: 0.5rem;
list-style: none;
display: flex;
flex-wrap: wrap;
}
nav ul li {
/* display: inline-block; */
margin: 0.2rem;
flex: 1 0 auto;
max-width: 10rem;
}
nav ul li a {
position: relative;
display: block;
padding: 0.2rem 0.6rem;
color: white;
line-height: 1rem;
background-color: black;
border-radius: 0.2rem;
text-decoration: none;
text-align: center;
}
nav ul li a:before {
position: absolute;
content: '';
width: 0;
height: 0;
border: 0.7rem solid transparent;
border-right-width: 0.7rem;
border-right-color: black;
left: -1.2rem;
top: 0;
}
</style>
</head>
<body>
<nav>
<ul>
<li><a href="">Fillithar</a></li>
<li><a href="">Berzite</a></li>
<li><a href="">Galidraan</a></li>
<li><a href="">Gravlex Med</a></li>
<li><a href="">Cato Neimoidia</a></li>
<li><a href="">Coruscant</a></li>
<li><a href="">Dantooine</a></li>
<li><a href="">Dhandu</a></li>
<li><a href="">Iktotchon</a></li>
<li><a href="">Hosnian Prime</a></li>
<li><a href="">Harkrova I</a></li>
<li><a href="">Livno III</a></li>
<li><a href="">Karfeddion</a></li>
<li><a href="">Eriadu</a></li>
<li><a href="">Jestefad</a></li>
<li><a href="">Iridonia</a></li>
<li><a href="">Malachor</a></li>
<li><a href="">Gan Moradir</a></li>
<li><a href="">Kethmandi</a></li>
<li><a href="">Mirrin Prime</a></li>
<li><a href="">Ezaraa</a></li>
<li><a href="">Muunilinst</a></li>
<li><a href="">Itapi Prime</a></li>
<li><a href="">Nam Chorios</a></li>
</ul>
</nav>
</body>
</html>
其他
- order:给弹性项设置order值,可以完全摆脱项目在源码中顺序的约束;默认值为0
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
section {
display: flex;
flex-direction: column;
text-align: center;
}
section img {
order: -1;
}
</style>
</head>
<body>
<section>
<h2>countdown</h2>
<img src="https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fuploads.xuexila.com%2Fallimg%2F1912%2F1135-191202143454.jpg&refer=http%3A%2F%2Fuploads.xuexila.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1639984107&t=eca951193e736a17eb96278117bcfb1f" width="100%">
<article>The countdown to Christmas starts here.</article>
<p><a href="#">more</a></p>
</section>
</body>
</html>
grid
要点:
- grid-template-rows: 300px 300px 300px; 这句设置了3行的网格高度均为300px;简便写法为grid-template-rows: repeat(3,300px);
- grid-template-columns: 200px 1fr 2fr; 这句第一个网格宽度为200px,后面剩余的宽度分为两部分,宽度分别为剩余宽度的 1/3 和 2/3;
- grid-gap: 10px 5px; 第一个值为行间距,第二个值为列间距
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
section {
width: 500px;
text-align: center;
display: grid;
/* grid-template-columns: ; */
grid-template-rows: 100px;
grid-template-columns: repeat(2, 1fr);
grid-gap: 10px;
}
article {
height: 100px;
border: 1px solid black;
}
</style>
</head>
<body>
<section>
<article>1</article>
<article>2</article>
<article>3</article>
<article>4</article>
<article>5</article>
<article>6</article>
<article>7</article>
<article>8</article>
<article>9</article>
</section>
</body>
</html>
- grid-template-areas:属性用于定义区域;
- grid-template-areas: 'a b c''d e f''g h i'; 相当于为9个区域命名;用于父元素
- 配合grid-area: e;使用;用于子元素(网格项),可修改元素的位置
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
section {
text-align: center;
display: grid;
grid-template-rows: repeat(3,100px);
grid-template-columns: repeat(3,100px);
grid-template-areas: 'a b c''d e f''g h i';
}
article {
height: 100px;
border: 1px solid black;
}
section article:first-child {
grid-area: e;
}
</style>
</head>
<body>
<section>
<article>1</article>
<article>2</article>
<article>3</article>
<article>4</article>
<article>5</article>
<article>6</article>
<article>7</article>
<article>8</article>
<article>9</article>
</section>
</body>
</html>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!