Some time back I was implementing a functionality for Firefox browsers on Android devices and I found a strange problem – For Firefox > 18 on Android devices if I move an element using CSS3 Transformations inside a parent container with overflow:hidden, then part of the element being moved is displayed outside the overflowed region. It seems like when you move the element it just discards the overflow:hidden property and everything is revealed rather. Normally the content outside overflow:hidden should be cut off from view.
I have a simple demo http://rialab.jbk404.site50.net/ffandroidissue/ – an image which is bigger than the container div is moved using CSS3 Transformations. The div has a overflow:hidden set to it. There are two buttons. Click on them to see the various results. The first button causes the issue whereas the second button resolves it.
So this is what causes the issue – moving the image using CSS3 Transformations (for eg. transform:translateX(value);) inside a container with overflow:hidden
And this is what solves it – strange !!
Adding a background color and an opacity to the container element like this,
#container.noissue{
-moz-perspective: 1000px;
overflow: hidden;
background:#ccc;
width: 100px;
height: 50px;
display: block;
position:absolute;
top:50px;
right:50px;
background:#ccc;
opacity:0.99;
}
Check out the demo in Firefox on an Android device. I am not sure if anybody has encountered this situation. But this definitely seems to be a bug in Firefox for Android’s. This is not seen for other browsers.
Fantastic!!! This little bug has been driving me mad
Aha, even you had the same issue. This was really painful isn’t it?
Great! I was searching a lot to find a workaround for this, also posted a question on SO (http://stackoverflow.com/questions/15405054/firefox-mobile-element-animated-with-translate3d-flows-out-from-parent-containe)
Your solution with opacity kind of works (I already had background on the element), but still has some rendering problems.
Btw, my problem occurs with the mobiscroll picker, it can be reproduced here: http://demo.mobiscroll.com/datetime#display=inline
Works perfect!
Thanks a lot!
Thanks – it worked 🙂 strange bug
BTW I found this bug doing a PhoneGap app on Android
This isn’t a bug, it has to do with paint layers – i.e. GPU layers. A paint layer (that lies above everything else) is created by using transforms OR opacity (which explains why your workaround works).
Yep! So I add a style transform: translate(0,0); to the container element to fix this problem, and it works perfectly!
Thank you, spent couple of days trying to solve the problem. You saved me a couple more 😀
Thanks for sharing the solution.
It’s kinda strange how an opacity could solve this issue.
Superstrange thing a had ever saw, but working!
You save my day, thank you!
For me, the Opacity and Background were unnecessary, and it didn’t work without the “position: absolute”. I tried removing just this part to test, and indeed the “absolute” is what makes the “overflow: hidden” work in my case. If it matters, I’m using a DIV container with a TABLE inside, and I’m using all three translations with all three rotations.
Awesome post