CSS 的定位属性 position 可以把元素从文档流中拧出来,让其显示在其他位置。

但凡元素定位属性加身,元素位置便不再受文档流控制,这时候什么 flexgrid 都不好使了,定位的元素已然跳出三界外,不在五行中,这时候元素的位置由自身的偏移属性决定(top、right、bottom、left)。

定位相关属性

position 设置定位方式。

以下属性仅对非 static 元素生效:

top 设置元素距离顶部的距离。

right 设置元素距离右边的距离。

bottom 设置元素距离底部的距离。

left 设置元素距离左边的距离。

z-index 设置元素的堆叠顺序。

关于偏移位置

toprightbottomleft 这几大偏移位置属性,就是其翻译过来的意思,设置元素对应方向的位置。

图解偏移位置属性:

默认值静态定位

position 的默认值就是静态定位 static,此时元素按照正常的文档流渲染。

<div class="list">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
<div class="item">5</div>
<div class="item">6</div>
<div class="item">7</div>
<div class="item">8</div>
</div>
<style>
.list {
width: 400px;
}
.item {
height: 40px;
margin: 10px 0;
background-color: rgba(255, 71, 87,0.2);
}
.item:nth-child(2) {
position: static;
left: 10px;
top: -20px;
}
</style>

显示效果:

在不设置任何定位属性的时候,元素默认值就是 static

如果想要覆盖非 static 的定位方式,则必须使用 static 进行替换。比如以前的导航吸附效果,导航移动到视窗之外时需要使用 fixed 固定定位,元素显示在视窗中的时候就用 static 正常的文档流显示。

static 定位属性是不支持偏移属性的,上面代码在开发者工具中显示的是这样:

相对定位

position 的 relative 相对定位属性值,相对于元素的当前位置进行位移,不会改变页面的正常布局。

比如:仅改变上例中的第二个元素样式,将定位属性值改为 relative

  .item:nth-child(2) {
position: relative;
left: 10px;
top: -20px;
}

这时候,第二个子元素渲染效果就会变成这样:

元素自身的位置还在,但位置偏移了,嗯...可以理解为:人走江山还在。

绝对定位

position 使用 absolute 便是绝对定位了。

还是使用第一例,定位属性值改为 absolute

  .item:nth-child(2) {
position: absolute;
left: 20px;
top: 20px;
}

显示效果:

绝对定位元素会丢失自身位置(人走江山 she),还丢失了自身的大小,所以在使用绝对定位时候,要注意设置元素大小。

有没有好奇为什么会跑到浏览器的右上角??

原因是绝对定位会相对于最近的 非 static 定位的祖先元素进行位置偏移,如果找不到这样的祖先元素,则相对于浏览器窗口。

所以我们在使用 absolute 时,最好先设置一个 relative 的祖先元素,比如将以上代码改为相对于 .list 列表定位,只需要给 .list 列表添加一个 relative

  .list {
width: 400px;
position: relative;
}
.item:nth-child(2) {
position: absolute;
left: 20px;
top: 20px;
}

显示效果:

找到了 .list 有相对定位属性,所以元素的偏移位置就会以 .list 这个盒子为参考。

固定定位

position 的 fixed 就是用于固定定位,固定定位作用就是把元素给钉在浏览器的某个位置上,不会随页面滚动而滚动。

fixed 元素不会受任何祖先元素影响,只与浏览器窗口有关。

  .item:nth-child(2) {
position: fixed;
left: 20px;
top: 20px;
width: 40px;
}

为了查看效果,添加了一个 width: 40px;,让定位的元素大一点。

显示效果:

可以明显看到 fixed 元素被钉在了浏览器左上角,不论页面怎么滚动,元素始终在同一位置。

粘性定位

position 的 sticky 属性值,跟 grid 网格布局同一时期出现,浏览器都是在 2017 年之后才开始支持,所以能不能使用请谨慎考虑。

使用 height: 300px; 控制 .list 高度,再添加 overflow: auto; 让 .list 元素可实现内部滚动,最后给子元素添加 sticky 属性值:

<div class="list">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
<div class="item">5</div>
<div class="item">6</div>
<div class="item">7</div>
<div class="item">8</div>
<div class="item">9</div>
<div class="item">10</div>
<div class="item">11</div>
<div class="item">12</div>
</div>
<style>
.list {
width: 400px;
height: 300px;
overflow: auto;
}
.item {
height: 40px;
margin: 10px 0;
background-color: rgba(255, 71, 87,0.2);
}
.item:nth-child(2) {
background-color: rgba(255, 71, 87, 1);
position: sticky;
top: 0;
}
</style>

显示效果:

sticky 做的事就是常见的网页中导航吸附效果,最初这种吸附效果必须借助 javascript 来实现,如今粘性定位可完美做到吸附效果,无需 javascript。

以上仅使用了粘性定位的 top 方向,可思考下其他三个方向的粘性定位会有什么效果,同时设置多个方向又有什么神奇效果......

控制元素堆叠顺序

这里的 z-index 属性只对非 static 元素生效,可不像 grid 网格布局中那样,直接设置 z-index 值即可控制显示顺序。

如果有多个 fixed、absolute、relative、sticky 元素,当两个元素占用同一片区域的时候,要控制元素的堆叠顺序,那么就必须要使用 z-index 属性。常见的应用场景:一个网页上出现了多个弹窗,哪个弹窗要给用户看,就给哪个弹窗加一个较大的 z-index 属性值。

  .list {
width: 400px;
position: relative;
}
.item {
height: 40px;
margin: 10px 0;
background-color: rgba(255, 71, 87,0.2);
}
.item:nth-child(2) {
position: absolute;
left: 0;
top: 0;
width: 100%;
background-color: rgba(255, 71, 87, 1);
}

默认的显示效果如下图左侧,定位的子元素 2 会遮挡住子元素 1。

给子元素 1 添加一个相对定位,并设置 z-index 为 2,即可让其显示在子元素 2 的上方(下图右侧),分分钟翻身做主人...

.item:nth-child(1) {
position: relative;
z-index: 2;
background-color: burlywood;
}

显示效果:

注意:z-index 使用特殊的负数值时,可让元素沉底在所有正常元素下方。

实验中的定位相关属性

除了以上的常用的属性外,目前还新增了多个实验性的属性,由于大多浏览器都不支持,本文就不一一介绍,具体可参考 MDN:https://developer.mozilla.org/en-US/docs/Web/CSS/position-anchor

实验性的属性都还没被纳入规范,未来可能还会发生变化!

position-anchor 绑定一个元素到某个“锚点元素”(如按钮),使它的定位相对于该锚点。

position-area 定义元素允许放置的区域(如安全区域,避免被遮挡)。

position-try 定义定位策略的“尝试顺序”和“回退方案”。

position-try-fallbacks 定义定位策略的“尝试顺序”和“回退方案”。

position-try-order 控制多个 position-try 规则的优先级顺序。

position-visibility 根据定位是否成功,自动控制元素可见性。

其作用让元素动态适应布局,避免溢出视口或被遮挡,比如 Select 的下拉选项,如果上方空间不足,就让其显示在下方。其目的就是要代替 javascript 的动态计算,让 css 实现类似效果。

总结

position 这属性可以说在网页上随处可见它的身影,其在 Chrome 统计的 CSS 使用率数据中,常年霸榜前十,还是有必要熟练掌握的。

Web前端入门第 39 问:细说 CSS position 定位布局的更多相关文章

  1. web前端入坑第五篇:秒懂Vuejs、Angular、React原理和前端发展历史

    秒懂Vuejs.Angular.React原理和前端发展历史 2017-04-07 小北哥哥 前端你别闹 今天来说说 "前端发展历史和框架" 「前端程序发展的历史」 「 不学自知, ...

  2. Android零基础入门第39节:ListActivity和自定义列表项

    原文:Android零基础入门第39节:ListActivity和自定义列表项 相信通过前两期的学习,以及会开发最简单的一些列表界面了吧,那么本期接着来学习更多方法技巧. 一.使用ListActivi ...

  3. Android零基础入门第29节:善用TableLayout表格布局,事半功倍

    原文:Android零基础入门第29节:善用TableLayout表格布局,事半功倍 前面学习了线性布局和相对布局,线性布局虽然方便,但如果遇到控件需要排列整齐的情况就很难达到要求,用相对布局又比较麻 ...

  4. 教你玩转CSS Position(定位)

    CSS Position(定位) position 属性指定了元素的定位类型. position 属性的五个值: static relative fixed absolute sticky 元素可以使 ...

  5. web前端入坑第二篇:web前端到底怎么学?干货资料! 【转】

    http://blog.csdn.net/xllily_11/article/details/52145172 版权声明:本文为博主[小北]原创文章,如要转载请评论回复.个人前端公众号:前端你别闹,J ...

  6. 给 Web 前端开发人员推荐20款 CSS 编辑器

    CSS 和 HTML,JavaScript 是网页的基础,作为前端开发人员,对这三者都要很熟悉.特别是未来流行全栈开发的时代,每项技术都是你知识结构中必要的一个节点. 在开发中,选择好工具是非常重要的 ...

  7. web前端知识大纲:系列二 css篇

    web前端庞大而复杂的知识体系的组成:html.css和 javascript 二.css 1.CSS选择器 CSS选择器即通过某种规则来匹配相应的标签,并为其设置CSS样式,常用的有类选择器.标签选 ...

  8. Web前端开发规范【HTML/JavaScript/CSS】

    前言 这是一份旨在增强团队的开发协作,提高代码质量和打造开发基石的编码风格规范,其中包含了 HTML, JavaScript 和 CSS/SCSS 这几个部分.我们知道,当一个团队开始指定并实行编码规 ...

  9. CSS Position 定位属性

    本篇文章主要介绍元素的Position属性,此属性可以设置元素在页面的定位方式. 目录 1. 介绍 position:介绍position的值以及辅助属性. 2. position 定位方式:介绍po ...

  10. CSS| position定位和float浮动

    对基础知识再度做个巩固和梳理. 一.position定位 (一):position的属性 1.absolute:生成绝对定位的元素,相对于最近一级定位不是static的父元素来进行定位: 2.rela ...

随机推荐

  1. 安装VMware

    安装VMware 官网下载 首先需要进行账号注册:https://support.broadcom.com/ 注册完成后,进行账号登录:https://login.broadcom.com/signi ...

  2. Luogu P3975 TJOI2015 弦论 题解 [ 紫 ] [ 后缀自动机 ] [ 动态规划 ] [ 拓扑排序 ]

    弦论:本来不想写板子题题解的,但奈何这道题的题解都太垃圾了,导致我理解了一个晚上都没想明白 dp 转移啥意思/fn/fn/fn,所以记录一下. 思路 \(t=0\) 时 考虑 SAM 思路,建出后缀自 ...

  3. Luogu P1777 帮助 题解 [ 紫 ] [ 线性 dp ] [ 状压 dp ]

    帮助:大毒瘤!!!调了我2h,拍了我2h,最后没调出来,重写才AC.wdnmd. 思路 这题主要是线性 dp ,而状压 dp 只是最后在统计答案时的一个辅助. 首先定义 \(dp[i][j][k]\) ...

  4. 如何配置支付宝密钥之如何配置普通 RSA2 密钥|保姆级教学(一)

    进行支付宝开发的第一步就是:配置密钥. 但是有很多小伙伴都不知道怎么配置,这篇文章将手把手帮你从头开始捋清如何配置支付宝密钥- 这次首先放一下官方文档:[如何生成及配置 RSA2 密钥],大佬们也可以 ...

  5. c/c++ 2019公司面试题目录

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/12131500.html c++面试题中经常被面试官面试的小问题总结(一)(本篇偏向基础知识) ...

  6. 大数据之路Week08_day02 (Flume架构介绍和安装)

    Flume架构介绍和安装 写在前面在学习一门新的技术之前,我们得知道了解这个东西有什么用?我们可以使用它来做些什么呢?简单来说,flume是大数据日志分析中不能缺少的一个组件,既可以使用在流处理中,也 ...

  7. 全网最强 DeepSeek 插件上线!支持多家云服务,一键解锁满血版 AI

    前言 自 DeepSeek 推出以来,其回答质量备受好评.然而,许多用户在连续提问时经常遇到"服务器繁忙,请稍后再试"的提示.随着各大云服务商陆续部署 DeepSeek 的完整模型 ...

  8. 130道基础OJ编程题之: 68~77

    130道基础OJ编程题之: 68~77 @ 目录 130道基础OJ编程题之: 68~77 68:BC72 平均身高 69:BC74 HTTP状态码 70:BC75 数字三角形 71:BC76 公务员面 ...

  9. 【前端动画】—— 再看tweenJS

    16开始接触前端,一直对一个问题特别感兴趣,那就是js动画,也就是从那时起开始探究动画的各种表现形式,也是那个时候开始意识到编程这块东西最终考验的就是抽象和逻辑,而这一切完全是数学里边的东西. 最早接 ...

  10. centos 防火墙配置,并限制端口

    查看防火墙状态 systemctl status firewalld 如果防火墙处于停止状态,则启动它: systemctl start firewalld 并设置防火墙开机自启: systemctl ...