今天看啥  ›  专栏  ›  Liyager

1-2-7【CSS核心样式】CSS定位

Liyager  · 简书  ·  · 2020-11-02 15:01

每天都累的要死,但只要想着能做出来东西,就很开心~


文章内容输出来源 :拉勾教育大前端就业集训营

1.定位属性

  • 概述:在之前的课程中,大家已经学习过了盒模型、浮动这些布局相关的内容。而定位是另一种布
    局的重要属性,常用于制作 压盖 或者 位置相关的效果
  • 属性名:position
  • 属性值:
属性值 效果
relative 相对定位,相对标签自身原始位置定位
absolute 绝对定位,以最近的带有定位属性的父元素或body为基准进行定位
fixed 固定定位,以浏览器窗口的四个顶点为基准进行定位
  • 偏移量属性:定位的元素要想发生位置的移动,除了需要确定定位类型外,还必须搭配 偏移量属性 进行设置。
    • 水平方向:left、right;
    • 垂直方向:top、bottom;
    • 属性值:常用px为单位的数值,%也可以。

说明:偏移量属性 必须配合 定位属性使用,否则就算定义了偏移量,元素也不会发生任何移动!

2.相对定位

  • 属性值:relative
  • 参考元素:以标签自身的原始加载位置为基准,进行偏移。

说明:偏移量属性方向的理解可能会比较绕,比如说left:50px;实际上是元素向右移动50像素,可以理解为“新位置相对老位置为向左50px”。

  • 性质:相对定位的元素不脱离标签的原始状态(标准流、浮动),不会让出原来占有的位置。
  • 注意事项1:偏移量的属性值是 区分正负的
  • 注意事项2:同一个方向,不能设置两个偏移量。若同时设置了left和right则以left为主,同时设置了top和bottom则以top为主。

说明:第4个盒子没有侵占第3个盒子的原始位置;left为-50px,盒子向反方向移动;left和right同时设置,以left为主,所以依然向左移动50px。

  • 应用1:由于相对定位元素比较稳定,不会随意让出位置,可以将相对定位元素作为后期绝对定位的参考元素
  • 应用2:相对定位比较稳定,可以在占有原始位置的情况下,对加载效果区域进行位置调整,进行 微调设置 。或者对文字进行微调。
  • 实际案例:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .nav{
            width: 500px;
            height: 50px;
            background-color: skyblue;
            margin: 50px auto;
            
        }
        .nav li{
            float: left;
            list-style: none;
        }
        .nav li a{
            display: inline-block;
            width: 100px;
            height: 50px;
            background-color: skyblue;
            text-decoration: none;
            color: white;
            font-size: 20px;
            text-align: center;
            line-height: 50px;
            border-right: 1px solid rgb(190, 181, 181);
        }
        a:hover{
            border-top: 2px solid chartreuse;
            /*这里用到了相对定位*/
            position: relative;
            top: -2px;
        }
    </style>
</head>
<body>
    <ul class="nav">
        <li><a href="http://www.lagou.com">首页</a></li>
        <li><a href="http://www.lagou.com">产品</a></li>
        <li><a href="http://www.lagou.com">支持</a></li>
        <li><a href="http://www.lagou.com">更多</a></li>
    </ul>
</body>
</html>

说明:本案例模仿了“导航栏中鼠标悬停”时的效果。如果不增加向上偏移的效果,a元素因为在鼠标悬停时增加了“上边框”,所以整体会下移。

3.绝对定位

  • 属性值:absolute
  • 参考元素:参考的是 距离最近 有定位的 祖先元素,如果祖先都没有定位,参考<body>元素。

说明:父元素存在定位属性(案例中设定为相对定位),则子元素的绝对定位会参照父元素的位置进行偏移。

  • 性质:绝对定位的元素 脱离标准流 ,会 让出标准流位置 ,可以设置宽高,也可以随时定义位置,绝对定位的元素不设置宽高只能被内容撑开。

说明:如图所示,粉色盒子脱离了标准流,第三个盒子占据了粉色盒子的位置。而且粉色盒子没有 带有定位属性 的父元素,所以参照<body>元素定位。

以<body>为参考元素

  • 如果有top(bottom)参与的绝对定位,参考点就是<body> 页面的上顶点(下顶点)。
  • 如果有left(right)参与的绝对定位,参考点就是<body> 页面的左顶点(右顶点)。

说明:所以垂直和水平方向属性的配合,可以确定一个唯一的顶点作为参考,进行偏移。
例如,设置了top和left属性,则参考点为左上角;bottom和right属性,则参考点为右下角。

说明:粉色盒子以页面左上角为参考点,蓝色盒子以页面右下角为参考点。

  • 实际应用中,如果以<body>为参考元素,不同分辨率的浏览器中,绝对定位的元素位置是不同的,所以较少使用<body>作为参考元素。

以祖先元素为参考元素

  • 参考点是盒子 border以内 的四个顶点,组合方向决定了参考点。
    • 与“以body为参考元素”类似,设置top和right属性,则以父元素的右上顶点为参考点,以此类推。
  • 绝对定位父元素的参考点是 border以内的顶点 ,有无padding不影响;而元素自身的偏移参考点是 整个盒模型最外层的区域 ,有margin则margin顶点为参考点,有border无margin则border顶点为参考点,以此类推。

说明:第一个粉盒子以父元素的左上角为参考点;第二个粉盒子以父元素的右下角为参考点。

4.固定定位

  • 属性值:fixed
  • 参考元素:参考的是 浏览器窗口的四个顶点 ,同样,具体是哪一个顶点由偏移属性的组合决定。
  • 注意:由于浏览器窗口的四个顶点位置不会发生变化,会导致固定定位的元素会始终显示在定位位置,不会随着页面滚动而移动。

说明:这里肯定有小伙伴想到了,“固定定位”和“以body为参考元素的绝对定位”难道不一样吗?
答:不一样!以body为参考元素定位,元素 会随着窗口滚动而滚走 ,但是以浏览器窗口为参考元素定位,元素位置 不会发生变化 !body和浏览器窗口是两个概念!

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        div{
            height: 1000px;
        }
        .box1{
            background-color: pink;
            width: 100px;
            height: 100px;
            position: absolute;
            left: 100px;
            top: 100px;
        }
        .box2{
            background-color: yellow;
            width: 100px;
            height: 100px;
            position: fixed;
            right: 100px;
            bottom: 100px;
        }
    </style>
</head>
<body>
    <div class="box1"></div>
    <div class="box2"></div>
    <div></div>
</body>
</html>

说明:粉色盒子是以body为参考元素的 绝对定位 ,黄色盒子是 固定定位

  • 性质:固定定位的元素 脱离标准流 ,让出标准流位置,可以设置宽高,根据偏移量属性可以任意设置在浏览器窗口的位置。固定定位的元素会 始终显示在浏览器窗口上

5.定位应用

压盖效果

  • 概述:所有的定位类型都可以实现压盖效果。由于绝对定位的元素脱标,不占标准流位置,压盖效果更彻底,实际工作中, 常见的是绝对定位制作的压盖

说明:上图案例中p标签使用绝对定位,对图片进行了压盖。

居中

  • 概述:在1-2-2盒模型文章中,我们学到了一种使元素水平居中显示的方法,使用定位同样可实现元素的水平居中。

文章地址: 1-2-2盒模型

  • 步骤一:在水平方向设置一个偏移量left值为50%。

说明:其意义为将元素向右移动父元素宽度50%的距离

  • 步骤二:给绝对定位的子盒子设置一个同方向的margin,例如margin-left,属性值为 负的 自身宽度的一半。

说明:其意义是把盒子整体向左拉一半自身的宽度,从而达到居中效果。

  • 源码如下:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .box1{
            border: 5px solid red;
            height: 200px;
            width: 500px;
            position: relative;
            background-color: rgb(107, 107, 107);
        }
        .box2{
            position: absolute;
            background-color: pink;
            width: 100px;
            height: 100px;
            left: 50%;
            margin-left: -50px;
        }
    </style>
</head>
<body>
    <div class="box1">
        <div class="box2"></div>
    </div>
</body>
</html>

压盖顺序

  • 概述:实际使用定位时,可能出现多个定位的元素加载到同一个位置的情况,这时候压盖的顺序是可以控制的。
  • 默认压盖顺序:定位的元素不区分定位类型,都会去 压盖标准流或浮动的元素 。如果都是定位的元素,在HTML中 后写的定位压盖先写的定位
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .box1{
            background-color: pink;
            width: 300px;
            height: 300px;
        }
        .box2{
            background-color: skyblue;
            width: 200px;
            height: 200px;
            float: left;
        }
        .box3{
            background-color: green;
            width: 100px;
            height: 100px;
            position: absolute;
            top: 8px;
        }
        .box4{
            background-color: yellow;
            width: 50px;
            height: 50px;
            position: absolute;
            top: 8px;
        }
    </style>
</head>
<body>
    <div class="box1">
        <div class="box2"></div>
    </div>
   <div class="box3"></div>
   <div class="box4"></div>
</body>
</html>

说明:粉色盒子是标准流,所以在最下面;蓝色盒子是浮动所以在标准流上方;绿色盒子是绝对定位,所以在蓝色盒子上面;黄色盒子也是绝对定位,但代码书写顺序靠后,所以在绿色盒子上面。

自定义压盖顺序

  • 概述:如果想更改 定位的元素 的压盖顺序,可以设置一个z-index属性。
  • 属性值:数字。
  • 注意事项:
    • 属性值大的会压盖属性值小的,设置z-index属性的会压盖没有设置的。
    • 如果属性值相同,比较HTML书写顺序,后写的压盖先写的。
    • z-index属性只能设置给定位的元素才会生效,如果给没有定位的元素设置,不会生效。
    • 父子盒模型中,如果父子盒子都进行了定位,与其他的父子级有压盖的部分:
      • 父级盒子:如果不设置z-index,后写的压盖先写的;如果设置了z-index,值大的压盖值小的。
      • 子级盒子:如果父级没有设置z-index属性,子级z-index大的会压盖小的;如果父级设置了z-index值,无论子级值是多少,都是父级的值大的子级压盖父级值小的子级,俗称“从父效应”。
    <style>
         .box1{
            background-color: green;
            width: 100px;
            height: 100px;
            position: absolute;
            top: 8px;
            /* 设置压盖顺序 */
            z-index: 1;
        }
    </style>

前端文章汇总目录

https://www.jianshu.com/p/6d80dd616ff4


结束语 :一花一世界,一木一浮生,愿与诸君共勉~




原文地址:访问原文地址
快照地址: 访问文章快照