Как сделать скругленные углы 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/

Ответ 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;
        }
    }