| | |
| | | // 使用说明:(需要移动的dom,触摸块dom,跟随改变map dom) |
| | | function myDomMove(dom, div, map) { |
| | | this.m = $(dom); |
| | | this.div = $(div); |
| | | this.mapId = $(map); |
| | | this.__xx = null; //鼠标实时位置 |
| | | this.__yy = null; |
| | | this.__sx = null; //鼠标开始位置 |
| | | this.__sy = null; |
| | | this.__dx = null; //dom位置 |
| | | this.__dy = null; |
| | | this.mapH = null; //地图高度 |
| | | this.__wy = null; //屏幕高度 |
| | | this.state = "up"; //dom状态默认up |
| | | class $moveWindow { |
| | | constructor(data) { |
| | | this.id = data.id; |
| | | this.start = 0; |
| | | this.end = 0; |
| | | this.domHeight = 0; |
| | | this.domMove = null; |
| | | this.openValue = false; |
| | | this.useHeight = data.minHeight; |
| | | this.maxHeight = data.maxHeight; |
| | | this.height = data.minHeight; |
| | | this.critical = data.critical; |
| | | this.openAnimation = data.openAnimation; |
| | | let that = this; |
| | | this.fn = |
| | | data.fn ? (function(res) { |
| | | // console.log("回调函数"); |
| | | data.fn(res); |
| | | that.changeHeight(res); |
| | | // if (res.state === true) { |
| | | // console.log(that.openValue, res.state) |
| | | // } else if (res.state === false) { |
| | | // console.log(that.openValue, res.state) |
| | | // } |
| | | }) : |
| | | (function(res) { |
| | | console.log("未设置回调函数"); |
| | | console.log(res); |
| | | }); |
| | | |
| | | this.getMosePosition = (x, y) => { //获取鼠标位置 |
| | | this.__sx = x; |
| | | this.__sy = y; |
| | | // console.log(this.__sy, '鼠标开始'); |
| | | |
| | | } |
| | | this.getDomPosition = () => { //获取dom位置 |
| | | this.__dx = this.m.offset().left; |
| | | this.__dy = this.m.offset().top; |
| | | this.__wy = document.documentElement.clientHeight; |
| | | // console.log(this.__dy, 'dom'); |
| | | } |
| | | this.getMapHeight = () => { //获取地图高度 |
| | | var that = this; |
| | | this.mapId.css("height", (index, value) => { |
| | | that.mapH = parseFloat(value); |
| | | }) |
| | | // console.log(that.mapH, 'map位置'); |
| | | } |
| | | this.changeDomPosition = (x, y, dy) => { //改变dom位置 |
| | | var that = this; |
| | | // this.mapId.css("height", (index, value) => {//改变地图高度 |
| | | // var h = this.mapH + y; |
| | | // console.log(h); |
| | | // return h ; |
| | | // }) |
| | | this.m.animate({ top: dy + "px" }, 10); |
| | | |
| | | } |
| | | |
| | | |
| | | //begin |
| | | this.followFinger = (map, state = 14) => { //(地图实例,dom状态判断是向上还是向下) |
| | | // console.log('开始跟随手指'); |
| | | var that = this; |
| | | if (state != 14) { |
| | | that.state = state; |
| | | // console.log(that.state); |
| | | } |
| | | that.getDomPosition(); //获取dom位置 |
| | | that.getMapHeight(); //获取地图高度 |
| | | var once = true; |
| | | that.div.on('touchmove', function(e) { //获取鼠标位置 |
| | | e = e || window.event; |
| | | that.__xx = e.touches[0].clientX; |
| | | that.__yy = e.touches[0].clientY; |
| | | if (once) { //获取第一次点击的位置 |
| | | once = false; |
| | | that.getMosePosition(that.__xx, that.__yy); |
| | | } |
| | | // console.log(that.__yy, '鼠标'); |
| | | var h = that.__yy - that.__sy //鼠标移动距离y |
| | | |
| | | if (that.state == 'down') { //两种模式 |
| | | // console.log(that.state); |
| | | if (h >= 0 && h + that.__dy <= that.__wy - 20) { |
| | | that.changeDomPosition(0, h, h + that.__dy); //改变位置 |
| | | // console.log(that.state,h + that.__dy,112); |
| | | } |
| | | } else if (that.state == 'up') { |
| | | if (h >= -that.__dy && h <= that.__wy - 20) { |
| | | that.changeDomPosition(0, h, h + that.__wy - 20); //改变位置 |
| | | // console.log(that.state,h + that.__wy - 20,112); |
| | | } |
| | | } |
| | | |
| | | }); |
| | | that.div.on('touchend', function() { //抬起重置 |
| | | once = true; //抬起重置鼠标点击位置 |
| | | var chous = null; |
| | | if (that.state == 'down') { //两种模式 |
| | | // var chous = Math.abs(that.__yy - that.__sy) < that.__wy / 4; |
| | | chous = (that.__sy - that.__yy) < 0; |
| | | } else if (that.state == 'up') { |
| | | // var chous = Math.abs(that.__yy - that.__sy) > that.__wy / 4; |
| | | chous = (that.__sy - that.__yy) < 0; |
| | | } |
| | | if (!chous) { |
| | | //改变dom位置 |
| | | that.changeDomPosition(0, 0, (parseFloat(that.__wy / 10) * 3.999)); |
| | | // that.getDomPosition();//抬起获取dom位置/持续停留使用 |
| | | that.state = 'down'; |
| | | $('#map').css("height", (index, value) => { //改变地图高度 |
| | | return '50%'; |
| | | }) |
| | | map.invalidateSize(true); //应用地图高度 |
| | | } else { |
| | | // that.changeDomPosition(0, 0, that.__wy - 50); //改变位置 |
| | | that.changeDomPosition(0, 0, that.__wy); //改变位置 |
| | | // that.getDomPosition();//抬起获取dom位置/持续停留使用 |
| | | that.state = 'up'; |
| | | $('#map').css("height", (index, value) => { //改变地图高度 |
| | | return '100%'; |
| | | }) |
| | | map.invalidateSize(true); //应用地图高度 |
| | | } |
| | | that.getMapHeight(); //抬起获取map高度 |
| | | }); |
| | | } |
| | | this.destruction = () => { //初始化销毁 |
| | | this.m = $(dom); |
| | | this.div = $(div); |
| | | this.mapId = $(map); |
| | | this.__xx = null; //鼠标实时位置 |
| | | this.__yy = null; |
| | | this.__sx = null; //鼠标开始位置 |
| | | this.__sy = null; |
| | | this.__dx = null; //dom位置 |
| | | this.__dy = null; |
| | | this.mapH = null; //地图高度 |
| | | this.__wy = null; //屏幕高度 |
| | | this.state = "up"; //dom状态默认up |
| | | this.div.off(); |
| | | } |
| | | this.ListenerTouchmove = function(window) { |
| | | let moseHeight = window.changedTouches[0].clientY; |
| | | // let windowHeight = document.body.clientHeight; //屏幕宽度 |
| | | let endOn = moseHeight; |
| | | // console.log(that.domHeight, that.start, endOn) |
| | | let cha = that.domHeight + (+that.start - +endOn); |
| | | if (cha >= that.maxHeight) { |
| | | cha = that.maxHeight; |
| | | } else if (cha <= that.useHeight) { |
| | | cha = that.useHeight; |
| | | } |
| | | let d = { |
| | | state: "on", |
| | | height: cha, |
| | | }; |
| | | that.fn(d); |
| | | }; |
| | | this.ListenerTouchstart = function(window) { |
| | | let moseHeight = window.changedTouches[0].clientY; |
| | | that.start = moseHeight; |
| | | // that.domHeight = document |
| | | // .getElementById(that.id) |
| | | // .style.cssText.split("px")[0] |
| | | // .split("height:")[1]; |
| | | that.domHeight = document |
| | | .getElementById(that.id) |
| | | .clientHeight; |
| | | }; |
| | | this.ListenerTouchend = function(window) { |
| | | let moseHeight = window.changedTouches[0].clientY; |
| | | that.end = moseHeight; |
| | | let cha, states; |
| | | if (that.end >= that.start) { |
| | | states = false; //方向 |
| | | cha = that.end - that.start; |
| | | } else { |
| | | states = true; //方向 |
| | | cha = that.start - that.end; |
| | | } |
| | | if (cha >= that.critical) { |
| | | //高 |
| | | that.opens(states, true); //程度 |
| | | } else if (cha < that.critical) { |
| | | //低 |
| | | that.opens(states, false); //程度 |
| | | } |
| | | }; |
| | | return this; |
| | | } |
| | | //启动监听事件 |
| | | init() { |
| | | // this.domMove = document.getElementById(this.id); |
| | | let that = this; |
| | | this.checkDom(that.id, (dom) => { |
| | | //检测是否有dom |
| | | that.domMove = dom; |
| | | if (that.openAnimation) { |
| | | that.domMove.style.transition = 'all 0.2s'; |
| | | } |
| | | that.domMove.addEventListener("touchmove", that.ListenerTouchmove); |
| | | // 结束位置靠滑动距离判断 |
| | | that.domMove.addEventListener("touchstart", that.ListenerTouchstart); |
| | | that.domMove.addEventListener("touchend", that.ListenerTouchend); |
| | | }); |
| | | } |
| | | //关闭监听事件 |
| | | closeInit() { |
| | | this.domMove = document.getElementById(this.id); |
| | | this.domMove.removeEventListener("touchmove", this.ListenerTouchmove); |
| | | // 结束位置靠滑动距离判断 |
| | | this.domMove.removeEventListener("touchstart", this.ListenerTouchstart); |
| | | this.domMove.removeEventListener("touchend", this.ListenerTouchend); |
| | | } |
| | | //输出事件 |
| | | opens(val, chengdu) { |
| | | if (chengdu) { |
| | | this.openValue = val; |
| | | if (val) { |
| | | this.height = this.maxHeight; |
| | | } else { |
| | | this.height = this.useHeight; |
| | | } |
| | | } else { |
| | | this.height = this.domHeight; |
| | | } |
| | | let d = { |
| | | state: this.openValue, |
| | | height: this.height, |
| | | }; |
| | | this.fn(d); |
| | | } |
| | | changeHeight(data) { |
| | | document |
| | | .getElementById(this.id).style.height = data.height + "px"; |
| | | } |
| | | checkDom(name, fn) { |
| | | // 声明定时器 |
| | | var timer = null; |
| | | // 检查dom是否执行完成 |
| | | function checkDom() { |
| | | // let dom = that.$refs[name]; |
| | | let dom = document.getElementById(name); |
| | | if (dom) { |
| | | // 执行dom加载完成后的操作 |
| | | // 清除定时器 |
| | | if (!timer) { |
| | | clearTimeout(timer); |
| | | } |
| | | if (fn) { |
| | | //回调函数 |
| | | fn(dom); |
| | | return; |
| | | } else { |
| | | return dom; |
| | | } |
| | | } else { |
| | | // 自我调用 |
| | | timer = setTimeout(checkDom, 100); |
| | | } |
| | | } |
| | | // 首次执行 |
| | | checkDom(); |
| | | } |
| | | // 结束位置是一半判断 |
| | | // domMove.addEventListener("touchend", function (window) { |
| | | // let moseHeight = window.changedTouches[0].clientY; |
| | | // let windowHeight = document.body.clientHeight; |
| | | // let cha = windowHeight - moseHeight; |
| | | // console.log(cha, "最后位置"); |
| | | // let centerPoint = |
| | | // (windowHeight / 2 - +that.useHeight) / 2 + +that.useHeight; |
| | | // if (cha >= centerPoint) { |
| | | // cha = windowHeight / 2; |
| | | // } else if (cha < centerPoint) { |
| | | // cha = that.useHeight; |
| | | // } |
| | | // that.height = cha; |
| | | // }); |
| | | } |
| | | |
| | | // export default myDomMove; |
| | | // export default moveWindow; |
| | | |
| | | // console.log(moveWindow) |