css - 我可以使用 "freeze"仅使用 CSS(或在移动设备上看起来不错的东西)的可滚动 DIV 中的元素吗?

标签 css html mobile css-position

我猜这个问题的答案会是“否”,但这太好了,我还是要问。

我想做的是卡住可滚动 DIV 内的元素,使其垂直放置。这是为了在表中实现卡住行功能。

使用 JavaScript 和绝对定位很容易做到。这是一个容器和三个内部 DIV 的 HTML(实时版本请参见 here):

<div id="container">
  <div id="background">
    Content
  </div>
  <div id="absolutediv">
    Absolute stays inside
  </div>
  <div id="fixeddiv">
    Fixed escapes!
  </div>
  <div id="absolutediv2">
    Stays put!
  </div>
</div>

相关的CSS:

#container {
  position: fixed;
  left: 20px;
  width: 250px;
  height: 250px;
  top: 20px;
  overflow: scroll;
}

#absolutediv {
  position: absolute;
  top: 30px;
  width: 300px;
  background-color: #CEC;
}

#fixeddiv {
  position: fixed;
  top: 100px;
  width: 300px;
  background-color: #ECC;
}

#absolutediv2 {
  position: absolute;
  width: 300px;
  top: 120px;
  background-color: #ECC;
}

以及将#absolutediv2 固定在适当位置的 JavaScript:

var div = document.getElementById('absolutediv2');
var container = document.getElementById('container');

container.addEventListener('scroll', function() {
  div.style.top = container.scrollTop + 120 + 'px';
});

所以#absolutediv2 的行为符合我的要求。但是看看#fixeddiv。这接近我所追求的,我怀疑它在移动设备上看起来更好,因为浏览器可以将它固定在适当的位置而无需等待运行脚本。除了它 (a) 正好越过边界,并且 (b) 不水平滚动。

有什么方法可以用纯 CSS 获得我想要的东西,可以在移动浏览器上运行良好的东西吗?

(在我的页面中,一种方法是将卡住行放在容器 DIV 上方,但卡住行的数量会根据用户滚动到的位置而变化,这意味着容器 DIV 必须移动周围。)

编辑:

总而言之,我想要一个 div:

  1. 与其容器一起水平滚动
  2. 当容器垂直滚动时保持不动
  3. 看起来它属于它的容器
  4. 在移动浏览器上看起来不错

最后一个是棘手的一点。我可以使用绝对位置 div 和 JavaScript 实现#1、#2 和#3,但它在移动浏览器上看起来很难看,因为它滞后。使用固定位置的 div,我可以获得 #2 和 #4,我可以用 JavaScript 实现 #1(水平方向上的滞后并没有给我带来太多困扰),但不是 #3,因为固定位置的 div 突然坐下在其容器顶部。

谷歌对这种事情有一个建议,但这是一个非常极端的解决方案:https://developers.google.com/mobile/articles/webapp_fixed_ui

最佳答案

好的,我还没有对此进行测试,但它应该是正确的。基本上,这使您能够使用我为您创建的 HTML5 数据属性创建多个“贴纸”元素 data-special="sticker" . jQuery 查找这些,然后复制数据并将其附加到另一个 <div>位于原始位置的元素,然后隐藏原始元素。

#container {
    position: fixed;
    left: 20px;
    width: 250px;
    height: 250px;
    top: 20px;
    overflow: scroll;
}

#original-element {
    position: absolute;
    top: 30px;
    width: 300px;
    background-color: #CEC;
}

.sticker {
    position:absolute;
}    

<div id="wrapper">
    <div id="container">
        <div id="background">
           Content
        </div>
        <div id="original-element" data-special="sticker">
           I want to stay put!
        </div>
    </div>
</div>

$("[data-special='sticker']").each(function () {
    $('#wrapper').append(
        $('<div/>').html($(this).html())
                   .addClass("sticker")
                   .css('top', parseInt($('#container').css('top')) + parseInt($(this).css('top')))
                   .css('left', $('#container').css('left'))
                   .css('width', $('#container').css('width'))
                   .css('background-color', $(this).css('background-color'))
    );
    $(this).css('display', "none");
});    

让我知道它是如何为你工作的,还有一个缺点是一旦原始元素被隐藏,它曾经占据的空间就会折叠起来......我会尝试集思广益解决这个问题。

编辑:

更改 JS 以获取 #container宽度而不是原始元素宽度,因为原始元素比容器大。

编辑:

测试:jsfiddle

有些问题是元素随后也会与滚动条重叠,如果您知道滚动条的宽度,则可以从该值中减去 if。

同时检查上面更新的代码。有一些错误...

关于css - 我可以使用 "freeze"仅使用 CSS(或在移动设备上看起来不错的东西)的可滚动 DIV 中的元素吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16445336/

相关文章:

javascript - 在我的搜索 javascript 中制作滚动条

javascript - 嵌套列表,动态菜单 : creating a Next Page button

ios - Flutter:扩展图 block 在纵向模式下工作正常,在横向模式下失败

css - 移动菜单 z-index 问题?

特定 div 下的 css 重置

html - 强制跨度占用 2 行

html - DIV 内的边距

html - 在下一行打断 float 之前打断左边的文本

javascript - 弹出窗口 react 不够灵敏

html - 移动设备上的视口(viewport)高度