我们正在尝试渲染一个可以放置数字的圆圈.我希望圆圈使用实线,虚线或虚线边框.此外,颜色可以变化,并且它将全部在CSS中定义,因此尝试使用图像将不是最佳的.
circle-score-label { height: 30px; width: 30px; } circle-score-label .circle { margin-left: auto; margin-right: auto; border-radius: 50%; width: 100%; height: 100%; position: relative; border: 3px solid black; } circle-score-label .solid-conf { border-style: solid; } circle-score-label .dotted-conf { border-style: dotted; } circle-score-label .dashed-conf { border-style: dashed; }
在IE11中它似乎很好.而在Chrome(目前为42.0.2311.135米或Canary)中,圆圈顶部有一个间隙.
Chrome示例:
IE示例:
有没有人遇到过这个问题以及如何解决它?
解决方法
由于每个浏览器如何呈现它并且我们无法控制它,因此预计会出现这些差异.如果你还需要支持FireFox,那么我建议你不要使用这种方法,因为
FF cannot display dashed borders as of now.
你最好的选择是使用SVG实现这一点,因为SVG允许通过使用stroke-dasharray
属性更好地控制点/破折号.
下面是一个示例片段:(虽然你没有标记SVG,但我给出了这一点,因为SVG可能是最适合这类的东西,这个例子可以指导你.)
svg{ height: 100px; width: 100px; } circle { fill: transparent; stroke: green; stroke-width: 3; } .solid{ stroke-dasharray: none; } .dashed { stroke-dasharray: 8,8.5; } .dotted { stroke-dasharray: 0.1,12.5; stroke-linecap: round; } div { height: 100px; width: 100px; color: green; font-weight: bold; text-align: center; line-height: 100px; }
<svg viewBox="0 0 120 120"> <circle cx="55" cy="55" r="50" class="solid" /> <foreignObject x="5" y="5" height="100px" width="100px"> <div>100</div> </foreignObject> </svg> <svg viewBox="0 0 120 120"> <circle cx="55" cy="55" r="50" class="dashed" /> <foreignObject x="5" y="5" height="100px" width="100px"> <div>100</div> </foreignObject> </svg> <svg viewBox="0 0 120 120"> <circle cx="55" cy="55" r="50" class="dotted" /> <foreignObject x="5" y="5" height="100px" width="100px"> <div>100</div> </foreignObject> </svg>
几乎所有版本的Chrome,Firefox,Safari,Opera和IE9都提供Support for SVG.
使用foreignObject来定位文本是我发现更容易使用和样式的文本,但它在IE中不起作用.因此,您可以使用文本SVG元素,如下面的代码段所示.
svg{ height: 100px; width: 100px; } circle { position: relative; fill: transparent; stroke: green; stroke-width: 3; } .solid{ stroke-dasharray: none; } .dashed { stroke-dasharray: 8,12.5; stroke-linecap: round; } text { width: 100px; text-anchor: middle; fill: green; font-weight: bold; text-align: center; }
<svg viewBox="0 0 120 120"> <circle cx="55" cy="55" r="50" class="solid" /> <text x="55" y="60"> 100 </text> </svg> <svg viewBox="0 0 120 120"> <circle cx="55" cy="55" r="50" class="dashed" /> <text x="55" y="60"> 100 </text> </svg> <svg viewBox="0 0 120 120"> <circle cx="55" cy="55" r="50" class="dotted" /> <text x="55" y="60"> 100 </text> </svg>
要支持较低版本的IE,您可以查看一些库,如this one或参考this SO answer.
这可以使用CSS使用除边框之外的属性来完成,但是这些要么需要大量的盒阴影或伪元素,并且对于较大的圆圈不是非常可取的.
使用伪元素方法需要CSS转换,因此在不使用其他库的情况下仍然不支持IE8或更少.
尽管它具有更好的浏览器支持,但是盒式阴影方法的可扩展性不是很高.下面是使用Box-shadow方法创建虚线边框的示例代码段.这是改编自The Pragmatick在this thread的回答.
div { position: relative; height: 100px; width: 100px; margin: 10px; text-align: center; line-height: 100px; border-radius: 50%; } .dotted { Box-shadow: 0px -55px 0px -48px blue,0px 55px 0px -48px blue,55px 0px 0px -48px blue,-55px 0px 0px -48px blue,-39px -39px 0px -48px blue,39px -39px 0px -48px blue,-39px 39px 0px -48px blue,39px 39px 0px -48px blue,-22px -51px 0px -48px blue,-51px 22px 0px -48px blue,51px -22px 0px -48px blue,-51px -22px 0px -48px blue,51px 22px 0px -48px blue,22px 51px 0px -48px blue,-22px 51px 0px -48px blue,22px -51px 0px -48px blue; }
<div class="dotted"> 100 </div>