JS实现拖动元素分界改变元素大小
2018-04-04 01:32
896 查看
想在页面上实现拖动两个元素分界位置可以改变元素的大小,基本思路是:在两个元素之间增加一个分界元素,监听该元素的mousedown事件,事件触发时立刻设置监听页面mousemove事件以及mouseup事件,mousemove事件处理元素大小修改,mouseup事件触发时应该移除页面mousemove事件。其中主要是mousemove事件,其实就是计算鼠标在拖动过程中,鼠标相对屏幕的垂直距离(或者水平距离)的变化量,然后分界元素上下(或左右)的两个元素的高度(或宽度)跟随此变化量变化即可。
项目使用Vue.js开发,所以这里写成一个单页面组件的形式。
实现效果:
![](https://img-blog.csdn.net/20180404013027128?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTA0MTkzMzc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
代码:<template>
<div id="board">
<div class="card" id="node1">
区域1
</div>
<div id="dividing-line1"></div>
<div class="card" id="node2">
区域2
</div>
<div id="dividing-line2"></div>
<div class="card" id="node3">
区域3
</div>
</div>
</template>
<script>
export default {
methods: {
setMouseEventListen () {
let oLine1 = document.getElementById('dividing-line1')
let oLine2 = document.getElementById('dividing-line2')
oLine1.lastElementID = 'node1'
oLine1.nextElementID = 'node2'
oLine2.lastElementID = 'node2'
oLine2.nextElementID = 'node3'
oLine1.onmousedown = this.changeDivheight
oLine2.onmousedown = this.changeDivheight
},
changeDivheight (event) {
let oEventNode = event.srcElement
let last = oEventNode.lastElementID
let next = oEventNode.nextElementID
let oDivNode1 = document.getElementById(last)
let oDivNode2 = document.getElementById(next)
let oldY = event.clientY
let oBoard = document.getElementById('board')
let oldHeight1 = getComputedStyle(oDivNode1).getPropertyValue('height').split('px')[0] // 获取高度数值
let oldHeight2 = getComputedStyle(oDivNode2).getPropertyValue('height').split('px')[0]
oBoard.onmousemove = function (e) { // 鼠标移动事件,元素大小随之改变
let detaY = e.clientY - oldY
console.log('mousemove', Number(oldHeight1) + detaY)
oDivNode1.style.height = (Number(oldHeight1) + detaY) + 'px' // 这里注意 + px
4000
oDivNode2.style.height = (Number(oldHeight2) - detaY) + 'px'
}
document.onmouseup = function () { //onmouseup 要绑定到document 防止鼠标被移出但是事件未释放的异常
console.log('onmouseup')
oBoard.onmousemove = null
document.onmouseup = null
}
}
},
mounted () {
this.setMouseEventListen()
}
}
</script>
<style scoped>
#board {
margin: 0 auto;
height:300px;
width:360px;
display:flex;
flex-direction:column;
align-items: stretch
}
#dividing-line1, #dividing-line2 {
width:100%;
height:10px
}
#dividing-line1:hover, #dividing-line2:hover {
cursor:n-resize
}
.card {
flex: 1 1 auto;
padding: 10px;
overflow: scroll;
box-shadow: 0 0 5px gray;
border-radius: 2px;
text-align: center ;
font-size: 2rem
}
.card:hover {
box-shadow: 0 0 10px black
}
</style>
项目使用Vue.js开发,所以这里写成一个单页面组件的形式。
实现效果:
代码:<template>
<div id="board">
<div class="card" id="node1">
区域1
</div>
<div id="dividing-line1"></div>
<div class="card" id="node2">
区域2
</div>
<div id="dividing-line2"></div>
<div class="card" id="node3">
区域3
</div>
</div>
</template>
<script>
export default {
methods: {
setMouseEventListen () {
let oLine1 = document.getElementById('dividing-line1')
let oLine2 = document.getElementById('dividing-line2')
oLine1.lastElementID = 'node1'
oLine1.nextElementID = 'node2'
oLine2.lastElementID = 'node2'
oLine2.nextElementID = 'node3'
oLine1.onmousedown = this.changeDivheight
oLine2.onmousedown = this.changeDivheight
},
changeDivheight (event) {
let oEventNode = event.srcElement
let last = oEventNode.lastElementID
let next = oEventNode.nextElementID
let oDivNode1 = document.getElementById(last)
let oDivNode2 = document.getElementById(next)
let oldY = event.clientY
let oBoard = document.getElementById('board')
let oldHeight1 = getComputedStyle(oDivNode1).getPropertyValue('height').split('px')[0] // 获取高度数值
let oldHeight2 = getComputedStyle(oDivNode2).getPropertyValue('height').split('px')[0]
oBoard.onmousemove = function (e) { // 鼠标移动事件,元素大小随之改变
let detaY = e.clientY - oldY
console.log('mousemove', Number(oldHeight1) + detaY)
oDivNode1.style.height = (Number(oldHeight1) + detaY) + 'px' // 这里注意 + px
4000
oDivNode2.style.height = (Number(oldHeight2) - detaY) + 'px'
}
document.onmouseup = function () { //onmouseup 要绑定到document 防止鼠标被移出但是事件未释放的异常
console.log('onmouseup')
oBoard.onmousemove = null
document.onmouseup = null
}
}
},
mounted () {
this.setMouseEventListen()
}
}
</script>
<style scoped>
#board {
margin: 0 auto;
height:300px;
width:360px;
display:flex;
flex-direction:column;
align-items: stretch
}
#dividing-line1, #dividing-line2 {
width:100%;
height:10px
}
#dividing-line1:hover, #dividing-line2:hover {
cursor:n-resize
}
.card {
flex: 1 1 auto;
padding: 10px;
overflow: scroll;
box-shadow: 0 0 5px gray;
border-radius: 2px;
text-align: center ;
font-size: 2rem
}
.card:hover {
box-shadow: 0 0 10px black
}
</style>
相关文章推荐
- js拖拽之二:实现拖动元素上下左右改变元素大小
- JS 实现 ResizeBar,可拖动改变两个区域(带iframe)大小
- node-webkit无边框窗口用纯JS实现拖动改变大小
- JS实现左右拖动改变内容显示区域大小的方法
- node-webkit无边框窗口用纯JS实现拖动改变大小
- js通过八个点 拖动改变div大小的实现方法
- 鼠标拖动改变DIV等网页元素的大小的实现方法
- JS实现左右拖动改变内容显示区域大小的方法
- js通过八个点 拖动改变div大小的实现方法
- js通过八个点 拖动改变div大小的实现方法
- JS 实现 ResizeBar,可拖动改变两个区域(带iframe)大小
- JS实现拖动div改变大小
- node-webkit学习之【无边框窗口用JS实现拖动改变大小等】
- js通过八个点 拖动改变div大小的实现方法
- Js - 可拖动可改变大小div的实现代码
- js实现拖动改变层的大小(宽度)
- javascript实现鼠标拖动改变层大小的方法
- 无边框对话框拖动改变大小的实现总结
- JS实现元素拖动