慕课前端入门-CSS定位

1.position属性

属性值:static,relative,absolute,fixed,sticky,inherit
top,left,right,bottom,z-index

1.1 static

static又称静态定位/常规定位/自然定位,定位中的一股清流,回归本真

作用使元素定位于常规/自然流中(块、行垂直排列下去、行内水平从左到右),如图1
特点1.忽略top,bottom,left,right,z-index声明,如图2
2.两个相邻的元素如果都设置了外边距,那么最终外边距=两者外边距中最大的,如图3
3.具有固定width和height值的元素,如果把左右外边距设置为auto,则左右外边距会自动扩大占满剩余宽度。造成的效果就是这个块水平居中,如图4

自然流示例-图1

自然流示例-图2

自然流示例-图3

自然流示例-图4

1.2 relative

如果元素被选择了使用relative这种模型,它会变成一个可定位的祖先元素,可以被别人当作定位的标杆、参照物。

作用使元素成为containing-block,官话是可定位的祖先元素
特点1.可以使用top/right/bottom/left/z-index进行相对定位——相对的是自己在常规流中原来的位置进行偏移,见图1
2.相对定位的元素不会离开常规流——心念家乡,见图1
3.任何元素都可以设置为relative,它的绝对定位的后代都可以相对于它进行绝对定位——超好用
4.可以使浮动元素发生偏移,并控制它们的堆叠顺序,如图2

相对流示例-图1

相对流示例-图2

1.3 absolute

作用使元素脱离常规流
特点1.脱离常规流,不再保留位置,如图1
2.设置尺寸要注意:百分比比的是谁?最近定位祖先元素,如图2
3.left/right/top/bottom如果设置为0 它将对齐到最近定位祖先元素的各边——衍生出一个居中妙计
4.left/right/top/bottom如果设置为auto 它将被打回原形
5.如果没有最近定位祖先元素 会认body做父元素
6.z-index可以控制堆叠顺序

绝对流示例-图1

绝对流示例-图2
如果长和宽设置的是百分比,而不是具体的值。其百分比比的是最近定位祖先元素(设置relative就会变为定位祖先元素);如果没有,就是body

绝对流示例-图3
场景:正文旁边的小广告。只需要将元素设置为relative,再将小广告设置为absolute即可。

宽高偏移属性外边距效果
不设置0不设置撑满父元素,如图4
不设置auto不设置不可见,元素区域为0,如图5
设置0、auto不设置原样展示,没有任何效果,如图6,7
设置0auto居中,如图8
设置autoauto原样展示,没有任何效果,如图9

绝对流示例-图4
绝对定位元素未设置宽高,偏移属性设置为0,元素就会填充整个容器。

绝对流示例-图5
绝对定位元素未设置宽高,偏移属性设置为auto,元素的区域为0,将不可见。

绝对流示例-图6
绝对定位元素设置宽高,偏移属性设置为0,会被打回原形。

绝对流示例-图7
绝对定位元素设置宽高,偏移属性设置为auto,会被打回原形。

绝对流示例-图8
绝对定位元素设置宽高,偏移属性设置为0,外边距设置为auto,元素会相对定位祖先元素居中展示。
注意:margin必须和偏移属性配合使用,否则没有效果。

绝对流示例-图9
绝对定位元素设置宽高,偏移属性设置为auto,外边距设置为auto,会被打回原形。

1.4 fixed 固定定位

fixed常用域狗皮膏药广告

作用在视口固定位置,不受任何元素的影响
特点1.跟absolute区别:absolute相对于最近定位祖先元素,而fixed相对于视口固定不变。
2.固定定位元素不会随着视口滚动而滚动
3.继承absolute特点,也可以设置偏移量,层叠顺序。

1.5 position之sticky

当滚动到特定位置时,导航栏在固定。

作用relative+fixed的完美结合,制造出吸附效果
特点1.如果产生偏移,原位置还是在常规流中,即保留原位置
2.如果它的祖先元素有滚动,那么它的偏移标尺就是最近祖先元素
3.如果最近祖先元素没有滚动,那么它的偏移标尺是视口
4.上下左右的偏移规则

问题:为什么设置top呢?
当我们不设置top的时候,或者将它设置为自动,它是没有偏移效果的。在磁贴定位模型中,如果没有给目标元素设置偏移量或者偏移属性,它的特性是跟relative一致的。还是在常规流中,不会有特殊的效果。
当给它设置偏移量的时候,他会按照偏移规则做一个偏移。
偏移量:top:0为例,从祖先元素的顶部开始,以目标元素的高和宽,绘制一个矩形。当页面向上滚动时,一旦这个矩形和元素重合,即捕获了这个目标元素,会说目标元素进入了定位矩形。当它进入这个定位矩形中,就变成了固定定位,具备了固定定位的特性。当页面向下滚动,离开定位矩形,就失去了固定定位的特性。
规则:在祖先元素的置顶位置,会以当前元素高和宽绘制一个矩形。矩形捕获目标元素,就固定;离开,就不再固定。
磁贴定位流示例-图1

磁贴定位流示例-图2

2.补充

2.1 box-sizing

属性描述
inherit规定从父元素继承box-sizing属性的值
content-box在宽度和高度之外绘制元素的内边距和边框,默认
width=元素的宽度
height=元素的高度
border-box从已经设定的宽度和高度中分别减去边框和内边距之后得到的值
width=padding+border+元素的宽度
height=padding+border+元素的高度

2.2 nth-child()

nth-child(n):匹配属于其父元素的第n个元素。不论元素的类型;其中n可以是数字、关键字或公式。
nth-child(odd):当n为odd和even时:可用于匹配下表是奇数或偶数的子元素的关键词

注意:
      第一个元素的下标是1,即元素的下标是从1开始的
      IE不支持:nth-child()选择器

2.3 z-index

z-index属性设置元素的堆叠顺序。拥有更高堆叠顺序的元素总是会处于堆叠顺序较低的元素的前面。

描述
auto默认。堆叠顺序与父元素相等
number设置元素的堆叠顺序
inherit规定应该从父元素继承z-index属性的值
注意:
      1.z-index值可以为负值
      2. z-index仅能在定位元素上奏效,如relative,absolute,fixed
      3. z-index不能逾越层级

3.总结

盒子:通过改变元素的内边距或外边距来实现盒子的移动
定位:通过改变元素的位置移动来实现盒子的移动

4.利用定位属性来实现导航跟随效果

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
  <!-- <link rel="stylesheet" type="text/css" href="./reset.css"> -->
  <style>
    *{margin:0;padding:0;}
    .page{
      width: 100%;
      height: 4043px;
      background:aquamarine;
    }
    .nav{
      width: 160px;
      height: 205;
      font-family: '微软雅黑';
      position: fixed;
      /* 实现导航居中,先利用位置移动到50%处,再向上挪动一半的距离*/
      left: 0;
      top: 50%;
      margin-top: -103px; 
    }
    .nav-li{
      width: 160px;
      height: auto;/*40px*/
      border-bottom: 1px solid #fff;
      background: #333;
      text-align: center;
      line-height: 40px;
      color: #fff;
      font-size: 16px;
      cursor: pointer;
    }
    .title{
      width: 160px;
      height: 40px;
    }
    .nav-li ul{
      width: 160px;
      height: auto;
      background:#fff;
      display: none;
    }
    .nav-li:hover ul{
      display: block;

    }
    .nav-li ul li{
      width: 160px;
      height: 40px;
      border-bottom: 1px dashed #666;
      color:#333;
      text-align: center;
      line-height: 40px;
      list-style-type: none;
      position: relative;
    }
    .nav-li ul li:hover .list-3{
      display: block;
    }
    .list-3{
      width: 160px;
      height: auto;
      position: absolute;
      left: 150px;
      top: 0px;
      display: none;
    }
    .list-3Dom{
      width: 160px;
      height: 40px;
      background:#444;
      border-bottom: 1px solid #fff;
      text-align: center;
      line-height: 40px;
      color:#fff;
    }
  </style>
</head>
<body>
  <div class="page">
    <div class="nav">
      
      <div class="nav-li">
        <div class="title">慕课网的标题</div>
        <ul>
          <li>二级栏目
            <div class="list-3">
              <div class="list-3Dom">三级栏目</div>
              <div class="list-3Dom">三级栏目</div>
              <div class="list-3Dom">三级栏目</div>
            </div>
          </li>
          <li>二级栏目
            <div class="list-3">
              <div class="list-3Dom">三级栏目</div>
              <div class="list-3Dom">三级栏目</div>
              <div class="list-3Dom">三级栏目</div>
            </div>
          </li>
          <li>二级栏目
            <div class="list-3">
              <div class="list-3Dom">三级栏目</div>
              <div class="list-3Dom">三级栏目</div>
              <div class="list-3Dom">三级栏目</div>
            </div>
          </li>
        </ul>
      </div>
      
      <div class="nav-li">
        <div class="title">慕课网的标题</div>
        <ul>
          <li>二级栏目
            <div class="list-3">
              <div class="list-3Dom">三级栏目</div>
              <div class="list-3Dom">三级栏目</div>
              <div class="list-3Dom">三级栏目</div>
            </div>
          </li>
          <li>二级栏目
            <div class="list-3">
              <div class="list-3Dom">三级栏目</div>
              <div class="list-3Dom">三级栏目</div>
              <div class="list-3Dom">三级栏目</div>
            </div>
          </li>
          <li>二级栏目
            <div class="list-3">
              <div class="list-3Dom">三级栏目</div>
              <div class="list-3Dom">三级栏目</div>
              <div class="list-3Dom">三级栏目</div>
            </div>
          </li>
        </ul>
      </div>
      
      <div class="nav-li">
        <div class="title">慕课网的标题</div>
        <ul>
          <li>二级栏目
            <div class="list-3">
              <div class="list-3Dom">三级栏目</div>
              <div class="list-3Dom">三级栏目</div>
              <div class="list-3Dom">三级栏目</div>
            </div>
          </li>
          <li>二级栏目
            <div class="list-3">
              <div class="list-3Dom">三级栏目</div>
              <div class="list-3Dom">三级栏目</div>
              <div class="list-3Dom">三级栏目</div>
            </div>
          </li>
          <li>二级栏目
            <div class="list-3">
              <div class="list-3Dom">三级栏目</div>
              <div class="list-3Dom">三级栏目</div>
              <div class="list-3Dom">三级栏目</div>
            </div>
          </li>
        </ul>
      </div>
      
      <div class="nav-li">
        <div class="title">慕课网的标题</div>
        <ul>
          <li>二级栏目
            <div class="list-3">
              <div class="list-3Dom">三级栏目</div>
              <div class="list-3Dom">三级栏目</div>
              <div class="list-3Dom">三级栏目</div>
          </div>
          </li>
          <li>二级栏目
            <div class="list-3">
              <div class="list-3Dom">三级栏目</div>
              <div class="list-3Dom">三级栏目</div>
              <div class="list-3Dom">三级栏目</div>
          </div>
          </li>
          <li>二级栏目
            <div class="list-3">
              <div class="list-3Dom">三级栏目</div>
              <div class="list-3Dom">三级栏目</div>
              <div class="list-3Dom">三级栏目</div>
            </div>
          </li>
        </ul>
      </div>

      <div class="nav-li">
        <div class="title">慕课网的标题</div>
        <ul>
          <li>二级栏目
            <div class="list-3">
              <div class="list-3Dom">三级栏目</div>
              <div class="list-3Dom">三级栏目</div>
              <div class="list-3Dom">三级栏目</div>
            </div>
          </li>
          <li>二级栏目
            <div class="list-3">
              <div class="list-3Dom">三级栏目</div>
              <div class="list-3Dom">三级栏目</div>
              <div class="list-3Dom">三级栏目</div>
            </div>
          </li>
          <li>二级栏目
            <div class="list-3">
              <div class="list-3Dom">三级栏目</div>
              <div class="list-3Dom">三级栏目</div>
              <div class="list-3Dom">三级栏目</div>
            </div>
          </li>
        </ul>
      </div>

    </div>
  </div>
</body>
</html>
posted on 2020-06-02 21:30  singleSpace  阅读(185)  评论(0编辑  收藏  举报