Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to hide canvas content from parent rounded corners in any webkit for Mac?

Tags:

css

canvas

I have a parent div with rounded corners that contains a canvas:

<div id="box">
    <canvas width="300px" height="300px"></canvas>
</div>​

#box {
    width: 150px;
    height: 150px;
    background-color: blue;
    border-radius: 50px;
    overflow: hidden;
}​

The canvas renders a red rectangle that overflows the parent. As expected, this is what I get in all browsers:

enter image description here

The problem:

However, for webkit browsers running in Mac OS lion (I tested Safari 5.1.5 and Chrome 19), the canvas is still visible in the round corners:

enter image description here

Interestingly, this problem seems to happen only when the inner element is a canvas. For any other child element, the content is correctly hidden.

One workaround would be to apply the same rounded corners to the canvas itself, but unfortunately this is not possible, since I need to animate the canvas relative position.

Another workaround that should work, is to redraw the canvas in a clipped region that resembles the rounded corners shape, but I would prefer a cleaner CSS3 solution.

So, does one know how to fix this for Safari and Chrome on Mac?

EDIT: Problem also happens in Chrome on Win7

jsFiddle here

like image 236
Jose Rui Santos Avatar asked May 16 '12 10:05

Jose Rui Santos


4 Answers

Issue 137818: Large canvas does not honor containing div's border-radius

I solved this with CSS tag to parent div to:

transform: translate3d(0,0,0);

it works on the current chrome version 36.0.1985.143 m

jsfiddle.net/PJqXY/38/

#box {
    width: 150px;
    height: 150px;
    background-color: blue;
    border-radius: 50px;
    overflow: hidden;
    transform: translate3d(0,0,0);
}
like image 189
Dowai Avatar answered Nov 11 '22 19:11

Dowai


Here's the code to add in the css :

 -webkit-mask-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAA5JREFUeNpiYGBgAAgwAAAEAAGbA+oJAAAAAElFTkSuQmCC); /* this fixes the overflow:hidden in Chrome/Opera */

HTML Source Code

<div id="box">
  <canvas width="300px" height="300px"></canvas>
</div>

Css Source Code

#box {
    width: 150px;
    height: 150px;
    background-color: blue;
    border-radius: 50px;
    overflow: hidden;
    -webkit-mask-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAA5JREFUeNpiYGBgAAgwAAAEAAGbA+oJAAAAAElFTkSuQmCC); /* this fixes the overflow:hidden in Chrome/Opera */
}

Javascript Source Code

var $canvas = $("canvas");

if ($canvas[0].getContext) {
    var context = $canvas[0].getContext('2d');
    context.fillStyle = 'red';
    context.fillRect(10, 10, 300, 60);
}

Note : This Need's Jquery

Example : http://jsfiddle.net/PJqXY/12/

like image 20
David Surprenant Avatar answered Nov 11 '22 19:11

David Surprenant


Bug still exists (11/2015), but another workaround is to add position: relative; to the overflow:hidden; element.

like image 24
Laurent VB Avatar answered Nov 11 '22 19:11

Laurent VB


This is what I found out:

In the canvas element, when the multiplication of width by height is 66000 or greater, the canvas ignores the parent's overflow property.

For example, the following one fails, because 300*220 = 66000

<canvas width="300" height="220"></canvas>

This one works fine:

<canvas width="300" height="219"></canvas>

I've found this bug report after googling for "canvas 66000". It is not related with overflow, but I am sure is the same bug.

Thanks for Jeemusu for pointing me in the right direction.

like image 36
Jose Rui Santos Avatar answered Nov 11 '22 19:11

Jose Rui Santos