Подтвердить что ты не робот

Webkit не соблюдает переполнение: скрыт с граничным радиусом

У меня есть прекрасная анимация Star Trek Red Alert с использованием CSS3. Один из моих родительских элементов имеет border-radius вместе с overflow:hidden, так что любое содержимое обрезается до формы радиуса границы.

Все это прекрасно работает в Firefox, но браузеры Webkit оставляют некоторые дочерние элементы висящими за пределами обрезанной области.

Вот мой код:

http://jsfiddle.net/doublewombat/EqK6R/embedded/result/

div с именем класса curvedEdges имеет border-radius и overflow:hidden. Однако блоки слева и справа от текста "Предупреждение" выходят за пределы этого радиуса, хотя они являются дочерними элементами curvedEdges. Или на простом английском, левый и правый края анимации должны быть слегка изогнуты (как в Firefox), а не мертвы прямо.

Так это ошибка в Webkit, или у меня что-то не так?

Вот он на YouTube, если у вас нет браузера Webkit...

http://www.youtube.com/watch?v=3vyVy21nWsE

4b9b3361

Ответ 1

Вы можете поместить абсолютный позиционный div над ним с граничным радиусом и толстой черной рамкой, чтобы блокировать части, которые вы хотите скрыть.

Я сделал демо для другого вопроса о подобной проблеме в FF3.6: http://jsfiddle.net/vfp3v/15/

border-radius; переполнение: скрыто, а текст не обрезается

Ответ 2

Во-первых, какая классная демонстрация!

Я осмотрелся и, похоже, проблема не в том, что у вас есть. второй ответ на чужую проблему исправил его для меня, хотя это не работает для сафари. Исправление заключается в использовании маскирования:

-webkit-mask-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAA5JREFUeNpiYGBgAAgwAAAEAAGbA+oJAAAAAElFTkSuQmCC);

Принятый ответ на тот же вопрос имеет другое исправление, которое, я думаю, действительно может помочь вам, но я не мог бы получить правильную комбинацию элементов и радиус границы.

Ответ 3

Я пытался сделать то же самое и использовал border-radius для маскировки элементов в круг.

Я смог использовать маскирование и радиальный градиент для достижения желаемого эффекта в Safari 6.0.3 (с переходами по положению и размеру).

Здесь одна строка кода, которую я добавил в элемент контейнера (маскирования):

-webkit-mask-image: -webkit-radial-gradient(circle, white, black);

Я думал, что мне придется использовать жесткие остановки цвета, как показано ниже, чтобы получить жесткий край:

-webkit-mask-image: -webkit-radial-gradient(circle, white 100%, black 100%);

Однако, он работает одинаково без (возможно, кто-то может просветить нас о том, почему). Обрезание не так гладко, как с радиусом границы, но оно превосходит изображение, непредсказуемо превышающее границы.

Вам может потребоваться настроить его для использования со старыми версиями Safari/Chrome и т.д., я не тестировал его в разных версиях (например, YMMV).

Ответ 4

Как представляется, проблема с браузером: https://code.google.com/p/chromium/issues/detail?id=157218

В основном, когда вы применяете анимацию к элементу, браузер будет обрабатывать ее в графическом процессоре (графическом процессоре) по соображениям производительности, а остальная часть - процессору. Это приводит к анимации над маской.

В качестве обходного пути вы можете попробовать добавить незаметное свойство transform, которое также инициирует обработку GPU для элемента маски, продвигая его на тот же уровень анимации:

#redAlert .curvedEdge {
    -webkit-transform: rotate(0.000001deg);
}

Я предполагаю, что это может варьироваться в зависимости от версии браузера, но также сообщалось, что эти другие значения запускают обработку GPU: rotate(0), translateZ(0)

Ответ 5

Кажется, что это проблема с графическим процессором/аппаратным составом. transform: translateZ(0); должен также исправить эту проблему. Для получения дополнительной информации об этом читайте http://aerotwist.com/blog/on-translate3d-and-layer-creation-hacks/

-webkit-transform: translateZ(0);
transform: translateZ(0);

Я включил префиксы поставщиков, но вы можете удалить их, если хотите.

Ответ 6

Кажется, это смешанное исправление:

.wrap {
    -webkit-transform: translateZ(0);
    -webkit-mask-image: -webkit-radial-gradient(circle, white 100%, black 100%);
}

http://jsfiddle.net/qWdf6/82/

Ответ 7

Как и хедз-ап, это исправление срабатывало только для меня, если я применил маску на контейнере с радиусом границы, но без границы. В конечном итоге у меня получилось что-то вроде этого:

<div style="border-radius: 15px; border: 1px solid red;">
    <div style="border-radius: 15px; overflow: hidden; -webkit-mask-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAA5JREFUeNpiYGBgAAgwAAAEAAGbA+oJAAAAAElFTkSuQmCC);">
        <span style="position: relative; left; -20px;">Some stuff that overflows.</span>
    </div>
</div>

С рамкой на внутреннем div, отсечение не было идеальным.

Совершенно странно.

Ответ 8

Я нашел еще одно возможное решение этой ошибки, используя клип CSS3, но работает только в последних версиях webkit (похоже, это работает в Chrome 24, но не в Safari 6.0.2). Ниже будет скопирован круг вокруг элемента:

-webkit-clip-path: circle(50%, 50%, 100%);

Надеюсь, что это будет реализовано больше браузерами в ближайшее время! Похоже, эта функция может иметь много интересных приложений. Вот соответствующее сообщение в блоге: http://blog.romanliutikov.com/coding/css-clip-path-landed-in-webkit/.