【问题标题】:CSS: Problems when using object-fit and transform together on webkitCSS:在 webkit 上同时使用 object-fit 和 transform 时的问题
【发布时间】:2015-07-12 10:43:07
【问题描述】:

我正在尝试在 img 元素上同时使用 css 属性 object-fit: cover 来填充包含 divtransform: scale(xx) 的图像,以使图像在悬停时缩小。

这是一个小提琴示例:https://jsfiddle.net/96kbuncq/
编辑:带有真实图像的示例:https://jsfiddle.net/96kbuncq/3/

HTML:

<div>
   <div class="category">
      <img src="http://placehold.it/1200x950&text=1200x950+-+Category+1+-" />
   </div>
   <div class="category">
      <img src="http://placehold.it/1200x950&text=1200x950+-+Category+2+-" />
   </div>
   <div class="category">
      <img src="http://placehold.it/1200x950&text=1200x950+-+Category+3+-" />
   </div>
</div>

CSS:

.....

div.category img {
  display: block;
  height: 100%;
  width: 100%;
  object-fit: cover;
  object-position: center;
}

/* Transformations */

div.category img {
  transition: transform 0.35s;
  transform: /*translateZ(0)*/ scale(1.12);
}

div.category:hover img {
  transform: /*translateZ(0)*/ scale(1);
}

这在 Firefox 中运行良好,但在 Chrome 和 Opera 中我有以下问题:

  • 当悬停第一个 div 时,其他两个也会受到影响(悬停在第二个时,第三个也会受到影响),
  • 当悬停div 时,内部的图像首先完全显示(我们可以看到整个图像被拉伸以适合div),然后正确缩小并“覆盖”div

我不知道如何解决这些问题。

关于第一个问题(受影响的兄弟姐妹),我发现其他答案说要使用translateZ(0),但是当我添加这个时,object-fit: cover 不再起作用(整个图像被拉伸以适应div )。

任何想法如何在 Chrome 中进行这项工作? (object-fittransform 在没有另一个的情况下都可以正常工作。)

【问题讨论】:

    标签: css webkit transform scale


    【解决方案1】:

    经过测试,似乎需要backface-visibilitytranslateZtranslate3d来防止变换闪烁,打破object-fitbackground-size。如果您的目标是使图像居中,则可以使用position: absolutetranslate,如下例所示。

    div.category {
        width: 80%;
        height: 150px;
        margin: 20px;
        position: relative;
        overflow: hidden;
    }
    img {
        display: block;
        width: 100%;
        position: absolute;
        top: 50%;
        left: 50%;
        transform: translate(-50%, -50%) scale(1.12); /* order is important here*/
        backface-visibility: hidden;
        transition: transform 0.35s;
    }
    div.category:hover img {
        transform: translate(-50%, -50%) scale(1);
    }
    <div>
        <div class="category">
            <img src="http://www.4freephotos.com/images/batch/Elephant-dusting674.jpg" />
        </div>
        <div class="category">
            <img src="http://www.4freephotos.com/images/batch/Bananas-and-kiwi-221.jpg" />
        </div>
        <div class="category">
            <img src="http://placehold.it/1200x950&text=1200x950+-+Category+3+-" />
        </div>
    </div>

    http://jsfiddle.net/moogs/r1s1rtLk/4/

    【讨论】:

    • 这样我遇到了与使用 translateZ(0) 时相同的问题,对象拟合不起作用并且图像被拉伸。也许我们更好地看到真实图像的问题:jsfiddle.net/96kbuncq/2
    • 谢谢。这在 Chrome 中运行良好,但在 Firefox 中,图像不是垂直居中的。你知道如何让它在 Firefox 中也能正常工作吗?
    • 如果您不需要解决创建对象匹配的特定问题,您可以使用此方法。也就是说,您事先不知道图像是否必须与宽度相关或与高度相关。
    【解决方案2】:

    您可以创建一个额外的图层,使用类包装,并使用它来制作缩放效果

    你的风格是一样的,但重新签名

    html, body {
        width: 100%;
        height: 100%
    }
    
    div.category {
        width: 80%;
        height: 150px;
        background-color: yellow;
        margin: 20px;
        overflow: hidden;
        position: relative;
    }
    
    .wrap {
        position: absolute;
        height: 100%;
        width: 100%;
    }
    
    div.category .wrap img {
        display: block;
        height: 100%;
        width: 100%;
        object-fit: cover;
        object-position: center;
    }
    
    /* Transformations */
    
    div.category .wrap {
        transition: transform 0.35s;
        transform:  scale(1.12);
    }
    
    div.category:hover .wrap {
        transform:  scale(1);
    }
    <div>
        <div class="category">
            <div class="wrap">
            <img src="http://www.4freephotos.com/images/batch/Elephant-dusting674.jpg" />
            </div>
        </div>
        <div class="category">
            <div class="wrap">
            <img src="http://www.4freephotos.com/images/batch/Bananas-and-kiwi-221.jpg" />
            </div>
        </div>
        <div class="category">
            <div class="wrap">
            <img src="http://placehold.it/1200x950&text=1200x950+-+Category+3+-" />
            </div>
        </div>
    </div>

    【讨论】:

    • 感谢您的回答。现在它可以在 Chrome 中使用,但在 Firefox 中,图像在悬停时会被拉伸,而不仅仅是缩小。你知道如何让它在 Firefox 和 Chrome 中都能正常工作吗?
    • 抱歉,无法为这两种方法找到解决方法。但两者都是浏览器错误,所以这可能会在未来的版本中得到修复。使用带有 background-image 的 div 而不是 img 可以吗?
    • 还是谢谢你。我不想使用 background-image 并且其他解决方案对我有用,所以我会在更好地支持 object-fit 之前使用它。
    猜你喜欢
    • 1970-01-01
    • 2014-05-04
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 2011-10-02
    • 2015-10-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多