带你了解html5 svg,看看怎么绘制自适应的菱形-kb88凯时官网登录

时间:2022-03-29
阅读:
免费资源网 - https://freexyz.cn/

最近在某思看到这样一个问题:需要绘制一个自适应尺寸的菱形,并且还有边框,一般在流程图中很常见,效果如下

如果没有边框的话,用  也能很方便的裁剪出一个菱形,但是边框不太好处理(通常用嵌套一层的方式或者投影来模拟,但是效果不太好),这里介绍一个 svg 方式,充分利用缩放特性来实现这样一个效果

一、svg 从何而来

svg 通常都不需要手写代码(除少量基本形状以外),一般都可以用设计生成(svg 在设计之初就是给机器看的,非常不利于人工阅读)。比如,我这里是用 figma 绘制的(一个多边形就搞定),随便什么尺寸都行

然后就得到了这样一段 svg



在浏览器中效果如下

二、svg 的缩放特性

现在 svg 有一个默认尺寸,如果手动改变 svg 的默认尺寸,如下

是不是有点类似于object-fit:contain的效果?如果想整个铺满,强制拉伸该怎么做呢?这里需要用到 svg 的缩放属性,表示当 svg 的实际尺寸和viewbox尺寸不一致时的缩放规则,有点类似于 object-fit 和 object-position 组合。这里的取值非常多,默认值是xmidymid,表示强制等比缩放,并且居中对齐。

有兴趣的可以参考这篇文章:理解svg viewport,viewbox,preserveaspectratio缩放,案例非常详细

https://www.zhangxinxu.com/wordpress/2014/08/svg-viewport-viewbox-preserveaspectratio/

这里我们不需要等比缩放,可以直接设置为none


...

效果如下

三、svg 的描边缩放

在设置不等比缩放后,其实描边还有一点小问题,不同尺寸下,描边的粗细不同,如下

有没有办法让描边不会跟随 svg 尺寸缩放呢?当然也是有的!svg 中有一个属性 可以控制描边不缩放,永远保持默认设置的尺寸,有兴趣的可以参考这篇文章 ,这里只需要在 path添加属性vector-effect="non-scaling-stroke"就行了,表示描边不跟随缩放,如下


	...

这样就实现了一个自适应尺寸的菱形了,描边也不会缩放,完整 svg 代码如下


  

四、svg 内联 base64

通常情况下,这样一个图形用作背景图更为合适(svg代码放在页面上不太美观)。让人惊讶的是,将 svg 转换成 base64 后,以上特性仍然是存在的。这里使用张鑫旭老师的 ,如下

转换后,将这段 base64 直接用作背景就行

div{
  background: 
}

这样就得到了一个自适应的菱形背景了

当然,转换成 base64 后就不能实时修改颜色了,需要整体替换

完整代码可以访问 svg diamond

https://codepen.io/xboxyan/pen/abvrwmz

五、总结一下

从这个例子就可以看出 svg 的天然优势了,特别是描边的缩放特性,如果用 css 来绘制估计要遇到不少麻烦。这里总结一下实现要点:

  • svg 一般通过设计软件绘制导出就行,不需要手写

  • svg 默认是保持原比例缩放的,可以通过 preserveaspectratio 修改缩放规则

  • svg 描边的粗细默认会跟随整体尺寸缩放,可以通过 vector-effect 设置保持原始大小

  • svg 在转成 base64 后仍然具备以上特性,更适合用作背景图片

svg 一直在图形绘制上更具优势,特别是这类几何图形,缩放、自适应更加灵活,如果 css 实现有困难,不妨考虑一下 svg。最后,如果觉得还不错,对你有帮助的话,欢迎点赞、收藏、转发

免费资源网 - https://freexyz.cn/
返回顶部
顶部
网站地图