- CSS定位介绍
- 层叠上下文 z-index
-曾老湿, 江湖人称曾老大。
-多年互联网运维工作经验,曾负责过大规模集群架构自动化运维管理工作。 -擅长Web集群架构与自动化运维,曾负责国内某大型金融公司运维工作。 -devops项目经理兼DBA。 -开发过一套自动化运维平台(功能如下): 1)整合了各个公有云API,自主创建云主机。 2)ELK自动化收集日志功能。 3)Saltstack自动化运维统一配置管理工具。 4)Git、Jenkins自动化代码上线及自动化测试平台。 5)堡垒机,连接Linux、Windows平台及日志审计。 6)SQL执行及审批流程。 7)慢查询日志分析web界面。
CSS定位介绍
布局和定位的区别 |
---|
布局是屏幕平面上的,定位是垂直于屏幕的。
还得从文档流
和盒模型
说起。


代码语言:javascript复制<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>JS Bin</title>
</head>
<body>
<div class="demo">你好</div>
</body>
</html>
代码语言:javascript复制.demo{
box-sizing: border-box;
margin: 12px;
border: 5px solid red;
padding: 22px;
width: 100px;
height: 100px;
background: blue;
color: white;
}
此时盒模型,加了背景颜色为蓝色: 1.蓝色的范围,是红色围成的内部区域? 2.蓝色的范围,是包括红色边框的区域?
我们将边框的颜色修改为半透明,不难发现...

代码语言:javascript复制<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>JS Bin</title>
</head>
<body>
<div class="demo">你好</div>
</body>
</html>
代码语言:javascript复制.demo{
box-sizing: border-box;
margin: 12px;
border: 5px solid rgba(255,0,0,0.3);
padding: 22px;
width: 100px;
height: 100px;
background: blue;
color: white;
}
如果从左边,看div是什么样子的?类似于图层...背景在最下面一层
代码验证:
代码语言:javascript复制<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>JS Bin</title>
</head>
<body>
<div class="demo">
<span class='text'>你好</span>
</div>
</body>
</html>
代码语言:javascript复制.demo{
box-sizing: border-box;
margin: 12px;
border: 5px solid rgba(255,0,0,1);
padding: 22px;
width: 100px;
height: 100px;
background: blue;
color: green;
}
.text{
font-size:100px;
}



代码语言:javascript复制<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>JS Bin</title>
</head>
<body>
<div class="demo">
<div class="float">浮动文字</div><span class=text>■你好</span>
<div class="childDiv">测试</div>
</div>
</body>
</html>
代码语言:javascript复制.demo{
background: rgb(120, 184, 211);
width: 200px;
height: 200px;
border: 15px solid rgba(255,0,0,0.2);
padding: 10px;
}
.childDiv{
background: #fff;
height: 50px;
color:red;
}
.float{
float: left;
background: green;
height: 50px;
width: 50px;
color: red;
}
.text{
margin-left: -10px;
}

position |
---|
新属性:position
1.static:默认值,待在文档流里,这里可以不写

2.relative:相对定位,升起来,但不脱离文档流


代码语言:javascript复制<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>JS Bin</title>
</head>
<body>
<div class="container clearfix">
<div class="demo"></div>
<div class="demo2"></div>
</div>
</body>
</html>
代码语言:javascript复制*{box-sizing: border-box;}
.container{
border: 1px solid red;
height: 300px;
}
.clearfix{
content: '';
clear: both;
display: block;
}
.demo{
border: 1px solid green;
background: green;
width: 50px;
height: 50px;
position: relative;
top: 10px;
z-index: 0;
}
.demo2{
background: black;
width: 50px;
height: 50px;
position: relative;
}
3.absolute:绝对定位,定位基准是祖先里的非static
使用场景,关闭按钮

代码语言:javascript复制<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>JS Bin</title>
</head>
<body>
<div class="container clearfix">
<div class="demo"></div>
<div class="demo2"></div>
<span class='close'>X</span>
</div>
</body>
</html>
代码语言:javascript复制*{box-sizing: border-box;}
.container{
border: 1px solid red;
height: 300px;
position: relative;
}
.clearfix{
content: '';
clear: both;
display: block;
}
.demo{
border: 1px solid green;
background: green;
width: 50px;
height: 50px;
position: relative;
top: 10px;
z-index: 0;
}
.demo2{
background: black;
width: 50px;
height: 50px;
position: relative;
z-index: 0;
}
.close{
position: absolute;
top: 0;
right: 0;
padding: 0 8px;
background: blue;
color: white;
}
鼠标提示

代码语言:javascript复制<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>JS Bin</title>
</head>
<body>
<div class="container clearfix">
<div class="demo"></div>
<div class="demo2"></div>
<div style='height: 100px;'></div>
<span class='close'>X</span>
<button>点击
<span class='tips'>提示内容</span>
</button>
</div>
</body>
</html>
代码语言:javascript复制*{box-sizing: border-box;}
.container{
border: 1px solid red;
height: 300px;
position: relative;
padding: 20px;
}
.clearfix:after{
content: '';
clear: both;
display: block;
}
.demo{
border: 1px solid green;
background: green;
width: 50px;
height: 50px;
position: relative;
top: 10px;
z-index: 0;
}
.demo2{
background: black;
width: 50px;
height: 50px;
position: relative;
z-index: 0;
}
.close{
position: absolute;
top: 0;
right: 0;
padding: 0 8px;
background: blue;
color: white;
}
button{
position: relative;
}
button>span{
position: absolute;
border: 1px solid red;
/*文字内容不准换行*/
white-space: nowrap;
bottom: calc(100% 10px);
left: 50%;
transform: translateX(-50%);
}
button span{
display: none;
}
button:hover span{
display: inline-block;
}

4.fixed:固定定位,定位基准是viewport
使用场景:烦人的广告 和 返回顶部按钮


5.sticky:粘滞定位,不好描述,直接举例



代码语言:javascript复制<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>JS Bin</title>
</head>
<body>
<div class="container">
<p>1</p>
<p>2</p>
<p>3</p>
<p>4</p>
<p>5</p>
<p>6</p>
<p>7</p>
<p>8</p>
<p>9</p>
<p>10</p>
<p>11</p>
<p>12</p>
<p>13</p>
<div class="sticky">我是个导航</div>
<p>14</p>
<p>15</p>
<p>16</p>
<p>17</p>
<p>18</p>
<p>19</p>
<p>20</p>
<p>21</p>
<p>22</p>
<p>23</p>
<p>24</p>
<p>25</p>
<p>26</p>
<p>27</p>
<p>28</p>
<p>29</p>
<p>30</p>
<p>31</p>
<p>32</p>
<p>33</p>
<p>34</p>
<p>35</p>
<p>36</p>
<p>37</p>
<p>38</p>
<p>39</p>
<p>40</p>
<p>41</p>
<p>42</p>
<p>43</p>
<p>44</p>
<p>45</p>
<p>46</p>
<p>47</p>
<p>48</p>
<p>49</p>
<p>50</p>
<p>51</p>
<p>52</p>
<p>53</p>
<p>54</p>
<p>55</p>
<p>56</p>
<p>57</p>
<p>58</p>
<p>59</p>
<p>60</p>
<p>61</p>
<p>62</p>
<p>63</p>
<p>64</p>
<p>65</p>
<p>66</p>
<p>67</p>
<p>68</p>
<p>69</p>
<p>70</p>
<p>71</p>
<p>72</p>
<p>73</p>
<p>74</p>
<p>75</p>
<p>76</p>
<p>77</p>
<p>78</p>
<p>79</p>
<p>80</p>
<p>81</p>
<p>82</p>
<p>83</p>
<p>84</p>
<p>85</p>
<p>86</p>
<p>87</p>
<p>88</p>
<p>89</p>
<p>90</p>
<p>91</p>
<p>92</p>
<p>93</p>
<p>94</p>
<p>95</p>
<p>96</p>
<p>97</p>
<p>98</p>
<p>99</p>
<p>100</p>
<div class="fixed">返回顶部</div>
</div>
</body>
</html>
代码语言:javascript复制*{box-sizing: border-box;}
.container{
border: 1px solid red;
position: relative;
padding: 20px;
}
.fixed{
border: 1px solid green;
width: 100px;
height: 100px;
display: flex;
justify-content: center;
align-items: center;
}
.sticky{
position: sticky;
position: -webkit-sticky;
top: 0;
border: 1px solid green;
background: green;
}
经验: 如果写了absolute,一般都得补一个relative 如果写了absolute或fixed,一定要补top和left sticky兼容性很差,主要用于面试装逼
层叠上下文 z-index
每个层叠上下文,就是一个新的小世界(作用域),这个小世界里面的z-index跟外界无关,处在同一个小世界的z-index才能比较。

代码语言:javascript复制<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>JS Bin</title>
</head>
<body>
<div class="container">
<div class="a">1
<div class="a2">10</div>
</div>
<div class="b">
<div class="b2">5</div>
</div>
</div>
</body>
</html>
代码语言:javascript复制*{margin:0;padding:0;box-sizing:border-box;}
.container{
border: 1px solid black;
height: 200px;
background: rgba(255,255,0,0.5)
position: relative;
}
.a{
position: relative;
z-index: 1;
border: 1px solid red;
}
.a2{
position: relative;
z-index: 10;
height: 50px;
width: 50px;
background: red;
}
.b{
}
.b2{
position: relative;
z-index: 5;
height: 50px;
width: 50px;
top: -20px;
background: blue;
color: white;
}
还有哪些属性可以创建层叠上下文?
文档中的层叠上下文由满足以下任意一个条件的元素形成:
1.文档根元素();
2.position 值为 absolute(绝对定位)或 relative(相对定位)且 z-index 值不为 auto 的元素;
3.position 值为 fixed(固定定位)或 sticky(粘滞定位)的元素(沾滞定位适配所有移动设备上的浏览器,但老的桌面浏览器不支持);
4.flex (flexbox) 容器的子元素,且 z-index 值不为 auto;
5.grid (grid) 容器的子元素,且 z-index 值不为 auto;
6.opacity 属性值小于 1 的元素(参见 the specification for opacity);
7.mix-blend-mode 属性值不为 normal 的元素;
8.以下任意属性值不为 none 的元素: transform filter perspective clip-path mask / mask-image / mask-border
9.isolation 属性值为 isolate 的元素;
10.-webkit-overflow-scrolling 属性值为 touch 的元素;
11.will-change 值设定了任一属性而该属性在 non-initial 值时会创建层叠上下文的元素(参考这篇文章);
12.contain 属性值为 layout、paint 或包含它们其中之一的合成值(比如 contain: strict、contain: content)的元素。
13.在层叠上下文中,子元素同样也按照上面解释的规则进行层叠。 重要的是,其子级层叠上下文的 z-index 值只在父级中才有意义。子级层叠上下文被自动视为父级层叠上下文的一个独立单元。
总结:
层叠上下文可以包含在其他层叠上下文中,并且一起创建一个层叠上下文的层级。 每个层叠上下文都完全独立于它的兄弟元素:当处理层叠时只考虑子元素。 每个层叠上下文都是自包含的:当一个元素的内容发生层叠后,该元素将被作为整体在父级层叠上下文中按顺序进行层叠