【问题标题】:Is there a way to use CSS to make a background image act like "cover" but at 120%?有没有办法使用 CSS 使背景图像表现得像“封面”但 120%?
【发布时间】:2016-11-28 20:41:33
【问题描述】:

CSS 值background-size: cover 将拉伸图像但保持其宽高比。但是,它只会拉伸它,直到最小边达到父节点同一边的 100%。

/* This is an image of 100px Wide x 50px Tall, so it'll 
   stretch to 100% of the window height and then scale the
   width larger to retain its width-to-height ratio.
 */
body
{
    background-image: url( "/images/test.png" );
    background-size: cover;
    background-position: center;
}

我想要一些可以做掩护但比例更大的东西,例如 130%。 (我将在 CSS 关键帧动画中使用它来使背景图像放大/缩小)

我该怎么做?

【问题讨论】:

  • 我不相信有任何这样的价值 - 我什至不确定background-size 是一个可以在所有浏览器中动画的属性。您能否使用背景创建一个单独的元素(设置为 cover)并让您的关键帧动画使用 transform: scale() 缩放该元素?
  • @JonUleis 我认为这必须是解决方案。我只是想知道是否有纯 CSS 方式。
  • 您可以为此使用媒体查询吗?检查窗口是否超过了一定的宽度,如果超过,则使用 130% 作为 background-size 的宽度值。如果在一定宽度以下,则将background-size的高度值设置为130%。或者类似的东西......
  • @KodosJohnson 我想让它变得更大

标签: html css


【解决方案1】:

通过使用伪元素,您可以实现类似的效果

CSS 动画的浏览器支持率为 +90%:http://caniuse.com/#feat=css-animation

.bkg {
  position: absolute;
  left: 0;
  top: 0;
  right: 0;
  bottom: 0;
  overflow: hidden;
}
.bkg::before {
  content: '';
  position: absolute;
  left: 0;
  top: 0;
  width: 100%;
  height: 100%;
  background-image: url(http://lorempixel.com/500/400/nature/1);
  background-size: cover;
  background-position: center;
  animation: growme 5s forwards;
}
@keyframes growme {
  from {transform: scale(1);}
  to   {transform: scale(1.3);}  
}
<div class="bkg"></div>

增长和缩小

.bkg {
  position: absolute;
  left: 0;
  top: 0;
  right: 0;
  bottom: 0;
  overflow: hidden;
}
.bkg::before {
  content: '';
  position: absolute;
  left: -20%;
  top: -20%;
  width: 140%;
  height: 140%;
  background-image: url(http://lorempixel.com/500/400/nature/1);
  background-size: cover;
  background-position: center;
  animation: shrinkme ease-in-out 10s infinite;
}
@keyframes shrinkme {
  0%   {transform: scale(1);}
  50%  {transform: scale(.72);}  
  100% {transform: scale(1);}
}
<div class="bkg"></div>

根据一些浏览器存在动画伪元素问题的评论进行更新,其中只需使用子元素即可。

.bkg {
  position: absolute;
  left: 0;
  top: 0;
  right: 0;
  bottom: 0;
  overflow: hidden;
}
.bkg div {
  position: absolute;
  left: 0;
  top: 0;
  width: 100%;
  height: 100%;
  background-image: url(http://lorempixel.com/500/400/nature/1);
  background-size: cover;
  background-position: center;
  animation: growme 5s forwards;
}
@keyframes growme {
  from {transform: scale(1);}
  to   {transform: scale(1.3);}  
}
<div class="bkg"><div></div></div>

【讨论】:

  • 好答案。将伪宽度和高度设置为 100% 会不会更好,以便它适应基本元素?
  • @LGSon 知道浏览器支持使用伪元素并为其提供背景和动画吗? caniuse.com/#search=keyfr 似乎表明 iOS Safari 中的伪元素动画存在问题。
  • @DonRhummy 用 3:rd 样本更新了我的答案,使用子元素而不是伪
  • @DonRhummy 如果你将 scale 与脚本结合起来,它可以在 IE9 下运行
【解决方案2】:

我之前通过将背景图像应用于绝对定位的伪元素(例如 ::before)并对其应用缩放变换来完成此操作。

【讨论】:

  • 知道浏览器对此的支持是什么吗?
  • Transform 被所有现代浏览器支持,而且大多是几个版本。所有现代浏览器都支持伪元素,有好几个版本。所以,我的假设是,两者的组合似乎得到了很好的支持。我已经在真实的文字制作中使用了它,因为它与现代浏览器的当前版本和 2 个版本都兼容。
  • 不支持变形,支持动画伪元素。
  • 关键帧动画只是一系列 css 调用,因此任何通过 CSS 支持的选择器都将支持关键帧动画。我会确保使用特定于浏览器的前缀 -webkit、-moz 和 -o。我知道的伪元素的唯一限制是 JS 无法触摸它们
猜你喜欢
  • 1970-01-01
  • 2014-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多