侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

推荐深入理解css中的position定位和z-index属性

前端  /  管理员 发布于 7年前   165

由于平时不太用到,所以过去写css的时候对于position属性的absolute、relative值理解比较模糊,对于z-index的层叠更是摸不着头脑,除了理解的因素外,各个浏览器的不同解析结果也是一个大问题。

今天仔细阅读了一下css文档,总算是对盒模型的浮动、定位有了比较深刻的理解。


我们在实践中很有可能遇到这样的问题:

1、做一个横向导航,然后鼠标经过之后出现下拉菜单,那么这个下拉菜单的位置控制就是一个关键;

2、我们想在一个正常的页面布局中放入几个浮在页面上的气泡提示,这时既不想让气泡提示破坏正常的文档布局,又不想气泡提示的定位在不同的浏览器中到处乱飘。

3、当我们在一句正常的文本中插入一个小图标的话,一般会使用<img />标签,而这时它的垂直居中问题又是让人困惑,无论你使用html属性absmiddle、或是使用css属性vertical-align、抑或是使用父对象的heigh + line-height,在不同的浏览器中总会看起来不同。


嗯,上面几个问题你是否也遇到过呢?

如果你至今还没有一个很好的解决办法,不妨继续阅读此文,或许能对你有所帮助

我们先看一下position属性的几个取值定义:

position: static、absolute、relative

static : 

默认值。

如果没有指定position属性,支持position属性的html对象都是默认为static,

可以这么理解:

把html页面看作一个文档流,源代码中各个标签的先后位置就是它们所对应的对象的呈现次序,所有取值为static的对象都按照你所编写的html标签的顺序依次呈现。


relative: 

相对定位。

这个属性值保持对象所在文档流中的位置,也就是说它具有和static相同的呈现方式,它同样占有在文档流中的固定位置,后面的对象不会侵占或覆盖;与static属性值不同的是,设置了relative的对象,可以通过top, left, right, bottom属性设定自己的新显示位置,这4个属性的取值是相对于文档流的前一个对象的,你可以自由设置这4个属性偏移到新的位置而不对文档流中的其他对象产生任何影响,原来的页面呈现仍然会我行我素.


absolute: 

绝对定位。

和relative不同的是,这个属性值会将当前对象拖出文档流,后面的对象会占有原来的位置,也就是说,当前对象的呈现是独立显示的,但是它的位置在指定top, left, right, bottom任一属性之前仍是有继承性的,这时的4个属性的取值是相对于浏览器的,和文档流无关了。如果把示例中的B区域设定为absolute而不指定4个位置属性,通过设定margin来改变它的相对位置,用这个方法可以解决前面提到的问题2。


提示a: 

苏昱的css2.0手册中提到relative和absolute定位的滚动条区别不是绝对的,

至少在firefox、opera和safari中滚动条该出现还是会出现。


提示b: 

属性值为absolute对象的z-index属性可以设置层叠显示的次序,它是直接有效的;

而属性值为relative对象的z-index属性在设置时要小心,把当前对象的z-index设置为-1是不行的,在firefox中它会无法显示

(注意,不是说浏览器有误,而是指如果父对象是根元素body,那么z-index是无效的,任何z-index设置都不会显示在根元素之后,除了IE的解析bug,感谢#19提示),

必须设置为0以上,我们如果想让别的对象挡住它,只有将其他对象也设置position为relative,

并将z-index属性取一个比它大的值即可。


上面的表述不知道也许不是很清晰,具体的理解还是要自己亲自动手操作一下。


这样看来,前面的问题就有解了,

问题3我们可以根据设计的要求将其设置为相对或绝对定位;

问题1的解决方法也有很多,个人推荐使用有语义的dl, dt, dd来实现,而且这个方法在不同浏览器中的表现基本相同(已在ie, firefox, opera, safari中测试),仅在top的属性上有几像素的差异,由于时间关系我只能给出自己测试时的代码以供参考:

body { color:#fff; font-size:12px; } 
ul li { float:left; height:30px; background-color:#99CC99; margin:0 10px; padding:0; border:1px solid #c30; width:100px; }
ul li div { border:1px solid #f00; background-color:#996666; width:100px; height:100px; position:absolute; margin-top:15px; margin-left:-1px; *margin-left:-79px; }
ul li dl, ul li dl dt, ul li dl dd { margin:0; padding:0; }
ul li dl dd { border:1px solid #f00; background-color:#996666; width:100px; height:100px; position:absolute; margin-top:11px; *margin-top:10px; margin-left:-1px; }
<ul>
<li> 标题 - #text  下拉菜单 - div  </li>
<li style="position:relative;">列表b</li>
<li>列表c</li>
<li> <dl> <dt>标题 - dt</dt> <dd>下拉菜单 - dd</dd> </dl> </li>
</ul>

补充一个例子,请在IE和非IE浏览器中对比观看:

<style> 
.main {     width:500px;     height:500px;     background-color:#9cf; }
.layer_a, .layer_b, .layer_c, .layer_d {     position:absolute;     width:100px;     height:60px; }
.layer_a {     background-color:#69c; } .layer_b {     background-color:#369; } .layer_c {     background-color:#eee; }
.layer_d {     background-color:#696; } .brd {     border:1px solid #c30;     margin:1em; }
.block {     display:block; }
</style>
<div class="main">     
<div class="brd">一段文本一段文本一段文本一段文本一段文本一段文本一段文本
<div class="layer_a">         
<div class="brd">另一段文本另一段文本另一段文本
<div class="layer_b">     
<p class="brd">第三段不同的文本第三段不同的文本
<div class="layer_c"></p>     
<p class="brd block">第四段指定了block的文本
<div class="layer_d">
</p>     第四段指定了block的文本
<div class="layer_c">     
<map class="brd block">第四段指定了block的文本
<div class="layer_d"></map>     
<dd class="brd">第四段指定了block的文本
<div class="layer_a"></dd>     
<li class="brd">第四段指定了block的文本<div class="layer_b"></li>      


从这个例子可以看出,IE将一个块元素绝对定位时,如果父元素是一个块级元素,

那么拖出文档流之后它仍会继承原来所在位置的坐标;

而非IE浏览器的做法是:

拖出文档流之后,直接定位到父元素所在的坐标。


转:

http://www.moonless.net/blog/2007/09/csspositionz-index.html



  • 上一条:
    不错的10个你未必知道的CSS技巧
    下一条:
    创建IE各版本专属CSS IE中的if语句
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 使用 Alpine.js 排序插件对元素进行排序(0个评论)
    • 在js中使用jszip + file-saver实现批量下载OSS文件功能示例(0个评论)
    • 在vue中实现父页面按钮显示子组件中的el-dialog效果(0个评论)
    • 使用mock-server实现模拟接口对接流程步骤(0个评论)
    • vue项目打包程序实现把项目打包成一个exe可执行程序(0个评论)
    • 近期文章
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-06
    • 2017-07
    • 2017-08
    • 2017-09
    • 2017-10
    • 2017-11
    • 2018-03
    • 2018-04
    • 2018-05
    • 2018-06
    • 2018-09
    • 2018-11
    • 2018-12
    • 2019-02
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2021-04
    • 2021-05
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-11
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-09
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-02
    • 2024-03
    • 2024-04
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客