使用CSS过渡缩放图像

9

我希望图片能够像此处展示的那样平滑地缩放。

然而我的尝试并不像上述相册中那样,图片(在我的情况下是红色方块)会跳动。这是我的代码

section {
    background-color: rgba(0, 0, 0, 0.701961);
    width: 400px;
    height: 400px;
}

div {
    position: absolute;
    top: 120px;
    left: 120px;
    width: 160px;
    height: 160px;
    background-color: red;
    -webkit-transition: all .2s ease-in-out;

}

div:hover {
    -webkit-transform: scale(1.8);
}
<section>
    <div></div>
</section>

如何解决这个问题?红色正方形跳动。是否可能像链接中的画廊那样使用CSS过渡平滑缩放?
2个回答

12
你所说的“jumps”是什么意思?试一下这个链接,它也会跳吗?

section {
    background-color: rgba(0, 0, 0, 0.701961);
    width: 400px;
    height: 400px;
}

div {
    position: absolute;
    top: 120px;
    left: 120px;
    width: 160px;
    height: 160px;
    background-color: red;
    -webkit-transition: -webkit-transform 0.4s;
    transition: transform 0.4s;
}

    div:hover {
        -webkit-transform: scale(1.8) rotate(0.01deg);
        transform: scale(1.8) rotate(0.01deg);
    }
<section>
    <div></div>
</section>

此外,你可以尝试使用包含图像的容器变体(就像你问题中的第一个链接中的那样)。

JSFiddle

.banner {
    position: relative;
    z-index: 1;
    cursor: pointer;
    border: 1px solid #dfe2e5;
    background: #000;
    width: 310px;
    height: 150px;
    -webkit-transition: border-color 0.1s;
    transition: border-color 0.1s;
    overflow: hidden;
}

    .banner:hover {
        border-color: #bdc1c5;
    }

    .banner__image-container {
        overflow: hidden;
        height: 100%;
    }

    .banner__image {
        -webkit-transition: all 0.4s;
        transition: all 0.4s;
    }

        .banner:hover .banner__image {
            -webkit-transform: scale(1.15) rotate(0.01deg);
            transform: scale(1.15) rotate(0.01deg);
            opacity: 0.5;
        }
<div class="banner">
    <div class="banner__image-container">
        <img class="banner__image" src="https://picsum.photos/310/150/?image=1022"/>
    </div>
</div>


它仍然在我的Chrome版本(44.0.2403.155 m)上跳动,在Windows 7上。并非总是如此,但如果您反复悬停-取消悬停,某些情况下它会突然改变尺寸。我相信这是较新的Chrome版本中的一个错误。 - vals
是的,它确实会跳动,但因为比例较低,所以不太明显。但我认为这是一个错误,可能在其他设置中无法重现。 - vals
@Sergey Denisov确实,在问题的第一个示例中,图像有一个容器,但仅仅因为有容器这个原因会改变什么吗?您能否详细说明图像具有容器会带来什么不同之处?我想问题出在Chrome上。 - Piotr
@Piotr 当你有一个容器时,你可以通过级联应用:hover样式,就像我的例子一样:.banner:hover .banner__image { ... }。而且容器具有overflow: hidden。因此,由于图像在固定大小的容器内缩放,所以块的实际大小不会改变。我认为这可以解决“跳动”的问题。http://jsfiddle.net/sergdenisov/o1ztj3o0/ - sergdenisov
@Piotr 谢谢。我改进了我的答案,添加了最新的代码片段,适合你使用。 - sergdenisov
显示剩余4条评论

1

我有时会通过在 transform 属性上添加 rotate(0.01deg) 来解决转换时出现的奇怪跳跃问题,就像这样:

.element:hover {
    transform: scale(1.5) rotate(0.01deg);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接