美文网首页
Canvas实现连线题的方案设计

Canvas实现连线题的方案设计

作者: 半吊子伯爵 | 来源:发表于2024-05-23 11:25 被阅读0次

        开发“连线题”并没什么难点,这里主要分享的是:实现过程中的一点点布局设计上的小心思。想要的效果大体长这样(如下图所示):

1

        乍一看似乎需要获取每个元素的位置信息、计算连线的端点坐标,似乎很繁琐,而且每次页面尺寸变化时,都得重新计算。其实,事情可以比想象中简单很多…

一、方案设计

        1.1 将连线题分为上中下三个区块,其中:

        1)上下区块均使用flex(justify-content: space-around)

        2)中间区块为canvas,在style属性中将width和height设置为100%

.row-1 { justify-content: space-around; }

.row-2 {

        height: 0; flex-grow: 1;

        canvas { width: 100%; height: 100%; }

}

.row-3 { justify-content: space-around; }

2

        1.2 这样设置以后,有几点好处

        1)计算直线端点(元素中点)坐标就会变得很轻松,只需要排序百分比与canvas的内容宽度相乘即可。

let x1 = (上方元素下标 * 2 + 1) / (上方元素总数 * 2) * canvas.width

let x2 = (下方元素下标 * 2 + 1) / (下方元素总数 * 2) * canvas.width

// 连线上方端点坐标: (x1, 0)

// 连线下方端点坐标: (x2, canvas.height)

        2)页面resize时无需重新计算,页面也不会乱。当然如果resize前后差异较大,可能连线粗细程度会不美观。

        经测,一般不重新绘制也问题不大;如果要求高的话,可以在resize时重新绘制一下。(下图是第一张图在网页resize后的效果,线条经过拉伸变细了)

3

        3)如果你连canvas的尺寸也懒得初始化,也是可以的,只不过效果会差些(线条有点模糊,粗细不美观),Chrome中canvas默认内容尺寸是300*100,效果如下图所示(截图可能视觉效果不明显):

4

二、代码实现

        线条绘制的相关代码如下:

        Html

<canvas ref="canvas" :width="cvsWidth" :height="cvsHeight"></canvas>

        Js

// 动态调整canvas的内容尺寸(必要时,可在每次resize时重复调用)

initCanvas() {

  if (!this.$refs.canvas) return

  let cvsInfo = this.$refs.canvas.getBoundingClientRect()

  this.cvsWidth = parseInt(cvsInfo.width)

  this.cvsHeight = parseInt(cvsInfo.height)

},

// 绘制连线

drawLine() {

  if (!this.$refs.canvas) return

  let count = this.dataList.length

  let ctx = this.$refs.canvas.getContext("2d");

  let cvsWidth = this.$refs.canvas.width

  let cvsHeight = this.$refs.canvas.height

  ctx.clearRect(0, 0, cvsWidth, cvsHeight);

  ctx.lineWidth = 4;

  ctx.lineCap = 'round';

  ctx.strokeStyle = '#FF9C0A'

  for (let k in this.answerDict) {

    let _i1 = parseInt(k)

    let _i2 = this.answerDict[k]

    let _i1_x = (_i1 * 2 + 1) / (count * 2) * cvsWidth

    let _i2_x = (_i2 * 2 + 1) / (count * 2) * cvsWidth

    ctx.beginPath()

    ctx.moveTo(_i1_x, 0);

    ctx.lineTo(_i2_x, cvsHeight);

    ctx.stroke()

  }

},

相关文章

  • canvas 实现动态粒子连线

    如果经常上网就一定见过一些博客的背景有一些粒子跑来跑去,还可以连线。看着是挺炫酷的。基本上就类似上面的效果。今天终...

  • H5 canvas制作数字连线效果

    小时候都玩过数字连线画册,这里我们用canvas将它实现 逻辑要点: canvas无法进行回撤操作,即每一步都需要...

  • canvas 会动的粒子效果

    particle-field canvas实现粒子场的动画效果 实现效果:粒子会动并且在一定范围内粒子之间出现连线...

  • canvas实现背景动态粒子连线

    和眼睛跟随鼠标一样,有些大佬的博客背景下雪,落叶,还有连线的,总觉得很酷炫,主要是思路,度娘了一下,发现其实还好理...

  • Android实现连线题效果

    效果图 全部正确: 有对有错: 结果展示,纯黑色: 支持图片: 实现思路 仔细分析可以发现,连线题的布局可以分为两...

  • 【Canvas】使用Vue3+TS+Canvas实现星星连线

    1.效果预览 2.实现思路 1.绘制一颗星星,让这颗星星在画布中运动2.在画布中绘制一组星星,每颗星星都在画布中运...

  • 连线题

    小明小平头,穿着黄迷彩上衣,红色裤子在上课,但他走神了,不知道在想些什么。左手拖着下巴默默傻笑。 ...

  • 前端效果链接

    canvas canvas实现各种点线效果 Canvas设置width与height 的问题!

  • iOS 连线题目实现。

    一个简单的小Demo,完成的功能是可以实现连线题。 下载地址:https://github.com/kklwg/L...

  • html5各种特效

    【唯美星空】HTML5 canvas/Javas cript 粒子连线 http://www.kgc.cn/bbs...

网友评论

      本文标题:Canvas实现连线题的方案设计

      本文链接:https://www.haomeiwen.com/subject/mjstqjtx.html