查找元素最近的相对位置祖先

您是否曾经遇到过 CSS 定位困境,即带有 position: absolute 的元素没有按预期进行定位?

我们知道,在元素上设置绝对位置将使其相对于最近的祖先进行定位,最近的祖先将其 position 设置为 static 以外的值(默认值)。

两个示例显示了当父元素具有相对位置时紫色元素的位置与另一个祖先具有相对位置时紫色元素的位置

在上图中,绝对定位元素在两个示例中都使用相同的 CSS 定位:

.absolute {
  position: absolute;
  top: 100%;
  left: 0;
}

但在每个例子中,结果都不一样。这是因为在第一个示例中,它的父元素(粉色元素)具有 position: relative,而在第二个示例中,它是另一个具有相对位置的祖先(灰色元素)。

值得注意的是,如果没有定位祖先,那么带有 position: absolute 的元素将相对于 <body> 放置。

在这样一个相对简单的示例中,快速检查 CSS 可以很容易地确定哪个祖先具有相对位置,如果样式没有达到预期效果,我们可以相应地调整样式。但有时,在更复杂的代码库中(尤其是在有大量嵌套元素的情况下),查找元素的哪个祖先具有相对定位可能会有点困难。

在构建复杂的全宽下拉子菜单的标题时,这种情况最常见:我通常需要将它们相对于整个标题进行定位,但在某个地方我无意中在其他元素上设置了 position: relative,这会破坏所需的行为。

浏览所有代码很费时间,有一种简单的方法可以在 JavaScript 中找到最近的父级 —— 我们可以在浏览器控制台中正确地找到。

在 Chrome 和 Firefox 中,如果我们打开开发工具中的 Console 选项卡,我们可以通过键入$0 来获取当前选中的元素。然后,我们可以使用 offsetParent 对象属性来查找 position 设置为 static 以外的元素的最近祖先。

尝试选择一个元素(Ctrl + shift + c)并将其键入控制台:

$0.offsetParent

键入之后,它将返回我们选中的元素。

接下来,我们可以使用 getComputedStyle 来找出元素的 position 属性的值:

getComputedStyle($0.offsetParent).position

还有一种更加快速的方法,我们还可以使用 $_ 对上次执行的结果进行引用:

> $0.offsetParent // <div class="trans-right">...</div>
> $_ //<div class="trans-right">...</div>
> getComputedStyle($0.offsetParent).position // "relative"
> $_ // relative

通过在控制台中键入 $_ 我们可以将最近计算的表达式作为变量进行检索,这也可以加快检索速度:

> $0.offsetParent // <div class="trans-right">...</div>
> getComputedStyle($_).position // "relative"

上面代码将检索其 position 值。

注意:使用 offsetParent 时,如果元素的 position 设置为 fixed 或其本身或其父元素的 display: none 将返回 null

全部评论

相关推荐

07-09 15:14
南京大学 C++
点赞 评论 收藏
分享
避坑恶心到我了大家好,今天我想跟大家聊聊我在成都千子成智能科技有限公司(以下简称千子成)的求职经历,希望能给大家一些参考。千子成的母公司是“同创主悦”,主要经营各种产品,比如菜刀、POS机、电话卡等等。听起来是不是有点像地推销售公司?没错,就是那种类型的公司。我当时刚毕业,急需一份临时工作,所以在BOSS上看到了千子成的招聘信息。他们承诺无责底薪5000元,还包住宿,这吸引了我。面试的时候,HR也说了同样的话,感觉挺靠谱的。于是,我满怀期待地等待结果。结果出来后,我通过了面试,第二天就收到了试岗通知。试岗的内容就是地推销售,公司划定一个区域,然后你就得见人就问,问店铺、问路人,一直问到他们有意向为止。如果他们有兴趣,你就得摇同事帮忙推动,促进成交。说说一天的工作安排吧。工作时间是从早上8:30到晚上18:30。早上7点有人叫你起床,收拾后去公司,然后唱歌跳舞(销售公司都这样),7:55早课(类似宣誓),8:05同事间联系销售话术,8:15分享销售技巧,8:30经理训话。9:20左右从公司下市场,公交、地铁、自行车自费。到了市场大概10点左右,开始地推工作。中午吃饭时间大约是12:00,公司附近的路边盖饭面馆店自费AA,吃饭时间大约40分钟左右。吃完饭后继续地推工作,没有所谓的固定中午午休时间。下午6点下班后返回公司,不能直接下班,需要与同事交流话术,经理讲话洗脑。正常情况下9点下班。整个上班的一天中,早上到公司就是站着的,到晚上下班前都是站着。每天步数2万步以上。公司员工没有自己的工位,百来号人挤在一个20平方米的空间里听经理洗脑。白天就在市场上奔波,公司的投入成本几乎只有租金和工资,没有中央空调。早上2小时,晚上加班2小时,纯蒸桑拿。没有任何福利,节假日也没有3倍工资之类的。偶尔会有冲的酸梅汤和西瓜什么的。公司的晋升路径也很有意思:新人—组长—领队—主管—副经理—经理。要求是业绩和团队人数,类似传销模式,把人留下来。新人不能加微信、不能吐槽公司、不能有负面情绪、不能谈恋爱、不能说累。在公司没有任何坐的地方,不能依墙而坐。早上吃早饭在公司外面的安全通道,未到上班时间还会让你吃快些不能磨蹭。总之就是想榨干你。复试的时候,带你的师傅会给你营造一个钱多事少离家近的工作氛围,吹嘘工资有多高、还能吹自己毕业于好大学。然后让你早点来公司、无偿加班、抓住你可能不会走的心思进一步压榨你。总之,大家在找工作的时候一定要擦亮眼睛,避免踩坑!———来自网友
qq乃乃好喝到咩噗茶:不要做没有专业门槛的工作
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务