【问题标题】:Need a fixed positioned div inside an absolute positioned div在绝对定位的 div 内需要一个固定定位的 div
【发布时间】:2013-06-09 23:23:18
【问题描述】:

我正在使用 Snap.js 插件 -(它允许您创建滚动侧抽屉/面板)。

它通过创建 3 个绝对定位的 div 来工作,其中一个包含主要内容。

当一个 div 本身位于绝对定位的 div 内时,有没有办法将它定位到窗口的顶部。

目前我只是将固定的 div 固定到绝对定位的 div 的顶部,而不是固定到浏览器的顶部。当我滚动时,div 保持固定在主要内容的顶部,而不是窗口。

例如:

<div style="position:absolute;">

    <div style="position:fixed;top:0">
       <!-- some content which needs to be pinned to top of window -->
    </div>

</div>

目前我正在使用 javascript 来跟踪滚动偏移量并手动调整子 div 的顶部位置,这对于性能来说并不理想。

任何帮助表示赞赏!

【问题讨论】:

  • 绝对定位的 div 应用了以下 css: translate3d(0px, 0px, 0px),如果我将其移除,则固定元素会正常运行并固定在窗口顶部。关于为什么会这样的任何想法?
  • 这就是您的示例代码所做的。 (这是您想要的吗?)当您将位置固定在一个元素上时,它会将其从文档流中取出并使其相对于视口。你是说 snap.js 打破了这个?
  • 我主要使用的是firefox 21.0,它有描述的问题。您对解决此问题有任何想法吗?或者我是否必须对 snap.js 的工作方式进行修改?他们在这里也有一些信息github.com/jakiestfu/Snap.js/issues/24
  • 如果你去这里jakiestfu.github.io/Snap.js/demo/apps/default.html 并将以下内容添加到具有id内容的div中,可以重新创建问题。

标签: javascript html css snap.js


【解决方案1】:

我做了一个小提琴来展示我的 javascript 解决方法 - 在 Internet Explorer 中滚动时它会抖动,任何想法。

<div id="displayed-content" class="snap-content scrollable">
    <div><!-- regular content --></div>
        <div><!-- fixed content --></div>
    <div><!-- footer content --></div>
</div>

http://jsfiddle.net/bxRVT/

【讨论】:

  • 你在这里做了很多工作。很难说如何最好地提高 IE 性能。您确实处于 CSS3 技术的最前沿。我的第一个猜测是,这些变换不能很好地与 jQuery .scrollTop 配合使用,但它本身就是一个完整的项目来尝试改进你所做的事情。我会给你投票!
  • 谢谢,我现在正在使用上面的实现,直到我想出更好的方法。
【解决方案2】:

我猜测你正在尝试做什么,但你可能正在寻找这样的东西:

<div class="local-wrap">
    <div class="fixed">
       Some content which needs to be pinned to top of window
    </div>
    <div class="port">
        Regular content...
    </div>
</div>

并应用以下 CSS:

.local-wrap {
    position: relative;
}
.local-wrap .fixed {
    position: absolute;
    top: 0;
    left: 0;
    background-color: lightgray;
    width: 100%;
    height: 5.00em;
}
.local-wrap .port {
    position: relative;
    top: 5.00em;
    min-height: 10em;
    height: 15em;
    overflow: auto;
    border: 1px solid gray;
    border-width: 0 1px 1px 1px;
}

演示小提琴:http://jsfiddle.net/audetwebdesign/pTJbW/

本质上,要获得相对于块元素的固定块,您需要使用绝对定位。固定定位总是相对于根元素或视口,所以position: fixed 帮不了你。

我所做的是定义一个.local-wrap 容器,其中包含两个子块,其中一个是 绝对定位在.local-wrap 的顶部,另一个在常规流中。我使用position: relative 将其置于.fixed 下方,但也可以使用上边距。

我修复了一些高度来演示本地窗口/端口中的滚动内容,但这可以根据您的设计和应用程序进行更改。

免责声明

我不熟悉 snap.js,因此可能需要考虑其他因素。

评论 CSS3 变换和固定元素

根据 CSS3 规范,如果您对元素应用变换,则将其命名为 div.transformed,然后 div.transformed 会创建一个新的堆叠上下文并用作它包含的任何固定位置子元素的包含块,其中这就是为什么在您的场景中,固定位置上下文不会停留在窗口顶部。

参考见Mozilla Developer Network -> CSS Reference -> Transform

【讨论】:

  • 不幸的是,这不起作用,因为 div 需要固定到窗口的顶部,但会随着示例中的 .local-wrap 滚动而随窗口滚动。使用固定位置 div 的正常方法确实有效,但前提是从父绝对定位 div 中删除 css 转换。有解决方法吗?目前,每次滚动窗口时,我都在使用 javascript 来调整浮动 div 的顶部 css 属性 - 这在某些浏览器上可以正常工作,但在其他浏览器上则不稳定。
  • 我创建了一个 jsfiddle 来更好地说明这一点 jsfiddle.net/pTJbW/10 。使您的浏览器窗口更小,直到滚动条出现在输出中,当您滚动时,固定标题将随着内容滚动。但是,如果您在 css 内容上移除 css 变换并更新,您会注意到滚动时标题保持固定。
  • 小提琴好,现在画面清晰多了。如果我理解的话,如果您删除 CSS 转换属性,那么 snap.js 将无法工作,这就是您要解决的问题。
  • 感谢您的关注!是的,这正是我面临的问题。我做了另一个小提琴,这次展示了我的 JS 解决方法 - 看看 JS 代码 - 它在移动 safari 和 internet explorer 8 中抖动 - 有什么想法吗?
猜你喜欢
  • 2012-07-23
  • 2015-07-28
  • 2011-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-21
  • 1970-01-01
相关资源
最近更新 更多