2011-12-20 11 views
45

Non dovrebbe essere tagliato il contenuto del mio contenitore quando il contenitore ha border-radius?Il raggio del bordo dovrebbe ritagliare il contenuto?

HTML e CSS Esempio:

<div class="progressbar"> 
    <div class="buffer"></div> 
</div> 
.progressbar { height: 5px; width: 100px; border-radius: 5px; } 
.buffer { width: 25px; height: 5px; background: #999999; } 

Come si può vedere che uso border-radius sul contenitore (.progressbar), but the content (.buffer) goes 'outside' the container. Lo sto vedendo su Google Chrome.

È questo il comportamento previsto?

P.S. Non si tratta di come risolverlo, si tratta di sapere se dovrebbe funzionare in questo modo.

+1

Il jsFiddle è morto. – SquareCat

+1

@CummanderCheckov tnx per avermi informato. Lascia che ti rimetta a posto. Sebbene tutte le informazioni * siano * nella mia domanda (solo per questo motivo) l'ho aggiornato. – PeeHaa

risposta

61

È questo il comportamento previsto?

Sì, da pazzi come sembra, in realtà lo è.Ecco perché:

L'impostazione predefinita overflow per <div> elementi (e la maggior parte delle altre cose) è visible, e il spec dice questo circa overflow: visible:

visibile
Questo valore indica che il contenuto non è ritagliato, cioè, può essere reso al di fuori della casella di blocco.

A sua volta, §5.3 Corner clipping negli sfondi e modulo frontiere dice:

sfondi di una scatola, ma non il suo border-immagine, vengono ritagliati la curva appropriata (come determinato da 'background-clip'). Anche altri effetti che si agganciano al bordo o al bordo di riempimento (come "overflow" diverso da "visibile") devono essere aggiunti alla curva. Il contenuto degli elementi sostituiti viene sempre ritagliato sulla curva del bordo del contenuto. Inoltre, l'area al di fuori della curva del bordo del bordo non accetta gli eventi del mouse per conto dell'elemento.

La frase che ho sottolineato in particolare afferma che il valore overflow della scatola deve essere qualcosa di diverso da visible (che significa auto, hidden, scroll e altri) in modo che gli angoli per fermano i suoi figli.

Se la casella è definita per avere overflow visibile, che come ho detto è l'impostazione predefinita per la maggior parte degli elementi visivi, il contenuto non dovrebbe essere troncato affatto. Ed è per questo che gli angoli quadrati di .buffer superano gli angoli arrotondati di .progressbar.

Di conseguenza, il modo più semplice per arrivare a .buffer clip all'interno .progressbar 's angoli arrotondati è quello di aggiungere uno stile overflow: hidden-.progressbar, come mostrato nella this updated fiddle.

+0

Great! Cattiva domanda (sì, so, vai a chiedere alle persone che hanno creato le specifiche), ma puoi pensare a un motivo per cui gli elementi sostituiti vengono tagliati?PS questa è una domanda bonus :) – PeeHaa

+1

@PeeHaa: il contenuto che viene sostituito (ad esempio, qualunque immagine sia collegata in un '') deve essere ritagliato, poiché questi elementi possono contenere solo il contenuto sostituito. In caso contrario, non sarà possibile applicare 'border-radius' alle immagini, ecc. – BoltClock

2

Questa domanda sembra indicare lo stesso difetto, apparentemente questo è un bug.

CSS3 border-radius clipping issues

Modifica

Eek! BoltClock ha menzionato che questo è indito quindi pubblicherò questa altra domanda SO sull'argomento mentre cercherò anche una citazione specifica su questo. How do I prevent an image from overflowing a rounded corner box with CSS3?

Specification link

Solo per riferimento, io bastone relativo link in - ma non riesco a trovare niente di esplicito l'esempio che hai dato.

CSS Backgrounds - Rounded Corners

+0

Il richiedente di quella domanda ha interpretato erroneamente la specifica CSS3 e il bug a cui si fa riferimento riguarda un valore di 'overflow' che non è' visible', che non è il caso qui. – BoltClock

+0

Nella specifica ho letto: 'Il contenuto degli elementi sostituiti è sempre ritagliato sulla curva del bordo del contenuto. Ciò significherebbe che dovrebbe tagliare il contenuto. O sto leggendo male: P – PeeHaa

+2

@PeeHaa: 'div' non è un elemento sostituito, quindi quel bit è irrilevante. – BoltClock

2

Così dice le specifiche, quindi questo è il modo in cui dovrebbe funzionare. Ma ciò non significa che a Chrome piaccia.

5.3. Ritaglio d'angolo

Gli sfondi di una casella, ma non la sua immagine di bordo, vengono ritagliati sulla curva appropriata (come determinato da 'background-clip'). Anche altri effetti che si agganciano al bordo o al bordo di riempimento (come "overflow" diverso da "visibile") devono essere aggiunti alla curva. Il contenuto degli elementi sostituiti viene sempre ritagliato sulla curva del bordo del contenuto. Inoltre, l'area al di fuori della curva del bordo del bordo non accetta gli eventi del mouse per conto dell'elemento.

http://www.w3.org/TR/css3-background/#border-radius

7

Per chiunque chiedendo cosa una correzione sarebbe. Il modo più semplice sarebbe quello di modificare il css.

Nell'esempio dato questo sarebbe una soluzione adeguata:

.progressbar { height: 5px; width: 100px; border-radius: 5px; overflow: hidden; } 
2

Semanticamente parlando, è meglio aggiungere semplicemente una proprietà border-radius ereditano il div interno, da qui la nuova classe aggiunta:

.buffer { 
    border-radius: inherit; 
} 

Di conseguenza, per gli altri la situazione, è possibile preservare l'uso di overflow: auto se il contenuto supera la tua situazione e vuoi vedere tutto.

+0

L'ho trovato utile per alcuni contenuti che non rispettavano' overflow: hidden' - molto più pulito di impostare il border-radius sul bambini per numero, che speravo di evitare. – Iiridayn

+0

Non è corretto. Il contenuto secondario che ha la stessa proprietà 'border-radius' non coprirà lo sfondo genitore a volte. Provalo con uno sfondo rosso sangue e lo vedrai. – Rockallite

Problemi correlati