今天在工作中遇到这样一个需求,需求如下:
子元素要固定在父元素旁边,当下滑到一定位置的时候,子元素固定在浏览器窗口顶部。
试了一下,fixed只能基于浏览器窗口定位,并不能基于父元素定位,这样满足不了我的需求。
CSS 有三种基本的定位机制:普通流、浮动和绝对定位。
除非专门指定,否则所有框都在普通流中定位。也就是说,普通流中的元素的位置由元素在 (X)HTML 中的位置决定。
块级框从上到下一个接一个地排列,框之间的垂直距离是由框的垂直外边距计算出来。
行内框在一行中水平布置。可以使用水平内边距、边框和外边距调整它们的间距。但是,垂直内边距、边框和外边距不影响行内框的高度。由一行形成的水平框称为行框(Line Box),行框的高度总是足以容纳它包含的所有行内框。不过,设置行高可以增加这个框的高度。--W3C
首先回顾一下定位:
CSS Positioning(定位)
- Static 定位
HTML元素的默认值,即没有定位,元素出现在正常的流中。
静态定位的元素不会受到top, bottom, left, right影响。 - Fixed 定位
元素的位置相对于浏览器窗口是固定位置。
即使窗口是滚动的它也不会移动 - Relative 定位
相对定位元素的定位是相对其正常位置。
可以移动的相对定位元素的内容和相互重叠的元素,它原本所占的空间不会改变。 - Absolute 定位
绝对定位的元素的位置相对于最近的已定位父元素,如果元素没有已定位的父元素,那么它的位置相对于html。
Absolutely定位使元素的位置与文档流无关,因此不占据空间。
Absolutely定位的元素和其他元素重叠。重叠的元素
元素的定位与文档流无关,所以它们可以覆盖页面上的其它元素
z-index属性指定了一个元素的堆叠顺序(哪个元素应该放在前面,或后面)
一个元素可以有正数或负数的堆叠顺序。具有更高堆叠顺序的元素总是在较低的堆叠顺序元素的前面。
看到fixed定位了么?元素的位置相对于浏览器窗口是固定位置。那么现在需要它基于父元素定位怎么办?
看代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>test</title>
<style>
.father{
top:100px;
position: absolute;
display: block;
width: 200px;
height: 200px;
background: red;
}
.sun{
position: fixed;
margin-left: 100px;
display: block;
width: 100px;
height: 100px;
background:blue;
}
</style>
</head>
<body>
<div class="father">
<div class="sun">
</div>
</div>
</body>
</html>
运行后你会发现:
不设置position: fixed的top值,用magin来控制当前子块的位置,这样就能达到在当前窗口基于父元素定位来实现自己想要的效果了。
热门评论
手机端的固定定位该怎么设置??
你是说子元素和父元素一起下降吗