vue+canvas繪制時(shí)間軸的方法
本文實(shí)例為大家分享了vue canvas繪制時(shí)間軸的具體代碼,供大家參考,具體內(nèi)容如下
最近在研究canvas繪制時(shí)間軸,直接上代碼,希望分享能給大家?guī)韼椭?,效果如下?/p>

代碼如下,可以拷貝到vue項(xiàng)目中直接預(yù)覽
<template>
<div>
<canvas id="time_line" width="1200" height="27"></canvas>
</div>
</template>
<script>
export default {
name: 'pathwaytrack',
data() {
return {
screenWidth: document.body.clientWidth
}
},
mounted() {
let that = this
that.carveTimeScale(1200, 1, 10, 0, 10)
let canvasColor = '#999999'
let initTime = 12000
setInterval(() => {
initTime += 1000
that.carveTimeScale(1200, 1, 10, initTime, 10)
}, 1000);
},
methods: {
/**
* 分割像素刻度
* width: 寬度 ms:一個(gè)小刻度的毫秒數(shù) pxMs:10像素一個(gè)小刻度 pageShowStartTime:初始時(shí)間(毫秒) 一大段間隔時(shí)長(秒)
*/
carveTimeScale(width, ms, pxMs, pageShowStartTime, intervalTime) {
let canvasId = document.getElementById('time_line')
let ctx = canvasId.getContext('2d')
ctx.clearRect(0, 0, 1200, 60)
ctx.fillStyle = '#999999'
// 為防止蘋果屏幕2X顯示不正常
// 為防止蘋果屏幕2X顯示不正常
var getPixelRatio = function (context) {
var backingStore = context.backingStorePixelRatio ||
context.webkitBackingStorePixelRatio ||
context.mozBackingStorePixelRatio ||
context.msBackingStorePixelRatio ||
context.oBackingStorePixelRatio ||
context.backingStorePixelRatio || 1
return (window.devicePixelRatio || 1) / backingStore
}
let ratio = getPixelRatio(ctx)
let msOffset = this.startOffsetTime(pageShowStartTime, ms) // 開始的偏移時(shí)間 ms
let pxOffset = msOffset / 1000 * pxMs // 開始的偏移距離 px
let leftDistance = 0 // 到左側(cè)的距離
let leftDistanceTime = 0 // 到左側(cè)的時(shí)間
let beginX = 0
let beginY = 0
for (let i = 0; i < width / (ms * pxMs); i++) {
leftDistance = pxOffset + i * (ms * pxMs) // 距離 = 開始的偏移距離 + 格數(shù) * px/格
leftDistanceTime = pageShowStartTime + msOffset + i * ms // 時(shí)間 = 左側(cè)開始時(shí)間 + 偏移時(shí)間 + 格數(shù) * ms
beginX = pxOffset + i * (ms * pxMs)
let canvasColor
let showTime = pageShowStartTime + beginX / pxMs * 1000
if (showTime % (intervalTime * 1000) === 0) {
beginY = 0
ctx.font = '12px Arial'
ctx.fillText(this.changeTime(showTime, 1), beginX + 10, 22)
canvasColor = '#999999'
ctx.fillStyle = '#B1B1B1'
this.drawLine(leftDistance, beginY, leftDistance, 20, canvasColor, 1)
} else if (showTime % intervalTime == 0) {
beginY = 0
canvasColor = '#999999'
this.drawLine(leftDistance, beginY, leftDistance, 10, canvasColor, 1)
}
}
},
/**
* 根據(jù)傳入?yún)?shù)畫線
*/
drawLine(beginX, beginY, endX, endY, color, width) {
let canvasId = document.getElementById('time_line');
let ctx = canvasId.getContext('2d');
ctx.beginPath();
ctx.moveTo(beginX, beginY);
ctx.lineTo(endX, endY);
ctx.strokeStyle = color;
ctx.lineWidth = width;
ctx.stroke();
},
/**
* 左側(cè)開始時(shí)間的偏移,返回單位ms
*/
startOffsetTime(timestamp, step) {
let remainder = timestamp % step
return remainder ? step - remainder : 0
},
/**
* 返回時(shí)間
*/
changeTime(time, num) {
let hour = 0
let minute = 0
let second = 0
second = time / 1000
if (second >= 3600) {
minute = (second - (second % 60)) / 60
hour = parseInt((minute / 60).toString())
minute = minute % 60
/* eslint-disable */
hour >= 10 ? hour : hour = '0' + hour
minute >= 10 ? minute : minute = '0' + minute
second = second % 60
second >= 10 ? second : second = '0' + second
/* eslint-enable */
return hour + ':' + minute + ':' + second
}
if (second < 3600 && second >= 60) {
hour = '00'
minute = parseInt((second / 60).toString())
/* eslint-disable */
minute >= 10 ? minute : minute = '0' + minute
second = second % 60
second >= 10 ? second : second = '0' + second
/* eslint-enable */
return hour + ':' + minute + ':' + second
}
if (second < 60) {
hour = '00'
minute = '00'
second = parseInt(second)
/* eslint-disable */
second >= 10 ? second : second = '0' + second
/* eslint-enable */
return hour + ':' + minute + ':' + second
}
}
}
}
</script>
<style lang="less" scoped>
canvas {
background: black;
}
</style>
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Vue實(shí)現(xiàn)時(shí)間軸效果
- vue實(shí)現(xiàn)橫向時(shí)間軸
- Vue實(shí)現(xiàn)時(shí)間軸功能
- vue實(shí)現(xiàn)兩列水平時(shí)間軸的示例代碼
- VUE實(shí)現(xiàn)時(shí)間軸播放組件
- Vue.js實(shí)現(xiàn)時(shí)間軸功能
- vue+swiper實(shí)現(xiàn)時(shí)間軸效果
- vue實(shí)現(xiàn)物流時(shí)間軸效果
- Vue時(shí)間軸 vue-light-timeline的用法說明
- Vue實(shí)現(xiàn)可移動(dòng)水平時(shí)間軸
- element step組件在另一側(cè)加時(shí)間軸顯示
相關(guān)文章
vue-cli項(xiàng)目優(yōu)化方法- 縮短首屏加載時(shí)間
這篇文章主要介紹了vue-cli項(xiàng)目優(yōu)化 縮短首屏加載時(shí)間,需要的朋友可以參考下2018-04-04
詳解vue項(xiàng)目中實(shí)現(xiàn)圖片裁剪功能
這篇文章主要介紹了vue項(xiàng)目中實(shí)現(xiàn)圖片裁剪功能,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06
自定義Vue中的v-module雙向綁定的實(shí)現(xiàn)
這篇文章主要介紹了自定義Vue中的v-module雙向綁定的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
vue.js前后端數(shù)據(jù)交互之提交數(shù)據(jù)操作詳解
這篇文章主要介紹了vue.js前后端數(shù)據(jù)交互之提交數(shù)據(jù)操作,結(jié)合實(shí)例形式較為詳細(xì)的分析了vue.js前后端數(shù)據(jù)交互相關(guān)的表單結(jié)構(gòu)、約束規(guī)則、數(shù)據(jù)提交等相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下2018-04-04
vue多頁面項(xiàng)目中路由使用history模式的方法
這篇文章主要介紹了vue多頁面項(xiàng)目中路由如何使用history模式,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-09-09

