2012-04-18 10 views
7

Quando applico il raggio di bordo e un gradiente di sfondo a <li>, gli angoli arrotondati appaiono irregolari e ruvidi. Check it out on this jsfiddleborder-radius + gradient + box-shadow che causa il bordo irregolare

L'ho visto in Chrome e FF. Se rimuovo il gradiente O il raggio del bordo, il problema scompare.

Qualche idea del perché questo sta accadendo e come potrei risolverlo?

UPDATE: Sto lavorando su una soluzione jQuery che si basa sull'idea di Josh F (vedere la sua risposta completa qui sotto). È una semplice funzione jQuery che aggiunge una copia duplicata dell'elemento dietro di essa. Al momento, gli script impostano il posizionamento dell'elemento di destinazione su relative. (Ho potuto vedere questo essere problematico in alcuni casi.) Il mio codice è jsfiddle here.

risposta

4

Le specifiche corrente definisce box-shadow da trarre fuori del border-box. Tuttavia, lo sfondo/bordo dipinge elementi sullo sfondo, senza riguardo per altri elementi (non dipinge con oggetti, solo sopra). Poiché l'elemento con lo border-radius viene disegnato prima dello box-shadow, disegna l'angolo con un bordo semitrasparente per rendere l'angolo liscio (come dovrebbe). Purtroppo, a causa di come la specifica è formulata per box-shadow, viene disegnata dopo l'elemento e quindi dipinta sulla parte superiore della pagina (dopo l'elemento) con un bordo semitrasparente. Normalmente, ciò andrebbe bene, ma poiché sia ​​l'elemento che lo box-shadow hanno un bordo trasparente sugli stessi pixel, esso causa il piccolo spazio semitrasparente.

Questo è un bug noto, o almeno è stato considerato un bug dalla comunità di web design. Vedi Bugzilla Bug #474386 (specifically comment #6) per la fonte delle mie informazioni.

+0

Freddo. Buono a sapersi. Conosci qualche soluzione (oltre a tornare a uno sfondo di file immagine?)? – emersonthis

+0

@Emerson, utilizzando uno sfondo di file immagine * non * risolverà lo sfondo. Questo è un problema con il modo in cui viene disegnato lo sfondo stesso e non è specifico per i gradienti (vedi [esempio jsFiddle] (http://jsfiddle.net/wCtgh/1/)). La mia tipica soluzione è usare un 'box-shadow' e' background che non sia * troppo * lontano dallo sfondo 'del genitore. Mentre il divario trasparente è ancora visibile, non è così evidente. Non è l'ideale, ma funziona. Un'altra opzione sarebbe quella di non usare 'border-radius' (dato che questo è il colpevole principale). – 0b10011

+0

Huh. Penso di seguire ciò che stai dicendo, ma sembra che anche il gradiente faccia parte del problema. No? Quando guardo il tuo jsFiddle (con sfondo piatto) su Chrome, il problema non c'è. – emersonthis

1

Un possibile modo per aggirare il bug sarebbe quello di posizionare uno pseudo elemento dietro la scatola che è 1px più alto della scatola e dello stesso colore dell'ombra della scatola. Ciò nasconderebbe il bug rendendo il bordo bianco precedente lo stesso o vicino a quello del box-shadow.

Vedere this jsFiddle per un esempio.

+0

Molto intelligente. Stavo solo pensando di provare qualcosa del genere, ma non mi era venuto in mente di usare uno pseudo-elemento. – emersonthis

+0

In questo modo non è necessario fare confusione con il genitore dell'elemento o aggiungere ulteriori markup. –

+0

Sto giocando con questo, e ho trovato un ostacolo: sto usando 'border-radius' su tutto il mio sito, utilizzando diverse classi diverse.Mi sto rendendo conto che dovrò creare MOLTE classi duplicate per applicare lo pseudo-elemento ovunque debba andare perché non riesco a pensare a un modo per scrivere il CSS in un modo che non diventa davvero disordinato In altre parole, vorrei poter in qualche modo rispecchiare gli stili del parten in modo che la classe possa essere riutilizzata: '.rounded-corners {/ * border radius * /}' '.rounded corners: after {/ * border radius rules * /; larghezza: [parent_width]; altezza: [parent_height]; ...} ' – emersonthis

Problemi correlati