D3.js在vue中实现水波球

参考:https://www.cnblogs.com/flashing-magic/p/11776365.html
https://blog.csdn.net/slzs_zyt/article/details/81068783
https://blog.csdn.net/code_for_free/article/details/52268686
来康康效果图叭

在这里插入图片描述
外面的圆环就是用两个圆套在一起,这没什么好说的
可以把这个水波球看成一个八卦图,上面一半,下面一半
首先要做一个水波clipPath裁剪层(就是八卦图的上面一部分),然后写两个text,一个深蓝一个淡蓝,然后用.attr('clip-path', 'url(#clipPath2)')裁剪成两部分,注意裁剪层是不显示颜色的。
所以我们还要再添加一个蓝色的水波。
这里值得一提的是svg的堆叠顺序是

  • 同级:后面的添加的元素会覆盖前面添加的元素
  • 不同级:层级更高的会被覆盖

这里有点坑,我的蓝色的水波明明是在text前面添加,可是在浏览器里显示text在水波的前面,导致我的水波会把文字给盖住!所以我有新建了一个qswl(气死我了)层,在这一层里面添加了水波。这样就不会覆盖住我的文字了。
附上代码:

<template>
  <div class="hello">
    <router-link to="/">柱状图</router-link><br/>
    <router-link to="lineChart">折现图</router-link><br/>
    <router-link to="pieChart">饼状图</router-link><br/>
    <div class="chart">
      <h3>任务二</h3>
      <svg ref="tast2" class="tast2">
        <svg ref="ground">
        </svg>
      </svg>
    </div>
  </div>
</template>

<script>
import * as d3 from 'd3'
export default {
  name: 'tast2',
  methods: {
    draw () {
      var svg = d3.select(this.$refs.tast2)
        .attr('width', 600)
        .attr('height', 550)
      svg.append('circle')
        .attr('fill', '#34a7f5')
        .attr('r', 100) // 半径
        .attr('cx', 200) // x轴位置
        .attr('cy', 200) // y轴位置
      svg.append('circle')
        .attr('fill', '#ffffff')
        .attr('r', 93) // 半径
        .attr('cx', 200) // x轴位置
        .attr('cy', 200) // y轴位置
      /* ------------动画部分------------ */
      var height = 600
      var values = 0
      var dataList0 = [values - 12, values - 18, values - 24, values - 18, values - 12, values - 6, values, values - 6]
      var dataList1 = [values - 18, values - 24, values - 18, values - 12, values - 6, values, values - 6, values - 12]
      var dataList2 = [values - 24, values - 18, values - 12, values - 6, values, values - 6, values - 12, values - 18]
      var dataList3 = [values - 18, values - 12, values - 6, values, values - 6, values - 12, values - 18, values - 24]
      var dataList4 = [values - 12, values - 6, values, values - 6, values - 12, values - 18, values - 24, values - 18]
      var dataList5 = [values - 6, values, values - 6, values - 12, values - 18, values - 24, values - 18, values - 12]
      var dataList6 = [values, values - 6, values - 12, values - 18, values - 24, values - 18, values - 12, values - 6]
      var dataList7 = [values - 6, values - 12, values - 18, values - 24, values - 18, values - 12, values - 6, values]
      var dataList01 = [values + 12, values + 18, values + 24, values + 18, values + 12, values + 6, values, values + 6]
      var dataList11 = [values + 18, values + 24, values + 18, values + 12, values + 6, values, values + 6, values + 12]
      var dataList21 = [values + 24, values + 18, values + 12, values + 6, values, values + 6, values + 12, values + 18]
      var dataList31 = [values + 18, values + 12, values + 6, values, values + 6, values + 12, values + 18, values + 24]
      var dataList41 = [values + 12, values + 6, values, values + 6, values + 12, values + 18, values + 24, values + 18]
      var dataList51 = [values + 6, values, values + 6, values + 12, values + 18, values + 24, values + 18, values + 12]
      var dataList61 = [values, values + 6, values + 12, values + 18, values + 24, values + 18, values + 12, values + 6]
      var dataList71 = [values + 6, values + 12, values + 18, values + 24, values + 18, values + 12, values + 6, values]
      var areaPath = d3.area()
        .x(function (d, i) { return i * 50 })
        .y0(function (d, i) { return height / 2 })
        .y1(function (d, i) { return -d })
        .curve(d3.curveBasis)
      svg.append('defs')
        .append('clipPath') // 裁剪图层
        .attr('id', 'clipPath')
        .append('circle')
        .attr('r', 86) // 半径
        .attr('cx', 100) // x轴位置
        .attr('cy', 20) // y轴位置
      svg.append('defs')
        .append('clipPath') // 裁剪图层
        .attr('id', 'clipPath1')
        .append('circle')
        .attr('r', 86) // 半径
        .attr('cx', 100) // x轴位置
        .attr('cy', -20) // y轴位置
      /* ---------------上面的裁剪层--------------- */
      svg.append('defs')
        .append('clipPath') // 裁剪图层
        .attr('id', 'clipPath2')
      var clipPath2 = d3.select('#clipPath2')
      function run1 () {
        clipPath2.append('path')
          .attr('class', 'path1')
          .attr('width', 600)
          .attr('d', areaPath(dataList01))
          .attr('fill', 'rgba(255, 255, 255, 1)')
          .attr('transform', 'rotate(180, 150, 90)')
          .attr('clip-path', 'url(#clipPath1)')

          .transition().duration(100).delay(0).ease(d3.easeLinear)
          .attr('d', areaPath(dataList71))

          .transition().duration(100).delay(0).ease(d3.easeLinear)
          .attr('d', areaPath(dataList61))

          .transition().duration(100).delay(0).ease(d3.easeLinear)
          .attr('d', areaPath(dataList51))

          .transition().duration(100).delay(0).ease(d3.easeLinear)
          .attr('d', areaPath(dataList41))

          .transition().duration(100).delay(0).ease(d3.easeLinear)
          .attr('d', areaPath(dataList31))

          .transition().duration(100).delay(0).ease(d3.easeLinear)
          .attr('d', areaPath(dataList21))

          .transition().duration(100).delay(0).ease(d3.easeLinear)
          .attr('d', areaPath(dataList11))

          .transition().duration(100).delay(0).ease(d3.easeLinear)
          .attr('d', areaPath(dataList01))

          .remove()
          .on('end', run1)
      }
      requestAnimationFrame(run1)
      /* -------------------波浪-------------------- */
      var qswl = svg.append('svg')
      function wave () {
        qswl.append('path')
          .attr('class', 'path')
          .attr('width', 600)
          .attr('d', areaPath(dataList0))
          .attr('fill', 'rgba(52, 167, 245, 1)')
          .attr('transform', 'translate(100,180)')
          .attr('clip-path', 'url(#clipPath)')

          .transition().duration(100).delay(0).ease(d3.easeLinear)
          .attr('d', areaPath(dataList1))

          .transition().duration(100).delay(0).ease(d3.easeLinear)
          .attr('d', areaPath(dataList2))

          .transition().duration(100).delay(0).ease(d3.easeLinear)
          .attr('d', areaPath(dataList3))

          .transition().duration(100).delay(0).ease(d3.easeLinear)
          .attr('d', areaPath(dataList4))

          .transition().duration(100).delay(0).ease(d3.easeLinear)
          .attr('d', areaPath(dataList5))

          .transition().duration(100).delay(0).ease(d3.easeLinear)
          .attr('d', areaPath(dataList6))

          .transition().duration(100).delay(0).ease(d3.easeLinear)
          .attr('d', areaPath(dataList7))

          .transition().duration(100).delay(0).ease(d3.easeLinear)
          .attr('d', areaPath(dataList0))

          .remove()
          .on('end', wave)
      }
      requestAnimationFrame(wave)
      /* ---------------添加文字--------------- */
      svg.append('text')
        .attr('x', 150)
        .attr('y', 220)
        .style('fill', '#c3e2fe')
        .style('font-size', '50px')
        .style('font-weight', 'bold')
        .text('55%')
      svg.append('text')
        .attr('x', 150)
        .attr('y', 220)
        .style('fill', '#31618e')
        .style('font-size', '50px')
        .style('font-weight', 'bold')
        .text('55%')
        .attr('clip-path', 'url(#clipPath2)')
      var ground = d3.select(this.$refs.ground)
      ground.append('rect')
        .attr('width', 300)
        .attr('height', 300)
        .attr('fill', '#ecf9fc')
        .attr('transform', 'translate(50,50)')
      ground.append('text')
        .attr('x', 65)
        .attr('y', 85)
        .style('fill', '#000000')
        .style('font-size', '25px')
        .style('font-weight', 'nomal')
        .text('Liquid Fill Gauge')
      ground.append('rect')
        .attr('width', 200)
        .attr('height', 200)
        .attr('fill', '#ffffff')
        .attr('transform', 'translate(100,100)')
    }
  },
  mounted () {
    this.draw()
  }
}
</script>

<style scoped>
.chart {
    margin-left: 100px;
    margin-top: -80px;
  }
.tast2 {
    width: 600px;
    height: 550px;
    /* -webkit-transform: rotate(180deg) */
}
</style>

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个使用d3.jsVue实现树形结构曲线连接的示例: 1. 安装d3.js 使用npm安装d3.js: ``` npm install d3 ``` 2. 在Vue组件导入d3.jsVue组件的`<script>`标签导入d3.js: ``` import * as d3 from 'd3'; ``` 3. 在Vue组件定义一个SVG元素 在Vue组件定义一个SVG元素,用于绘制树形结构: ``` <template> <svg ref="svg"></svg> </template> ``` 4. 在Vue组件的mounted钩子函数使用d3.js绘制树形结构 在Vue组件的mounted钩子函数使用d3.js绘制树形结构: ``` <script> export default { mounted() { const svg = d3.select(this.$refs.svg); const width = 500; const height = 500; const treeData = { name: 'A', children: [ { name: 'B', children: [ { name: 'C' }, { name: 'D' } ] }, { name: 'E', children: [ { name: 'F' }, { name: 'G' } ] } ] }; const treeLayout = d3.tree() .size([width, height]); const rootNode = d3.hierarchy(treeData); treeLayout(rootNode); const link = svg.selectAll('.link') .data(rootNode.links()) .enter() .append('path') .attr('class', 'link') .attr('d', d => { return `M${d.source.x},${d.source.y}C${d.source.x},${(d.source.y + d.target.y) / 2} ${d.target.x},${(d.source.y + d.target.y) / 2} ${d.target.x},${d.target.y}`; }); const node = svg.selectAll('.node') .data(rootNode.descendants()) .enter() .append('g') .attr('class', 'node') .attr('transform', d => `translate(${d.x},${d.y})`); node.append('circle') .attr('r', 5); node.append('text') .attr('x', 10) .attr('y', -10) .text(d => d.data.name); } } </script> ``` 这段代码首先定义了一个SVG元素,然后使用d3.tree()创建一个树形布局,再使用d3.hierarchy()创建一个层次结构。接着使用selectAll()创建节点和链接,使用enter()添加节点和链接,然后使用attr()设置样式和属性。最后使用path元素绘制贝塞尔曲线连接节点。 上面的代码可以画出一个简单的树形结构,你可以根据自己的需求修改数据和样式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值