当前位置: 首页 > news >正文

哪个网站推广产品好长沙模板网站建设

哪个网站推广产品好,长沙模板网站建设,公司调查公司,外包公司离职一定要一个月吗大家好,我是前端西瓜哥。在图形编辑器中,想象这么一个场景,我们撤销了一些重要的操作,然后想选中一个图形,看看它的属性。你点了上去,然后你发现你再也无法重做了。 你以为你点了一下,但其实你…

大家好,我是前端西瓜哥。在图形编辑器中,想象这么一个场景,我们撤销了一些重要的操作,然后想选中一个图形,看看它的属性。你点了上去,然后你发现你再也无法重做了。

你以为你点了一下,但其实你点击的时候,鼠标还是小小移动了一点,飘了一个像素点。对编辑器来说,它识别到让图形移动一个像素点的操作,就生成了一个新的版本,然后重做栈(redoStack)被清空了,你退回前的操作就没了。

为了解决这类用户微小操作的问题,我们可以巧妙地给拖拽行为加一个 阻塞阈值。具体就是就是按下鼠标后,移动鼠标的距离要大于某个值,我们才认为发生了拖拽,并执行对应工具的逻辑。

下面为我们要实现的效果。此处为了更好地演示效果,将阈值设置得很大。通常设置个 4px 就够了。

可以看到,按下鼠标然后移动,如果移动的位移太小,矩形是不会被移动的,直到达到一定位移阈值后,矩形才会乖乖听话跟随鼠标进行移动

阈值表示位移距离,使用的是视口坐标系,而不是场景坐标系。

代码改造

原来的逻辑:

let isPressing = false;
let currentTool = null; // 当前工具对象// 鼠标按下
function handleDown(e) {isPressing = true;currentTool.start(e);
}// 鼠标移动
function handleMove(e) {if (isPressing) {currentTool.drag(e);} else {// 非拖拽的移动事件// 比如选择工具停留在图形上,图形要高亮,此时没发生拖拽currentTool.move(e);}
}// 鼠标释放
function handleUp(e) {currentTool.end(e);isPressing = false;
}

鼠标按下时,isPressing 设置为 true,表示发生了鼠标按下事件。

此时鼠标再移动,我们就能知道这是一个 “拖拽” 的行为,即按下鼠标不放然后移动鼠标的行为。此时调用工具对象的 drag 方法。

最后鼠标释放,将状态 isPressing 重置。

现在我们进行改造。

let isPressing = false;
let currentTool = null; // 当前工具对象let isEnableDragging = false; // 是否调用工具对象的 drag 方法
let startPos = null; // 保存鼠标按下时的坐标
const blockStep = 4; // 阈值function handleDown(e) {isPressing = true;isEnableDragging = false;startPos = { x: e.clientX, y: e.clientY };currentTool.start(e);
}function handleMove(e) {// 判断位移是否突破阈值,是的话更新状态为 “可拖拽”if (!isEnableDragging &&(Math.abs(e.clientX - startPos.x) > blockStep ||Math.abs(e.clientX - startPos.x) > blockStep)) {isEnableDragging = true;}if (isPressing) {if (isEnableDragging) {// “可拖拽” 状态,调用工具的 drag 方法currentTool.drag(e);}} else {currentTool.move(e);}
}function handleUp(e) {currentTool.end(e);// 初始化状态isPressing = false;isEnableDragging = false;startPos = null;
}

核心思路是引入 isEnableDragging 状态,表示鼠标移动时,是否达到移动的条件。

我们在鼠标移动事件中,计算鼠标按下和鼠标移动之间的距离是否超过某个值,如果超过阈值,就将 isEnableDragging 状态转换为 true。

然后判断 isEnableDragging 为 true,就调用工具对象的 drag 方法。

需要注意的是,不要只用位移距离来判断是否可以拖拽,要配合状态。否则突破阈值后,又移动回来,你会发现你又卡住了,因为此时阈值因为再次计算,没能达到阈值。

所以加了个 isEnableDragging 状态,在第一次突破阈值设置为 true 后,就再也不用计算位移了,之后一直都是可拖拽状态,直到鼠标释放重置状态。

结尾

拖拽阻塞是开发图形编辑器的一点小细节,并不复杂,但能带来很好的用户体验。

我是前端西瓜哥,欢迎关注我,学习更多前端知识。

http://www.yayakq.cn/news/506618/

相关文章:

  • 岳阳做公司网站网站开发 实训 报告
  • 只做衬衣网站怎么关键词优化网站
  • 怎样给网站做流量2021年9月重大新闻
  • 个人备案网站能做商城吗表白网页生成器手机版
  • 集团网站建设调研报告成都口碑最好的家装公司
  • 上海网站备案信息微信商城网站开发
  • 珠海特价做网站哈尔滨企业建站网站开发
  • 门户网站需求济南学网站建设哪里好
  • 个人做地方民生网站电销外包怎么收费
  • asp.net怎么做网站北京计算机培训学校
  • 网站建设分金手指排名二六特殊字体
  • 怎么做淘宝网站赚钱网页游戏吃显卡还是cpu
  • 自适应模板网站电脑和手机都能浏览的网站开发
  • 实搜石家庄网站建设小程序无锡网站建设上海韵茵
  • 莱山网站建设海口网站制作案例
  • 买了域名就可以做网站批量上传网站产品
  • 重庆企业网站推广费用网站建设推广保举火13星
  • 网站建设课程实训报告国内网站排名
  • 江西网站做的好的企业文化wordpress发布文章
  • 石家庄网站设计工作室做外汇看哪个网站
  • 天津网站搭建在网站图片源代码alt写入关键词后为什么不显示只显示title内容
  • 微商城网站建设什么是网络营销促销?网络营销促销有何作用?
  • 做自媒体关注的网站app设计理念怎么写
  • 如何 网站优化做前端开发需要学什么
  • 建设网站需要从哪方面考虑网站页面如何设计图
  • 甘肃省建设局网站首页网站设计 评价 方法
  • 苏州园区手机网站制作黄骅招聘信息最新2022
  • 电脑网站建设策划书用自己的电脑做网站需要备案吗
  • 网站建设与用户需求分析商务网站推广目标有哪些
  • 旅游网站排名前5位的网店运营推广高级实训攻略