当前位置: 首页 > 编程日记 > 正文

CSS中position属性( absolute | relative | static | fixed )详解

我们先来看看CSS3 Api中对position属性的相关定义:

  • static:无特殊定位,对象遵循正常文档流。top,right,bottom,left等属性不会被应用。
  • relative:对象遵循正常文档流,但将依据top,right,bottom,left等属性在正常文档流中偏移位置。而其层叠通过z-index属性定义。
  • absolute:对象脱离正常文档流,使用top,right,bottom,left等属性进行绝对定位。而其层叠通过z-index属性定义。
  • fixed:对象脱离正常文档流,使用top,right,bottom,left等属性以窗口为参考点进行定位,当出现滚动条时,对象不会随着滚动。而其层叠通过z-index属性定义。

怎么样,是不是还是很迷糊~~ 没关系,下面就从几个基础概念一一给大家详述:

什么是文档流?

将窗体自上而下分成一行行, 并在每行中按从左至右的顺序排放元素,即为文档流。

只有三种情况会使得元素脱离文档流,分别是:浮动绝对定位相对定位

静态定位(static) :

static,无特殊定位,它是html元素默认的定位方式,即我们不设定元素的position属性时默认的position值就是static,它遵循正常的文档流对象,对象占用文档空间,该定位方式下,top、right、bottom、left、z-index等属性是无效的。

相对定位(relative) :

relative定位,又称为相对定位,从字面上来解析,我们就可以看出该属性的主要特性:相对。但是它相对的又是相对于什么地方而言的呢?这个是个重点,也是最让我迷糊的一个地方,现在让我们来做个测试,我想大家都会明白的:

(1) 初始未定位

[html] view plain copy
  1. /******初始*********/
  2. <style type="text/css">  
  3. #first { width: 200px; height: 100px; border: 1px solid red; }
  4. #second{ width: 200px; height: 100px; border: 1px solid blue;}
  5. </style>  
  6. <body>  
  7. <div id="first"> first</div>  
  8. <div id="second">second</div>  
  9. </body>  
初始原图:

(2) 我们修改first元素的position属性:

[html] view plain copy
  1. <style type="text/css">  
  2. #first{ width: 200px; height: 100px; border: 1px solid red; position: relative; top: 20px; left: 20px;} /*add position*/
  3. #second{width: 200px; height: 100px; border: 1px solid blue;}
  4. </style>  
相对偏移20px后:

 -- >> 虚线是初始的位置空间

现在看明白了吧,相对定位相对的是它原本在文档流中的位置而进行的偏移,而我们也知道relative定位也是遵循正常的文档流,它没有脱离文档流,但是它的top/left/right/bottom属性是生效的,可以说它是static到absoult的一个中间过渡属性,最重要的是它还占有文档空间,而且占据的文档空间不会随 top / right / left / bottom 等属性的偏移而发生变动,也就是说它后面的元素是依据虚线位置( top / left / right / bottom 等属性生效之前)进行的定位,这点一定要理解。

那好,我们知道了top / right / left / bottom 属性是不会对relative定位的元素所占据的文档空间产生偏移,那么margin / padding会让该文档空间产生偏移吗?答案是肯定的,我们一起来做个试验吧:

(3)   添加margin属性:

[html] view plain copy
  1. <style type="text/css">  
  2. #first{width: 200px;height: 100px;border: 1px solid red;position: relative;top: 20px;left: 20px;margin: 20px;} /* add margin*/
  3. #second{width: 200px;height:100px;border: 1px solid blue;}
  4. </style>  
设置margin:20px后:

对比一下,是不是就很清晰了,我们先将first元素外边距设为20px,那么second元素就得向下偏移40px,所以margin是占据文档空间!同理,大家可以自己动手测下padding的效果吧!

绝对定位(absoulte) :

absoulte定位,也称为绝对定位,虽然它的名字号曰“绝对”,但是它的功能却更接近于"相对"一词,为什么这么讲呢?原来,使用absoult定位的元素脱离文档流后,就只能根据祖先类元素(父类以上)进行定位,而这个祖先类还必须是以postion非static方式定位的, 举个例子,a元素使用absoulte定位,它会从父类开始找起,寻找以position非static方式定位的祖先类元素(注意,一定要是直系祖先才算哦~),直到<html>标签为止,这里还需要注意的是,relative和static方式在最外层时是以<body>标签为定位原点的,而absoulte方式在无父级是position非static定位时是以<html>作为原点定位。<html>和<body>元素相差9px左右。我们来看下效果:

(4) 添加absoulte属性:

[html] view plain copy
  1. <html>  
  2. <style type="text/css">  
  3. html{border:1px dashed green;}
  4. body{border:1px dashed  purple;}
  5. #first{ width: 200px;height: 100px;border: 1px solid red;position: relative;}
  6. #second{ width: 200px;height: 100px;border: 1px solid blue;position: absolute;top :0;left : 0;}
  7. </style>  
  8. <body>  
  9. <div id="first">relative</div>  
  10. <div id="second">absoult</div>  
  11. </body>  
  12. </html>  
效果图:

哈哈,看了上面的代码后,细心的朋友肯定要问了,为什么absoulte定位要加 top:0; left:0; 属性,这不是多此一举呢?

其实加上这两个属性是完全必要的,因为我们如果使用absoulte或fixed定位的话,必须指定 left、right、 top、 bottom 属性中的至少一个,否则left/right/top/bottom属性会使用它们的默认值 auto ,这将导致对象遵从正常的HTML布局规则,在前一个对象之后立即被呈递简单讲就是都变成relative,会占用文档空间,这点非常重要,很多人使用absolute定位后发现没有脱离文档流就是这个原因,这里要特别注意~~~

少了left/right/top/bottom属性不行,那如果我们多设了呢?例如,我们同时设置了top和bottom的属性值,那元素又该往哪偏移好呢?记住下面的规则:

  • 如果top和bottom一同存在的话,那么只有top生效。
  • 如果left和right一同存在的话,那么只有left生效。

既然absoulte是根据祖先类中的position非static元素进行定位的,那么祖先类中的margin/padding会不会对position产生影响呢?看个例子先:

(5) 在absoulte定位中添加margin / padding属性:

[html] view plain copy
  1. #first{width: 200px;height: 100px;border: 1px solid red;position: relative;margin:40px;padding:40px;}
  2. #second{width: 200px;height:100px;border: 1px solid blue;position: absolute;top:20px;left:20px;}
  3. <div id="first">first  
  4. <div id="second">second</div>  
  5. </div>  
效果图:

看懂了,祖先类的margin会让子类的absoulte跟着偏移,而padding却不会让子类的absoulte发生偏移。总结一下,就是absoulte是根据祖先类的border进行的定位。

Note : 绝对(absolute)定位对象在可视区域之外会导致滚动条出现。而放置相对(relative)定位对象在可视区域之外,滚动条不会出现。

固定定位(fixed):

fixed定位,又称为固定定位,它和absoult定位一样,都脱离了文档流,并且能够根据top、right、left、bottom属性进行定位,但不同的是fixed是根据窗口为原点进行偏移定位的,也就是说它不会根据滚动条的滚动而进行偏移。

z-index属性:

z-index,又称为对象的层叠顺序,它用一个整数来定义堆叠的层次,整数值越大,则被层叠在越上面,当然这是指同级元素间的堆叠,如果两个对象的此属性具有同样的值,那么将依据它们在HTML文档中流的顺序层叠,写在后面的将会覆盖前面的。需要注意的是,父子关系是无法用z-index来设定上下关系的,一定是子级在上父级在下。

Note:使用static 定位或无position定位的元素z-index属性是无效的。

转载于:https://www.cnblogs.com/zhimo/p/7268719.html

相关文章:

ASP.NET 2.0 ajax中gridView的刷新问题!

我是一个经常使用ASP.NET2.0的开发人员,最近看了ajax课程,也想使用一下Ajax这个强大的技术,我就使用了,在一个UpdatePanel中放入了一个gridView,果然能达我的满意效果,设置了gridView中的分页,相应的代码我都已经写好了.唯一的问题是当我点击了第二页的时候,我再点击刷新,当前页…

心灵小栈: 镌刻在地下500米的母爱

这位母亲叫赵平饺&#xff0c;今年48岁。谁能想到&#xff0c;在不见天日的煤井深处&#xff0c;她已经弓着脊梁爬行了13 年。1993年&#xff0c;赵平姣的丈夫陈达初在井下作业时被矿车压断了右手的三根手指。此后他只能在井上干轻活&#xff0c;收入少了一大截。为了供女儿陈娟…

js学习总结----crm客户管理系统之项目开发流程和api接口文档

CRM ->客户管理系统 CMS ->内容发布管理系统 ERP ->企业战略信息管理系统 OA -> 企业办公管理系统 产品 / UI设计&#xff1a;需求分析&#xff0c;产品定位&#xff0c;市场调查...按照产品的规划设计出对应的效果图(PSD->photoshop) 前端开发工程师 API接口文…

数据结构--数组队列的实现

数据结构--数组模拟队列1. 说明2. 实现代码1. 数组队列类2.数组队列测试类3.代码运行结果3.完整代码1. 说明 队列是一个有序列表&#xff0c;可以用数组或者链表来实现。 遵循先入先出&#xff08;FIFO&#xff09;的原则&#xff0c;即先存入列的数据&#xff0c;会被先取出&…

DIV+CSS一行两列布局

实现效果&#xff1a; main 我是包在外面的div col1 我是第一列col2 我是第二列clear-float;我用来清除浮动&#xff08;清除float&#xff09;以下是说明&#xff1a;CSS代码&#xff1a;.main{width:800px;/* 总的宽度 */ background:red; } .main .col1{ float:left;/* 这个…

编程上标和下标使用方法

1.问题&#xff1a;写代码要求显示平方、立方、化学符号等等完全写不出来&#xff0c;Word写出来复制出来也不管用 2.办法&#xff1a;Unicode下标和上标 3.举例&#xff1a;string.Format("{0} km\xB2"&#xff0c;1000&#xff09;&#xff0c;单位是平方千米&…

上周新闻回顾:微软补丁个个紧急 奥运网络百花齐放

也许是美国不是黄金周的原因&#xff0c;五一刚过&#xff0c;直接来自国外的新产品发布等IT新闻就源源不断涌来&#xff0c;倒是国内的新闻发布不是非常多。不过&#xff0c;微软的5月安全补丁如期发布&#xff0c;还是值得大家关注的。此外&#xff0c;关于2008年奥运会网络建…

rest-framework之解析器

rest-framework之解析器 本文目录 一 解析器的作用二 全局使用解析器三 局部使用解析器四 源码分析回到目录一 解析器的作用 根据请求头 content-type 选择对应的解析器对请求体内容进行处理。 有application/json&#xff0c;x-www-form-urlencoded&#xff0c;form-data等格式…

httpd常用配置

author&#xff1a;JevonWei版权声明&#xff1a;原创作品 检查配置文件时&#xff0c;如下提示&#xff0c;则因为没有server的服务名称导致&#xff0c;故设置网站的服务server名称&#xff0c;若没有设置web服务名&#xff0c;主默认解析系统主机名(添加主机名解析) [rootda…

[导入]C#中实现Socket端口复用

一、什么是端口复用&#xff1a;   因为在winsock的实现中&#xff0c;对于服务器的绑定是可以多重绑定的&#xff0c;在确定多重绑定使用谁的时候&#xff0c;根据一条原则是谁的指定最明确则将包递交给谁&#xff0c;而且没有权限之分。这种多重绑定便称之为端口复用。 二、…

数据结构学习系列文章合集

数据结构学习系列文章目录前言1.稀疏数组和队列稀疏数组和二位数组的转换数组队列的实现环形队列的介绍与实现2.链表单链表的增、删、改、查总结前言 学习数据结构记录&#xff0c;作为自己的笔记&#xff0c;同时也可以方便大家一起交流和学习 1.稀疏数组和队列 稀疏数组和二…

支付宝Payto接口的c#.net实现

它现在这种支付方式比较多象网银在线等使用的方法都是url验证&#xff0c;就是通过url参数和一个这些url参数的md5编码来确认这个连接的正确性&#xff0c;支付宝在你购买成功后跳转自定义连接的时候会传2次过来&#xff0c;第一次是数据底层请求&#xff0c;第二次是web请求&a…

【Visual Studio 扩展工具】如何在ComponentOneFlexGrid树中显示RadioButton

概述 在ComponentOne Enterprise .NET控件集中&#xff0c;FlexGrid表格控件是用户使用频率最高的控件之一。它是一个功能强大的数据管理工具&#xff0c;轻盈且灵动&#xff0c;以分层的形式展示数据&#xff08;数据呈现更加直观&#xff09;。 FlexGrid 简介 FlexGrid 是业界…

如何 SQL Server 2005 实例之间传输登录和密码

INTRODUCTION 本文介绍如何不同服务器上的 Microsoft SQL Server 2005 实例之间传输登录和密码。 本文, 服务器 A 和服务器 B 是不同的服务器。 此外, 服务器 A 和 B 服务器都运行 SQL Server 2005。 将数据库从服务器 A 上的 SQLServer 实例移到 B, 服务器上的 SQLServer 实例…

IDEA配置GitHub报错GitHub Invalid authentication data.404 Not Found-Not Found

登录账户GitHub Invalid authentication data.404 Not Found-Not Found报错及解决办法1 登录自己的github账号--》头像---》settting2 Developer settings3 Personal access tokens4 回到IDEA中&#xff0c;粘贴上自己的token就可以了想要把自己的代码上传到GitHub中&#xff0…

console.log 简写

console.log 简写 平常代码调试总会用到console.log&#xff0c;但是每次写这么长也是很麻烦&#xff0c;就想着存一个简介一点的变量&#xff1b; 然后就随手写了下面代码&#xff1b; var a 10;var log console.log;log(a);调用的时候发现火狐浏览器报错了&#xff0c;仔细…

为何我的BLOG不能DIY?

今天想把MODULE调整一下&#xff0c;居然搞不定。估计是服务器又出问题了........不知道51CTO有没有备份我们的博克呀&#xff1f;

Java中的自动装箱和拆箱

自动装箱和拆箱自动装箱和拆箱自动装箱&#xff1a;拆箱1. 为什么要有包装类(或封装类&#xff09;2. 基本数据类型与对应的包装类&#xff1a;3. 类型间的转换4. 何时发生自动装箱和拆箱赋值、数值运算时方法调用时&#xff1a;自动装箱、拆箱中的坑自动装箱和拆箱 目的&…

【Java】身份证号码验证

代码引用自&#xff1a;https://gitee.com/appleat/codes/ynrtqujv0wfgesm8ia9b547 1 package xxx;2 3 /**4 * Created by wdj on 2017/6/21.5 */6 7 import java.text.ParseException;8 import java.text.SimpleDateFormat;9 import java.util.Calendar;10 import java.util…

linux history记录格式修改

#保存一万条命令记录 sed -i s/^HISTSIZE1000/HISTSIZE10000/g /etc/profile#在/etc/profile的文件尾部添加如下行数配置信息 ######jiagu history xianshi######### USER_IPwho -u am i 2>/dev/null | awk {print $NF} | sed -e s/[()]//g if [ "$USER_IP" &quo…

从EAI到SOA

写在前面SOA现在越发闹腾的厉害了&#xff0c;各种宣传越来越多&#xff0c;都把SOA吹上天&#xff1b;到底SOA是什么&#xff0c;有啥神奇之处&#xff0c;真的想宣传说的那么好吗&#xff1f;看了种种文章&#xff0c;只是越发混沌。罢了&#xff0c;俺做技术的&#xff0c;商…

用C#实现FTP搜索引擎

晚辈最近用C#写了一个教育网FTP搜索引擎&#xff0c;希望能得到高手的指点。 网址&#xff1a;http://soso.ccnu.com.cn http://it.ccnu.edu.cn/soso 部分代码&#xff1a; using System;using softplib;using System.Threading;using System.Collections;using System.Ne…

IDEA配置GitHub和Gitee

IDEA配置GitHub和GiteeIDEA配置GitHub和GiteeGit准备IDEA内配置Git配置GitHub1. IDEA的Settings-->Version Control ---> GitHub2. 登录账户GitHub Invalid authentication data.404 Not Found-Not Found报错及解决办法2.1 登录自己的github账号--》头像---》settting2.2…

MATLAB 2014a (8.3) Compiler Runtime (MCR)

在安装的时候可以 ./install -H 界面化安装到自己目录下 MATLAB 2014a (8.3) Runtime Compiler (MCR) Errors when trying to launch deployed (using deploy tool) application in Ubuntu 13.04. Right after installation of MCR if one runs the deployed application follo…

[Quiz]竞赛题目 Word Trace

一、竞赛题目Problem Statement You are given a String[] grid representing a rectangular grid of letters. You are also given a String find, a word you are to find within the grid. The starting point may be anywhere in the grid. The path may move up, down, le…

c#总结最近的几项重要代码

java的代码就不说了&#xff0c;毕竟不是我的主业。 1.c#数据库连接池Hikari. (1)动态加载各类数据库驱动 &#xff08;2&#xff09;支持简单配置文件 &#xff08;3&#xff09;支持按照名称多数据库调用 &#xff08;4&#xff09;使用简洁 单数据库使用&#xff1a; Hikari…

动态模板列更新数据分页的例子

前台&#xff1a;<% Page language"c#" Codebehind"WebForm30.aspx.cs" AutoEventWireup"false" Inherits"csdn.WebForm30" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <HTML>…

[您有新的未分配科技点]可,可,可持久化!?------0-1Trie和可持久化Trie普及版讲解...

这一次&#xff0c;我们来了解普通Trie树的变种&#xff1a;0-1Trie以及在其基础上产生的可持久化Trie&#xff08;其实&#xff0c;普通的Trie也可以可持久化&#xff0c;只是不太常见&#xff09; 先简单介绍一下0-1Trie&#xff1a;一个0-1Trie节点只有两个子节点&#xff0…

SQL查询1064报错 [ERR] 1064 - You have an error in your SQL syntax; check the manual.......

MySQL建表出现1064问题问题 SQL语句 DROP DATABASE IF EXISTS bookstore; DROP DATABASE bookstore; USE bookstore; CREATE TABLE t_user (id INT PRIMARY KEY auto_increment,username VARCHAR ( 20 ) NOT NULL UNIQUE,password VARCHAR ( 32 ) NOT NULL,email VARCHAR ( …

移动端丨-webkit-overflow-scrolling:touch属性导致页面卡住

起因 起因-webkit-overflow-scrolling问题解决方案&#xff1a; 方案一方案二思考为什么会出现这个问题总结故事的起因是&#xff0c;在一个多列表的页面上&#xff0c;页面在iOS11&#xff0c;跟iOS10中会发生页面卡住&#xff0c;不能进行滚动。 然后就怀疑是自己的样式写的出…