基于 vue
此功能核心思想就是通过 JavaScript 代码控制 node 在页面上的左边距与顶边距,不同的的样式定位方式有不同的解决方案
本方案采用position: absolute
定位方式的解决方案
css 样式的核心代码
// 父容器核心样式 width: 100%; height: 100%;
// 子容器核心样式 position: absolute; top: 50%; left: 50%; transform: translate(-50%,-50%);
父容器通过width && height
字段占满整个浏览器的可视范围,子容器通过position: absolute
属性开启在父容器内的绝对定位,在通过top && left && transform: translate(-50%, -50%)
属性控制子容器在父容器内的绝对位置
JavaScript 逻辑控制的核心代码
首先分解下,要实现 node 的移动需要哪些步骤和对应的 event 事件
- 子容器创建时,在父容器内的绝对位置
- 鼠标按键按下时,onmousedown 事件
- 鼠标移动时,onmousemove 事件
- 鼠标按键弹起时,onmouseup 事件
只要使用 onMousedown、onMousemove和onMouseup 这三个事件,就可以实现最简单的移动
/* * 在子容器创建的时候获取子容器相对于父容器的 top 和 left 位置 */ mounted () { this.left = this.$refs.fatherBox.offsetLeft this.top = this.$refs.fatherBox.offsetTop }
/* * 鼠标按下时 * 1. 开启允许子容器移动的 flag * 2. 记录鼠标点击时的位置信息 */ mouseDown (e) { // 设置允许弹窗移动的 flag this.moveFlag = true // 保存鼠标开始位置 this.startLeft = e.clientX - this.left this.startTop = e.clientY - this.top }
/* * 鼠标移动时 * 1. 判断 flag 是否允许子容器移动 * 2. 设置弹框左边位置 * 3. 设置弹框右边位置 */ move (e) { // 判断 flag 是否允许移动 if (!this.moveFlag) return // 设置弹框左边位置 this.left = e.clientX - this.startLeft // 设置弹框右边位置 this.top = e.clientY - this.startTop }
/* * 鼠标按键弹起时 * 1. 关闭允许子容器移动的 flag */ mouseUp (e) { this.flag = false }
通过这几个方法就可以获取鼠标按下移动时,鼠标的top 和 left 的偏移量,通过把这偏移量暴露出去给父组件,父组件实时设置子组件的 top 和 left 值,来使得子容器跟随鼠标的移动
父组件部分代码
父组件通过设置子组件的 ref、zIndex 值,而且父组件的 backValue 方法会从子组件接收 zIndex 值,通过 zIndex 来识别具体的子组件实例
/* * 父组件代码片段 jsx 版 */ export default { props: { playList: { type: Array, required: true } }, render () { return ( <div style={{width: '100%', height: '100%'}} ref={'father'}> { this.playList && this.playList.map((item, index) => { return ( <ChildComponents key={index} ref={index} zIndex={index} visible={true} backValue={this.backValue} info={item} width={600} height={400} /> ) }) } </div> ) }, methods: { backValue (left, top, zIndex) { this.$refs[zIndex].$el.style.top = `${top}px` this.$refs[zIndex].$el.style.left = `${left}px` } } }
<!-- 父组件代码片段 vue 文件版 --> <template> <div ref="father" style"width: 100%, height: 100%" > <ChildComponents v-for="(item, index) in playList" :key="index" :ref="index" :visible="true" :z-index="index" :back-value="backValue" :info="item" :close="close" :width="600" :height="400" /> </div> </template> <script> export default { components: { VideoPlayerModal }, props: { playList: { type: Array, required: true } }, methods: { backValue (left, top, zIndex) { this.$refs[zIndex][0].$el.style.top = `${top}px` this.$refs[zIndex][0].$el.style.left = `${left}px` } } } </script>
设置子组件的围栏范围
这个功能只需要在 onmousemove 事件中进行判断 子容器的 top 和 left 是否超出浏览器的可视范围
/* * 1. this.width 数据为父组件传递进来的 width 值,或者子组件本身设置的默认值 * 2. this.height 数据为父组件传递进来的 height 值,或者子组件本身设置的默认值 */ move (e) { // 判断 flag 是否允许移动 if (!this.moveFlag) return // 判断是否超出左边视图 if (this.$refs.fatherBox.offsetLeft < this.width / 2) { // 禁止弹框移动 this.moveFlag = false // 设置弹框左边位置 this.left = this.width / 2 + 10 // 调用回调函数把偏移量暴露给父组件 this.backValue(this.left, this.top, this.zIndex) return } // 判断是否超出右边视图 if (this.$refs.fatherBox.offsetLeft > document.body.clientWidth - this.width / 2) { // 禁止弹框移动 this.moveFlag = false // 设置弹框右边位置 this.left = document.body.clientWidth - this.width / 2 - 10 // 调用回调函数把偏移量暴露给父组件 this.backValue(this.left, this.top, this.zIndex) return } // 判断是否超出顶部视图 if (this.$refs.fatherBox.offsetTop < this.height / 2 + 70) { // 禁止弹框移动 this.moveFlag = false // 设置弹框顶部位置 this.top = this.height / 2 + 70 + 10 // 调用回调函数把偏移量暴露给父组件 this.backValue(this.left, this.top, this.zIndex) return } // 判断是否超出底部视图 if (this.$refs.fatherBox.offsetTop > document.body.clientHeight - this.height / 2 - 50) { // 禁止弹框移动 this.moveFlag = false // 设置弹框底部位置 this.top = document.body.clientHeight - this.height / 2 - 50 - 10 // 调用回调函数把偏移量暴露给父组件 this.backValue(this.left, this.top, this.zIndex) return } // 设置弹框左边位置 this.left = e.clientX - this.startLeft // 设置弹框右边位置 this.top = e.clientY - this.startTop // 调用回调函数把偏移量暴露给父组件 this.backValue(this.left, this.top, this.zIndex) }
子组件还要设置一个当鼠标超出子容器时的 onmouseout 事件,用来防止不可预期的 bug 问题
mouseOut (e) { this.moveFlag = false }
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
P70系列延期,华为新旗舰将在下月发布
3月20日消息,近期博主@数码闲聊站 透露,原定三月份发布的华为新旗舰P70系列延期发布,预计4月份上市。
而博主@定焦数码 爆料,华为的P70系列在定位上已经超过了Mate60,成为了重要的旗舰系列之一。它肩负着重返影像领域顶尖的使命。那么这次P70会带来哪些令人惊艳的创新呢?
根据目前爆料的消息来看,华为P70系列将推出三个版本,其中P70和P70 Pro采用了三角形的摄像头模组设计,而P70 Art则采用了与上一代P60 Art相似的不规则形状设计。这样的外观是否好看见仁见智,但辨识度绝对拉满。
更新日志
- 群星.1992-电视金曲巡礼VOL.2【EMI百代】【WAV+CUE】
- 廖昌永《情缘HQ》头版限量[低速原抓WAV+CUE]
- 蔡琴《老歌》头版限量编号MQA-24K金碟[低速原抓WAV+CUE]
- 李嘉《国语转调》3CD[WAV+CUE]
- 谭咏麟《爱的根源 MQA-UHQCD》2022头版限量编号 [WAV+CUE][1G]
- 江洋 《江洋原创琵琶作品专辑》[320K/MP3][118.08MB]
- 江洋 《江洋原创琵琶作品专辑》[FLAC/分轨][228.33MB]
- 《战舰世界》语音包文件夹位置介绍
- 《CSGO》送好友皮肤方法介绍
- 《山羊模拟器重制版》发售平台说明
- 刘德华2002-美丽的一天[香港首批大包装首版][WAV]
- 刘文正《金装刘文正不朽经典金曲》2CD(1995环星)][WAV+CUE]
- 周慧敏《94美的化身演唱会》宝丽金1995港版2CD[WAV+CUE]
- 娃娃.1997-精选180绝版冠军精丫滚石】【WAV+CUE】
- 娃娃.1997-精选290巅峰情歌经典【滚石】【WAV+CUE】