【问题标题】:Pixelated edge around a CSS Circle with overflow: hidden;带有溢出的 CSS 圆周围的像素化边缘:隐藏;
【发布时间】:2013-11-21 20:00:51
【问题描述】:

这是我的猫/动画的JSFIDDLE 没有任何 drop-shadows 尽可能清楚地显示问题。据我了解,这是由border-radius 引起的,也可能是由overflow: hidden; 引起的。


猫头鹰不是这个问题的意思,只是我遇到的类似情况的一个例子。jsfiddle/cat 是这个问题的意思,抱歉混淆了!

这是我的猫的JSFIDDLE,使用box-shadowblur 属性插入框阴影,并且像素化边缘在眼睛周围仍然相同。

这里的答案确实解决了我在猫头鹰图像中看到的问题,但不能解决这个答案的内容。

这是使用第三个值blur 时带有inset box-shadow 的猫。


我在 Safari、Chrome 和 Firefox 中测试过这个小提琴,它们似乎都显示相同。

我有两只眼睛盯着我昨天开始用 CSS 制作的 Cheshire Cat。一切都渲染得很好,我还用 CSS 制作了一个 Owl(我最初认为这是类似的情况,但事实并非如此),它在眼睛像素化方面有一个非常小但类似的问题在边缘。

我也尝试给眼睛一个紫色的边框,但像素化的边缘在边框的边缘保持不变。

在我的新 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

我认为问题是由...引起的……

我认为问题的根源在于我的 .eye 中包含的 .lidT.lidB 类。

它似乎在它的边缘将眼睑切掉了1px。试着让眼睛在小提琴中闪烁,看看我的意思。

图像也不是不可能的,但出于学习的原因,我想坚持先制作 CSS 图像。

无用的样式列表

  1. box-shadow

  2. border

  3. box-sizing

  4. 不是 Firefox 独有的错误

结束列表

更新

解决方法是在眼睛上添加一个眼窝或外部主标签。这隐藏了像素化,但只是解决问题的一种方法。

查看 apaul34208 答案了解更多详情

这是 apaul34208 答案的问题,

看看眼睛的左侧和顶部是如何平坦的,我很想知道我的问题是浏览器问题还是 CSS 问题

结束更新

截至 2013 年 11 月 13 日的最佳选择

.eye 上使用背景渐变似乎是迄今为止最干净的解决方案。请参阅 ScottS 的回答。

这也适用于 Firefox、Chrome、Safari 和 IE。 (在 IE 中稍微有点毛边,比以前好多了)

非常感谢任何和所有帮助!

【问题讨论】:

  • 我不得不说那是一只相当可爱的猫头鹰:D
  • @Terry 为什么谢谢你!他是我制作的第一个CSS3 人物/图像,并且非常喜欢他的表现。 (那个网站也没有一张图片!:])
  • 它在我测试过的 Firefox、chrome 和 safari 中看起来是一样的。

标签: html css css-shapes


【解决方案1】:

我相信您所感知的像素化是box-shadow 的结果,而不是border-radiusoverflow 的结果。

浏览器试图在圆的内侧顶部画一条1px #2b2b2b 线。这条线一定会看起来参差不齐,因为它位于弯曲的路径上并且需要在宽度上显示为 1px

尝试为box-shadow 属性设置blur(或第三个值)。

之前和之后:

查看此jsFiddle demo 中两个圆角<div/>s 之间的区别。

【讨论】:

  • 对于我制作的猫头鹰,这确实可以解决问题!我正在处理的猫有一个外部阴影,在我添加阴影之前看起来像这样。我尝试了投影,希望它看起来更平滑。
  • 我非常感谢您花时间帮助我,但我想让您和其他所有人知道这并不能解决我的问题。它确实帮助我举了一个我认为是类似问题的例子,但事实并非如此。据我了解,这是由于父母的眼睑和眼睛内部的眼睑溢出造成的。
  • 在尝试从示例中删除 box-shadow 之后,我认为这是一个“边界半径”问题。
【解决方案2】:

我想我可能有办法解决您的问题。基本上你只需要添加眼窝并将溢出物隐藏在眼窝而不是眼睛上。

Working Example

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

【讨论】:

  • 这是解决此问题的方法,并且很好地指出了这一点。我希望我们能找到一个直接的解决方案,或者如果它是 CSS 的一个错误。 +1 我确实注意到一件事情有点不对劲,在右眼,左侧你会看到一个平坦的边缘。
  • @JoshPowell 狩猎愉快,玩起来很有趣。
  • 谢谢你的朋友,希望有人有一个激进的想法!我很高兴我能提出一个很好的挑战:]
【解决方案3】:

看到这个答案:stackoverflow.com/questions/6001281/firefox-border-color-border-radius-and-background-color-creates-ragged-edges-a#6001374

这个其他已经被接受的答案:Border-radius bleeding

尝试剪辑你的背景:

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

经过思考,“模糊”边缘像素是正常行为。浏览器正试图使某些东西基本上与圆形东西成直角。不知何故,“中间”像素会变得模糊,就像 Photoshop 选择一样。

模糊像素的 Photoshop 演示。

遗憾的是,您将不得不使用背景图像,一个真正的 image-file.png。

就我而言,我尝试使用外部容器来修改您的标记以应用边界半径。用户 Mosher 做得很好,请参阅 his answer's jsfiddle

【讨论】:

  • 我不想写它:我没有找到解决这个问题的方法,除了背景图像。渲染时调整像素是正常的。用 Photoshop 做测试,你会看到的。
  • 好吧,这很糟糕,但希望有人能找到令人惊奇的东西;p
  • +1 很好的解释,如果您参考 ScottS 的回答。这是目前最好的选择,因为它不需要像其他选项那样的另一个 DOM 元素。这是一个相当聪明的解决方案,但您认为这纯粹是由于border-radius 而不是overflow
  • 嗯,但是如果我删除 .lidT/.lidB 边框根本不会像素化,但是一旦我将那些内部元素被 overflow 剪切,就会导致这种像素化。看看这个小提琴,jsfiddle.net/Josh_Powell/DJQ68/38
【解决方案4】:

工作演示在这里: jsFiddle

.eye 内容放入另一个容器中,如下所示:

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

.eye 中删除overflow:hidden。新的.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 宽度更改为 105px 然后为 #eyeCover 添加此样式:

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

工作演示在这里: jsFiddle

【讨论】:

  • 我会在我洗完澡后试一试。您的代码有一个小问题,ID 是唯一的,而且猫有两只眼睛。 :p
  • 好吧,我刚刚测试了这个,它和@apaul34208 的答案一样。除了这一次它使眼睛的右侧变平。 :p +1 是另一种体面的解决方法!我想知道使用CSS-pseudo elements 可以做些什么吗?我要调查一下。
【解决方案5】:

使用背景渐变

这不需要额外的 html 标记。我已经在 Firefox 上对其进行了测试(并且确认它也可以在 Safari 和 Chrome 上运行,请参阅 cmets)。它使眼睛的背景在距边缘一定距离处为紫色,然后使用径向背景渐变为颜色的其余部分为黄色。这似乎避免了基于border-radiusoverflow: hidden 组合在尝试“隐藏”的边缘看到的“混合”(和变黄)。

Here is the original solution/fiddle example with 1px of purple. 但是,删除了投影后,you can still slightly detect a discoloration。所以我将下面的答案更新为2px 宽紫色边框,即this winking cat with drop shadow removed shows that no discoloration is occurring

这里是(更新为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;
}

【讨论】:

  • @JoshPowell:那么它在 Safari 和 Chrome 中的测试是否良好?
  • 在 Safari 中我必须在家进行测试,但在 Chrome 中它确实有效!
  • @JoshPowell:我仍然可以在 Firefox 中检测到如此轻微的色环(几乎不可见)(当 I remove the box shadow and shut the lids 可以检测到时)。将停止值设置为48px49px(而不是49px50px)似乎完全删除了它,就像this winking cat shows。我想这取决于你想缩小多少眼睛,以及那个轻微可见的戒指有多重要。
  • 我每晚都祈祷 IE8-WinXP 死掉,这样我们就可以摆脱那些迫使我为“老歌”开发的“无赖”情况,使用图像文件作为纹理。而且,是的,我更喜欢你的答案而不是我的答案。
  • @MilchePatern:在这种情况下,IE8-WinXP 不是问题,因为所有 css3 动画和边框半径以及在“猫”中完成的所有操作都使整个问题与任何想要适应的人无关IE8。而且一旦 IE8 消失了,就会有其他旧的浏览器无法处理最新最好的 css。因此,它总是意味着一个人要为什么设计,以及一个人关心或不关心留下什么浏览器。
猜你喜欢
  • 1970-01-01
  • 2020-10-06
  • 2012-05-28
  • 2020-08-25
  • 2012-03-24
  • 1970-01-01
  • 1970-01-01
  • 2021-04-03
  • 1970-01-01
相关资源
最近更新 更多