Chrome / Opera'da CSS3 yuvarlak köşeleri taşmayı nasıl gizler


147

Çocukluğundan içeriği maskelemek için bir üst div üzerinde yuvarlak köşelere ihtiyacım var. overflow: hiddenbasit durumlarda çalışır, ancak ebeveyn nispeten veya kesinlikle konumlandırıldığında webkit tabanlı tarayıcılarda ve Opera'da kırılır.

Firefox ve IE9'da çalışır:

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 örneği

Yardım için teşekkürler!

GÜNCELLEME: Bu soruna neden olan hata Chrome'da düzeltildi. Ancak Opera veya Safari'yi tekrar test etmedim.

Yanıtlar:


183

Bu sorun için başka bir çözüm buldum. Bu WebKit'te (veya muhtemelen Chrome'da) başka bir hataya benziyor, ancak çalışıyor. Tek yapmanız gereken #wrapper öğesine bir WebKit CSS Maskesi eklemektir. Tek bir piksel png resmi kullanabilir ve hatta bir HTTP isteğini kaydetmek için CSS'ye ekleyebilirsiniz.

#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 Örneği


3
bu düzeltme için teşekkür ederim. bugün safari denedim (v6.0.2) ve orada benim için çalıştı!
billythetalented

6
ancak bu öğe üzerindeki gölgeleri kıracaktır.
Jack James

1
Bu, kesinlikle konumlandırılmış çocuklara sahip sarmalayıcılar üzerinde de çalışır, burada diğer çözümün olmadığı yerler. Güzel!
Dan Tello

2
Chrome 42.0.2311.90 (64 bit) kullanıyor ve bu düzeltme hala gerekli ... teşekkürler!
simon

2
çözümleriniz ana öğenin gölgelerini kaldırır.
ABDeveloper

106

Kenar yarıçaplı öğenize bir z-endeksi ekleyin, içindeki öğeleri maskeleyecektir.


@Sifu: sadece yanlışsın. Her ne sebeple olursa olsun, önerildiği gibi bir z-endeksi eklemek benim için (Chrome'un mevcut sürümünde) tam olarak bu sorunu çözdü ve bu en iyi yanıttan daha basit, daha genel bir çözüm.
Nick F

7
@simon: z-endeksinin bir etkisi olması için belirli koşulların yerine getirilmesi gerektiğini unutmayın (örn. konumun ayarlanması gerekir). Ayrıntılar için buraya bakın.
Nick F

@NickF - Chrome'da (-ium) bir hataydı; -webkit-mask-image: -webkit-radial-gradient(circle, white, black);etkili bir çözümdü, ancak neyse ki hata, Chrome'a ​​en son aldığım güncellemede düzeltildi.
simon

z-endeksi 1'den konteynere. mutlak elemana z-endeksi -1 benim için çözdü.
aZtraL-EnForceR

Bu benim için çalıştı. Yukarıdaki sargı çözümü yoktur.
Ruwen

58

Herkese boşver, sorunu paketleyici ve kutu arasına ek bir div ekleyerek çözmeyi başardım.

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>

Yardım eden herkese teşekkürler!

http://jsfiddle.net/5fwjp/


12
Bu, konumlandırılmış öğelerin içeriklerini Webkit'teki sınır yarıçaplarına kırpmaması nedeniyle çalışır. Bu ekstra katman, kenarlık yarıçaplı div konumlandırılmayacak şekilde basit hale getirir ve sadece konumlandırılmış bir elemanın içine oturur.
Daniel Beardsley

9
Şans eseri bunun bir hata / amaçlanan davranış olup olmadığını biliyor musunuz?
jmotes

4
Hataya +1 oy verin ... Div'leri otomatik olarak oluşturan ve konumu mutlak olarak ayarlayan bir resim galerisine sahip olduğunuzda, bu "özellik" gerçekten sux ...
inf3rno

@RunLoop Safari 7.1'de jsfiddle'ı test ettim ve iyi çalışıyor. Neyin işe yaramadığı konusunda daha açık olabilir misiniz?
jmotes

1
Meslektaşımız grafik tasarımcı aslında bu cevabı bulmadan 20 saniye önce "keşfetti": D
Pere

18

opaklık: 0.99; sarıcı üzerinde webkit hata çözmek


2
transform: translateY(0);nesnenin görsel temsilini etkilemeden aynı sonucu elde eden bir alternatiftir (perspektif kullanmadığınız sürece).
kontur

15

Bu işe yarıyor gibi görünüyor:

.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)benim için yeterli.
kalvn

Bunun (özellikle translateZ) öğeleriniz için donanım hızlandırmasını dolaylı olarak etkinleştireceğini unutmayın; bu , bazı durumlarda ne yazık ki yepyeni bir solucan kutusu açar.
doldt

transform: translateZ(0)benim için de çalıştı. Benim durumumda bu öğenin donanım hızlandırması olduğu kötü bir fikir değil.
Sebastien Lorber

9

En son krom, opera ve safari'de desteklenir, bunu yapabilirsiniz:

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

Kesinlikle http://bennettfeely.com/clippy/ aracını kontrol etmelisiniz !


Sanırım bu klibi daha da kısaltabilirsiniz : inset (% 0); ... sadece bir klip yol sahip olmak hile yapmak gibi görünüyor :-)
Jakob E

Vay. Mükemmel cevap.
Shashank Bhatt




2

graycrow'un mükemmel cevabına dayanarak ...

İşte bazı dolgu içeriği olan iki cicular div içeren daha gerçek bir dünya örneği. Sabit kodlu png arka planını yalnızca onaltılık bir değerle değiştirdim, yani

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

ile değiştirildi

-webkit-mask-image:#fff;

Bu JSFiddle'a bakın ... http://jsfiddle.net/hqLkA/


1

İşte nasıl yaptığımı görün; Jsfiddle

Girdiğim Kod ile Webkit (Chrome / Safari) ve Firefox üzerinde çalışmayı başardım. Opera'nın en son sürümüyle çalışıp çalışmadığını bilmiyorum. Evet, Opera'nın en son sürümü altında çalışır.

#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;
}

Neden border-radiusbu durumda on sarıcı koymak için uğraşmak , sadece onu ayarlamak ile aynı sonucu elde #box. Ayrıca, #boxsınır yarıçapı yalnızca WebKit'i düzeltmek içinse, -webkit-özelliği oraya dahil edebilirsiniz .
robertc

Labirent, bu bazı durumlarda işe yarayabilir, ancak benim durumumda kutunun şeklini dönüştürmeyen bir çözüm arıyorum (ve sarıcı hala maske olarak çalışıyor). Örneğim çok basitleştirildi, ancak açılan gölgeyi kutudan gizlemek için sarıcıyı kullanmaya çalışıyorum (yalnızca görünmesini istediğim gölge kenarlarını yapmak için sarıcı üzerinde dolgu kullanarak).
jmotes

1
Labirent rağmen yardım için teşekkürler! Çözümünüz, sorunu daha eleştirel bir şekilde düşünmeme yardımcı oldu. Btw, yayınınıza yaptığım düzenlemeyi göz ardı edebilirsiniz. Kendi başıma yapmak istedim. Üzgünüm :)
jmotes

@ user480837 Sorun değil dostum, yardımcı olduğum için memnunum. :)
Labirent

1
@ Labirent Herhangi bir sınır uygulanırsa işe yaramaz
antitoxic

1

Her cevabı denedim ama başarılı olamadım. Birkaç saat araştırdıktan sonra bu soruna bir çözüm buldum. Sınıfınızda bu özelliklerin kullanılması div öğelerinin kaptan taşmasına izin vermez.

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

0

Bir görüntü için maske oluşturmak ve görüntüyü kabın içine konumlandırmak istiyorsanız 'position: absolute' niteliğini ayarlamayın. Tek yapmanız gereken kenar boşluğunu ve sağ kenarını değiştirmek. Chrome / Opera taşma kurallarına uyacak: gizli ve sınır yarıçapı kuralları.

// 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;
        }
    }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.