【问题标题】:CSS - position element over another inside a scrolling areaCSS - 在滚动区域内将元素定位在另一个元素之上
【发布时间】:2013-05-13 05:34:35
【问题描述】:

我有以下html结构

<div id="scrolling-container">
    <div id="cover"></div>
    <div id="contents">
        A variable amount of iframes
    </div>
</div>

Here is the base jsbin explaining the issue.

我希望能够横向滚动#contents,但我希望它被一个透明元素 (#cover) 完全覆盖,我可以将其用于点击检测并允许更轻松地在平板电脑上进行横向滚动。

应该可以单独使用 css 来做到这一点。 #cover { position:absolute,top:0,bottom:0,left:0,right:0} 似乎是去这里的方式,因为这是我以前使用过数十次的技术,但是滚动它并不会一直延伸到右侧,而只是延伸到最初可见的尖端滚动区域。当您滚动时,它不再覆盖元素

Here is a demonstration of the issue。尝试滚动容器,您会发现问题。

【问题讨论】:

  • 你为什么反对使用 JavaScript?
  • @apaul34208 我现在是,但它就像所有的罪一样 hacky。 #contents 中的 iframe 需要一段时间才能重绘,并且每个 iframe 都会异步重绘。目前,当一个人完成重绘时,我没有简单的钩子(尽管我当然可以创建一个)。此外,这会使视图模型代码与 ui 问题混淆,整体感觉很恶心。

标签: html css scroll css-position


【解决方案1】:

尝试将 div 的内容设置为position: relative,然后使用伪元素生成封面:

演示:http://jsbin.com/arajag/1/edit

CSS:

div {
  border: 1px solid grey;
}

#scrolling-container {
  overflow-x: scroll;
  position: relative;
}
#contents {
  width: 400em;
  height: 10em;
  position: relative;
}

#contents:after {
  content: " ";
  position: absolute;
  z-index: 100;
  background-color: blue;
  top: 0;
  left: 0;
  bottom: 0;
  width: 100%;
}

HTML:删除#cover

我知道封​​面上下有间隙,那是因为 Chrome 在内容前后设置了边距。无论如何,您应该对此进行调整,所以我认为这不会成为问题。

【讨论】:

  • 很酷!我通过在#contents 上显式设置边距,然后在#contents::after 上反转它们来固定边距。 jsbin.com/arajag/5/edit
  • @OldPro,谢谢,我没有为演示设置它们,因为 OP 的边距可能与浏览器默认值不同。
  • @GeorgeMauer,如果这是答案,请您奖励赏金,谢谢!
  • 你去吧,没有意识到它不会自动发生(当赏金到期时它会自动发生)
【解决方案2】:

更新

你可以

你应该

你仍然可以,totally drop that and use jQuery

Example

js

$(document).ready(function () {
    var x = $('#contents').width();
    $('#cover').width(x);
});

$(window).resize(function () {
    var x = $('#contents').width();
    $('#cover').width(x);
});

$('#scrolling-container').scroll(function () {
    var x = $('#contents').width();
    $('#cover').width(x);
});

css

div {
  border: 1px solid grey;
}

#scrolling-container {
  overflow-x: scroll;
  position: relative;
}
#contents {
  width: 4000em;
  height: 10em;
}

#cover {
  position: absolute;
  z-index: 100;
  top:0;
  bottom:0;
  background-color: blue;

}

很抱歉,这应该像宣传的那样工作。

【讨论】:

  • 你可以,我现在也是(虽然我不知道调整大小事件 +1),但出于各种原因,我想避免它。然而最重要的是,只有当你不使用滚动区域时,这对 css 是绝对可行的,引入 overflow-x: scroll 突然需要 javascript 似乎很奇怪
  • 我知道这很令人沮丧。我遇到了这个问题,正在处理简单的两列布局。
  • 嗯...刚试过这个。调整大小事件 - 虽然它可以在特定元素上设置 - 只会在整个窗口调整大小时触发
【解决方案3】:

给你http://jsbin.com/oquguh/1/edit,我让你的#container div 负责处理滚动。

【讨论】:

  • 但这硬编码宽度不是吗?如果宽度是由#contents 内部的实际内容决定的(正如我所说,在我的实际情况下,它是一个 iframe 列表),那么我看不出这是如何工作的。
  • 好吧,如果没有定义父宽度,你不能在 css 中制作 100% 宽度的东西。唯一的方法是在内容加载后使用 javascript。
  • 这不是真的,width: 100% 只是告诉块元素水平填充所有可用空间,在没有父元素宽度的情况下使用它是很常见的。另外,我使用的是 position: absolute 并固定角落,而不是直接设置宽度。当您“不在”滚动元素中时,使用此技巧非常有效,只是滚动会弄乱它。
  • 是的,但是 css 只能根据父级的 css 属性从父级传输值。它无法计算与内容量相关的父宽度。这就是宽度:100%;确实,告诉它根据父级的宽度和填充属性设置宽度。
【解决方案4】:

试试这个..

#cover { 
  width: 400em;
  height: 20em;
  position: absolute;
  z-index: 100;
  background-color: blue;
  top: 0;
  left: 0;
  bottom: 0;
  right: 0;
}

这是你的意思吗?

【讨论】:

  • 这对#cover 的宽度进行了硬编码 - 我在示例中对#contents 的宽度进行了硬编码,但正如我所说,#contents 实际上是可变宽度的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-27
  • 1970-01-01
  • 2012-06-24
  • 1970-01-01
  • 2022-10-14
相关资源
最近更新 更多