【问题标题】:keep the background image fixed position and centered保持背景图像固定位置和居中
【发布时间】:2017-01-22 07:54:52
【问题描述】:

在我的项目中,我需要在容器可见部分的中心(相对于窗口)显示一个小图像,即.loader。即使用户滚动页面,图像也应该在.loader 的中心可见。

我成功实现了这一点,但现在我面临一个边缘情况,即当用户将页面“向上滚动到页眉”或“向下滚动到页脚”时,小图像被隐藏了。 demo

这实际上是正常行为,但在这些边缘情况下,我希望图像贴在.loader 容器的顶部/底部

我想要什么:

  • 将小图像始终保持在.loader 容器的中心。 (我已经实现了这个
  • 当滚动到.loader 容器的任何一端时,图像应保持在该端,而不是隐藏在容器后面。

Fiddle

首选仅使用 css 的解决方案。我正在寻找 IE9+、chrome 和 firefox 中的浏览器支持。

.header {
    height: 600px;
    width: 650px;
    background-color: grey;
}
.left-side {
    height: 300px;
    width: 150px;
    float: left;
    background-color: red;
}
.loader {
    background-image: url('http://i.imgur.com/U2njI.jpg');
    margin-left: 150px;
    height: 1500px;
    width: 500px;
    background-position: 345px center;  
    background-repeat: no-repeat;
    background-attachment: fixed;
    background-color: cornflowerblue;
}
.footer {
    height: 600px;
    width: 650px;
    background-color: silver;
}
<div class="header"></div>
<div class="left-side"></div>
<div class="loader"></div>
<div class="footer"></div>

【问题讨论】:

  • 对不起,如果只有我无法理解问题。
  • @C-link 我添加了更多解释。如果您仍然无法理解,请告诉我。
  • 你应该使用 jquery!
  • @Mr_Green - 这就是 position:sticky 的好处。请参阅 herehere 和(然后)[这里] (jsfiddle.net/danield770/msUP9) - 如果您启用了标志
  • @Danield 感谢您提供这个很酷的信息。我希望这对未来的用户有所帮助。 :) 顺便说一句,随着 chrome 引擎升级为闪烁,该标志现在已更改。 link

标签: javascript html css


【解决方案1】:

这是一个使用 javascript 的有效解决方案,我希望它的行为是您所期望的。不幸的是,我现在无法在 IE9 上对其进行测试,但它应该可以工作 (DEMO):

document.addEventListener('DOMContentLoaded',function() {
    var loader = document.querySelector('.loader'),
        loaderRect = loader.getBoundingClientRect(),
        loaderTop = loaderRect.top + document.body.scrollTop,
        loaderBottom = loaderTop + loader.offsetHeight,
        initialBgPos = loader.style.backgroundPosition,
        imageHeight = 141;

    function onScroll() {
        var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;

        if(loaderTop >= (scrollTop + (window.innerHeight - imageHeight)/2)) {
            loader.style.backgroundPosition='345px ' + (loaderTop - scrollTop) + 'px'; 
        } else if(loaderBottom <= (scrollTop + (window.innerHeight + imageHeight)/2)) {
            loader.style.backgroundPosition='345px ' + (loaderBottom - scrollTop - imageHeight) + 'px'; 
        } else {
           loader.style.backgroundPosition = initialBgPos;
        }
    }

    window.addEventListener('scroll', onScroll);
    onScroll();    
});

【讨论】:

  • 非常感谢.. 不知何故我没有得到您的回答.. 我重新访问了我的帖子以寻求赏金并找到了您的解决方案.. 我认为只有 css 是不可能的.
【解决方案2】:

实现我认为你想要的。我们必须将 .loader div 的位置设置为固定,然后它会一直停留在它所在的位置,无论用户是否滚动页面,div 也会滚动。下面介绍如何在 CSS 中将 loader 的位置设置为固定(您可能还需要获取固定 div 的位置):

.loader{
    position: fixed;
    left: 100px;
    top: 300px;
 }

这是您更新的 JSFiddle:http://jsfiddle.net/Ezhb4/4/

【讨论】:

  • Xanco,主容器在哪里?我的意思是.loader
  • 由于JSFiddle结果窗口太小可能不会出现,试试这个:fiddle.jshell.net/Ezhb4/4/show
  • 应该会出现,它是我项目中的主容器。
  • 您的 JSFiddle 中是否还有其他 HTML/CSS 未包含在内?它在这里工作正常:postimg.org/image/enljqw9ah 我已经在 CSS 中注释掉了背景颜色,以防你想知道
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-30
  • 1970-01-01
  • 2013-03-26
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多