Cara membuat sudut bulat CSS3 menyembunyikan overflow di Chrome / Opera

147

Saya perlu sudut bulat di div induk untuk menutupi konten dari masa kanak-kanaknya. overflow: hiddenberfungsi dalam situasi sederhana, tetapi istirahat di browser berbasis webkit dan Opera ketika orang tua diposisikan relatif atau mutlak.

Ini berfungsi di Firefox dan 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>

Contoh di JSFiddle

Terima kasih untuk bantuannya!

PEMBARUAN: Bug yang menyebabkan masalah ini telah diperbaiki di Chrome. Saya belum menguji ulang Opera atau Safari.

jmotes
sumber

Jawaban:

183

Saya menemukan solusi lain untuk masalah ini. Ini terlihat seperti bug lain di WebKit (atau mungkin Chrome), tetapi berhasil. Yang perlu Anda lakukan - adalah menambahkan Masker CSS WebKit ke elemen #wrapper. Anda dapat menggunakan gambar png piksel tunggal dan bahkan memasukkannya ke CSS untuk menyimpan permintaan 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;
}​

Contoh JSFiddle

greycrow
sumber
3
terima kasih atas perbaikan ini. mencobanya di safari hari ini (v6.0.2) dan bekerja untuk saya di sana!
billythetalented
6
namun ini akan memecah bayangan pada elemen.
Jack James
1
Ini bekerja pada pembungkus dengan anak-anak yang benar-benar diposisikan juga, di mana solusi lain di sini tidak. Bagus!
Dan Tello
2
menggunakan Chrome 42.0.2311.90 (64-bit), dan perbaikan ini masih diperlukan ... terima kasih!
simon
2
solusi Anda menghilangkan bayangan elemen induk.
ABDeveloper
106

Tambahkan z-indeks ke item berbatasan-jari Anda, dan itu akan menutupi hal-hal di dalamnya.

Jackolai
sumber
@ Sifu: Anda salah besar. Untuk alasan apa pun, menambahkan indeks-z seperti yang disarankan menyelesaikan masalah yang tepat bagi saya (dalam versi Chrome saat ini), dan ini adalah solusi yang lebih sederhana, lebih umum daripada jawaban teratas.
Nick F
7
@simon: ingat bahwa agar indeks-z memiliki efek, kondisi tertentu harus dipenuhi (mis. posisi perlu diatur). Lihat di sini untuk detailnya.
Nick F
@NickF - itu adalah bug di Chrome (-ium); -webkit-mask-image: -webkit-radial-gradient(circle, white, black);adalah solusi yang efektif, tetapi, untungnya, bug ini diperbaiki pada pembaruan terbaru yang saya terima ke Chrome.
simon
z-indeks 1 ke wadah. z-index -1 hingga elemen absolut menyelesaikannya untuk saya.
aZtraL-EnForceR
Yang ini berhasil untuk saya. Solusi pembungkus di atas tidak.
Ruwen
58

Bagaimanapun, saya berhasil menyelesaikan masalah dengan menambahkan div tambahan antara pembungkus dan kotak.

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>

Terima kasih semuanya yang telah membantu!

http://jsfiddle.net/5fwjp/

jmotes
sumber
12
Ini berfungsi karena elemen yang diposisikan tidak klip konten mereka ke radius perbatasan mereka di Webkit. Lapisan tambahan ini membuatnya begitu div dengan jari-jari perbatasan TIDAK diposisikan, dan hanya duduk di dalam elemen yang diposisikan.
Daniel Beardsley
9
Apakah Anda kebetulan tahu apakah ini bug / perilaku yang diinginkan?
jmotes
4
Beri +1 untuk bug ... Ketika Anda memiliki galeri gambar yang secara otomatis menghasilkan div dan mengatur posisi ke absolut, maka "fitur" ini benar-benar sux ...
inf3rno
@RunLoop Saya baru saja menguji jsfiddle di Safari 7.1 dan berfungsi dengan baik. Bisakah Anda lebih spesifik tentang apa yang tidak berfungsi?
jmotes
1
Rekan kami, perancang grafis, sebenarnya "menemukan" ini 20 detik sebelum menemukan jawaban ini: D
Pere
18

opacity: 0,99; pada bungkus menyelesaikan bug webkit

flavi1
sumber
2
transform: translateY(0);adalah alternatif yang mencapai hasil yang sama tanpa mengganggu representasi visual objek (kecuali jika Anda menggunakan perspektif).
kontur
15

Tampaknya ini bekerja:

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

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

nakrill
sumber
4
transform: translateZ(0)sudah cukup untukku.
kalvn
Perhatikan bahwa ini (khususnya, translateZ) secara implisit akan memungkinkan akselerasi perangkat keras untuk elemen Anda, yang membuka kaleng baru cacing dalam beberapa kasus, sayangnya.
doldt
transform: translateZ(0)juga bekerja untuk saya. Dalam kasus saya itu bukan ide yang buruk bahwa item ini dipercepat perangkat keras.
Sebastien Lorber
9

Didukung dalam chrome, opera dan safari terbaru, Anda dapat melakukan ini:

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

Anda pasti harus memeriksa alat http://bennettfeely.com/clippy/ !

antoni
sumber
Saya pikir Anda dapat mempersingkat lebih banyak lagi jalur klip ini: inset (0%); ... hanya memiliki jalur klip tampaknya melakukan trik :-)
Jakob E
Wow. Itu adalah jawaban yang sempurna.
Shashank Bhatt
4

ubah opacity dari elemen induk dengan perbatasan dan ini akan mengatur ulang elemen yang ditumpuk. Ini bekerja secara ajaib bagi saya setelah jam penelitian dan upaya gagal. Itu sesederhana menambahkan opacity 0,99 untuk mengatur ulang proses pengecatan browser ini. Lihat http://philipwalton.com/articles/what-no-one-told-you-about-z-index/

Rami Awar
sumber
3

Bagi saya tidak ada solusi yang bekerja dengan baik, hanya menggunakan:

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

pada elemen pembungkus melakukan pekerjaan.

Berikut ini contohnya: http://jsfiddle.net/gpawlik/qWdf6/74/

Grzegorz Pawlik
sumber
2

berdasarkan jawaban Graycrow yang sangat baik ...

Berikut adalah contoh dunia nyata yang memiliki dua div cicular dengan beberapa konten pengisi. Saya mengganti latar belakang png hard-coded hanya dengan nilai hex, yaitu

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

diganti dengan

-webkit-mask-image:#fff;

Lihat JSFiddle ini ... http://jsfiddle.net/hqLkA/

gts101
sumber
1

Di sini, lihat bagaimana saya melakukannya; Jsfiddle

Dengan Kode yang saya masukkan, saya berhasil membuatnya bekerja di Webkit (Chrome / Safari) dan Firefox. Saya tidak tahu apakah itu berfungsi dengan Opera versi terbaru. Ya itu berfungsi di bawah versi terbaru 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;
}
Labirin
sumber
Mengapa repot-repot meletakkan border-radiuspembungkus sama sekali dalam situasi itu, Anda mendapatkan hasil yang sama hanya dengan menyalakannya #box. Juga, jika #boxradius perbatasan hanya untuk memperbaiki WebKit, Anda cukup memasukkan -webkit-properti di sana.
robertc
Labirin, ini mungkin berfungsi dalam beberapa situasi, tetapi dalam kasus saya, saya mencari solusi yang tidak mengubah bentuk kotak (dan pembungkusnya masih berfungsi sebagai topeng). Contoh saya sangat sederhana tetapi saya mencoba menggunakan pembungkus untuk menyembunyikan dropshadow dari kotak (menggunakan padding pada pembungkus untuk membuat hanya tepi bayangan yang saya inginkan terlihat).
jmotes
1
Terima kasih atas bantuannya, Labirin! Solusi Anda membantu saya memikirkan masalah dengan lebih kritis. Btw, Anda dapat mengabaikan suntingan yang saya buat untuk posting Anda. Saya bermaksud membuatnya sendiri. Maaf :)
jmotes
@ user480837 Tidak Masalah sobat, senang bahwa saya telah membantu. :)
Labirin
1
@Maze Itu tidak akan berfungsi jika batas jenis apa pun diterapkan: jsfiddle.net/ptW85/228
antitoxic
1

Saya mencoba setiap jawaban tetapi tidak berhasil. Setelah beberapa jam menyelidiki saya menemukan solusi untuk masalah ini. Menggunakan properti ini di kelas Anda tidak akan memungkinkan elemen div meluap wadah.

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

Jika Anda mencari untuk membuat topeng untuk gambar dan posisi gambar di dalam wadah tidak mengatur atribut 'position: absolute'. Yang harus Anda lakukan adalah mengubah margin-kiri dan margin-kanan. Chrome / Opera akan mematuhi aturan overflow: tersembunyi dan radius batas.

// 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;
        }
    }
pengguna6039997
sumber