资讯专栏INFORMATION COLUMN

鼠标 控制 盒子大小 、位置(八角控制流)

Caicloud / 2958人阅读

摘要:此时可以想到目标都有同样的效果,因此我实现了一个类,来减少代码量。


看见项目里用了一个裁图插件,看一了这么一个效果,故此模拟一下
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...

    lastSeries 评论0 收藏0
  • CSS的使用方法

    摘要:如内可以包含块级元素与块级元素并列内联元素与内联元素并列。错误的属性选择器匹配所有具有属性的元素,不考虑它的值。一、CSS的四种引入方式1.行内式  行内式是在标记的style属性中设定CSS样式。这种方式没有体现出CSS的优势,不推荐使用(与链接式或者导入式同时控制同一标签时,行内式优先显示)。2.嵌入式  嵌入式是将CSS样式集中写在网页的标签对的标签对中。格式如下:        注意...

    番茄西红柿 评论0 收藏0
  • 前端基础入门二(CSS)

    摘要:输入的时候少按一个键浏览器兼容问题比如使用的选择器命名,在是无效的能良好区分变量命名变量命名是用不要纯数字中文等命名,尽量使用英文字母来表示。选择器和类选择器最大的不同在于使用次数上。当需要设置英文字体时,英文字体名必须位于中文字体名之前。 回顾上一节HTML 思维导图 showImg(https://segmentfault.com/img/bVbno3O?w=1378&h=1178...

    Lorry_Lu 评论0 收藏0
  • CSS

    摘要:如内可以包含块级元素与块级元素并列内联元素与内联元素并列。相对定位是相对于该元素在文档流中的原始位置,即以自己原始位置为参照物。另外,对象脱离正常文档流,使用,,,等属性进行绝对定位。1、CSS概述CSS是 Coscoding Style Sheets 的简称,中文称为层叠样式表,用来控制网页数据的表现,可以使网页的表现与数据内容分离。2、CSS的四种引入方式2.1 行内式 --> 行...

    番茄西红柿 评论0 收藏0
  • CSS基础知识整理

    摘要:语法基础语法规则由两个主要部分构成选择器以及一条或多条声明。语法名属性属性值属性属性值属性属性值选择器选择器用于描述一组元素的样式,也叫做类选择器。后代选则器又称为包含选择器,以空格分隔,子元素选择器只能选择作为某元素子元素的元素。 1 什么是CSS? CSS通常称为CSS样式表或层叠样式表(级联样式表),主要用于设置HTML页面中的文本内容(字体、大小、对齐方式等)、图片的外形(宽高...

    Edison 评论0 收藏0

发表评论

0条评论

Caicloud

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<