Подтвердить что ты не робот

Pixelated edge вокруг CSS-круга с переполнением: hidden;

Вот JSFIDDLE моей кошки/анимации без drop-shadows, чтобы показать проблему как как я могу. Насколько я понимаю, это вызвано border-radius и, возможно, из-за overflow: hidden;.


Сова - это не то, о чем этот вопрос, просто пример подобной ситуации, в которой я был. jsfiddle/cat - вот что этот вопрос, извините за смешение!

Вот JSFIDDLE для моей кошки с тенью вставки с использованием свойства blur для box-shadow и пиксельной край остается тем же самым вокруг глаз.

Ответ здесь решает то, что я видел с моим изображением Совы, но не за то, о чем этот ответ.

Вот кошка с inset box-shadow при использовании третьего значения blur.

inset box-shadow


Я тестировал эту скрипту в Safari, Chrome и Firefox, и все они кажутся одинаковыми.

У меня есть два взгляда на Cheshire Cat, которые я начал делать вчера из CSS. Все отлично работает, и я также сделал Owl (Сначала я подумал, что это была аналогичная ситуация, но это НЕ) из CSS, который имеет очень незначительную, но схожую проблему, когда глаза окрашены вокруг краев.

Я также попытался дать глазам границу фиолетового цвета, но пикселированный край остался на краю границы.

В моем новом создании CSS внешний край глаз очень неровный и кажется цветным (желтым) родительского круга.

Вот CSS для глаз.

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

Ниже приведен jsfiddle, который я использовал для создания этой анимации/существа.

JSFIDDLE

Я считаю, что проблема вызвана...

Я думаю, что корень проблемы вызван классами .lidT и .lidB, которые я содержал внутри моего .eye.

Кажется, вырезали веки на 1px вокруг края. Попытайтесь заставить глаза моргнуть в скрипке, чтобы понять, что я имею в виду.

Изображения также не могут быть и речи, но я хотел бы сначала создать изображение CSS для изучения.

Список стилей, которые не помогают

  • box-shadow

  • border

  • box-sizing

  • Ошибка только для Firefox

Конечный список

Обновление

Работа вокруг - добавление глазному гнезду или внешнему основному тегу в глаза. Это скрывает пикселизацию, но это всего лишь обходной путь к проблеме.

Подробнее см. apaul34208

Вот проблема с ответом apaul34208,

apaul's answer

Посмотрите, как левая и верхняя сторона глаза плоская, Мне было бы интересно узнать, является ли мой вопрос проблемой браузера или css.

Конечные обновления

Лучший вариант от 11/13/2013

Использование градиента фона на .eye кажется самым чистым решением до сих пор. Обратитесь к ответу Скотта.

Это также работает в Firefox, Chrome, Safari и IE. (Немного ерша в IE бу гораздо лучше, чем раньше)

Любая помощь приветствуется!

4b9b3361

Ответ 1

Использование фонового градиента

Это не требует дополнительной разметки html. Я протестировал его на Firefox (и это подтверждено для работы с Safari и Chrome, см. Комментарии). Это делает фон глаза фиолетовым цветом на некотором расстоянии от края, а затем желтым остальное, используя радиальный фоновый градиент для цвета. Это, по-видимому, позволяет избежать "смешивания" (и пожелтения) вдоль края, где он пытается "спрятать" на основе комбинаций border-radius и overflow: hidden.

Вот пример оригинального решения/скрипта с 1px фиолетового цвета. Однако, если тень удалена, вы все равно можете обнаружить обесцвечивание. Поэтому я обновил ответ ниже до 2px широкой фиолетовой границы, которая эта подмигающая кошка с удаленной теневой тканью показывает, что обесцвечивание не происходит.

Вот код (обновленный до 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;
}

Ответ 2

Я считаю, что пикселирование, которое вы воспринимаете, является результатом box-shadow, а не border-radius или overflow.

Браузер пытается нарисовать строку 1px #2b2b2b на внутренней стороне круга. Эта строка обязательно будет выглядеть зубчатой, так как она на криволинейном пути и должна выглядеть как 1px по ширине.

Попробуйте установить blur (или третье значение) для свойства box-shadow.

До и после:

Owl eyes before and after

Посмотрите разницу между двумя закругленными <div/> в этой jsFiddle demo.

Ответ 3

Думаю, у меня может быть решение вашей проблемы. В основном вам просто нужно добавить глазницы и скрыть переполнение глазных сокетов, а не глаз.

Рабочий пример

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

Ответ 4

Смотрите этот ответ: fooobar.com/questions/147871/...

и этот другой уже принятый ответ: Пограничный радиус кровотечения

Попробуйте закрепить свой фон:

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

Подумав, это нормальное поведение, чтобы "размыть" крайний пиксель. Браузер пытается сделать что-то в основном квадратным для чего-то раунда. Так или иначе, "промежуточный" пиксель будет размытым, как и выбор фотошопа.

Фотошоп демонстрирует размытый пиксель. BORDER-RADIUS BLUR

К сожалению, вам придется использовать фоновое изображение, реальное изображение файл .png.

Со своей стороны, я попытался реформировать ваши разметки контейнером для внешнего применения, чтобы применить радиус границы. Пользователь Мошер сделал это отлично, см. его ответ jsfiddle.

Ответ 5

рабочая демонстрация находится здесь: jsFiddle

поместите содержимое .eye в другой контейнер следующим образом:

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

удалите overflow:hidden с .eye. новый стиль .eye находится здесь:

.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  */
}

измените .lidT и .lidB width на 105px, затем добавьте этот стиль для #eyeCover:

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

рабочая демонстрация находится здесь: jsFiddle