位置层级 z-index

  • 测试环境:先搞两个div颜色块
......
		<style type="text/css">
			div {
				height: 200px;
				width: 200px;
			}
			.box1 {
				background-color: red;
			}
			.box2 {
				background-color: #008000;
			}
		</style>
	</head>
	<body>
		<div class="box1"></div>
		<div class="box2"></div>
		
	</body>
......

  • 对box1 设置 position 偏移,box1色块会有一部分覆盖了box2
......
		<style type="text/css">
			div {
				height: 200px;
				width: 200px;
			}
			.box1 {
				background-color: red;
				position: relative; /*增加之处*/
				top: 100px;
				left: 100px;
			}
			.box2 {
				background-color: #008000;
			}
		</style>
  • 现在,我们也对box2设置位置,结果变成了 box2的色块覆盖了box1色块
......
		<style type="text/css">
			div {
				height: 200px;
				width: 200px;
			}
			.box1 {
				background-color: red;
				position: relative; 
				top: 100px;
				left: 100px;
			}
			.box2 {
				background-color: #008000;
				position: relative; /*增加之处*/
			}
		</style>
  • 所以,对于谁在谁上面,css提供了 z-index 这个属性来决定(使用前提,必须有position,否则没有意义),值越大,就越往上层
<style type="text/css">
	div {
		height: 200px;
		width: 200px;
	}
	.box1 {
		background-color: red;
		position: relative;
		top: 100px;
		left: 100px;
		z-index: 100;/*增加之处*/
	}
	.box2 {
		background-color: #008000;
		position: relative;
		z-index: 200;/*增加之处*,该色块会在最上层,即把box1部分色块覆盖/
	}
	
</style>
......
<div class="box1"></div>
<div class="box2"></div>
  • 再次强调,有position以后, z-index才有意义,否则根本没效果,把上述示例的position注释掉,色块就互相隔离开来了

定位的父子关系/兄弟关系层级探讨

  • demo环境:两个父包子的色块
<style type="text/css">
    .parent {
        height: 200px;
        width: 200px;
        background-color: red;
    }
    .child {
        height: 100px;
        width: 100px;
        background-color: green;
    }
    
</style>
......
<div class="parent">
    <div class="child"></div>
</div>
  • 对两个色块设置定位,效果是 子色块与父色块之间,有10px的边距
<style type="text/css">
    .parent {
        height: 200px;
        width: 200px;
        background-color: red;
        position: relative; /*新增*/
    }
    .child {
        height: 100px;
        width: 100px;
        background-color: green;
        position: absolute; /*新增*/
        top: 10px;
        left: 10px;
    }
    
</style>
  • 现在,想把父色块的层级提上来,加 z-index 可否实现效果(答案'否',没有效果)
<style type="text/css">
    .parent {
        height: 200px;
        width: 200px;
        background-color: red;
        position: relative; 
        z-index: 100; /*新增,无效果*/
    }
    .child {
        height: 100px;
        width: 100px;
        background-color: green;
        position: absolute;
        top: 10px;
        left: 10px;
    }
    
</style>
  • 解决办法:删除父色块的层级,把子色块的层级修改为'负数'即可
<style type="text/css">
    .parent {
        height: 200px;
        width: 200px;
        background-color: red;
        position: relative;
        /* z-index: 100; 注释掉 */
    }
    .child {
        height: 100px;
        width: 100px;
        background-color: green;
        position: absolute;
        top: 10px;
        left: 10px;
        z-index: -1; /*新增*/
    }
    
</style>

兄弟关系探讨

  • demo 环境:两个兄弟色块,与浏览器拉开边距(谁在后面,谁占优势,所以绿块会覆盖红块)
<style type="text/css">
    .box1 {
        height: 200px;
        width: 200px;
        background-color: red;
        position: absolute;
        left: 100px; /*距离浏览器100px*/
        top: 100px;
        
    }
    .box2 {
        height: 200px;
        width: 200px;
        background-color: green;
        position: absolute;
        top: 0px; /*与浏览器没有距离*/
        left: 0px;
    }
    
</style>
......
<div class="box1"></div>
<div class="box2"></div>
  • 对红块运用层级优先,有效果,红块在上层
<style type="text/css">
    .box1 {
        height: 200px;
        width: 200px;
        background-color: red;
        position: absolute;
        left: 100px;
        top: 100px;
        z-index: 100; /*新增*/
    }
    .box2 {
        height: 200px;
        width: 200px;
        background-color: green;
        position: absolute;
        top: 0px;
        left: 0px;
    }
            
</style>
  • 小结
- 父子关系设置层级,把子元素的 z-index 设置成 负数即可
- 兄弟关系设置层级,正常设置即可

position的"另类用法",把'行内元素',变成'块级元素'

  • demo 环境:对 span 元素设置宽/高,肯定是没效果的,示例如下
<style type="text/css">
    span {
        width: 200px; /*无效果*/
        height: 200px;
        background-color: yellow;
        position: absolute;
    }
    
</style>
......
<span>111111111111</span>
  • 另类解决办法,添加 position:absolute,效果就出来了
<style type="text/css">
    span {
        width: 200px;
        height: 200px;
        background-color: yellow;
        position: absolute; /*新增*/
    }
    
</style>

使'行内元素'变成'块级元素'的三个方法

display:block

float:left

position:absolute

利用position实现 水平垂直居中

  • 之前,我们实现水平方向居中,使用的是: margin:0 auto;(垂直方向无法居中)

  • 利用position实现 外层容器 相对于 浏览器窗口 '水平&垂直方向'居中


<style>
    * {
        padding: 0;
        margin:0;
    }
    div {
        width:200px;
        height:200px;
        background-color:red;
        position:absolute; <!--距离上/左均50%,外边距再切掉原有的一半像素即可-->
        top:50%;
        left:50%;
        margin-top: -100px;
        margin-left: -100px;
    }
</style>
......
<body>
    <div></div>
</body>
  • 父子关系容器的 '水平&垂直方向'居中(一样的套路)
<style type="text/css">
    .parent {
        width: 500px;
        height: 500px;
        background-color: red;
        margin: 0 auto;
        position: relative; <!--设置相对定位,給子元素当参考-->
    }
    .child {
        width: 200px;
        height: 200px;
        background-color: green;
        position: absolute; <!--一样的套路-->
        top: 50%;
        left: 50%;
        margin-top: -100px;
        margin-left: -100px;
    }
</style>
......
<div class="parent">
    <div class="child"></div>
</div>

position[absolute] 和 浮动 的区别(都会脱离文档流)

  • 实验环境: 两个色块盒子
<style type="text/css">
    .box1 {
        width: 100px;
        height: 100px;
        background-color: red;
    }
    .box2 {
        width: 200px;
        height: 200px;
        background-color: green;
    }
</style>
......
<div class="box1"></div>
<div class="box2"></div>
  • 使用浮动:红块浮起来,绿块趁机上来
<style type="text/css">
    .box1 {
        width: 100px;
        height: 100px;
        background-color: red;
        float: left; <!--浮动,绿块会趁机挤上来-->
    }
    .box2 {
        width: 200px;
        height: 200px;
        background-color: green;
    }
</style>
......
<div class="box1"></div>
<div class="box2"></div>
  • 使用 position:红块浮起来,绿块趁机上来(一样的效果)
<style type="text/css">
    .box1 {
        width: 100px;
        height: 100px;
        background-color: red;
        position: absolute; <!--一样的效果-->
    }
    .box2 {
        width: 200px;
        height: 200px;
        background-color: green;
    }
</style>
......
<div class="box1"></div>
<div class="box2"></div>
  • 区别:当加入文字的时候,区别就很明显了

    • float 文字有环绕效果,不会被覆盖(半脱离)

    • absolute 文字被覆盖了(全脱离)

<style type="text/css">
    .box1 {
        width: 100px;
        height: 100px;
        background-color: red;
        float: left; <!--浮动-->
    }
    .box2 {
        width: 200px;
        height: 200px;
        background-color: green;
    }
</style>
......
<div class="box1"></div>
<div class="box2"> <!--新增文字,环绕效果-->
    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Velit odio ...........
</div>
<style type="text/css">
    .box1 {
        width: 100px;
        height: 100px;
        background-color: red;
        position: absolute; <!--修改之处-->
    }
    .box2 {
        width: 200px;
        height: 200px;
        background-color: green;
    }
</style>
......
<div class="box1"></div>
<div class="box2"> <!--文字被覆盖了-->
    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Velit odio ...........
</div>

利用锚点实现单页面内部的定位跳转

<!DOCTYPE html>
<html>
   <head>
      <meta charset="utf-8" />
      <title></title>
      <style>
         * {
            margin: 0;
            padding: 0;
         }
         ul { <!--整个列表固定在浏览器右边,并距离上方100px-->
            list-style: none;
            position: fixed;
            top: 100px;
            right: 0;
         }
         li { <!--列表中的每一项,容器内居中,并加边框-->
            width: 100px;
            height: 50px;
            line-height: 50px;
            text-align: center;
            border: 1px solid red;
         }
         div { <!--示范内容,占比较大的高度,方便演示效果-->
            height: 800px;
         }
      </style>
   </head>
   <body>
      <ul>
         <!--利用<a>实现锚点的跳转-->
         <li>
            <a href="#part1">第一部分</a>
         </li>
         <li>
            <a href="#part2">第二部分</a>
         </li>
         <li>
            <a href="#part3">第三部分</a>
         </li>
         <li>
            <a href="#part4">第四部分</a>
         </li>
         
      </ul>
      <!--使用id来标识位置-->
      <div id="part1">我是第一部分内容</div>
      <div id="part2">我是第二部分内容</div>
      <div id="part3">我是第三部分内容</div>
      <!--最后这块,由于到底部了,所以实际效果,与浏览器顶部会有一段距离,这是正常的-->
      <div id="part4">我是第四部分内容</div>
</html>

精灵图

  • 将多张图片合成一张图,然后利用 background-position 实现图片定位的技术

  • 好处

    • 通过图片整合来减少对服务器的请求次数,从而提高页面的加载速度

    • 通过整合图片,减少的图片的体积

  • 案例演示

<!--先搞6个色块,向左浮动起来,然后把色块替换成图片即可-->
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title></title>
        <style>
            div {
                width: 103px;
                height: 32px;
                float: left;
                margin: 10px;
                background-color: yellow;
            }
        </style>
    </head>
    
    <body>
        <div class="box1"></div>
        <div class="box2"></div>
        <div class="box3"></div>
        <div class="box4"></div>
        <div class="box5"></div>
        <div class="box6"></div>
    </body>
</html>

<!--把色块替换成图片,开始定位-->
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title></title>
        <style>
            div {
                width: 103px;
                height: 32px;
                float: left;
                margin: 10px;
                background-image: url(./img/jd.png); <!--背景图片-->
            }
            .box1 {
                background-position: 105px 231px; <!--调试工具开始定位-->
            }
            .box2 {
                background-position: 105px 195px;
            }
            .box3 {
                background-position: 105px 157px;
            }
            ......
        </style>
    </head>
    
    <body>
        <div class="box1"></div>
        <div class="box2"></div>
        <div class="box3"></div>
        <div class="box4"></div>
        <div class="box5"></div>
        <div class="box6"></div>
    </body>
</html>

元素的宽高自适应

  • 我们经常希望,元素的大小随着窗口或者子元素的大小,而自动调整,这就是自适应
- width:auto  /  height:auto
- 或者不指定宽高, 那么css默认就是auto

......
<style>
    * {
        padding: 0;
        margin: 0;
    }
    div {
        /* width: 100px; */
        /* width: 100%; 也会占满窗口,那是因为body宽度占满了100%,如果body为500px,就不会占满*/  
        width: auto; /* 宽度会占满整个窗口 */ 
        height: 100px;
        background-color: purple;
    }
    
</style>
......
<div></div>

  • 案例演示:导航栏(小块),中间部分(大块),底部(小块)
......
<style>
    * {
        padding: 0;
        margin: 0;
    }
    .header,.footer {
        width: 100%;
        height: 50px;
        background-color: red;
    }
    .body {
        height: 500px;
        background-color: blue;
    }
    
</style>
......
<div class="header"></div>
<div class="body"></div>
<div class="footer"></div>
<!--当body里面的内容过多,超过body本身的高度时,里面的元素就会溢出,从而影响美观-->
......
.body {
    height: 500px;
    background-color: blue;
}
li {
    height: 100px;
    background-color: green;
}
......
<ul>
    <li>111111111111111111</li>
    <li>111111111111111111</li>
    <li>111111111111111111</li>
    <li>111111111111111111</li>
    <li>111111111111111111</li>
    <li>111111111111111111</li>
    <li>111111111111111111</li>
</ul>
<!--解决办法:把body的高度设置为自适应即可,不再用固定的500px-->
......
.body {
    /* height: 500px; 注释掉即可*/
    background-color: blue;
}
li {
    height: 100px;
    background-color: green;
}
......
<ul>
    <li>111111111111111111</li>
    <li>111111111111111111</li>
    <li>111111111111111111</li>
    <li>111111111111111111</li>
    <li>111111111111111111</li>
    <li>111111111111111111</li>
    <li>111111111111111111</li>
</ul>
<!--问题又来了,当内容比较少的时候,比如列表只有一项内容,此时自适应高度比较高,也不美观-->
......
.body {
    background-color: blue;
}
li {
    height: 100px;
    background-color: green;
}
......
<ul>
    <li>111111111111111111</li> <!--只有一行,自适应高度效果不美观-->
</ul>
<!--解决办法,设置最小高度 min-height即可-->
- 拓展延伸

    - min-height
    - max-height
    - min-width
    - max-width

伪元素

  • 虚伪的元素,并不是真实存在的,表现为其内容鼠标无法选中(而真实元素的内容可以)

- div::after { // 注意写成 div:after 也是可以的,但是不够标准~~~
    content:"div后面放置的文本内容"
}

- div::before {
    content:"div前面放置的文本内容"
}

- ::first-letter: 定义对象内第一个字符的样式

- ::first-line: 定义对象内第一行文本的样式

  • demo示例
<style>
    * {
        margin: 0;
        padding: 0;
    }
    div::first-letter {
        color: red;
    }
    div::first-line {
        background-color: green;
    }
    div::before {  /*content的内容无法被鼠标选中*/
        content: "aaa";
    }
    div::after {
        content: "bbb";
    }
</style>
......
<div>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Necessitatibus eum molestiae of......</div>
  • 实战案例,使用伪元素是解决浮动的最佳方案
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title></title>
        <style>
            * {
                margin: 0;
                padding: 0;
            }
            .left {
                width: 100px;
                height: 100px;
                background-color: red;
                float: left;
            }
            .right {
                width: 100px;
                height: 100px;
                background-color: green;
                float: left;
            }
            .content {
                width: 200px;
                height: 200px;
                background-color: purple;
            }
            .box::after {
                /*在父容器box后面添加伪元素,以下写法比较固定*/
                content: '';
                clear: both;
                display: block;
            }
        </style>
    </head>
    <body>
        <div class="box">
            <div class="left"></div>
            <div class="right"></div>
        </div>
        <div class="content"></div>
        <script>
            
        </script>
    </body>
</html>

......
<!--如果有内容,可以这么写-->
.box::after {
    content: 'aaa';
    clear: both;
    display: block;
    width: 0;
    height: 0;
}

显示/隐藏元素的两种方法

- display: none; 

    - display元素消失以后,后面的元素会占用display元素的位置

visibility: hidden;

    - visibility元素消失以后,后面的元素不会占用visibility元素的位置

盒子随着窗口的大小而改变(宽高自适应)

html,body {
    height: 100%;
}
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        .box {
            width: 100%;
            height: 100%;
            background-color: red;
        }
        
        html,body { /*不加这句,盒子是没有高度的,网页上显示不出来*/
            height: 100%;
        }
    </style>
......
<body>
    <div class="box">
    </div>
</body>

两栏布局案例演示

    <style>
        * {
            margin: 0;
            padding: 0;
        }
        html,body {
            height: 100%;
        }
        .left {
            width: 200px;
            height: 100%;
            background-color: blueviolet;
            float: left; /*浮动起来,使left盒子位置靠上来*/
        }
        .right {
            height: 100%;
            background-color: burlywood;
            margin-left: 200px; /*如果不设置外边距,部分内容会被right盒子覆盖*/
            
        }
    </style>
    ......
    <body>
        <div class="left"></div>
        <div class="right"></div>
    </body>
  • calc()函数:动态计算长度值
div {
    width:calc(100% - 10px)
}

- 注意事项: 运算符前后都需要保留一个"空格",否则计算无效!

- 任何长度值都可以使用calc()计算
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title></title>
        <!-- <script src="https://unpkg.com/vue@next"></script> -->
        <!-- <script src="js/v3.2.8/vue.global.prod.js" type="text/javascript" charset="utf-8"></script> -->
        <style>
            * {
                margin: 0;
                padding: 0;
            }
            html,body {
                height: 100%;
            }
            .left {
                width: 200px;
                height: 100%;
                background-color: blueviolet;
                float: left;
            }
            .right {
                height: 100%;
                width: calc(100% - 200px); /*默认是减去右边的宽度*/
                background-color: burlywood;
                float: left; /*如果不浮起来,那么窗口右边会有200px的间隔,浮起来刚好把200间隔填满*/
                
            }
        </style>
    </head>
    <body>
        <div class="left"></div>
        <div class="right"></div>
        <script>
            
        </script>
    </body>
</html>