网站下方一般放什么,开发一套程序多少钱,网站程序免费下载,免费软件版免费下载一、如下图所示效果#xff1a; 运行后入下图所示效果#xff1a; 实现原理是用div画图并动态改变进度#xff0c; 
二、div源码 
div stylewidth: 100%;div classsdg_title styleheight: 35px;!--对话组[{{ dialo…一、如下图所示效果 运行后入下图所示效果 实现原理是用div画图并动态改变进度 
二、div源码 
div stylewidth: 100%;div classsdg_title styleheight: 35px;!--对话组[{{ dialogGroup.index }}]编辑--div classsdg_title_btnsa-button sizemini clickdeleteCurrentBlock删除/a-buttondiv classsdg_split/diva-button sizemini clickplay v-ifisPlay ! 播放中运行/a-buttona-button sizemini clickpause v-ifisPlay  播放中暂停/a-buttona-button sizemini clickstop v-ifisPlay ! 未播放停止/a-buttondiv classsdg_split/divdiv stylebox-sizing: border-box; display: flex; justify-content: center; align-items: center;span最小刻度单位/spana-radio-group v-model:valuescaleUnit changeinita-radio-button value秒1秒/a-radio-buttona-radio-button value5秒5秒/a-radio-buttona-radio-button value10秒10秒/a-radio-button/a-radio-group/divdiv stylepadding-left: 10px;span刻度总时长/spana-input-number v-model:valueinitData.period placeholder请输入任务想定名称stylewidth: 80px changemaxPeriodChange/a-input-number/div/div/divdiv styleposition: relative; width: 100%; display: flex; flex-direction: row;!--title--div stylewidth: 150px; height: 250px; classscrolldiv classblockTitle刻度(总时长)/divdiv classblockTitle2A项/divdiv classblockTitle2B项/div/divdiv stylewidth: calc(100% - 150px); height: 250px; classscroll!--刻度表--div classtimeScaleBlock :style{ width: maxWidth  px }div v-forval in maxWidth / 100 :keyval classoneScaleUnit!--刻度主线--div classmainLine/div!--长刻度线--div classlongLine styleleft: -1px/divdiv classlongLine styleleft: 48pxdiv classmiddleScaleValue v-ifscaleUnit  5秒{{ formatSecond((val * 10 - 5) * 5) }}/divdiv classmiddleScaleValue v-else-ifscaleUnit  10秒{{ formatSecond((val * 10 - 5) * 10) }}/divdiv classmiddleScaleValue v-else{{ formatSecond((val * 10 - 5)) }}/div/div!--短刻度线--div classshortLine styleleft: 9px/divdiv classshortLine styleleft: 19px/divdiv classshortLine styleleft: 28px/divdiv classshortLine styleleft: 38px/divdiv classshortLine styleleft: 58px/divdiv classshortLine styleleft: 68px/divdiv classshortLine styleleft: 78px/divdiv classshortLine styleleft: 88px/div/divdiv classleftBorder v-ifclickBlock :style{ left: leftBorderValue }↑div classborderValue{{ formatSecond(clickBlock.startTime) }}/div/divdiv classleftBorder v-ifclickBlock :style{ left: rightBorderVaule }↑div classborderValue{{ formatSecond(clickBlock.endTime) }}/div/div!--播放进度三尖角--div classtriangleDiv :style{ left: triangleDivLeft  px }span classsecond{{ formatSecond(startTime) }}/span/div/div!--背景信号--div classstationBlock idbackgroundTimeLineDiv v-ifinitData :style{ width: maxBlockWidth  px } mousemovebgMousemove mouseupbgMouseup mouseleavebgMouseleavediv :iditem.idclasstae_base_block1v-for(item, index) in initData.backgroundTimeLine :keyindexmousedowndialogueBlockClick(item):class{ block_selected1: clickBlock  clickBlock.id  item.id }:style{ width: item.widthPx, left: item.leftPx }div classblockItem{{ item.name }}/divdiv classblockItem{{ item.period }}秒/div/div!-- 拖拽进入的临时模块 --div v-iftempBlockData  tempBlockData.blockType  signal classtae_base_block1_temp :style{ width: tempBlockData.widthPx, left: tempBlockData.leftPx }div classblockItem{{ tempBlockData.name }}/divdiv classblockItem{{ tempBlockData.period }}秒/div/div/div!--设备部署--div classstationBlock v-ifinitData :style{ width: maxBlockWidth  px } mousemovebgMousemove mouseupbgMouseup mouseleavebgMouseleavediv :iditem.idclasstae_base_block2v-for(item, index) in initData.equipmentTimeLine :keyindexmousedowndialogueBlockClick(item):class{ block_selected2: clickBlock  clickBlock.id  item.id }:style{ width: item.widthPx, left: item.leftPx }div classblockItem{{ item.name }}/divdiv classblockItem{{ item.period }}秒/div/div!-- 拖拽进入的临时模块 --div v-iftempBlockData  tempBlockData.blockType  place classtae_base_block2_temp :style{ width: tempBlockData.widthPx, left: tempBlockData.leftPx }div classblockItem{{ tempBlockData.name }}/divdiv classblockItem{{ tempBlockData.period }}秒/div/div/div!--播放背景布--div v-ifstartTime  0 classstationPlayBlock :style{ width: triangleDivLeft  6  px}/div/div/div/div 
script源码如下 
script
import { mapState, mapActions } from vuex
import { message } from ant-design-vue
export default {name: DialogBlockEditor,components: {},props: {initDefaultData: {type: Object,default: ()  {return null}},dialogGroup: {type: Object,default: ()  {return null}},},computed: {...mapState([runningScenario]),leftBorderValue() {let unit  1if (this.scaleUnit  5秒) {unit  5} else if (this.scaleUnit  10秒) {unit  10}return (10 * this.clickBlock.startTime) / unit - 7  px},rightBorderVaule() {let unit  1if (this.scaleUnit  5秒) {unit  5} else if (this.scaleUnit  10秒) {unit  10}return (10 * this.clickBlock.endTime) / unit - 7  px},isPlay() {if (this.startTime  0  this.timer  null) {return 未播放} else if (this.startTime  0  this.timer  null) {return 暂停中} else {return 播放中}}},data() {return {initData: {startTime: 0,period: 60, // 任务总时长backgroundTimeLine: [{name: 素材1,type: signal,period: 10,startTime: 10,},], // 时间线equipmentTimeLine: [{name: 素材1,type: place,period: 10,startTime: 10,},], // 时间线},loading: false,maxWidth: 2000,maxBlockWidth: 1000,scaleUnit: 秒,dialogueBlock: null,clickBlock: null,dataList: [],audioSrc: ,triangleDivLeft: -6,timer: null,startTime: 0,tempData: null,tempBlockData: null,clientLeft: 0,}},mounted() {if(this.initDefaultDatanull){this.initDefaultDatathis.initData}else{this.initDatathis.initDefaultData}this.init()setTimeout(()  {let backgroundTimeLineDiv  document.getElementById(backgroundTimeLineDiv)this.clientLeft  backgroundTimeLineDiv.getBoundingClientRect().left}, 2000)},beforeDestroy() {this.stop()},methods: {...mapActions([runScenario, stopScenario]),async init() {if (this.scaleUnit  5秒) {this.maxWidth  Math.ceil(this.initData.period / 50) * 100this.maxBlockWidth  this.initData.period * 2} else if (this.scaleUnit  10秒) {this.maxWidth  Math.ceil(this.initData.period / 100) * 100this.maxBlockWidth  this.initData.period} else {this.maxWidth  Math.ceil(this.initData.period / 10) * 100this.maxBlockWidth  this.initData.period * 10}let sortNumber  0for (let backgroundData of this.initData.backgroundTimeLine) {backgroundData.id  Tool.uuid(8, 32)backgroundData.leftPx  this.timeToPx(backgroundData.startTime - this.initData.startTime)backgroundData.widthPx  this.timeToPx(backgroundData.period)backgroundData.endTime  backgroundData.startTime  backgroundData.periodbackgroundData.blockType  backgroundData.typebackgroundData.sortNumber  sortNumber// rightPx: this.timeToPx(dialogueDetail[0] - this.initData.startTime  dialogue.period)}sortNumber  0for (let equipmentData of this.initData.equipmentTimeLine) {equipmentData.id  Tool.uuid(8, 32)equipmentData.leftPx  this.timeToPx(equipmentData.startTime - this.initData.startTime)equipmentData.widthPx  this.timeToPx(equipmentData.period)equipmentData.endTime  equipmentData.startTime  equipmentData.periodequipmentData.blockType  equipmentData.typeequipmentData.sortNumber  sortNumber// rightPx: this.timeToPx(dialogueDetail[0] - this.initData.startTime  dialogue.period)}this.$nextTick(()  {this.initBlockClickEvent()})},/*** 增加素材到刻度尺* param data 素材数据* param type */addBlock(data, type) {if (type  signal) {this.initData.backgroundTimeLine.push(data)} else if (type  place) {this.initData.equipmentTimeLine.push(data)}this.init()},timeToPx(time) {switch (this.scaleUnit) {case 秒:return time * 10  pxcase 5秒:return time * 2  pxcase 10秒:return time  px}},pxToTime(px) {switch (this.scaleUnit) {case 秒:return Math.round(px / 10)  this.initData.startTimecase 5秒:return Math.round(px / 2)  this.initData.startTimecase 10秒:return px  this.initData.startTime}},async dataConfirm() {this.$emit(save-scheme-dialog, this.initData)},dialogueBlockClick(block) {this.clickBlock  block},deleteCurrentBlock() {if (this.clickBlock) {if (this.clickBlock.blockType  signal) { // 删除的for (let index in this.initData.backgroundTimeLine) {if (this.initData.backgroundTimeLine[index].id  this.clickBlock.id) {this.initData.backgroundTimeLine.splice(index, 1)break}}} else {for (let index in this.initData.equipmentTimeLine) { // 删除的是if (this.initData.equipmentTimeLine[index].id  this.clickBlock.id) {this.initData.equipmentTimeLine.splice(index, 1)break}}}this.clickBlock  nullmessage.success(删除成功)this.init()} else {message.error(未选择台词块)}},initBlockClickEvent() {for (let dialogueWrapper of this.initData.backgroundTimeLine) {let dom  document.getElementById(dialogueWrapper.id)dom.onmousedown  (e)  {this.onmousedownEvent(e, dialogueWrapper)}}for (let dialogueWrapper of this.initData.equipmentTimeLine) {let dom  document.getElementById(dialogueWrapper.id)dom.onmousedown  (e)  {this.onmousedownEvent(e, dialogueWrapper)}}},maxPeriodChange(){this.init()},onmousedownEvent(event, clickBlock) {let disX  event.clientXlet oldLeftPx  Number.parseFloat(clickBlock.leftPx)document.onmousemove  (me)  {let offsetPx  me.clientX - disXswitch (this.scaleUnit) {case 秒:offsetPx  Math.round(offsetPx / 10) * 10breakcase 5秒:offsetPx  Math.round(offsetPx / 2) * 2breakcase 10秒:break}offsetPx  oldLeftPx// 边界处理let preBlock  null, nextBlock  nullif (clickBlock.blockType  signal) { //if (clickBlock.sortNumber  0) {preBlock  this.initData.backgroundTimeLine[clickBlock.sortNumber - 1]}if (this.initData.backgroundTimeLine[clickBlock.sortNumber  1]) {nextBlock  this.initData.backgroundTimeLine[clickBlock.sortNumber  1]}} else { // if (clickBlock.sortNumber  0) {preBlock  this.initData.equipmentTimeLine[clickBlock.sortNumber - 1]}if (this.initData.equipmentTimeLine[clickBlock.sortNumber  1]) {nextBlock  this.initData.equipmentTimeLine[clickBlock.sortNumber  1]}}// 左边重合if (preBlock) {if (offsetPx  Number.parseInt(preBlock.leftPx)  Number.parseInt(preBlock.widthPx)) { // 重合了offsetPx  Number.parseInt(preBlock.leftPx)  Number.parseInt(preBlock.widthPx)}} else {if (offsetPx  0) {offsetPx  0}}// 判断右边重合if (nextBlock) {if (offsetPx  Number.parseInt(clickBlock.widthPx)  Number.parseInt(nextBlock.leftPx)) {offsetPx  Number.parseInt(nextBlock.leftPx) - Number.parseInt(clickBlock.widthPx)}}clickBlock.leftPx  offsetPx  pxclickBlock.startTime  this.pxToTime(offsetPx)clickBlock.endTime  clickBlock.startTime  clickBlock.period}document.onmouseup  ()  {document.onmousemove  nulldocument.onmouseup  null}},closeDialog() {this.$emit(close-dialog)return false},play() {this.timer  setInterval(()  {this.startTimethis.calcTriangleDivLeft()for (let block of this.initData.backgroundTimeLine) {if (!block.status) { // 还未运行if (this.startTime  block.startTime  this.startTime  block.endTime) {block.status  runningthis.runScenario({_this: this,scenario: this.initData,callback: ()  {}})break}} else if (block.status  running) { // 正在运行if (this.startTime  block.endTime) {block.status  endedbreak}}}for (let block of this.initData.equipmentTimeLine) {if (!block.status) { // 还未运行if (this.startTime  block.startTime  this.startTime  block.endTime) {block.status  runningbreak}} else if (block.status  running) { // 正在运行if (this.startTime  block.endTime) {block.status  endedbreak}}}if (this.startTime  this.initData.period) { // 播放完成了this.stop()}}, 1000)message.success(开始播放)},pause() {if (this.timer) {try {clearInterval(this.timer)} catch (e) {}}this.timer  nullmessage.success(暂停)},stop() {if (this.timer) {try {clearInterval(this.timer)} catch (e) {}}this.timer  nullthis.startTime  0this.triangleDivLeft  -6for (let block of this.initData.backgroundTimeLine) {block.status  null}for (let block of this.initData.equipmentTimeLine) {block.status  null}message.success(停止)},calcTriangleDivLeft() {switch (this.scaleUnit) {case 秒:this.triangleDivLeft  this.startTime * 10 - 6breakcase 5秒:this.triangleDivLeft  this.startTime * 2 - 6breakcase 10秒:this.triangleDivLeft  this.startTime - 6breakcase 分:this.triangleDivLeft  this.startTime * 10 / 60 - 6breakcase 5分:this.triangleDivLeft  this.startTime * 10 / 300 - 6breakcase 10分:this.triangleDivLeft  this.startTime * 10 / 600 - 6break}},formatSecond(value) {value  value || 0;let second  parseInt(value, 10); // 秒let minute  0; // 分let hour  0; // 小时if (second  60) {// 当大于60秒时才需要做转换minute  Math.floor(second / 60);second  Math.floor(second % 60);if (minute  60) {hour  Math.floor(minute / 60);minute  Math.floor(minute % 60);}} else {// 小于60秒时直接显示不需要处理}let result    Tool.PrefixInteger(second, 2)  ;// 拼上分钟result    Tool.PrefixInteger(minute, 2)  :  result;// 拼上小时result    Tool.PrefixInteger(hour, 2)  :  result;return result},bgMousemove(e) {if (this.tempData) {document.body.style.cursor  movelet offsetPx  e.clientX - this.clientLeftswitch (this.scaleUnit) {case 秒:offsetPx  Math.round(offsetPx / 10) * 10breakcase 5秒:offsetPx  Math.round(offsetPx / 2) * 2breakcase 10秒:break}let startTime  this.pxToTime(offsetPx)this.tempBlockData  {id: Tool.uuid(8, 32),name: this.tempData.name,period: this.tempData.period,leftPx: offsetPx  px,widthPx: this.timeToPx(this.tempData.period),startTime: startTime,endTime: startTime  this.tempData.period,blockType: this.tempData.type,}// 判断是否重合if (this.judgeBlockCoincidence(this.tempBlockData)) { // 重合了document.body.style.cursor  not-allowedthis.tempBlockData.success  false}else { // 没有重合document.body.style.cursor  movethis.tempBlockData.success  true}}},bgMouseup(e) {document.body.style.cursor  autoif (this.tempBlockData  this.tempBlockData.success) {let tempData  Tool.deepCopy(this.tempData)tempData.startTime  this.tempBlockData.startTimethis.initData.periodthis.tempBlockData.periodif (this.tempBlockData.blockType  signal) {this.initData.backgroundTimeLine.push(tempData)this.initData.backgroundTimeLine.sort((a, b)  a.startTime  b.startTime ? 1 : -1)}else {this.initData.equipmentTimeLine.push(tempData)this.initData.equipmentTimeLine.sort((a, b)  a.startTime  b.startTime ? 1 : -1)}//console.log(规划-鼠标松开1,this.tempData.period)this.init()//console.log(规划-鼠标松开2,this.tempData.period)}this.tempBlockData  nullthis.tempData  null},bgMouseleave(e) {this.tempBlockData  nulldocument.body.style.cursor  auto},// 判断是否有重合judgeBlockCoincidence(blockData) {let list  nullif (blockData.blockType  signal) {list  this.initData.backgroundTimeLine} else {list  this.initData.equipmentTimeLine}for (let block of list) {if (blockData.startTime  block.startTime  blockData.startTime  block.endTime) {return true}if (blockData.endTime  block.startTime  blockData.endTime  block.endTime) {return true}}return false},setTempData(tempData) {this.tempData  tempData},updata(tempData){this.initDatatempDatathis.init()}}
}
/script 
运行时如有问题欢迎讨论 文章转载自: http://www.morning.kgkph.cn.gov.cn.kgkph.cn http://www.morning.xmbhc.cn.gov.cn.xmbhc.cn http://www.morning.tnzwm.cn.gov.cn.tnzwm.cn http://www.morning.tnjkg.cn.gov.cn.tnjkg.cn http://www.morning.hkpyp.cn.gov.cn.hkpyp.cn http://www.morning.krklj.cn.gov.cn.krklj.cn http://www.morning.lbgfz.cn.gov.cn.lbgfz.cn http://www.morning.sbyhj.cn.gov.cn.sbyhj.cn http://www.morning.glxdk.cn.gov.cn.glxdk.cn http://www.morning.fdsbs.cn.gov.cn.fdsbs.cn http://www.morning.xmtzk.cn.gov.cn.xmtzk.cn http://www.morning.hjlsll.com.gov.cn.hjlsll.com http://www.morning.qstkk.cn.gov.cn.qstkk.cn http://www.morning.qymqh.cn.gov.cn.qymqh.cn http://www.morning.fywqr.cn.gov.cn.fywqr.cn http://www.morning.xnqwk.cn.gov.cn.xnqwk.cn http://www.morning.snxbf.cn.gov.cn.snxbf.cn http://www.morning.tfcwj.cn.gov.cn.tfcwj.cn http://www.morning.mslsn.cn.gov.cn.mslsn.cn http://www.morning.cjqcx.cn.gov.cn.cjqcx.cn http://www.morning.bpmdg.cn.gov.cn.bpmdg.cn http://www.morning.kcdts.cn.gov.cn.kcdts.cn http://www.morning.bwzzt.cn.gov.cn.bwzzt.cn http://www.morning.ddzqx.cn.gov.cn.ddzqx.cn http://www.morning.zbhfs.cn.gov.cn.zbhfs.cn http://www.morning.clpdm.cn.gov.cn.clpdm.cn http://www.morning.hgkbj.cn.gov.cn.hgkbj.cn http://www.morning.dxqfh.cn.gov.cn.dxqfh.cn http://www.morning.yrms.cn.gov.cn.yrms.cn http://www.morning.glxdk.cn.gov.cn.glxdk.cn http://www.morning.rckmz.cn.gov.cn.rckmz.cn http://www.morning.dsncg.cn.gov.cn.dsncg.cn http://www.morning.nlywq.cn.gov.cn.nlywq.cn http://www.morning.qztdz.cn.gov.cn.qztdz.cn http://www.morning.nlbhj.cn.gov.cn.nlbhj.cn http://www.morning.qsszq.cn.gov.cn.qsszq.cn http://www.morning.fthqc.cn.gov.cn.fthqc.cn http://www.morning.fcrw.cn.gov.cn.fcrw.cn http://www.morning.zqkms.cn.gov.cn.zqkms.cn http://www.morning.pbsfq.cn.gov.cn.pbsfq.cn http://www.morning.kkjlz.cn.gov.cn.kkjlz.cn http://www.morning.qxlyf.cn.gov.cn.qxlyf.cn http://www.morning.hwnqg.cn.gov.cn.hwnqg.cn http://www.morning.ypzr.cn.gov.cn.ypzr.cn http://www.morning.lqynj.cn.gov.cn.lqynj.cn http://www.morning.ey3h2d.cn.gov.cn.ey3h2d.cn http://www.morning.lmdfj.cn.gov.cn.lmdfj.cn http://www.morning.bmtkp.cn.gov.cn.bmtkp.cn http://www.morning.krlsz.cn.gov.cn.krlsz.cn http://www.morning.ntzbr.cn.gov.cn.ntzbr.cn http://www.morning.lxkhx.cn.gov.cn.lxkhx.cn http://www.morning.lsnnc.cn.gov.cn.lsnnc.cn http://www.morning.znlhc.cn.gov.cn.znlhc.cn http://www.morning.drbd.cn.gov.cn.drbd.cn http://www.morning.tytly.cn.gov.cn.tytly.cn http://www.morning.coatingonline.com.cn.gov.cn.coatingonline.com.cn http://www.morning.fqyxb.cn.gov.cn.fqyxb.cn http://www.morning.pthmn.cn.gov.cn.pthmn.cn http://www.morning.swsrb.cn.gov.cn.swsrb.cn http://www.morning.sgfpn.cn.gov.cn.sgfpn.cn http://www.morning.qgfkn.cn.gov.cn.qgfkn.cn http://www.morning.xknsn.cn.gov.cn.xknsn.cn http://www.morning.qkbwd.cn.gov.cn.qkbwd.cn http://www.morning.qsctt.cn.gov.cn.qsctt.cn http://www.morning.lwdzt.cn.gov.cn.lwdzt.cn http://www.morning.tbjtm.cn.gov.cn.tbjtm.cn http://www.morning.pwxkn.cn.gov.cn.pwxkn.cn http://www.morning.yrskc.cn.gov.cn.yrskc.cn http://www.morning.rnwmp.cn.gov.cn.rnwmp.cn http://www.morning.ptmgq.cn.gov.cn.ptmgq.cn http://www.morning.xhpnp.cn.gov.cn.xhpnp.cn http://www.morning.tdmgs.cn.gov.cn.tdmgs.cn http://www.morning.wqrk.cn.gov.cn.wqrk.cn http://www.morning.xcjbk.cn.gov.cn.xcjbk.cn http://www.morning.kbqqn.cn.gov.cn.kbqqn.cn http://www.morning.cfcdr.cn.gov.cn.cfcdr.cn http://www.morning.youprogrammer.cn.gov.cn.youprogrammer.cn http://www.morning.kjyfq.cn.gov.cn.kjyfq.cn http://www.morning.tntgc.cn.gov.cn.tntgc.cn http://www.morning.etsaf.com.gov.cn.etsaf.com