该文章参考了张鑫旭的两博文:
paint-order
webkit-text-stroke

webkit-text-stroke文字描边

webkit-text-stroke.png
描边效果:居中描边
现象:text-stroke-width会削弱文字的字重,导致文字变细

-webkit-text-stroke: 2px red;
//等同
-webkit-text-stroke-width: 2px;
-webkit-text-stroke-color: red;
完美描边效果

可以使用-webkit-text-stroke描边文字和非描边文字相互重叠覆盖的方法模拟。技巧就在于-webkit-text-stroke描边文字的描边宽度要是要实现的外描边效果宽度的2倍。

<div class="texts">
    <p class="text1">我是苗冰的小哇啊</p>
    <p class="text2">我是苗冰的小哇啊</p>
</div>

//css
.texts {
    position: relative;
}
.text1 {
    font-size: 40px;
    position: absolute;
    z-index: 2;
    font-weight: bold;
}
.text2 {
    font-size: 40px;
    font-weight: bold;
    -webkit-text-stroke: green 6px;
    position: absolute;
}

test.png
text-stroke属性不行不断累加,如果想要实现多重描边效果,可以借助伪元素多层叠加模拟。

text-shadow

.strok-outside {
    text-shadow: 0 1px red, 1px 0 red, -1px 0 red, 0 -1px red;
}

image.png
由于text-shadow不支持阴影扩展(box-shadow支持),因此,我们使用四向阴影叠加实现。
如图,当文字特别大的时候,会有齿轮问题。

svg

CSS paint-order作用在SVG图形元素上,设置是先绘制描边还是先绘制填充。
在SVG中,描边和填充同时都有设置是很常见的,而SVG图形的描边和-webkit-text-stroke是一样的,都是居中描边。

svg {
    background-color:deepskyblue;
    fill:crimson;
    stroke:white;
    stroke-width:6px;
    font-size:40px;
    font-weight:bold;
}
.paint-order {
    paint-order:stroke;
}
<svg xmlns="http://www.w3.org/2000/svg">
    <text x="10" y="50">我是测试小霸王</text>
    <text x="10" y="120" class="paint-order">我是测试小霸王</text>
</svg>

image.png

//`||`表示或者,可以并存
paint-order: normal | [ fill || stroke || markers ]
paint-order: markers stroke;
  • normal:默认值。绘制顺序是fill stroke markers。图形绘制是后来居上的,因此默认是描边覆盖填充,标记覆盖描边。
  • fill:先填充。
  • stroke:先描边,然后再填充或者标记。
  • markers:先标记。下图坐标值的两个箭头,以及折线上的红色小圆点就是标记,<marker>元素绘制的

CSS paint-order可以作用在SVG的以下这些元素上:<circle>, <ellipse>, <line>, <path>, <polygon>, <polyline>, <rect>, <text>, <textPath>,~~~~ 以及<tspan>

paint-order也可以直接作为XML属性用在上面这些元素上。
兼容性也是不错的
image.png


Shiryan
9 声望1 粉丝

人生就是体验,喜欢就坚持。