Як змусити закруглені кути CSS3 приховати переповнення в Chrome / Opera


147

Мені потрібні круглі кути на батьківському діві, щоб замаскувати вміст його дитини. overflow: hiddenпрацює в простих ситуаціях, але відбувається перерва у веб-браузерах на базі веб-програм і 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. Однак я ще не перевіряв Оперу чи Сафарі.

Відповіді:


183

Я знайшов інше рішення цієї проблеми. Це схоже на чергову помилку в WebKit (або, можливо, в Chrome), але вона працює. Все, що вам потрібно зробити - це додати CSK-маску 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
дякую за це виправлення спробував це в сафарі сьогодні (v6.0.2) і працював на мене там!
billythetalented

6
це, однак, порушить тіні на елементі.
Джек Джеймс

1
Це працює і на обгортках з абсолютно розташованими дітьми, де іншого рішення тут немає. Приємно!
Дан Телло

2
використовуючи Chrome 42.0.2311.90 (64-бітний), і це виправлення все- таки потрібно ... дякую!
симон

2
ваші рішення видаляють тіні батьківського елемента.
ABDeveloper

106

Додайте z-індекс до елемента-радіуса кордону, і він замаскує речі всередині нього.


@Sifu: ти просто помилився. З будь-якої причини додавання z-індексу, як було запропоновано, вирішило цю точну для мене проблему (у поточній версії Chrome), і це більш просте, більш загальне рішення, ніж відповідь вгорі.
Нік F

7
@simon: пам’ятайте, що для досягнення z-індексу необхідно виконати певні умови (наприклад, потрібно встановити позицію). Деталі дивіться тут .
Нік Ф

@NickF - це була помилка в Chrome (-ium); -webkit-mask-image: -webkit-radial-gradient(circle, white, black);було ефективним рішенням, але, на щастя, помилка виправлена ​​в останньому оновлення, яке я отримав у Chrome.
симон

z-індекс 1 до контейнера. z-індекс -1 до абсолютного елемента вирішив це для мене.
aZtraL-EnForceR

Цей працював на мене. Вищеописаний розчин для обгортки не відповідає.
Ruwen

58

Не зважаючи на всіх, мені вдалося вирішити проблему, додавши додаткову діву між обгорткою та коробкою.

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/


12
Це працює, тому що позиціоновані елементи не відсікають їх вміст до межі радіусу в Webkit. Цей додатковий шар просто робить його так, щоб div з радіусом кордону НЕ розміщувався, а просто сидить усередині позиціонованого елемента.
Даніель Бердслі

9
Ви випадково дізнаєтесь, чи це помилка / передбачувана поведінка?
jmotes

4
+1 голосувати за помилку ... Коли у вас є галерея зображень, яка автоматично генерує діви і встановлює позицію абсолютною, то ця "особливість" дійсно суха ...
inf3rno

@RunLoop Я щойно перевірив jsfiddle в Safari 7.1 і працює чудово. Чи можете ви бути більш конкретними щодо того, що не працює?
jmotes

1
Наш колега, графічний дизайнер, фактично "виявив" це за 20 секунд до того, як знайти цю відповідь: D
Пер

18

непрозорість: 0,99; на обгортці вирішити помилку в веб-програмі


2
transform: translateY(0);- це альтернатива, яка досягає того ж результату, не втручаючись у візуальне зображення об'єкта (якщо ви не використовуєте перспективу).
kontur

15

Здається, це працює:

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

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


4
transform: translateZ(0)мені достатньо.
калвн

Зауважте, що це (зокрема translateZ) неявно дасть можливість прискорити апаратне прискорення для ваших елементів, що, на жаль, відкриває абсолютно нову банку глистів.
doldt

transform: translateZ(0)також працював на мене. У моєму випадку це не погана ідея, що цей предмет прискорений на апаратному рівні.
Себастьян Лорбер

9

Підтримуючи новітні версії хрому, опери та сафарі, ви можете це зробити:

-webkit-clip-path: inset(0 0 0 0 round 100px);
clip-path: inset(0 0 0 0 round 100px);

Ви обов'язково повинні перевірити інструмент http://bennettfeely.com/clippy/ !


Я думаю, ви можете скоротити цю ще більшу кількість кліпів: inset (0%); ... маючи лише шлях до кліпу, здається, виходить це:
Jakob E

Ого. Це ідеальна відповідь.
Шашанк Бхатт


4

змінити непрозорість батьківського елемента з облямівкою, і це впорядкує складені елементи. Це чудо спрацювало для мене після годинних досліджень і невдалих спроб. Це було так само просто, як додати непрозорість 0,99 для того, щоб організувати цей процес фарбування браузерів. Перевірте http://philipwalton.com/articles/what-no-one-told-you-about-z-index/



2

заснований на чудовій відповіді Graycrow ...

Ось більш реальний приклад світу, який містить два конічні диски з деяким вмістом наповнювача. Я замінив жорстко закодований png фон просто шістнадцятковим значенням, тобто

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

замінюється на

-webkit-mask-image:#fff;

Дивіться цей JSFiddle ... http://jsfiddle.net/hqLkA/


1

Ось подивіться, як я це зробив; 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;
}

Чому взагалі border-radiusв цій ситуації не варто надягати обгортку, ви отримуєте такий же результат, просто ввімкнувши її #box. Крім того, якщо #boxрадіус кордону призначений лише для фіксації WebKit, ви можете просто включити -webkit-туди властивість.
robertc

Лабіринт, це може спрацювати в деяких ситуаціях, але в моєму випадку я шукаю рішення, яке не перетворює форму коробки (а обгортка все ще працює як маска). Мій приклад був дуже спрощеним, але я намагаюся використовувати обгортку, щоб приховати тінь від коробки (використовуючи набивання на обгортці, щоб зробити видимими лише тіньові краї).
jmotes

1
Дякуємо за допомогу, хоча Лабіринт! Ваше рішення допомогло мені поставитись до проблеми більш критично. До речі, ви можете ігнорувати зміни, які я внесла до вашої публікації. Я мав намір зробити це самостійно. Вибачте :)
jmotes

@ user480837 Немає проблемних товаришів, радий, що мені допомогли. :)
Maze

1
@Maze Це не буде працювати , якщо межа будь-якого виду застосовується: jsfiddle.net/ptW85/228
антитоксичну

1

Я спробував кожну відповідь, але без успіху. Після кількох годин дослідження я знайшов рішення для цієї проблеми. Використання цих властивостей у вашому класі не дозволить елементам div переповнювати контейнер.

.container {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  align-items: center;
}

0

Якщо ви хочете створити маску для зображення та розташувати зображення всередині контейнера, не встановлюйте атрибут "position: absolut". Все, що вам потрібно зробити, - це змінити поле вліво і поле-право. 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;
        }
    }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.