44

I am having getting a weird bug when I use a combination of overflow, border-radius, and transition. I have a div with an img inside of it:

<a href="#" class="block size1 annualreport nonprofit">
    <div class="inner_block">
        <img src="http://i.imgur.com/8uuZB.jpg" />
    </div>
</a>

The div has a border-radius, and overflow is set to hidden:

body {background-color:#78735e;}

.block {
    position: absolute;
    left: 0px;
    top: 0px;
    border-radius: 10px;
    margin: 6px;
    box-shadow: 0px 0px 6px 2px rgba(0, 0, 0, 0.2);
    overflow:hidden;
}
.size1 {
    width: 226px;
    height: 464px;
    min-width: 160px;
    max-width: 226px;
}
.inner_block {
    overflow: hidden;
    border-radius: 10px;
}
.block img {
    width: 100%;
    height: 100%;
    transition: all 0.1s;
}

.block img:hover { width:115%; height:115%; }

When I hover over the img I have a transition that takes place which makes the image larger to create a zooming effect. The problem is that the overflow seems to break on the bottom left and bottom right of the image.

I have created a JSFiddle for you to see what I'm talking about. http://jsfiddle.net/dmcgrew/HuMrC/1/

It works fine in Firefox, but breaks in Chrome and Safari.

Anyone know what might be causing this or how to fix it?

allenski
  • 1,652
  • 4
  • 23
  • 39
Dustin
  • 4,314
  • 12
  • 53
  • 91
  • Thanx for your question, was about to post my own :) Thanx! – Danny van Holten Jul 13 '14 at 22:55
  • 1
    Please look at this: http://stackoverflow.com/questions/20001515/chrome-bug-border-radius-not-clipping-contents-when-combined-with-css-transiti This is the final answer and best solution! – Jay Chow Aug 07 '15 at 08:37
  • 1
    Related Chromium bug: [#157218](https://code.google.com/p/chromium/issues/detail?id=157218). – Ivan Akulov Nov 13 '15 at 14:19
  • 1
    Related Safari/Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=68196 – Oliver Joseph Ash May 19 '20 at 19:07
  • The accepted answer didn't work for me because I can't have the clear border increasing the clickable area of the masked element, nor do I want it to obscure that of other elements (and setting the height to 100% didn't solve the issue). See [my answer to a related question](https://stackoverflow.com/a/16109635/1502691) for a possible solution. – bschnur Apr 19 '13 at 16:50

8 Answers8

107

I had the same exact issue. Adding this to the parent container solved it for me (this is a LESS mixin).

.transitionfix() {
    -webkit-backface-visibility: hidden;
    -moz-backface-visibility: hidden;
    -webkit-transform: translate3d(0, 0, 0);
    -moz-transform: translate3d(0, 0, 0)
}
HandiworkNYC.com
  • 10,914
  • 25
  • 92
  • 154
5

-- Simple Solution --

On the same element that has the animation transition, simply add:

.animated-item {
    will-change: transform; /* New line to add to your existing CSS */
}

The will-change CSS property hints to browsers how an element is expected to change. Browsers may set up optimizations before an element is actually changed. These kinds of optimizations can increase the responsiveness of a page by doing potentially expensive work before they are actually required. ~ https://developer.mozilla.org/en-US/docs/Web/CSS/will-change

allenski
  • 1,652
  • 4
  • 23
  • 39
3

I have faced this issue on Safari(It's a known bug in safari); fixed it by applying -webkit-mask-image and it works for me perfectly. cheers

.block {
  -webkit-mask-image: -webkit-radial-gradient(white, black);
}
Olivier Tassinari
  • 8,238
  • 4
  • 23
  • 23
Azhar
  • 693
  • 9
  • 22
2

I added minus z-index value for image and higher value for parent

li {z-index:10; overflow: hidden;}

li img {z-index: -10;}
Rijo
  • 2,568
  • 1
  • 22
  • 30
  • z-index does not cancel out like this. This logic is flawed. Adding a z-index may help, but the reasoning (and having 2 like this) is incorrect – Zach Saucier Oct 18 '22 at 15:41
1

I don't know if I'm understanding the problem correctly as the image isn't loading. If you add height: 100%; to .inner_block does it help your issue?

http://jsfiddle.net/HuMrC/2/

mikevoermans
  • 3,967
  • 22
  • 27
  • 2
    Yep that seems to fix it. I was also just able to fix it by adding a border with transparent color to the .block div. – Dustin Jan 17 '13 at 16:50
0

There's already an answer about a CSS property for creating a new stacking context:

isolation: isolate;
Enrique
  • 9
  • 1
-1

I've had an issue in the past like this while trying to zoom into a photo inside a div. I fixed it by adding rotation scale(1.05) rotate(0.02deg) to the scale transform (It actually removed the glitchy lines)

My issue today is getting the glitch lines off a translateY div hover effect. Surprisingly enough, I got rid of them by removing overflow: hidden;

Hopefully this helps future debuggers.

mateostabio
  • 958
  • 8
  • 11
-1

It is a problem about stacking context.

We can use methods listed in MDN - stacking context to form a stacking context:

  • position: relative; z-index: 1;
  • -webkit-mask-image: -webkit-radial-gradient(white, black);
  • opacity: 0.999;
  • will-change: transform;

For me personally, the first method is the best.

Elvinn
  • 39
  • 3