剖析CSS Position定位

       当人们刚接触布局的时候都比较倾向于使用定位的方式。因为定位的概念看起来好像比较容易掌握。表面上你确切地指定了一个块元素所处的位置那么它就会坐落于那里。可是定位比你刚看到的时候要稍微复杂一点。对于定位来说,有一些东西会绊倒新手,所以在它成为你的惯用技巧前你需要掌握它们。

  一旦你更深入地了解了它是怎么运作的,你就能够做出一些更棒的事情来。

  CSS盒模型和定位的类型

  为了搞清楚定位首先你得了解CSS盒模型。在上一句中的链接是我写在InstantShift 中的一篇关于盒模型的文章。我在那篇文章做了详细的讲解并会在这篇文章中做一个快速的总结。

  在CSS中,每一个元素都由一个矩形盒子所包含。每一个盒子都会具有一个内容区,内容区被一个内边距所包裹,内边距外是盒子的边框,并且在边框之外会有一个外边距用于与其他盒子分隔开来。这些你可以从下面这张图片看到。

立即学习“前端免费学习笔记(深入)”;

剖析CSS Position定位

  定位模式规定了一个盒子在总体的布局上应该处于什么位置以及对周围的盒子会有什么影响。定位模式包括了常规文档流,浮动,和几种类型的 position 定位的元素。

  CSS position 属性可以取5种值:

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

  position 值为 inherit 的元素和其他所有属性的继承值一样,元素只是简单地应用了与父元素一样的 position 值。

  绝对定位(Absolute Positioning)

  绝对定位的元素会完全地从常规文档流中脱离。对于包围它的元素而言,它会将该绝对定位元素视为不存在。就好像 display 属性被设为 none 一样。如果你想要保持它所占有的位置而不被其他元素所填充,那么你需要使用其他的定位方式。

  你可以通过 top, right, bottom, 和 left 四个属性来设置绝对定位元素的位置。但你通常只会设置它们其中的两个,top 或者 bottom,以及 left 或者 right。默认地它们的值都为 auto。

  弄明白绝对定位的关键是知道它的起点在哪里。如果 top 被设置为20px那么你要知道这20px是从哪里开始计算的。

  一个绝对定位的元素的起点位置是相对于它的第一个 position 值不为 static 的父元素而言的。如果在它的父元素链上没有满足条件的父元素,那么绝对定位元素则会相对于文档窗口来进行定位。哈!

  关于“相对”这个概念你或许有点迷惑,尤其是还有一个叫相对定位的东西,这是我们还没有讲到的。

  当你在一个元素的样式上设置 position:absolute 意味着需要考虑父元素,并且如果父元素的 position 值不为 static ,那么绝对定位元素的起点为父元素的左上角位置。

  如果父元素没有应用除了 static 以外的 position 定位,那么它会检查父元素的父元素是否有应用非 static 定位。如果该元素应用了定位,那么它的左上角便会成为绝对元素的起点位置。如果没有则会继续向上遍历DOM直到找到一个定位元素或者寻找失败以到达最外层的浏览器窗口。

  相对定位(Relative Positioning)

  相对定位的元素也是根据 top, right, bottom, 和 left 四个属性来决定自己的位置的。但只是相对于它们原来所处于的位置进行移动。在某种意义上来说,为元素设置相对定位和为元素添加 margin 有点相似,但也有一个重要的区别。区别就是在围绕在相对定位元素附近的元素会忽略相对定位元素的移动。

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

  相对定位元素离开了正常文档流,但仍然影响着围绕着它的元素。那些元素表现地就好像这个相对定位元素仍然在正常文档流当中。

  我们无需再追问这个相对的位置是在哪里。因为这个相对位置很显然是正常的文档流。相对定位有点儿像为元素添加了 margin ,对相邻元素来说却像是什么都没发生过。但实际上并没有增加任何的 margin 。

  固定定位(Fixed Positioning)

  固定定位的行为类似于绝对定位,但也有一些不同的地方。

  首先,固定定位总是相对于浏览器窗口来进行定位的,并且通过哪些属性的 top, right, bottom, 和 left 属性来决定其位置。它抛弃了它的父元素,它就是定位中表现地有点儿反叛。

  第二个不同点是其在名字上是继承的。固定定位的元素是固定的。它们并不随着页面的滚动而移动。你可以告诉元素它所处的位置并永远不再移动。噢~好像还挺乖巧的。

  在某种意义上说固定定位元素有点儿类似固定的背景图片,只不过它的外层容器块总是浏览器窗口罢了。如果你在 body 中设置一个背景图片那么它与一个固定定位的元素的行为时非常像的,只不过在位置上的精度会略少一些。

  背景图片也不能改变其在第三个维度的大小,也因而带来了 z-index 属性。

  打破了平面的 Z-Index

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

 

剖析CSS Position定位

  由上图可知,高的 z-index 位于低的 z-index 的上面并朝页面的上方运动。相反地,一个低的 z-index 在高的 z-index 的下面并朝页面下方运动。

  没有的 z-index 的话,定位元素会有点儿麻烦。因为 z-index 能让一个定位元素位于另一个元素的上方或者下方,这或许能让你做出点创造性的东西。所有的元素的默认的 z-index 值都为0,并且我们可以对 z-index 使用负值。

  z-index 实际上比我在这里描述的要更加地复杂,但细节写在了另一篇文章里。现在只需要记住这个额外维度的基本概念以及它的堆叠顺序,另外还要记住只有定位元素才能应用 z-index属性。

  定位的问题

  对于定位元素来说由几个比较常见的问题,都值得我们好好了解。

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

  2.Margin 不会在绝对元素上折叠。假设你具有一个 margin-bottom 为20px的段落。在段落后面是一个具有30px的 margin-top 的图片。那么段落和图片之间的空间不会是50px(20px+30px)而是30px(30px > 20px)。这就是所谓的 margin-collapse,两个 margin 会合并(折叠)成一个 margin。

  绝对定位元素不会像那样进行 margin 的折叠。这会使它们跟预期的不一样。

  3.IE在 Z-index 上有一些BUG。在IE 6中 select 元素总是处于堆叠层级的最上方而不管它的 z-index 和其他元素的 z-index 是多少。

  IE 6和IE 7在堆叠层级上又有另外一个问题。IE 6由最外层的定位元素的层级来决定哪一组的元素处于层级的最上面,而不是每一个单独的元素自身的层级决定。

@@##@@

  对上面这段结构,你会预料段落元素处于堆叠层级的最上方。因为它具有最大的 z-index 值。但在IE 6和IE 7中,图片为处于段落的上方。因为 img 具有比 p 更加高的 z-index 层级。因此它会位于所有 p 的子元素的上方。

  总结

  一个元素上所设置的位置属性会根据其中的一种CSS定位模式来运作。你可以为定位元素设置 absolute, relative, fixed, static (默认), 和 inherit 中的其中一个值。

  定位模式和CSS定位元素,定义了一个盒子在布局中应该处于什么位置以及围绕它的元素会受到定位元素带来的影响。

  z-index 属性只能被应用与定位元素上。它为页面增加了第三个维度并设置了元素的层级上的顺序。

  定位属性看起来好像很好理解,但它的运作与它在表面所看到的有点儿不一样。你可能会觉得的是相对定位更加类似绝对定位。当在做布局设计的时候你通常会想使用浮动并在指定的元素上应用定位来打破布局。

更多剖析CSS Position定位相关文章请关注PHP中文网!

剖析CSS Position定位

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1607574.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月23日 20:50:32
下一篇 2025年12月15日 18:41:01

相关推荐

  • CSS的技巧

    有些经典的css技巧,我们还是需要记住的,这样可以节省我们大量的时间,下面零度就为大家推荐几个比较好的css技巧: 1、在不同页面上使用同样的导航代码 许多网页上都有导航菜单,当进入某页时,菜单上相应这一项就应该变灰,而其他页亮起来。一般要实现这个效果,需要写程序或专门为每一页做设计,现在靠CSS就…

    好文分享 2025年12月23日
    000
  • css中px、em和rem的区别

    前言 em 和 rem 都是灵活可扩展的单位,由浏览器转换为像素值,取决于设计中的字体大小,如果使用值 1em 或 1rem ,它可以被浏览器转换为从 16px 到 160px 或其他任意值。浏览器使用 1px ,那么 1px 始终显示为完全 1px。 em 和 rem 的相同点 使用 em 和 r…

    好文分享 2025年12月23日
    000
  • rem — 低调的css单位

    rem这是个低调的 css 单位,近一两年开始崭露头角,有许多同学对rem的评价不一,有的在尝试使用,有的在使用过程中遇到坑就弃用了。但是我对rem综合评价是用来做web app它绝对是最合适的人选之一。 rem是什么? rem(font size of the root element)是指相对于…

    2025年12月23日 好文分享
    000
  • 用CSS实现带箭头的流程进度条

    本文介绍的是利用纯css的带箭头流程进度条,兼容到ie8,需要的朋友们下面来一起学习学习。 首先写出一个基本的样式。 .cssNav li{ padding: 0px 20px; line-height: 40px; background: #50abe4; display: inline-bloc…

    2025年12月23日 好文分享
    000
  • CSS与HTML使用误区

    误区一.多p症  Home About Concact 上述使用使用多余的p标签现状,就称为“多p症”,理应简化成下 Home About Concact误区二.多类class症  注意点class可以应用于页面任意多个元素,非常适合标识内容类型或其他相似的条目 立即学习“前端免费学习笔记(深入)”…

    2025年12月23日
    000
  • CSS属性transparent实现各种三角形示例

    效果图如下 示例代码 *{ margin: 0; padding: 0; } .box{ margin: 40px auto; width: 60px; background-color: #f0ac6b; } .t1{ margin: 40px auto; width: 0px; height: …

    2025年12月23日
    000
  • CSS实现书签效果实例

    这篇文章通过纯css代码写了个书签效果,实现后的书签效果很漂亮,文中给出了完整的示例代码,实现的代码也很简单,很方便大家理解和学习,有需要的朋友们可以参考学习,下面来一起学习学习吧。 实现的效果图如下: 示例代码如下: border制作书签(图形) .p2:before { /*做一个书签效果*/ …

    2025年12月23日
    000
  • CSS设定一个元素半透明

    这篇文章主要介绍了用css设定一个元素半透明的相关资料,非常不错,具有参考借鉴价值,需要的朋友参考下吧 .opacity{ filter:alpha(opacity=50); /* IE */ -moz-opacity:0.5; /* 老版Mozilla */ -khtml-opacity:0.5;…

    好文分享 2025年12月23日
    000
  • css中的三种定位机制

    css中的三种基本定位机制 a.普通文档流 b.定位:相对定位          绝对定位       固定定位 立即学习“前端免费学习笔记(深入)”; c.浮动 1.普通流中,元素位置由文档顺序和元素性质决定,块级元素从上到下依次排列,框之间的垂直距离由框的垂直margin值计算得到,行内元素在一…

    好文分享 2025年12月23日
    000
  • CSS的position定位属性在使用的一些重点

    1.position:static static属性是position的默认值,也就是说,当一个元素没有为其设定position属性时,它的默认值就是static。 2.position:absolute这是一个经常会被用到的position属性值。如果为某个元素设定了absolute,则该元素脱离…

    好文分享 2025年12月23日
    000
  • jimdo能否添加html5弹窗_jimdo弹窗html5代码实现与触发条件【技巧】

    可在Jimdo实现HTML5弹窗的四种方法:一、用内置“弹窗链接”模块;二、通过HTML区块注入精简dialog结构(需配合内联CSS);三、外部托管HTML+iframe嵌入;四、纯CSS :target伪类无JS方案。 如果您希望在Jimdo网站中实现HTML5弹窗效果,但发现平台默认不支持直接…

    2025年12月23日
    000
  • 响应式HTML5按钮适配不同屏幕方法【方法】

    实现响应式HTML5按钮需五种方法:一、CSS媒体查询按max-width断点调整样式;二、用rem/vw等相对单位替代px;三、Flexbox控制容器与按钮伸缩;四、CSS变量配合requestAnimationFrame优化的JS动态适配;五、Tailwind等框架的响应式工具类。 如果您希望H…

    2025年12月23日
    000
  • jimdo如何添加html5表单_jimdo表单html5代码嵌入与字段设置【实操】

    可通过嵌入HTML5表单代码、启用字段验证属性、添加CSS样式反馈及替换提交按钮并绑定JS事件四种方式在Jimdo实现自定义表单行为。 如果您在 Jimdo 网站中需要自定义表单行为或字段逻辑,而内置表单编辑器无法满足需求,则可通过嵌入 HTML5 表单代码实现更灵活的控制。以下是具体操作步骤: 一…

    2025年12月23日
    000
  • vs里面怎么html5_VS新建项目选HTML5模板或文件选HTML5创建【创建】

    Visual Studio 中创建 HTML5 项目可通过四种方式:一、新建空 ASP.NET Web 应用程序后添加 HTML 页面;二、使用 UWP 的 Blank App 模板;三、直接新建 HTML 文件并手动编写标准 HTML5 结构;四、安装 Web Template Studio 扩展…

    2025年12月23日
    000
  • html如何调整_调整HTML元素大小与样式属性【大小】

    可通过CSS样式属性调整HTML元素尺寸与外观:一、内联style设宽高;二、class类名调用外部CSS;三、box-sizing控制盒模型;四、相对单位实现响应式;五、transform缩放视觉尺寸。 如果您需要修改网页中某个HTML元素的尺寸或外观,可以通过CSS样式属性直接控制其宽度、高度、…

    2025年12月23日
    000
  • html5怎么设置单选_html5用input type=”radio”加name设单选按钮组【设置】

    HTML5 使用 type=”radio” 实现单选功能,需统一 name 值构成互斥组;通过 checked 设默认项;可用 CSS 隐藏原生控件并自定义样式;推荐用 fieldset/legend 增强语义;required 可实现必填验证。 如果您希望在网页中创建一组互…

    2025年12月23日
    000
  • 如何将内容居中html_将HTML页面内容整体居中【整体】

    HTML页面整体居中可通过四种CSS方法实现:一、Flexbox设display: flex; justify-content/align-items: center; height: 100vh;二、绝对定位加transform: translate(-50%,-50%);三、Grid设displ…

    2025年12月23日
    000
  • html5怎么放置下方_html5用flex或float布局将元素置于容器下方【布局】

    可在HTML5中用Flexbox、Float、order属性、margin-top: auto或absolute定位将元素置于容器正下方:Flexbox通过flex-direction: column与justify-content: flex-end或margin-top: auto实现;Floa…

    2025年12月23日
    000
  • html5能否插入带表单的文档_html5表单文档嵌入与数据提交【步骤】

    HTML5中无法直接嵌入外部带表单的HTML文档并原生提交;可行方案有四:一、用iframe嵌入,需同源或CORS支持,并用postMessage通信;二、用fetch+DOMParser动态加载表单片段并手动绑定事件;三、在当前页面直接编写表单,最规范且兼容性好;四、用JavaScript+fet…

    2025年12月23日
    000
  • HTML5怎么制作广告_HTML5用动画与交互制横幅或弹窗广告吸引点击【制作】

    可利用HTML5结合CSS3动画、Canvas、Web Animations API、Intersection Observer和video标签制作互动广告:一用@keyframes实现横幅入场动画;二用Canvas绘制并响应悬停;三用Web Animations API控制弹窗时序;四用Inter…

    2025年12月23日
    000

发表回复

登录后才能评论
关注微信