摘要:此时可以想到目标都有同样的效果,因此我实现了一个类,来减少代码量。
看见项目里用了一个裁图插件,看一了这么一个效果,故此模拟一下
github L6zt
项目地址:
https://github.com/L6zt/captu...
step 1: npm install && npm run dev
step 2 浏览器访问 http://localhost:7001/
实现效果:
/代码思路/
1.页面的坐标系是以左上角 为(0,0)点,
2.依鼠标拖动的坐标位置,和 刚开始 坐标位置进行 比较, 算出 差值即是当前 拖动距离,依靠这个距离控制 元素的 大小 或 位置。
3.该效果有 9个控制点,被控制的元素 + 8 个圆形蓝色控制点。 都是利用上面的原理,来做。此时可以想到 9 目标 都有 同样的效果,因此我实现了一个 CaptureMouse类, 来减少代码量。
具体代码结构:
mian.js 实现 CaptureMouse;
具体部分代码介绍
/* * * * * */ /* * 事件列表 mousedown mouseup mousemove touchstart touchmove touchend * */ import {on, off, once} from "./utils/dom"; import {checkIsPc} from "./utils/browser"; import JcEvent from "./common/event"; const global = window; const doc = global.document; const body = doc.body; /* * _x _y 初始坐标 * _dx _dy 坐标增量 * * */ class CaptureMouse{ constructor (elem, options) { this.elem = elem; this._isPc = this.checkInPc(); this._defaultOptions = {}; this.options = Object.assign({}, this._defaultOptions, options || {}); this._x = 0; this._y = 0; this._mvX = 0; this._mvY = 0; this._dx = 0; this._dy = 0; // 生成事件 trigger on 事件流 this.actionEvent = new JcEvent(); this.captureMouseStart = this.captureMouseStart.bind(this); this.captureMouseMove = this.captureMouseMove.bind(this); this.captureMouseEnd = this.captureMouseEnd.bind(this); this.findMouseLc = this.findMouseLc.bind(this); this.init(); } checkInPc () { const {isPc} = checkIsPc(); return isPc } // 输出参数转换 findMouseLc (e) { const {pageX, pageY} = e; const {_x, _y} = this; const dx = pageX - _x; const dy = pageY - _y; this._dx = dx; this._dy = dy; this._mvX = pageX; this._mvY = pageY; const playLoad = { dx, dy, mvX: pageX, mvY: pageY, x: this._x, y: this._y }; return playLoad } //鼠标按下事件 captureMouseStart (e) { const {captureMouseMove, captureMouseEnd} = this; const elem = body; const {pageX, pageY} = e; this._x = this._mvX = pageX; this._y = this._mvY= pageY; e.stopPropagation(); // 绑定鼠标移动事件 on({ elem, type: "mousemove", fn: captureMouseMove }); // 绑定鼠标左键抬起事件 on({ elem, type: "mouseup", fn: captureMouseEnd }); } captureMouseMove (e) { const playLoad = this.findMouseLc(e); e.preventDefault(); e.stopPropagation(); this.actionEvent.trigger({ type: "state:change", playLoad }) } //操作结束 captureMouseEnd (e) { const {captureMouseMove, captureMouseEnd} = this; const playLoad = this.findMouseLc(e); const elem = body; // e.stopPropagation(); // 销毁 绑定的 鼠标移动事件 off({ elem, type: "mousemove", fn: captureMouseMove }); // 销毁 绑定的 鼠标抬起事件 off({ elem, type: "mouseup", fn: captureMouseEnd }); this.actionEvent.trigger({ type: "state:end", playLoad }) } //外面函数捕捉 鼠标 事件活动 结束 captureStateEnd(fn) { const self = this; this.actionEvent.on({ type: "state:end", fn: fn.bind(self) }) } //外面函数 捕捉 鼠标 变化信息 captureStateChange(fn) { const self = this; this.actionEvent.on({ type: "state:change", fn: fn.bind(self) }) } // 写法有误 offCaptureStateChange (fn) { const self = this; this.actionEvent.off({ type: "state:change", fn: fn.bind(self) }) } init () { const {_isPc, elem, captureMouseStart} = this; if (_isPc) { on({ elem, type: "mousedown", fn: captureMouseStart }) } else { } } destroy () { const {_isPc, captureMouseStart, elem} = this; if (_isPc) { off({ elem, type: "mouseup", fn: captureMouseStart }) } } }; export default CaptureMouse
// index.js 初始化 整个效果的主文件
import "./css/main.scss" import CaptureMouse from "./main"; import {getElement, sgElemCss, createdElem} from "./utils/dom"; const global = window; const doc = global.document; // 生成控制点 const insertControlDot = (fartherNone) => { const childNodeList = [ { tag: "span", classNames: "control-content-lc jc-capture-lt" }, { tag: "span", classNames: "control-content-lc jc-capture-lm" }, { tag: "span", classNames: "control-content-lc jc-capture-rt" }, { tag: "span", classNames: "control-content-lc jc-capture-rm" }, { tag: "span", classNames: "control-content-lc jc-capture-lb" }, { tag: "span", classNames: "control-content-lc jc-capture-rb" }, { tag: "span", classNames: "control-content-lc jc-capture-bm" }, { tag: "span", classNames: "control-content-lc jc-capture-tm" } ]; const xmlRoot = doc.createDocumentFragment(); childNodeList.forEach(nodeDesc => { xmlRoot.appendChild(createdElem(nodeDesc)) }); fartherNone.appendChild(xmlRoot); }; // 初始化绑定事件 const init= () => { const controlView = getElement(".mouse-handle-view"); insertControlDot(controlView); const rbElem = getElement(".jc-capture-rb"); const tmElem = getElement(".jc-capture-bm"); const bmElem = getElement(".jc-capture-tm"); const lmElem = getElement(".jc-capture-lm"); const rmElem = getElement(".jc-capture-rm"); const rtElem = getElement(".jc-capture-rt"); const ltElem = getElement(".jc-capture-lt"); const lbElem = getElement(".jc-capture-lb"); const captureControlView = new CaptureMouse(controlView); let left = sgElemCss(controlView, "left"); let top = sgElemCss(controlView, "top"); let width = sgElemCss(controlView, "width"); let height = sgElemCss(controlView, "height"); const initCaptureRb = () => { const captureRbElem = new CaptureMouse(rbElem); captureRbElem.captureStateChange(function (playLoad) { const {dx, dy} = playLoad; let curWidth = width + dx; let curHeight = height + dy; if (curWidth < 24) curWidth = 24; if (curHeight < 24) curHeight = 24; sgElemCss(controlView, { width: `${curWidth}px`, height: `${curHeight}px` }); }); captureRbElem.captureStateEnd(function () { const {_dx, _dy} = this; width = width + _dx; height = height + _dy; if (width < 24) width = 24; if (height < 24) height = 24; sgElemCss(controlView, { width: `${width}px`, height: `${height}px` }) }); }; const intCaptureMainTree = () => { const captureRbElem = new CaptureMouse(rbElem); captureControlView.captureStateChange(function (playLoad) { const {dx, dy} = playLoad; let curLeft = left + dx; let curTop = top + dy; sgElemCss(controlView, { left: `${curLeft}px`, top: `${curTop}px` }) }); captureControlView.captureStateEnd(function (playLoad) { const {_dx, _dy} = this; left = left + _dx; top = top + _dy; console.log("end", left, top); sgElemCss(controlView, { left: `${left}px`, top: `${top}px` }) }) }; const initCaptureTm = () => { const captureTmElem = new CaptureMouse(tmElem); captureTmElem.captureStateChange(function (playLoad) { const {dx, dy} = playLoad; let curHeight = height - dy; let curTop = top + dy; if (curHeight < 24) curHeight = 24; sgElemCss(controlView, { height: `${curHeight}px`, top: `${curTop}px` }); }); captureTmElem.captureStateEnd(function () { const {_dx, _dy} = this; height = height - _dy; top = top + _dy; if (height < 24) height = 24; sgElemCss(controlView, { height: `${height}px`, top: `${top}px` }) }); }; const initCaptureBm = () => { const captureBmElem = new CaptureMouse(bmElem); captureBmElem.captureStateChange(function (playLoad) { const {dx, dy} = playLoad; let curHeight = height + dy; if (curHeight < 24) curHeight = 24; sgElemCss(controlView, { height: `${curHeight}px` }); }); captureBmElem.captureStateEnd(function () { const {_dx, _dy} = this; height = height + _dy; if (width < 24) width = 24; if (height < 24) height = 24; sgElemCss(controlView, { height: `${height}px` }) }); }; const initCaptureRm = () => { const captureRmElem = new CaptureMouse(rmElem); captureRmElem.captureStateChange(function (playLoad) { const {dx, dy} = playLoad; let curWidth = width + dx; if (curWidth < 24) curWidth = 24; sgElemCss(controlView, { width: `${curWidth}px` }); }); captureRmElem.captureStateEnd(function () { const {_dx, _dy} = this; width = width + _dx; if (width < 24) width = 24; sgElemCss(controlView, { width: `${width}px` }) }); }; const initCaptureLm = () => { const captureLmElem = new CaptureMouse(lmElem); captureLmElem.captureStateChange(function (playLoad) { const {dx, dy} = playLoad; let curWidth = width - dx; let curLeft = left + dx; if (curWidth < 24) curWidth = 24; sgElemCss(controlView, { width: `${curWidth}px`, left: `${curLeft}px` }); }); captureLmElem.captureStateEnd(function () { const {_dx, _dy} = this; width = width - _dx; left = left + _dx; if (width < 24) width = 24; sgElemCss(controlView, { width: `${width}px`, left: `${left}px` }) }); }; const initCaptureRt = () => { const captureLmElem = new CaptureMouse(rtElem); captureLmElem.captureStateChange(function (playLoad) { const {dx, dy} = playLoad; let curWidth = width + dx; let curHeight = height - dy; let curTop = top + dy; if (curWidth < 24) curWidth = 24; if (curHeight < 24) curHeight = 24; sgElemCss(controlView, { width: `${curWidth}px`, height: `${curHeight}px`, top: `${curTop}px` }); }); captureLmElem.captureStateEnd(function () { const {_dx, _dy} = this; width = width + _dx; height = height - _dy; top = top + _dy; if (width < 24) width = 24; if (height < 24) height = 24; sgElemCss(controlView, { width: `${width}px`, height: `${height}px`, top: `${top}px` }) }); }; const initCaptureLb = () => { const captureLbElem = new CaptureMouse(lbElem); captureLbElem.captureStateChange(function (playLoad) { const {dx, dy} = playLoad; let curWidth = width - dx; let curHeight = height + dy; if (curWidth < 24) curWidth = 24; if (curHeight < 24) curHeight = 24; sgElemCss(controlView, { width: `${curWidth}px`, height: `${curHeight}px`, }); }); captureLbElem.captureStateEnd(function () { const {_dx, _dy} = this; width = width - _dx; height = height + _dy; if (width < 24) width = 24; if (height < 24) height = 24; sgElemCss(controlView, { width: `${width}px`, height: `${height}px`, }) }); }; const initCaptureLt = () => { const captureLtElem = new CaptureMouse(ltElem); captureLtElem.captureStateChange(function (playLoad) { const {dx, dy} = playLoad; let curWidth = width - dx; let curHeight = height - dy; let curTop = top + dy; let curLeft = left + dx; if (curWidth < 24) curWidth = 24; if (curHeight < 24) curHeight = 24; sgElemCss(controlView, { width: `${curWidth}px`, height: `${curHeight}px`, top: `${curTop}px`, left: `${curLeft}px` }); }); captureLtElem.captureStateEnd(function () { const {_dx, _dy} = this; width = width - _dx; height = height - _dy; top = top + _dy; left = left + _dx; if (width < 24) width = 24; if (height < 24) height = 24; sgElemCss(controlView, { width: `${width}px`, height: `${height}px`, top: `${top}px`, left: `${left}px` }) }); }; initCaptureRb(); initCaptureTm(); initCaptureBm(); initCaptureRm(); initCaptureLm(); initCaptureRt(); initCaptureLb(); initCaptureLt(); intCaptureMainTree(); } init();
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/53765.html
摘要:此时可以想到目标都有同样的效果,因此我实现了一个类,来减少代码量。 看见项目里用了一个裁图插件,看一了这么一个效果,故此模拟一下github L6zt项目地址:https://github.com/L6zt/captu...step 1: npm install && npm run devstep 2 浏览器访问 http://localhost:7001/实现效果:showImg...
摘要:输入的时候少按一个键浏览器兼容问题比如使用的选择器命名,在是无效的能良好区分变量命名变量命名是用不要纯数字中文等命名,尽量使用英文字母来表示。选择器和类选择器最大的不同在于使用次数上。当需要设置英文字体时,英文字体名必须位于中文字体名之前。 回顾上一节HTML 思维导图 showImg(https://segmentfault.com/img/bVbno3O?w=1378&h=1178...
阅读 3159·2021-11-22 09:34
阅读 2799·2021-09-22 15:28
阅读 820·2021-09-10 10:51
阅读 1856·2019-08-30 14:22
阅读 2276·2019-08-30 14:17
阅读 2736·2019-08-30 11:01
阅读 2297·2019-08-29 17:19
阅读 3660·2019-08-29 13:17