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

你对CSS布局中的Position了解程度有多少

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

当人们将接触CSS布局的时候倾向于使用Position。Positoin似乎是一个很容易掌握的概念。从表面上来看,你只要精确指定了一个块所处的位置,它就会坐落在那里。然而定位比你刚接触时要更复杂一些。这里有几件事会绊倒一个新手,所以在熟练使用之前需要掌握它们。

一旦你深入地理解了Position的工作原理,你就可以使用它做出很棒的事来

盒模型和Position类型

为了理解定位你首先的理解盒模型。前面一个链接是我之前写给InstantShift关于盒模型的一篇文章。我在那里做了详细的介绍,在这里我将提供一个快速的总结。

在CSS中,每个元素都被一本矩形框所包围,每个元素都定了内容区,内容区被内边距(填充)包围,边框包围了内容区和内边距。外边距在边框外面用来和其他盒子分隔开来。你可以在下面这张图中看到这些

 

定位 模式定义了一个盒子在整体布局中将会放置在哪里、每个盒子怎样影响在它周围的盒子。定位模式包含了正常文档流,浮动流和几种类型的定位元素

CSS定位属性有五个可取值

position: absolute
position: relative
position: fixed
position: static
position: inherit

下面我将对前三个属性进行详细地讲解,对后面两个属性只是作简单的介绍

static是position默认的值。每个position属性被设置为static的元素将在正常文档流中显示。它们被放置和显示的规格在盒模型中定义。

一个static定位的元素将会忽略任何top, right, bottom, left, z-index属性的值。为了使用其中任何一个值,你必须将元素的position属性设置为absolute, relative, fixed之一

inherit和其他所有css属性一样,当前元素取得和父级元素相同的属性值。

绝对定位(Absolute Positioning)

绝对定位的元素完全从正常文档流中除去。对于包围它的其他元素而言,它们认为绝对定位的元素不存在,就好像将元素的display属性设置为none。假如你想保留它所占有的位置而不被其他元素所填充,那么你需要使用其他的定位方式。

你在设置一个绝对定位元素的位置时,top, right, bottom, left四个属性,你通常只定义其中的两个,top或者left,以及left或者right。它们的默认值都是auto

理解绝对定位的关键是理解它们从哪里开始。假如top值为20px,问题是20px是从哪里开始的。

一个绝对定位元素的起点位置是相对于它第一个postion属性值不为static的父级元素而言的。假如在父级元素链中没有满足条件的,绝对定位元素就是相对于整个文档窗口来定位的。哈

关于”相对“这个概念你或许有点疑惑,特别是还有个我们还没有谈到的”相对定位”的东西。

当你为一个元素设置position:absolute,css将会看这个元素的父元素,如果父元素被定位过(除了static),那么绝对定位元素的起点是父元素的左上角位置。

假如父元素没有被应用除static以外的positon定位,那么就检查父元素的父元素有没有应用除static以外的position定位。假如有,绝对定位元素的起点就是这个元素的左上角位置。假如没有,继续在DOM树上查找,知道找到一个应用除static以外的定位元素,或者查找失败,到达最外层的浏览器窗口。

相对定位(Relative Positoning)

相对定位也是根据top, right, bottom, left属性来定位。但是只是相对于它们原来的位置进行移动。这意味着,添加相对定位和添加外边距有些相似。但也有一个重要的不同之处,围绕在相对定位元素附近的元素会忽略相对定位元素的偏移

我们可以把它看做是一张图片的重像从真实的图片位置开始进行一点移动。它原始图片所占据的位置仍然保留,但我们已经没法再看到它,只能看到它的重像。这样就让元素之间可以进行位置的重叠,因为相对于定位元素能够移动到其他元素所占据的空间中。

相对定位元素从正常文档流中脱离,但是它仍然影响着围绕着它的元素。围绕着它的元素表现的好想相对定位元素仍在处在正常流中一样。

我们不需要在这里询问相对谁进行定位。答案是,始终是相对于正常文档流。相对定位好像为元素添加外边距(margin),但是对相邻的元素而言好想什么也没有发生。实际上没有添加外边距。

固定定位(Fixed Positioning)

固定定位和绝对定位有些相像,但是也有一些不同

首先,固定定位始终相对于浏览器窗口进行定位,然先取得top, right, bottom, left,属性值来进行定位。它脱离了它的父级元素,它定位元素中它表现得有点反叛。

第二个不同点是在名字上继承的。固定元素始终时固定的。当页面固定时他们不会移动。你告诉它该在哪里固定,它就始终在那里。这样,他们看起来似乎又不是那么反叛。

在某种意义上,固定定位元素有点像固定定位的背景图片,只不过它的外层容器始终时浏览器窗口罢了。如果你在body中设置一个背景图片,那么它与一个固定定位元素的行为非常相像。只不过在位置的位置不是那么精确。

背景图片也不会改变其在第三维度的位置,也因此带来了z-index属性

z-index,打破平面

一个页面是二位平面,它有宽和高。我们活在一个用z-index作为其深度的三维世界中,这个额外的维度能够穿越一个平面。

高z-index值在低z-index值元素上面,并从页面的上方运动。相反地,低z-index值在高z-index值元素下面,并从页面下方运动。

没有z-index,定位元素有点儿麻烦。应用了z-index,你可以做出一些创造性的东西出来,允许一个元素在另一个元素的上方或下方。每个元素的z-index属性默认值是0, 并且可以使用负值。

事实上,z-index比我这里叙述的要复杂得多,但细节写在了另外一篇文章里。现在请记住这个额外维度的基本概念,以及他们的堆叠顺序。并且只有定位元素才可以使用z-index属性

定位问题(Positioning Issues)

这里有一些常见的定位元素常见的问题,每个问题都值得了解。

1.你不能对一个元素同时使用position属性和float属性。因为对使用什么样的定位方案来说两者的指令是相对冲突的。如果你把两个属性都添加到同一个元素上,那么就期望在CSS中较后的那个属性是你想要使用的吧。

2.Margin不会在绝对定位元素上折叠。假如你有一个底外边距是20px的段落,在这个段落下面正好是一张有30px上外边距图片,段落和图片之间的空白将会是50px(20px+30px),而不是30px(30px > 20px)。这就是众所周知的外边距折叠,两个外边距合并(折叠)成一个。绝对定位元素不会像那样进行margin的折叠,这会使他们跟预期的不一样。

3.IE在z-index有些bug。在IE6中,选中元素总是在堆叠元素是上方,而不管它的z-index以及其他围绕在它周围的元素的z-index值是多少。

IE6和IE7在堆叠层上还有其他的问题。IE6由最外层的定位元素的层级来决定哪一组的元素处于层级的最上面,而不是每一个单独的元素自身的层级决定。

复制代码代码如下:
<div style="z-index: ">
<p style="z-index: 1"></p>
</div>
<img style="z-index: " />

你觉得段落会在堆叠成的最上面,因为它有最大的z-index值,但是在IE6和IE7中,图片将会在段落上面,因为看起来有两个不同的堆叠层。一个是div的,一个是image的。image比div有更高的z-index,因此它会覆盖在div中的任何东西

总结

对一个元素应用定位属性,元素的表现将取决于CSS的定位模式。你可以对一个定位元素使用absolute, relative, fixed, static(default)和inherit值。

定位模式,包括CSS定位元素,定义了一个盒子在布局中放在哪里,并且紧挨着它的元素是怎样受定位元素影响的。

z-index可应用于定位元素。它向页面添加了第三维度,并且定义了元素堆叠的顺序。

定位属性看起来很容易掌握,但是它工作起来和它在表面时所看到的不一样。你可能会觉得相对定位更像绝对定位。你通常想在布局是使用浮动,而对一个特殊的元素使用定位,以打破页面布局。


  • 上一条:
    使用div+css布局过程中在什么时候使用table呢
    下一条:
    DIV+CSS通过border样式制作带箭头提示框效果
  • 昵称:

    邮箱:

    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语言中使用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个评论)
    • Laravel 11.15版本发布 - Eloquent Builder中添加的泛型(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交流群

    侯体宗的博客