webveuje/css/定位.md
2021-01-05 09:18:22 +08:00

318 lines
8.2 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 定位
### 文档流
文档流就是HTML文档内所有元素按照一定规律排列并显示的形式。
 CSS文档流大致可以分为3种标准流浮动流定位流。
- 标准流
- 默认情况下HTML元素都在标准流中呈现和展示。我们之前把元素分为块级元素行内元素行内块级元素他们的特性是块级独占一行行内和行内块级可以在一行内共存这些特性都是针对标准流的。总结一下就是标准流中元素只能在水平或垂直方向上排版。如果元素是块级元素, 那么就会垂直排版,如果元素是行内元素/行内块级元素, 那么就会水平排版。
- 浮动流
-  浮动流只有一种排版方式, 就是水平排版。 它只能设置某个元素在父元素内左对齐或者右对齐。设置了浮动的元素,**将脱离标准流**之后它将无视元素的display属性并且都被当做块级元素处理。
- 定位流
标准流和浮动流都只能在水平或垂直方向布局元素但现实是我们可能需要在上下左右几个方向上同时偏移元素定位流正是为了解决这一问题而设计的。通过设置元素的position属性可以让元素处于定为流中并通过left、right、top、bottom属性设置元素具体的偏移量。
  定为流分为四种:
    a) static 静态定位,实际上所有元素默认都是静态定位的,即处于标准流中。
    b) relative 相对定位,元素保留在标准流中所占用的位置,但实际是**边框及以内的部分将显示在偏移之后的位置**。即虽然元素已经不再原来的位置了,`但之前所占用的空间并不会被释放给其他标准流中的元素`。
    c) absolute 绝对定位,元素脱离标准流,浏览器把它视作块级元素,不论定位之前它是何种元素,其他元素也将无视它。绝对定位的偏移量是相对于其**有定位属性的第一个祖先元素的**。
    d) fixed 固定定位,固定定位和绝对定位相似,但它的偏移量固定的相对于浏览器窗口。
### position 应用
> position 属性用来指定一个元素在网页上的位置 一共有5种定位方式
- **static (默认)**
- **relative**
- **fixed**
- **absolute**
- sticky
#### 属性详解
#### static
------
static 是position 属性的默认值这个值使指定元素使用正常的布局行为即元素在文档常规流中当前的布局位置此时top, right, bottom, left和z-index 都无效
示例:
html
```
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<body>
<div class="content">
<div class="box" id="one">One</div>
<div class="box" id="two">Two</div>
<div class="box" id="three">Three</div>
<div class="box" id="four">Four</div>
</div>
</body>
</html>
```
css
```
.box {
display: inline-block; // 容器内的元素水平排列
width: 100px;
height: 100px;
background: red;
color: white;
}
#two {
position: static;
top: 20px;
left: 20px;
bottom:1px;
right:9px
background: blue;
}
```
![image-20201221095702906](定位.assets/image-20201221095702906.png)
##### **position:static**
<font color="red" size=5>**top,left,right,bottom无效**</font>
#### relative
------
relative 表示,相对于默认位置(即 static 时的位置)进行偏移,即定位基点是元素的默认位置。 它必须搭配 top、bottom、left、right 这四个属性一起使用,用来指定偏移的方向和距离。
示例:
html不变
css改为
```
.box {
display: inline-block;
width: 100px;
height: 100px;
background: red;
color: white;
}
#two {
position: relative;
top: 20px;
left: 20px;
background: blue;
}
```
![image-20201221102916077](定位.assets/image-20201221102916077.png)
#### absolute
------
absolute 表示,相对于上级元素(一般是父元素)进行偏移,即定位基点是父元素。
**它有一个重要的限制条件:定位基点(一般是父元素)不能是 static 定位,否则定位基点就会变成整个网页的根元素 html。**
另外absolute 定位也必须搭配 top、bottom、left、right 这四个属性一起使用。
示例:
html 不变 css 改为:
父元素static定位 子元素 absolute定位
```
.content {
margin-left: 100px;
border: 2px solid blue;
}
.box {
display: inline-block;
width: 100px;
height: 100px;
background: red;
color: white;
}
#two {
position: absolute;
top: 20px;
left: 20px;
background: blue;
}
```
![image-20201221103043181](定位.assets/image-20201221103043181.png)
<font color="red">**此时 子元素相对于body定位**</font>
父元素relative 定位 子元素absolute定位
css 改为:
```
.content {
margin-left: 100px;
border: 2px solid blue;
}
.box {
display: inline-block;
width: 100px;
height: 100px;
background: red;
color: white;
}
#two {
position: absolute;
top: 20px;
left: 20px;
background: blue;
}
```
![image-20201221103321675](定位.assets/image-20201221103321675.png)
<font color="red">**此时子元素根据父元素定位**</font>
#### fixed
------
fixed 表示相对于视口viewport浏览器窗口进行偏移即定位基点是浏览器窗口。这会导致元素的位置不随页面滚动而变化好像固定在网页上一样。
元素的位置通过 left、top、right 以及 bottom 属性进行规定。
示例:
```
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/html">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div class="content">
<div class="header">Header</div>
<div class="blank"></div>
<p>
我是内容~ <br/>
我是内容~ <br/>
我是内容~ <br/>
我是内容~ <br/>
我是内容~ <br/>
我是内容~ <br/>
我是内容~ <br/>
我是内容~ <br/>
我是内容~ <br/>
我是内容~ <br/>
我是内容~ <br/>
我是内容~ <br/>
我是内容~ <br/>
我是内容~ <br/>
我是内容~ <br/>
我是内容~ <br/>
我是内容~ <br/>
</p>
</div>
</body>
</html>
```
css:
```
.content {
width: 500px;
height: 200px;
overflow: scroll;
}
.header {
width: 100%;
height: 50px;
background: red;
color: white;
position: fixed;
}
p {
margin-top: 50px;
}
```
![image-20201221104140216](定位.assets/image-20201221104140216.png)
#### sticky
------
sticky 跟前面四个属性值都不一样,它会产生动态效果,很像 relative 和 fixed 的结合:一些时候是 relative 定位(定位基点是自身默认位置),另一些时候自动变成 fixed 定位(定位基点是视口)。比如型表格滚动的时候,表头始终固定。
sticky 生效的前提是,必须搭配 top、bottom、left、right 这四个属性一起使用,不能省略,否则等同于 relative 定位,不产生"动态固定"的效果。原因是这四个属性用来定义"偏移距离",浏览器把它当作 sticky 的生效门槛
## 常用的display属性
1. block 指定元素为块级元素 块级元素如div的display属性的默认值
2. inline 指定元素为行内元素 内联元素如span,a...able的display的默认值
> 在块级元素中指定display:inline 能将此元素转换成内联元素
>
> 在内联元素中指定 display:block 能将此元素转换成块级元素
3. flex 详情至弹性盒子 指定元素为弹性盒子
4. grid 详情自行探索网格布局grid
5. table 指定元素为table