title: CSS03Layout
date: 2022-01-22 00:09:16
tags: Layout 布局
布局(Layout)
文档流(normal flow)
-
网页是一个多层的结构,一层落着一层
-
通过CSS可以为每一层来设置样式,作为用户来讲只能看到最顶上的一层
-
最底下的一层我们称为文档流,文档流是网页的基础
- 我们所创建的元素默认都是在文档流中进行排列
-
对于我们来说,元素主要有两个状态,在文档流中和脱离文档流
元素在文档流中的特点
块元素
块元素在页面中独占一行,自上向下垂直排列
默认宽度是父元素的全部,会把父元素填满。
默认高度被子元素撑开
.box1{
background-color:red;
}
<div class="box1">我是div1</div>
行内元素
行内元素不会独占一行,只占自身大小,自左向右水平排列
如果一行之中不能容下所有的行内元素,元素会换到第二行继续自左向右排列,和人类书写习惯一致。
行内元素的默认长度和宽度都是被内容撑开
盒模型(box model)
CSS将页面的所有元素都设置成了一个矩形的盒子。
对网页的布局等同于将不同的盒子摆放到不同的位置,即可完成对网页的布局。
盒子组成部分
- 内容区(content)
- 内边距(padding):内容区和边框之间的距离
- 边框(border)
内容区+内边距+边框->盒子大小
- 外边距(margin):两个盒子之间的距离
外边距->盒子位置
内容区(content)
内容区:元素中的所有子元素和文本内容都在内容区中排列,内容区的大小由width和height来设置
width: 200px;
height: 200px;
background-color: rosybrown;
边框(border)
边框属于盒子的边缘,边框里面属于盒子内部,出了边框都是盒子的外部
设置边框最少设置三个样式
边框宽度:border-width
边框颜色:border-color
边框样式:border-style
边框大小会影响到盒子的大小
border-width:10px;
border-color:royalblue;
border-style:solid;
border-width
border-width可以省略不写,因为有一个默认值是3px
border-width可以用来指定四个方向的像素
如果写四个值,则顺序为上右下左
如果写三个值,则顺序为上(左右)下
如果写两个值,则顺序为(上下)(左右)
如果写一个值,则默认都是这个值
border-width:10px 20px 30px
除了border-width,还有一组border-XXX-width,用来单独指定某一个边的宽度
border-top-width
border-bottom-width
border-left-width
border-right-width
border-color
用来指定边框的颜色,规则和border-width一样
border-color也可以省略不写,如果不写,则自动使用color颜色
其实color是前景色,字体颜色和边框都使用前景色
border-style
用来指定边框的样式,规则还是和之前一样
solid:实线
dotted:点状虚线
dashed:线状虚线
double:双线
边框简写属性
border: 10px solid orange;
没有顺序要求
border-XX
border-top
border-bottom
border-left
border-right
内边距(padding)
一共有四个方向的内边距
padding-top
padding-right
padding-bottom
padding-left
内边距的设置会影响到盒子大小
背景颜色会延伸到内边距上
问题是:内容区和内边距的区分不明显->通过写个内容可以区分
还可以这样解决:设置一个inner
<style>
.box1{
background-color: #ffa;
width: 200px;
height: 200px;
border:10px #bcf solid;
padding-top: 10px;
padding-left:10px;
padding-bottom: 10px;
padding-right: 10px;
}
.inner{
/*此时inner占的是内容区的100%*/
background-color: red;
width:100%;
height:100%;
}
</style>
<body>
<div class="box1">
<div class="inner"></div>
</div>
一个盒子可见框的大小是由内容区+边框+内边距共同决定。
padding: 可以同时指定四个方向的大小
外边距(margin)
不会影响盒子可见框的大小但是会影响位置(和其他盒子隔多远),实地占地范围
margin-top:上外边距 元素向下移
margin-right:默认情况下设置margin-right不会产生任何效果
margin-bottom:下外边距 让别的元素向下
margin-left:左外边距 元素向右移
元素在页面中按照自左向右排列,所以默认情况下,如果我们设置的是上和左外边距,元素会移动自己,而设置下和右外边距,元素会移动别人。
margin也可以设置负值,如果是负值,元素会向相反方向移动。
margin:同时设置四个方向外边距
margin会影响到盒子实际占用空间的大小
盒子布局
盒子水平布局
元素水平方向的布局:
元素在其父元素中水平方向的位置由以下几个属性共同决定
margin-left
border-left
padding-left
width
padding-right
border-right
margin-right
过渡约束
一个元素在其父元素中,水平布局必须满足以下的等式
margin-left+border-left+padding-left+width+padding-right+border-right+margin-left=父元素内容区的width
以上等式必须满足,如果相加结果使等式不成立,则成为过渡约束,则等式会自动调整
- 如果值没有auto,则浏览器会自动调整margin-right部分以使等式满足
<style>
.outer{
background-color:green;
width:800px;
height:200px;
border:10px red solid;
}
.inner{
background-color:red;
width:200px;
height:200px;
}
</style>
<div class="outer">
<div class="inner"></div>
</div>
此时margin-left+border-left+padding-left+width+padding-right+border-right+margin-right=0+0+0+200+0+0+0≠800
则会自动调整margin-right=600
- 有三个值可以设置成auto,分别是width margin-left margin-right(其中width的值默认就是auto)
- 如果某个值为auto,会自动调整为auto的那个值以使等式成立
eg.
<style>
.outer{
width: 800px;
height: 200px;
border:10px red solid;
}
.inner{
width:auto;
height:180px;
border:10px blue solid;
background-color: rosybrown;
margin-right:200px;
}
</style>
<body>
<div class=outer> <div class=inner> </div> </div>
</body>
-
如果将一个宽度和一个外边距同时设置为auto,那么这个外边距自动为0
-
如果将三个值都设置为auto,则外边距都是0,宽度最大
-
如果将两个外边距设置为auto,width有值,则两个外边距值相同
- 我们经常用这个特性来设置居中,即指定width一个值,两个外边距auto
width: xxpx
margin: 0 auto;(垂直为0,水平居中)
如果加值超过了,比如设置了width为1000,那么这个时候就会设置margin-right=-200。颜色会超出但是margin-right=-200。再有元素放到该元素左边时,只会和父元素挨到一起,因为子元素实际大小为800。
盒子垂直布局
如果父元素没有设置高度,那么内容区会直接被子元素的高度撑开。
.outer{
background-color: aquamarine;
}
.inner{
background-color: bisque;
height: 200px;
width: 200px;
margin-bottom: 200px;
}
如果父元素设置了高度,溢出了,处理办法:overflow
四个属性:visible,hidden,scroll,auto
.outer{
background-color: aquamarine;
border-color:black;
border-style: solid;
border-width: 20px;
/* 如果inner的高度超过了outer的高度,可以用overflow来调节
overflow 4个属性
visible:能看见
hidden:直接砍掉
scroll:横竖滚轴
auto:设置横竖滚轴,如果不需要横向自动不设置横向滚轴,如果不需要竖向自动不设置竖向滚轴
auto-x:设置横向溢出
auto-y:设置竖向溢出
*/
height:200px;
overflow: auto;
}
.inner{
background-color: bisque;
height: 200px;
width: 200px;
margin-bottom: 200px;
}
<body>
<div class="box1"></div>
<div class="box2"></div>
<div class="box3">
<div class="box4"></div>
</div>
</body>
外边距的折叠
外边距在垂直方向分为兄弟元素折叠和父子元素折叠。兄弟元素折叠是对于编程有利的,不需要处理。父子元素折叠对编程不利,需要处理。具体处理方法之后补充。
/* 相邻的垂直方向外边距会发生折叠
兄弟元素 垂直外边距
-会取两者之间的较大值(两者都是正值)
-特殊情况:如果相邻外边距一正一负,取两者和
两者都为负,取绝对值较大的
兄弟之间的折叠有利于我们开发,所以不需要处理
父子元素 垂直外边距
-父子元素的相邻外边距,子元素的会传递给父元素(上外边距)
*/
.box1{
background-color: aqua;
height: 200px;
width: 200px;
margin-bottom: 10px;
}
.box2{
background-color: aqua;
height: 200px;
width: 200px;
margin-top: 10px;
}
/* 带着父元素一起向下了,这是因为子元素和父元素的外边距重合了。处理办法:1.可以不用外边距 2.将两者的外边距分开 但这都不是最好的处理办法,好的处理办法之后再讲*/
.box3{
background-color: aqua;
height: 200px;
width: 200px;
/*2.将两者的外边距分开*/
/*
height:199px
padding-top:1px;*/
}
.box4{
background-color: blue;
height: 20px;
width: 20px;
margin-top:10px;
/* 1.可以不用外边距*/
/* border-top-width:20px;
border-style:solid;
border-color:rgba(2, 3, 4, 0); */
/*2.将两者的外边距分开*/
/*height:19px*/
}
行内元素盒模型
/* 行内元素不支持设置宽度和高度
行内元素可以设置padding,但是垂直高度的padding不会影响页面的布局
行内元素可以设置设置border,同样,垂直方向的border不会影响垂直方向的布局
行内元素可以设置设置margin,同样,垂直方向的border不会影响垂直方向的布局
*/
/* 超链接的宽高设置,display属性,用来设置元素显示的类型
可选值:
inline 设置成行内元素
block 设置成块元素
inline-block 将元素设置为行内块元素
行内块,可以设置高度和宽度但是又不会独占一行
table 将元素设置为表格
none 元素不在页面中显示
visibility用来显示元素的显示状态
可选值:
visible 不会影响
hidden 内容会没有 但是位置依然会保留
*/
span{
background-color: red;
width:100px;
height: 100px;
display:block;
visibility:hidden;
}
a{
background-color: yellowgreen;
width: 100px;
height: 100px;
padding:100px;
border:100px red solid;
display:block;
}
.box1{
background-color: aqua;
width:600px;
height: 600px;
}
<body>
<span>span1</span>
<span>span2</span>
<a href="javascript:;">超链接</a>
<div class="box1"></div>
</body>
浏览器的默认样式
默认样式:
-浏览器都会为元素设置一些默认样式,以避免没有css的时候,什么都显示不出来
-默认样式的存在会影响页面的布局
通常情况下编写网页的时候必须要去除默认样式,在网页中可以点击f12可以查看各盒子的样子
下面展示了三种方法:
<!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>
/*
3.重置样式表,用的最多
*/
<!-- <link rel="stylesheet" href="./css_reset/reset.css"> -->
<link rel="stylesheet" href="./css_reset/normalize.css">
<!-- 重置样式表,专门用来对浏览器的样式进行重置
reset.css是所有都重置,网址:http://meyerweb.com/eric/tools/css/reset/
normalize.css是对默认样式进行统一,网址:github.com/necolas/normalize.css
-->
<style>
/*
1.手动去除
*/
body{
margin:0px;
}
p{
margin:0px;
}
ul{
margin:0px;
padding:0px;
这个是去除list前面的点的
list-style: none;
}
/*
2.通配去除
但是通常太多标签有默认样式了,我们都不希望他们有padding和margin,所以可以用通配选择器统一设置
但是依旧会有遗漏,所以我们一般采用方法3*/
*{
padding:0;
margin:0;
}
ul{
list-style: none;
}
.box1{
border:1px black solid;
padding:1px;
width:200px;
height:200px;
}
</style>
</head>
<body>
<div class="box1"></div>
<p>文字</p>
<p>文字</p>
<p>文字</p>
<p>文字</p>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
</body>
</html>
盒子尺寸
一般情况下的盒子尺寸是border+padding+content,但可以设置成不一样的
box-sizing 2个属性
1.content-box 默认属性 尺寸是order+padding+content,height和width表示的是content的大小
2.border-box 尺寸是order+padding+content=height或width。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>
<link rel="stylesheet" href="css_reset/reset.css">
<style>
/* 一般情况下的盒子尺寸是border+padding+content,但可以设置成不一样的
box-sizing 2个属性
1.content-box 默认属性 尺寸是order+padding+content,height和width表示的是content的大小
2.border-box 尺寸是order+padding+content=height或width。height和width表示的是整个盒子的大小
*/
.box1{
background-color: antiquewhite;
box-sizing:border-box;
height:200px;
width:200px;
padding:10px;
border:10px red solid;
}
</style>
</head>
<body>
<div class="box1"></div>
</body>
</html>
圆角,阴影,外轮廓
外轮廓:outline
和border的写法一样 outline: 10px red solid; 不同的是,它不会影响布局
阴影:box-shadow
不会影响布局
四个值
第一个值是颜色 第二个值是水平偏移量 第三个值是垂直偏移量 第四个值是羽化半径
圆角:border-radius 指的是角的半径
用法 设置四个角:
border-radius: 20px 30px 40px 50px;
设置单独的角 椭圆 两个值分别是水平半径和垂直半径:
border-top-left-radius: 20px 30px;
设置四个角为椭圆:
border-radius: 20px / 30px;
设置为圆:
border-radius: 50%;
<!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>
.box1{
width:200px;
height:200px;
background-color: bisque;
/* border:10px red solid; */
/* 轮廓 用来设置元素的轮廓线,用法和border一样,就是不会影响到可见框的大小,一般用来设置鼠标移入的时候轮廓变化 */
/* outline:10px red solid; */
/* 阴影 用来设置元素的阴影效果 也不会影响布局 第一个是水平偏移量 正值就往右侧移动 第二个值是垂直偏移量 正值向下 负值向上 第三个值是阴影的模糊半径*/
box-shadow: rgba(0, 0, 0, 0.3) 10px 10px 10px;
/* 设置圆角 设置的是半径大小 border-top-left-redius... */
border-radius: 10px 20px 30px 40px;
/* 设置椭圆圆角 第一个是水平半径 第二个是垂直半径*/
border-top-left-radius: 40px 50px;
/* border-radius设置椭圆 */
border-radius:40px / 50px;
/* 设置圆形 */
border-radius:50%;
}
.box1:hover{
outline:red 10px solid;
}
</style>
</head>
<body>
<div class="box1"></div>
<span>span</span>
</body>
</html>