一些关于定位和叠加的理解

一、position属性

position有5个值,分别为static,relative,absolute,fixed,sticky。

1.1 static

static是position的默认属性,元素会按正常的文档流进行排序,不会受到top,bottom,left,right的影响。

1.2 relative

relative相对定位的元素会较正常文档流中的位置进行偏移,受top,bottom,left,right的影响。就是元素还在文档流中像static一样占着位置,但视觉上会有偏移,多用于absolute绝对定位的父元素。

1.3 absolute

absolute绝对定位会脱离正常的文档流,相对于最近的进行过定位的(非static)父级元素定位,若没有父级元素进行过定位,则相对于即浏览器窗口定位。

1.4 fixed

fixed固定定位同样是脱离正常的文档流,一直相对于浏览器窗口定位,无论页面如何滚动,此元素总在屏幕的同一个位置。
注:当fixed定位的父元素使用了transform的样式时,fixed定位会失效,变成和absolute一样的效果。

1.5 sticky

sticky粘性定位需要指定 top,right,bottom,left 四个阈值其中之一才会生效。
阈值为此元素在可视区域中与边界的距离,跨越特定阈值前为相对定位(relative),当页面滚动导致此元素跨越阈值则变为固定定位(absolute)。
注:此属性兼容性不是特别好,请根据业务场景进行选择。
附兼容性传送门:https://caniuse.com/#search=sticky

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><div class="box"><div>title</div><div class="stickyBar">stickyBar</div><p>this is a paragraph!this is a paragraph!this is a paragraph!this is a paragraph!this is a paragraph!this is a paragraph!this is a paragraph!this is a paragraph!this is a paragraph!this is a paragraph!this is a paragraph!this is a paragraph!this is a paragraph!this is a paragraph!</p></div>
</body>
</html>
<style>div.box{height: 2000px;}div.stickyBar {position: -webkit-sticky;position: sticky;top: 0;padding: 5px;background-color: #cae8ca;border: 2px solid #4CAF50;width: 200px;}div p {width: 200px;}
</style>

效果:

二、元素叠加时的几种状态

实际开发过程中免不了遇到元素的叠加问题,大都可以使用除static以外的定位方式(relative,absolute,fixed,sticky),配合z-index来控制叠加的展示方式(z-index只在position不为static时才生效)。
注:父级加transform、opacity会使子元素的z-index失效,因为它们会创建新的stacking context,然后子元素原来设置的z-index会作用到这个新的stacking context上。
以下是可能的几种情况:

2.1

同一级别的元素,定位方式相同且没有设置z-index,在html结构中靠后的元素在上面。
注:同级别的static元素也可以叠加。常见的方法有把margin设为负数或使用transform。用transform的话,需要把两个元素都加上transform,这样在html结构中靠后的元素会在上面,否则加了transform的会展示在没加transform的元素上面。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><div class="one"><p>divOne</p><p>position: absolute;</p></div><div class="two"><p>divTwo</p><p>position: absolute;</p></div>
</body>
</html>
<style>p {margin: 0;}div {width: 200px;height: 200px;border: 1px solid black;}.one {position: absolute;background-color: red;top: 10px;left: 10px;}.two {position: absolute;background-color: blue;top: 100px;left: 100px;}
</style>

2.2

同一级别的元素使用了relative,absolute,fixed,sticky,那么z-index值大的元素在上面。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><div class="one"><p>divOne</p><p>position: relative;</p></div><div class="two"><p>divTwo</p><p>position: absolute;</p></div>
</body>
</html>
<style>p {margin: 0;}div {width: 200px;height: 200px;border: 1px solid black;}.one {position: relative;background-color: red;top: 10px;left: 10px;z-index: 99;}.two {position: absolute;background-color: blue;top: 50px;left: 100px;z-index: 1;}
</style>

2.3

同级别的元素,relative,absolute,fixed,sticky定位会在static上面。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><div class="one"><p>absolute</p></div><div class="two"><p>static</p></div>
</body>
</html>
<style>p {margin: 0;}div {width: 200px;height: 200px;border: 1px solid black;box-sizing: border-box;}.one {position: absolute;background-color: red;top: 0;left: 0;}.two {position: static;background-color: blue;margin: 100px 0 0 100px;padding-top: 100px;}
</style>

2.4

非同级别的使用了relative,absolute,fixed,sticky的元素,他们的叠加顺序是以非static的最上层的祖级元素的z-index进行比较的,没有非static的祖级则用自身进行比较,与此元素的子元素的z-index无关,再高都没用。
文字描述不是很清晰,举几个例子:

example1

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><div class="one"><p>absolute</p><p>z-index:2</p><div class="child"><p style="padding-left: 28px">absolute</p><p style="padding-left: 28px">z-index:1</p></div></div><div class="two"><p style="padding-left: 100px">absolute</p><p style="padding-left: 100px">z-index:1</p><div class="child"><p style="padding-left: 28px">absolute</p><p style="padding-left: 28px">z-index:99</p></div></div>
</body>
</html>
<style>p {margin: 0;}div {width: 200px;height: 200px;border: 1px solid black;box-sizing: border-box;}div .child {width: 100px;height: 100px;margin: 0 0 0 70px;position: relative;font-size: 14px;}.one {position: absolute;background-color: red;top: 0;left: 0;z-index: 2;}.one .child {background-color: palevioletred;z-index: 1;}.two {position: absolute;background-color: blue;top: 100px;left: 100px;z-index: 1;}.two .child {background-color: purple;z-index: 99;}
</style>
example2

可以实现父元素在底下,子元素在上面的情况。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><div class="one"><p>static</p><div class="child"><p style="padding-left: 28px">relative</p><p style="padding-left: 28px">z-index:1</p></div></div><div class="two"><p style="padding-left: 100px">static</p><div class="child"><p style="padding-left: 28px">static</p></div></div>
</body>
</html>
<style>p {margin: 0;}div {width: 200px;height: 200px;border: 1px solid black;box-sizing: border-box;}div .child {width: 100px;height: 100px;margin: 0 0 0 70px;font-size: 14px;}.one {position: static;background-color: red;}.one .child {position: relative;background-color: palevioletred;z-index: 1;}.two {position: static;background-color: blue;margin: -150px 0 0 75px;}.two .child {position: static;background-color: purple;}
</style>
example3

稍微复杂一点的情况

2.5

最后再来看一种被transform影响到的情况。

父级红色未加transform

父级红色加了transform

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><div class="one"><div class="oneChild"></div></div><div class="two"></div>
</body>
</html>
<style>p {margin: 0;}div {width: 200px;height: 200px;border: 1px solid black;}.one {position: static;background-color: red;/*transform: translate(1px,1px);*/}.oneChild {width: 100px;height: 100px;background-color: pink;margin: 50px 0 0 50px;position: relative;z-index: 2;}.two {position: absolute;background-color: blue;top: 100px;left: 100px;z-index: 1;}
</style>

CSS中position详解相关推荐

  1. CSS中position详解与常见应用实现

    在web前台开发时候,我们必不可少的会用到postion属性进行布局定位. 今天总结了一下position知识点,与常用功能与大家分享,欢迎大家交流指正. 首先我们对postion属性进行详解. 在C ...

  2. css中float详解,CSS浮动属性Float详解?史上最全Float详解

    我们在学习css样式的时候,都知道css是盒概念,并且每一个盒子都是一个元素,下面我们就对CSS浮动属性Float进行详解,让你彻底了解Float. 一:什么是Float浮动? Float浮动是css ...

  3. CSS之Position详解

    CSS的很多其他属性大多容易理解,比如字体,文本,背景等.有些CSS书籍也会对这些简单的属性进行大张旗鼓的介绍,而偏偏忽略了对一些难缠的属性讲解,有避重就轻的嫌疑.CSS中主要难以理解的属性包括盒型结 ...

  4. css 定位position详解,background注意事项 哒哒哒 -----20181119

    1.定位position:relative ||  absolute ||  fixed生成绝对定位的元素,相对于浏览器窗口进行定位.||  inherit (1)属性解释 ①````position ...

  5. CSS中list-style详解

    取消默认的圆点和序号可以这样写list-style:none;, list的属性如下: list-style-type:square;//正方形 list-style-position:inside; ...

  6. html css position,[CSS]CSS Position 详解

    一. CSS position 属性介绍 CSS中position属性指定一个元素(静态的,相对的,绝对或固定)的定位方法的类型.有static,relative,absolute和fixed四种取值 ...

  7. CSS margin属性详解

    CSS margin属性详解 我发现当我想写好一篇博文的时候,希望以后能有人看到,会对别人也有一定的帮助,这时候对于其中的内容就变得深思熟虑起来,让自己查阅尽可能多的资料,这样的方式正好可以弥补我某些 ...

  8. HTML使用CSS的方法详解

    HTML使用CSS的方法详解 在尝试学习 CSS 之前,您应该了解 HTML 的基础知识,或者同时学习 HTML 和 CSS. html是超文本编辑语言,是用来定义页面结构的,html有很多图文或者视 ...

  9. [转]CSS hack大全详解

    转自:CSS hack大全&详解 1.什么是CSS hack? CSS hack是通过在CSS样式中加入一些特殊的符号,让不同的浏览器识别不同的符号(什么样的浏览器识别什么样的符号是有标准的, ...

最新文章

  1. mysql中备份和导出的区别_mysql的备份和导出
  2. ITK:像素是否在区域内
  3. 《C++必知必会》读书笔记2
  4. iOS8+ UITableView自动计算cell高度并缓存
  5. 浅入深出之Java集合框架(中)
  6. linux中内部命令有哪些,linux内部命令有哪些
  7. Xshell替代品 -- FinalShell
  8. 网络虚拟化有几种实现方式_机械零件表面实现镜面的几种加工方式
  9. Js 日期 多少分钟前,多少秒前
  10. iso硬盘安装 凤凰os_X86平台国产OS 对比评测 | 凤凰os安装教程_什么值得买
  11. 最详细的世界集成电路发展历史足迹
  12. 分布式数据库核心原理
  13. 9.电阻线性电压转换电路
  14. arduino mega针脚_Arduino MEGA串口TX1、RX1使用方法
  15. Java实现人民币大小写转换
  16. Top01-0010、img标签的属性
  17. 面试之其他面试题归类
  18. USB驱动转换成VISA驱动供Labview调用
  19. 横井军平(WIKI资源收集)
  20. zookeeper控制台

热门文章

  1. 前端微信公众号开发,CSS浮动的使用与清除
  2. 15分钟学会ARIMA-基于R语言
  3. Quartz修改JobDetail
  4. Reset recovery and removal time
  5. 51单片机之IO口扩展——74HC595芯片串行转并行实验
  6. uniapp——开发微信H5调用jweixin微信js-sdk(uniapp开发H5使用微信扫一扫功能)
  7. SpringBoot JPA配置多数据源(同类型库)教程
  8. 2021全球与中国显微镜载玻片市场现状及未来发展趋势
  9. 研究生毕业1年论文被抽检不合格,网友喊话:翟天临,你睡了吗?
  10. 工作中办公文件共享用什么软件比较便捷?