CSS background-size:封面+背景附件:固定剪辑背景图片

God*_*win 34 css background-image background-attachment background-size

我有一个包含背景图像的图表列表.类似于以下内容:

<ul>
  <li>
    <figure style="background-image: url(...);"></figure>
  </li>
  <li>
    <figure style="background-image: url(...);"></figure>
  </li>
  <li>
    <figure style="background-image: url(...);"></figure>
  </li>
</ul>
Run Code Online (Sandbox Code Playgroud)

这些图像中的每一个都background-size设置为coverbackground-attachment设置为fixed.

figure {
  width: 100%;
  height: 100%;
  background-size: cover;
  background-attachment: fixed;
}
Run Code Online (Sandbox Code Playgroud)

当每个图形占据整个视口时,这可以正常工作,但如果存在任何类型的偏移,则背景图像被剪切.

据我所知,这是设计(https://developer.mozilla.org/en-US/docs/Web/CSS/background-size#Values).

我希望图像可以垂直或水平剪辑,但不能同时剪辑,而是以图形本身的大小为中心.

我知道有javascript解决方案但是有没有办法用CSS做到这一点?

这是一个工作示例:http://codepen.io/Godwin/pen/KepiJ

Enn*_*nui 56

不幸的是,这只是一个固定定位如何在CSS中工作的工件,并且在纯CSS中无法解决它 - 你必须使用Javascript.

之所以出现这种情况是由于组合background-attachment: fixedbackground-size: cover.当你指定background-attachment: fixed它时,它本质上会使它background-image表现得好像它是一个position: fixed图像,这意味着它从页面流和定位上下文中取出并变得相对于视口而不是它作为背景图像的元素.

因此,无论何时一起使用这些属性,cover都会相对于视口的大小计算该值,而不管元素本身的大小如何,这就是当元素与视口大小相同但被裁剪的情况下,它按预期工作的原因元素小于视口时的意外方式.

为了解决这个问题,你基本上需要使用background-attachment: scroll并将事件监听器绑定到scrollJS中的事件,该事件监听器手动更新background-position窗口滚动的距离,以便模拟固定定位,但仍然background-size: cover相对于容器元素而不是视口计算.

  • 有一种更简单的方法可以做到这一点。而不是使用background-position:fixed,而是使用position:fixed创建背景ELEMENT,然后使用background-size:cover。这将根据bg元素与视口的大小来覆盖图像,并且仍然为您提供固定的背景。 (3认同)
  • 是否有一个特定的原因,在最后一段中你建议使用CSS大小和JS定位与CSS定位和JS大小调整? (2认同)
  • 不是特别说明,尽管我没有像你提到的那样尝试,但两种方式都应该是可行的.主要是因为我认为JS定位比JS在这种情况下的大小更快/更容易编写. (2认同)

小智 22

有一个jQuery修复此问题:http://jsfiddle.net/QN9cH/1/ 我知道它不是最佳的,但至少它的工作:)

$(window).scroll(function() {
  var scrolledY = $(window).scrollTop();
  $('#container').css('background-position', 'left ' + ((scrolledY)) + 'px');
});
Run Code Online (Sandbox Code Playgroud)