原来 Canvas 也能直接绘制圆角矩形了

网站建设4年前发布
35 0 0

很多时候,在使用 Canvas 绘制圆角矩形都是一件比较麻烦的事,因为之前并没有直接的方法,只能通过直线和圆弧间接组合而成,下面是一个常规绘制方式。,这里x、y、w、h、r分别代表x坐标、y坐标、宽度、高度、圆角。,这段代码应该是最精简的了,虽然不是特别复杂,但是应该很少有人能直接手写,主要是不够语义化,比较繁琐。,而圆角矩形又是一个非常常见的功能需求,为此,Canvas 在Chrome 99悄悄推出了一个新的方法:roundRect()[1],花一分钟了解一下。,roundRect,顾名思义,就是圆角矩形,和rect[2]用法一致,只是参数上多了一个圆角radii。,2023030615273743bdc18346487171bd8378bf9431c2abd7a833931,这里x、y、w、h就不介绍了,重点介绍一下这个圆角radii。,圆角radii有以下几种取值,看似麻烦,其实就是和 CSS 中的圆角规则是一致的,稍微看一眼就能明白,下面来看具体的效果,首先来看一个值的,可以满足绝大部分情况。,效果如下:,2023030615273853892f2544fbb792d0f343e06333c2a578209e607,当然这个值也是可以省略的,这样就没有圆角了,等同于rect,效果如下:,20230306153017477101b074b3cb1499a8111783cdeafae2b2d9940,再来看数组的情况,比如两个值的,就像这样。,效果如下:,20230306152738f34e4763230b54a1777189a7dc0ff5e728a6ee516,再来看4个值的情况:,效果如下:,20230306152739a25d34d542bb4cbdcc40391b96620ed5d6d0cd697,如果这个圆角非常大呢,超出了矩形的尺寸会怎么样呢?,可以看到,这种情况也是完美适配,和 CSS 表现完全一致,变成了跑道形状,效果如下:,20230306153018d3abaf6509baa7e7d4974436596e89a33db1b0829,还有需要注意的是,这个圆角不能为负数,否则直接报错。,2023030615274153d28b481d3406e523e51557a0c2dac49cc606579,完整代码可以查看以下任意链接:,这个方法还比较新,也就是今年初才推出的,兼容性还不是特别好,如下:,20230306152741f6915de44ddfd79e2e119542a4b92ef4c7c58f523,除了firefox,其他主流浏览器都已经兼容。,当然也不用担心,这个也是有polyfill的,如下:,​​https://cdn.jsdelivr.net/gh/Kaiido/roundRect/roundRect.js​​,其实实现上还是比较复杂的,考虑的情况非常多,各种临界场景,参数的数量。这也是为什么推荐用原生 API 的原因的,语法容错性太强了!,下次绘制圆角矩形就可以考虑这个方法了,至少心里有个备选方案,兼容性倒是其次,最后再来回顾一下:,2023030615274296e4c3b64949e7645ab191107381c775f92d4e823,圆角可以是一个数组,规则就参考 CSS 圆角规则就行了。,[1]roundRect(): https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/roundRect,[2]rect: https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/rect,[3]canvas roundRect (juejin.cn): https://code.juejin.cn/pen/7178419723002970145,[4]canvas roundRect (codepen.io): https://codepen.io/xboxyan/pen/wvxwbWv,[5]canvas roundRect (runjs.work): https://runjs.work/projects/1ceee49205914def

© 版权声明

相关文章