Bord pixelisé autour d'un cercle CSS avec débordement: caché;

voici le JSFIDDLE de mon cat / animation sans aucun drop-shadows pour montrer le problème aussi clairement que je peux. À ma connaissance, cela est causé par le border-radius et peut-être dû à overflow: hidden; .


la chouette n'est pas le sujet de cette question , juste un exemple d'une situation similaire dans laquelle j'étais. Le jsfiddle/cat est ce que cette question est à propos, désolé pour le mélange!

voici un JSFIDDLE pour mon chat avec une ombre de boîte en médaillon en utilisant la propriété blur d'un box-shadow et le bord pixelisé est toujours le même autour de l'oeil.

la réponse ici résout ce que j'ai vu avec mon image de hibou mais pas pour ce que cette réponse est au sujet.

voici le chat avec un inset box-shadow en utilisant la troisième valeur, blur .

inset box-shadow


j'ai testé ce violon dans Safari, Chrome, et Firefox et ils semblent tous l'afficher le même.

j'ai deux yeux sur le chat Cheshire que j'ai commencé à faire hier à partir de CSS. Tout rend très bien et j'ai également fait un hibou ( j'ai d'abord pensé que c'était une situation similaire, mais il n'est pas ) de CSS qui a un problème très mineur mais similaire sur les yeux étant pixélisés autour des bords.

j'ai également essayé de donner les yeux d'une bordure de la couleur pourpre, mais la pixélisé bord est resté le même sur le bord de la frontière.

sur ma nouvelle création CSS le bord extérieur des yeux est très pixelisé et semble être la couleur(jaune) du cercle parent.

voici le CSS pour le oeil.

.eye {
  border-radius: 50%;
  height: 100px;
  width: 100px;
  background: #FAD73F;
  box-sizing: border-box;
  -webkit-box-sizing: border-box;
  -moz-box-sizing: border-box;
  overflow: hidden;
  position: relative;
  display: inline-block;
  box-shadow: 0 3px 15px rgba(0, 0, 0, 0.4);
  z-index: 100;
}

.pup {
  border-radius: 50%;
  height: 20px;
  width: 20px;
  background: #2b2b2b;
  display: block;
  position: absolute;
  top: 40px;
  left: 40px;
}

.lidT {
  display: block;
  width: 100px;
  height: 100px;
  background: #821067;
  position: absolute;
  top: -80px;
  z-index: 20;
}

.lidB {
  display: block;
  width: 100px;
  height: 100px;
  background: #821067;
  position: absolute;
  bottom: -80px;
  z-index: 20;
}

ci-dessous est le jsfiddle que j'ai utilisé pour faire cette animation/créature.

JSFIDDLE

je crois que le problème est causé par...

je pense que la racine du problème est causée par les classes .lidT et .lidB que j'ai contenues dans mon .eye .

il semble couper le les paupières par 1px autour du bord de celui-ci. Essayez de faire cligner les yeux dans le violon pour voir ce que je veux dire.

les Images ne sont pas non plus hors de question, mais je voudrais m'en tenir à faire une image CSS d'abord pour une raison d'apprentissage.

liste des styles qui n'aident pas

  1. box-shadow

  2. border

  3. box-sizing

  4. Pas uniquement pour Firefox bug

Fin De La Liste

Mises à jour

une modification consiste à ajouter à l'œil une Alvéole ou une étiquette extérieure principale. Cela cache la pixelisation mais n'est qu'un contournement du problème.

Voir apaul34208 réponse pour plus de détails

voici le problème avec apaul34208 réponse,

apaul's answer

Voir comment la gauche et de la partie supérieure de l'œil est plat, j'aimerais savoir si ma question est un problème de navigateur ou css .

Fin Des Mises À Jour

meilleure option en date du 11/13/2013

utilisant un gradient de fond sur le .eye semble être la solution la plus propre jusqu'à présent. Reportez-vous à la réponse de ScottS.

cela fonctionne aussi dans Firefox, Chrome, Safari, et IE. (Un peu ruff dans IE bu beaucoup mieux avant)

Toute aide est grandement appréciée!

37
demandé sur Josh Powell 2013-11-09 23:48:08

5 réponses

Utilisant Le Gradient D'Arrière-Plan

il n'est pas nécessaire de rajouter le balisage html . Je l'ai testé sur Firefox (et il est confirmé de travailler aussi sur Safari et Chrome, voir les commentaires). Il rend le fond de l'Œil de la couleur Pourpre une certaine distance dans le bord, puis le jaune le reste en utilisant un gradient radial de fond pour la couleur. Cela semble éviter le "mélange" (et le jaunissement) vu le long du bord où il est tentant pour " cacher "basé sur la combinaison border-radius et overflow: hidden .

Voici la solution originale/exemple de violon avec 1px de pourpre. avec l'ombre de chute enlevée, cependant, vous pouvez encore légèrement détecter une décoloration . Donc j'ai mis à jour la réponse ci-dessous à un 2px large bordure pourpre, qui ce chat clignotant avec ombre de chute enlevée montre qu'aucune décoloration ne se produit .

voici le code (mis à jour en 2px ):

.eye {
    border-radius: 50%;
    height: 100px;
    width: 100px;
    background: #fad73f; /* Old browsers */
    background: -moz-radial-gradient(center, ellipse cover,  #fad73f 0, #fad73f 48px, #821067 49px); /* FF3.6+ */
    background: -webkit-gradient(radial, center center, 0, center center, 100%, color-stop(0,#fad73f), color(48px,#fad73f), color-stop(49px,#821067)); /* Chrome,Safari4+ */
    background: -webkit-radial-gradient(center, ellipse cover,  #fad73f 0,#fad73f 48px,#821067 49px); /* Chrome10+,Safari5.1+ */
    background: -o-radial-gradient(center, ellipse cover,  #fad73f 0,#fad73f 48px,#821067 49px); /* Opera 12+ */
    background: -ms-radial-gradient(center, ellipse cover,  #fad73f 0,#fad73f 48px,#821067 49px); /* IE10+ */
    background: radial-gradient(ellipse at center,  #fad73f 0,#fad73f 48px,#821067 49px); /* W3C */

    box-sizing: border-box;
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    overflow: hidden;
    position: relative;
    display: inline-block;
    box-shadow: 0 3px 15px rgba(0, 0, 0, 0.4);
    z-index: 100;
}
12
répondu ScottS 2013-11-14 17:56:48

je pense que j'ai peut-être une solution à votre problème. Fondamentalement, vous avez juste besoin d'ajouter les orbites des yeux et cacher le débordement sur les orbites plutôt que les yeux.

Exemple Pratique

<span class="socket">
  <span class="eye">
    <span class="lidT"></span>
    <span class="pup"></span>
    <span class="lidB"></span>
   </span>
</span>

.socket {
    border-radius: 50%;
    height: 102px;
    width: 102px;
    box-sizing: border-box;
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    overflow: hidden;
    position: relative;
    top: -1px;
    left: -1px;
    display: inline-block;
    box-shadow: 0 3px 15px rgba(0, 0, 0, 0.4);
    z-index: 100;
}
.eye {
    border-radius: 50%;
    height: 100px;
    width: 100px;
    background: #FAD73F;
    box-sizing: border-box;
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    position: relative;
    top: 1px;
    left: 1px;
    display: inline-block;
    box-shadow: 0 3px 15px rgba(0, 0, 0, 0.4);
    z-index: 100;
}
6
répondu apaul 2013-11-11 23:52:47

je crois que la pixelisation que vous percevez est le résultat du box-shadow et non du border-radius ou du overflow .

le navigateur essaie de tracer une ligne 1px #2b2b2b sur le dessus du cercle. Cette ligne doit avoir l'air dentelée puisqu'elle est sur un chemin courbé et doit apparaître comme 1px en largeur.

essayez de définir la blur (ou la troisième valeur) pour la propriété box-shadow .

avant et après:

Owl eyes before and after

"151980920 voir la différence entre les deux arrondis <div/> dans cette jsFiddle démo .

6
répondu Adam 2014-01-02 16:10:08

la démo de travail est ici: jsFiddle

mettez le .eye contenu dans un autre conteneur comme celui-ci:

<span class="eye">
    <div id="eyeCover">
        <span class="lidT"></span>
        <span class="pup"></span>
        <span class="lidB"></span>
    </div>
</span>

supprimer overflow:hidden de .eye . nouveau .eye style est ici:

.eye {
    border-radius: 50%;
    height: 100px;
    width: 100px;
    background: #FAD73F;
    box-sizing: border-box;
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    position: relative;
    display: inline-block;
    box-shadow: 0 3px 15px rgba(0, 0, 0, 0.4);
    z-index: 100;
    overflow: visible;   /*  change is here  */
}

changer .lidT et .lidB largeur à 105px puis ajouter ce style pour #eyeCover :

#eyeCover{
width: 102px;
height: 102px;
top:-1px;
left:-1px;
border-radius: 50%;
overflow: hidden;
position: relative;
}

la démo de travail est ici: jsFiddle

5
répondu Mohsen Safari 2013-11-13 14:36:12

voir la réponse : /q/firefox-border-color-border-radius-and-background-color-creates-ragged-edges-and-white-space-55558/"/q/border-radius-bleeding-23705/"> border-radius bleeding

essayez de découper votre arrière-plan:

.your-element {
    -webkit-background-clip: padding-box;
    -moz-background-clip: padding-box;
    background-clip: padding-box;
}

après réflexion, c'est un comportement normal pour "brouiller" le pixel de bord. Navigateur est de tenter de faire quelque chose de carré à quelque chose de rond. D'une manière ou d'une autre, le pixel "in-between" sera flou, tout comme une sélection photoshop.

Un photoshoped démonstration de l'floue pixel. BORDER-RADIUS BLUR

malheureusement, vous devrez utiliser un fond-image , un vrai fichier-image.png.

pour ma part, j'ai essayé de réformer vos majorations avec un conteneur externe à appliquer border-radius. L'utilisateur Mosher l'a très bien fait, voir sa réponse est jsfiddle .

5
répondu Milche Patern 2017-05-23 12:00:17