Как сделать скругленные углы CSS3 скрывать переполнение в Chrome/Opera
Мне нужны круглые углы родительского div для маскировки содержимого из его дочернего элемента. overflow: hidden
работает в простых ситуациях, но ломается в браузерах на основе webkit и Opera, когда родитель размещается относительно или абсолютно.
Это работает в Firefox и IE9:
CSS
#wrapper {
width: 300px;
height: 300px;
border-radius: 100px;
overflow: hidden;
position: absolute;
}
#box {
width: 300px;
height: 300px;
background-color: #cde;
}
HTML
<div id="wrapper">
<div id="box"></div>
</div>
Пример JSFiddle
Спасибо за помощь!
ОБНОВЛЕНИЕ: Ошибка, связанная с этой проблемой, была исправлена в Chrome. Однако я не перепробовал Opera или Safari.
Ответы
Ответ 1
Невзирая на всех, мне удалось решить проблему, добавив дополнительный div между оберткой и полем.
CSS
#wrapper {
position: absolute;
}
#middle {
border-radius: 100px;
overflow: hidden;
}
#box {
width: 300px; height: 300px;
background-color: #cde;
}
HTML
<div id="wrapper">
<div id="middle">
<div id="box"></div>
</div>
</div>
Спасибо всем, кто помог!
→ http://jsfiddle.net/5fwjp/
Ответ 2
Я нашел другое решение для этой проблемы. Это похоже на еще одну ошибку в WebKit (или, возможно, на Chrome), но она работает. Все, что вам нужно сделать - это добавить маску CSS WebKit в элемент #wrapper. Вы можете использовать одно пиксельное PNG-изображение и даже включить его в CSS для сохранения HTTP-запроса.
#wrapper {
width: 300px; height: 300px;
border-radius: 100px;
overflow: hidden;
position: absolute; /* this breaks the overflow:hidden in Chrome/Opera */
/* this fixes the overflow:hidden in Chrome */
-webkit-mask-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAA5JREFUeNpiYGBgAAgwAAAEAAGbA+oJAAAAAElFTkSuQmCC);
}
#box {
width: 300px; height: 300px;
background-color: #cde;
}
Пример JSFiddle
Ответ 3
Добавьте z-index к вашему элементу border-radius'd и замаскируйте его внутри.
Ответ 4
непрозрачность: 0,99; на обертке решить ошибку webkit
Ответ 5
Кажется, это работает:
.wrap {
-webkit-transform: translateZ(0);
-webkit-mask-image: -webkit-radial-gradient(circle, white 100%, black 100%);
}
http://jsfiddle.net/qWdf6/82/
Ответ 6
Не ответ, но это исправленная ошибка под источником Chromium:
http://code.google.com/p/chromium/issues/detail?id=62363
К сожалению, похоже, что кто-то работает над этим.: (
Ответ 7
Поддерживается в последних хром, опера и сафари, вы можете сделать это:
-webkit-clip-path: inset(0 0 0 0 round 100px);
clip-path: inset(0 0 0 0 round 100px);
Вы обязательно должны проверить инструмент http://bennettfeely.com/clippy/!
Ответ 8
измените непрозрачность родительского элемента на границе, и это приведет к упорядочиванию элементов с элементами. Это чудесным образом помогло мне после нескольких часов исследований и неудачных попыток. Это было так же просто, как добавление непрозрачности 0,99 для организации этого процесса рисования браузеров. Проверьте http://philipwalton.com/articles/what-no-one-told-you-about-z-index/
Ответ 9
на основе грамотного отличного ответа...
Здесь представлен более реальный пример, в котором есть два точных divs с некоторым содержимым наполнителя. Я заменил жестко закодированный png-фон как раз шестнадцатеричным значением, т.е.
-=-webkit-mask-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAA5JREFUeNpiYGBgAAgwAAAEAAGbA+oJAAAAAElFTkSuQmCC);
заменяется на
-webkit-mask-image:#fff;
Смотрите этот JSFiddle... http://jsfiddle.net/hqLkA/
Ответ 10
Что касается меня, то ни один из решений не работал хорошо, только используя:
-webkit-mask-image: -webkit-radial-gradient(circle, white, black);
на элементе обертки выполнил задание.
Вот пример: http://jsfiddle.net/gpawlik/qWdf6/74/
Ответ 11
Вот посмотрите, как я это сделал; Jsfiddle
С кодом, который я вложил, мне удалось заставить его работать с Webkit (Chrome/Safari) и Firefox. Я не знаю, работает ли она с последней версией Opera. Да, она работает в последней версии Opera.
#wrapper {
width: 300px; height: 300px;
border-radius: 100px;
overflow: hidden;
position: absolute; /* this breaks the overflow:hidden in Chrome/Opera */
}
#box {
width: 300px; height: 300px;
background-color: #cde;
border-radius: 100px;
-webkit-border-radius: 100px;
-moz-border-radius: 100px;
-o-border-radius: 100px;
}
Ответ 12
Если вы хотите создать маску для изображения и поместить изображение внутри контейнера, не устанавливайте атрибут position: absolute. Все, что вам нужно сделать, это изменить маржу-левый и margin-right. Chrome/Opera будет придерживаться правил переполнения: скрытого и пограничного радиуса.
// Breaks in Chrome/Opera.
.container {
overflow: hidden;
border-radius: 50%;
img {
position: absolute;
left: 20px;
right: 20px;
}
}
// Works in Chrome/Opera.
.container {
overflow: hidden;
border-radius: 50%;
img {
margin-left: 20px;
margin-right: 20px;
}
}