vue3[TS]画出星空背景

找了很多在vue3画星空,但是没有……几乎是vue2或者js,所以随便整理了一下

 <canvas ref="canvasDom" id="canvasDom" class="canvasDom" />

const initStarry = () => {
  // 第一个画布
  const canvasDom: HTMLCanvasElement = document.getElementById('canvasDom') as HTMLCanvasElement
  const canvasCtx: CanvasRenderingContext2D = canvasDom.getContext('2d') as CanvasRenderingContext2D
  canvasDom.width = window.innerWidth
  canvasDom.height = window.innerHeight
  let w = window.innerWidth
  let h = window.innerHeight
  var hue = 217
  var stars: any = []
  var count = 0
  var maxStars = 300 // 星星数量

  // 第二个画布
  const canvasDom2: HTMLCanvasElement = document.createElement('canvas')
  const canvasCtx2 = canvasDom2.getContext('2d') as CanvasRenderingContext2D
  canvasDom2.width = 100
  canvasDom2.height = 100

  var half = canvasDom2.width / 2 //星星的大小
  var gradient2 = canvasCtx2.createRadialGradient(half, half, 0, half, half, half)
  gradient2.addColorStop(0.025, '#CCC')
  gradient2.addColorStop(0.1, 'hsl(' + hue + ', 61%, 33%)')
  gradient2.addColorStop(0.25, 'hsl(' + hue + ', 64%, 6%)')
  gradient2.addColorStop(1, 'transparent')
  canvasCtx2.fillStyle = gradient2
  canvasCtx2.beginPath()
  canvasCtx2.arc(half, half, half, 0, Math.PI * 2) //一个个流星的点
  canvasCtx2.fill()

  function random(min: number, max?: number): number {
    // arguments只有正常函数才有
    if (arguments.length < 2) {
      max = min
      min = 0
    }
    if (max) {
      if (min > max) {
        var hold = max
        max = min
        min = hold
      }
    }

    return Math.floor(Math.random() * ((max as number) - min + 1)) + min
  }
  // 运动最外圈的直径
  function maxOrbit(x: number, y: number) {
    var max = Math.max(x, y)
    var diameter = Math.round(Math.sqrt(max * max + max * max))
    return diameter / 2
    // 星星移动范围,值越大范围越小,
  }

  class Star {
    orbitRadius: number
    radius: number
    orbitX: number
    orbitY: number
    timePassed: number
    speed: number
    alpha: number

    constructor() {
      this.orbitRadius = random(maxOrbit(w, h))
      this.radius = random(60, this.orbitRadius) / 20

      // 星星大小
      this.orbitX = w / 2
      this.orbitY = h / 2
      this.timePassed = random(0, maxStars)
      this.speed = random(this.orbitRadius) / 50000
      // 星星移动速度
      this.alpha = random(2, 10) / 10
      count++
      stars[count] = this
    }
    draw() {
      var x = Math.sin(this.timePassed) * this.orbitRadius + this.orbitX
      var y = Math.cos(this.timePassed) * this.orbitRadius + this.orbitY
      var twinkle = random(10)

      if (twinkle === 1 && this.alpha > 0) {
        this.alpha -= 0.05
      } else if (twinkle === 2 && this.alpha < 1) {
        this.alpha += 0.05
      }

      canvasCtx.globalAlpha = this.alpha
      canvasCtx.drawImage(canvasDom2, x - this.radius / 2, y - this.radius / 2, this.radius, this.radius)

      this.timePassed += this.speed
    }
  }

  for (var i = 0; i < maxStars; i++) {
    /* eslint-disable no-new */
    new Star()
  }
  function animation() {
    canvasCtx.globalCompositeOperation = 'source-over'
    canvasCtx.globalAlpha = 0.5 // 尾巴
    // canvasCtx.value!.fillStyle = 'hsla(' + hue + ', 64%, 6%, 2)'
    canvasCtx.fillStyle = 'hsla(' + 229 + ', 93%, 22%, 2)'
    canvasCtx.fillRect(0, 0, w, h) //背景渲染 - 填充

    canvasCtx.globalCompositeOperation = 'lighter'
    for (var i = 1, l = stars.length; i < l; i++) {
      stars[i].draw()
    }
    window.requestAnimationFrame(animation)
  }
  animation()
}

在【onMounted】里调用一下方法就行了

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 Vue3 + TypeScript 中画 Echarts 环形图表,可以按照以下步骤进行: 1. 安装 EchartsVue-Echarts: ``` npm install echarts vue-echarts@5.0.0-beta.5 ``` 2. 在需要使用的组件中引入 EchartsVue-Echarts: ```typescript import { defineComponent, onMounted, ref } from 'vue' import * as echarts from 'echarts' import { use } from 'echarts/core' import { CanvasRenderer } from 'echarts/renderers' import { PieChart } from 'echarts/charts' import { LegendComponent, TooltipComponent } from 'echarts/components' import VueECharts from 'vue-echarts' use([CanvasRenderer, PieChart, LegendComponent, TooltipComponent]) export default defineComponent({ components: { VueECharts }, setup() { const chartRef = ref(null) const chart = ref<echarts.ECharts | null>(null) const options: echarts.EChartsOption = { title: { text: '环形图示例' }, tooltip: { trigger: 'item', formatter: '{a} <br/>{b}: {c} ({d}%)' }, legend: { orient: 'vertical', left: 10, data: ['数据1', '数据2', '数据3', '数据4', '数据5'] }, series: [ { name: '访问来源', type: 'pie', radius: ['50%', '70%'], avoidLabelOverlap: false, label: { show: false, position: 'center' }, emphasis: { label: { show: true, fontSize: '30', fontWeight: 'bold' } }, labelLine: { show: false }, data: [ { value: 335, name: '数据1' }, { value: 310, name: '数据2' }, { value: 234, name: '数据3' }, { value: 135, name: '数据4' }, { value: 1548, name: '数据5' } ] } ] } onMounted(() => { if (chartRef.value) { chart.value = echarts.init(chartRef.value) chart.value.setOption(options) } }) return { chartRef, chart } } }) ``` 3. 在组件的模板中使用 Vue-Echarts 组件,并传入需要渲染的数据和 Echarts 实例: ```vue <template> <div> <vue-echarts :options="options" :auto-resize="true" :renderer="'canvas'" :chart="chartRef"></vue-echarts> </div> </template> ``` 这样就可以在 Vue3 + TypeScript 中画出一个简单的 Echarts 环形图表了。注意,在 setup 函数中,需要使用 `ref` 函数将 `chart` 和 `chartRef` 定义为响应式数据,并在 `onMounted` 钩子函数中初始化 Echarts 实例并设置选项。在模板中,需要将 `chartRef` 作为 `VueECharts` 组件的 `chart` 属性传入。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值