前端——框选技术的实现

本文涉及的产品
文档翻译,文档翻译 1千页
语种识别,语种识别 100万字符
图片翻译,图片翻译 100张
简介: 前端——框选技术的实现
var selList = [];
window.onload = function() {
    //定义鼠标框选的区域
  var canvas = document.getElementById('teminal-area');
  var selDiv;
  var isSelect = false;
  var evt;
    //鼠标点击时候的坐标
  var startX;
  var startY;
    //鼠标移动时的坐标
  var _x = null;
  var _y = null;
    //区域内按下鼠标
  canvas.onmousedown = function(e) {
    evt = window.event || arguments[0];
    var parents = $(e.target).parents();
    var flag = true;
        //需要加上横滚动条与最左边的距离
    startX = (evt.clientX + $(document).scrollLeft() || evt.x);
        //设置范围
    var minOffset = $("#teminal-area").width() + 200 - 20;
        //如果在范围之外,设置flag为false
    if (startX > minOffset) {
      flag = false;
    }
    if (flag) {
            //所有需要被选择的图标
      var fileNodes = document.getElementsByClassName("device-content");
      selList = [];
      for (var i = 0; i < fileNodes.length; i++) {
        if (fileNodes[i].className.indexOf("device-content") != -1) {
          if (fileNodes[i].className.indexOf("seled") != -1) {
            var len = fileNodes[i].className.length;
            fileNodes[i].className = fileNodes[i].className
                .substring(0, len - 6);
          }
          $(fileNodes[i]).find("span").removeClass("selected-mt");
          selList.push(fileNodes[i]);
        }
      }
      // 左击
      if (e.button == 0) {
        isSelect = true;
        startX = (evt.clientX + $(document).scrollLeft() || evt.x);
        startY = (evt.clientY + $(document).scrollTop() || evt.y);
                //虚线框
        selDiv = document.createElement("div");
        selDiv.style.cssText = "position:absolute;width:0px;height:0px;font-size:0px;margin:0px;padding:0px;border:1px dashed #0099FF;background-color:#C3D5ED;z-index:1000;filter:alpha(opacity:60);opacity:0.6;display:none;";
        selDiv.id = "selectDiv";
        document.body.appendChild(selDiv);
        selDiv.style.left = startX + "px";
        selDiv.style.top = startY + "px";
      } else if (e.button == 2) {
        // 右击
        $(
            $(this).siblings().children(".device-content")
                .children("span")).removeClass("selected-mt");
      }
    }
  }
  clearEventBubble(evt);
    //区域内移动鼠标
  canvas.onmousemove = function(e) {
    evt = window.event || arguments[0];
    clearEventBubble(evt);
    if (isSelect) {
      if (selDiv.style.display == "none") {
        selDiv.style.display = "";
      }
            //鼠标当前所在的x、y坐标,分别加上滚动条距离最左边与顶端的距离
      _x = (evt.clientX + $(document).scrollLeft() || evt.x);
      _y = (evt.clientY + $(document).scrollTop() || evt.y);
            //框选区域,一个框有4个点,总是选取左上角的点
      selDiv.style.left = Math.min(_x, startX) + "px";
      selDiv.style.top = Math.min(_y, startY) + "px";
      selDiv.style.width = Math.abs(_x - startX) + "px";
      selDiv.style.height = Math.abs(_y - startY) + "px";
      // ---------------- 关键算法 ---------------------
      var teminalTop = $("#teminal-area").scrollTop();
      var _l = selDiv.offsetLeft - 200, _t = selDiv.offsetTop - 135
          + teminalTop;
      var _w = selDiv.offsetWidth, _h = selDiv.offsetHeight;
      for (var i = 0; i < selList.length; i++) {
        var sl = selList[i].offsetWidth + selList[i].offsetLeft;
        var st = selList[i].offsetHeight + selList[i].offsetTop;
        if (sl > _l && st > _t && selList[i].offsetLeft < _l + _w
            && selList[i].offsetTop < _t + _h) {
          if (selList[i].className.indexOf("seled") == -1) {
            selList[i].className = selList[i].className + " seled";
            $(selList[i]).find("span").addClass("selected-mt");
          }
        } else {
          if (selList[i].className.indexOf("seled") != -1) {
            var len = selList[i].className.length;
            selList[i].className = selList[i].className.substring(
                0, len - 6);
            $(selList[i]).find("span").removeClass("selected-mt");
          }
        }
      }
    }
    clearEventBubble(evt);
  }
    //页面内松开鼠标(这个需要用document,而不是canvas,因为鼠标松开的时候也可能不在区域内)
  document.onmouseup = function(e) {
    isSelect = false;
    if (selDiv) {
      document.body.removeChild(selDiv);
    }
    _x = null, _y = null, selDiv = null, startX = null, startY = null,
        evt = null;
    canvas.onmousewheel = function(){
      return true;
    }
  }
};
//清除事件
function clearEventBubble(evt) {
  var evt = window.event || arguments[0];
  if (evt.stopPropagation != null && evt.stopPropagation != undefined)
    evt.stopPropagation();
  else
    evt.cancelBubble = true;
  if (evt.preventDefault)
    evt.preventDefault();
  else
    evt.returnValue = false;
}
相关文章
|
3月前
|
前端开发 JavaScript 测试技术
前端测试技术中,如何提高集成测试的效率?
前端测试技术中,如何提高集成测试的效率?
|
3月前
|
Cloud Native 前端开发 JavaScript
前端开发者必看:不懂云原生你就OUT了!揭秘如何用云原生技术提升项目部署与全栈能力
【10月更文挑战第23天】随着云计算的发展,云原生逐渐成为技术热点。前端开发者了解云原生有助于提升部署与运维效率、实现微服务化、掌握全栈开发能力和利用丰富技术生态。本文通过示例代码介绍云原生在前端项目中的应用,帮助开发者更好地理解其重要性。
134 0
|
3月前
|
前端开发 JavaScript API
惊呆了!这些前端技术竟然能让你的网站实现无缝滚动效果!
【10月更文挑战第30天】本文介绍了几种实现网页无缝滚动的技术,包括CSS3的`scroll-snap`属性、JavaScript的Intersection Observer API以及现代前端框架如React和Vue的动画库。通过示例代码展示了如何使用这些技术,帮助开发者轻松实现流畅的滚动效果,提升用户体验。
336 29
|
3月前
|
前端开发 JavaScript 搜索推荐
HTML与CSS在Web组件化中的核心作用及前端技术趋势
本文探讨了HTML与CSS在Web组件化中的核心作用及前端技术趋势。从结构定义、语义化到样式封装与布局控制,两者不仅提升了代码复用率和可维护性,还通过响应式设计、动态样式等技术增强了用户体验。面对兼容性、代码复杂度等挑战,文章提出了相应的解决策略,强调了持续创新的重要性,旨在构建高效、灵活的Web应用。
71 6
|
3月前
|
前端开发 JavaScript 搜索推荐
前端懒加载:提升页面性能的关键技术
前端懒加载是一种优化网页加载速度的技术,通过延迟加载非首屏内容,减少初始加载时间,提高用户访问体验和页面性能。
|
3月前
|
缓存 JavaScript 前端开发
JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用
本文深入讲解了 JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用。
93 5
|
3月前
|
移动开发 前端开发 JavaScript
惊!这些前端技术竟然能让你的网站在移动端大放异彩!
随着互联网技术的发展,移动设备成为主要的上网工具。本文介绍了几种关键的前端技术,包括响应式设计、图片优化、字体选择、HTML5和CSS3的应用、性能优化及手势操作设计,帮助开发者提升网站在移动端的显示效果和用户体验。示例代码展示了如何实现简单的双向绑定功能。
64 3
|
3月前
|
数据采集 前端开发 安全
前端测试技术
前端测试是确保前端应用程序质量和性能的重要环节,涵盖了多种技术和方法
|
3月前
|
编解码 前端开发 JavaScript
前端界的黑科技:掌握这些技术,让你的网站秒变未来感十足!
【10月更文挑战第31天】前端技术日新月异,黑科技层出不穷,让网页更加美观、交互更加丰富。本文通过响应式布局与媒体查询、前端框架与组件化开发等案例,展示这些技术如何让网站充满未来感。响应式布局使网站适应不同设备,前端框架如React、Vue则提高开发效率和代码质量。
79 3
|
3月前
|
JSON 前端开发 搜索推荐
惊!这些前端技术竟然能让你的网站实现个性化推荐功能!
【10月更文挑战第30天】随着互联网技术的发展,个性化推荐已成为提升用户体验的重要手段。前端技术如JavaScript通过捕获用户行为数据、实时更新推荐结果等方式,在实现个性化推荐中扮演关键角色。本文将深入解析这些技术,并通过示例代码展示其实际应用。
144 4

热门文章

最新文章

  • 1
    【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 2
    【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 3
    详解智能编码在前端研发的创新应用
  • 4
    智能编码在前端研发的创新应用
  • 5
    VSCode AI提效工具,通义灵码前端开发体验
  • 6
    大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡
  • 7
    【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 8
    以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
  • 9
    【01】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-优雅草卓伊凡拟开发一个一站式家政服务平台-前期筹备-暂定取名斑马家政软件系统-本项目前端开源-服务端采用优雅草蜻蜓Z系统-搭配ruoyi框架admin后台-全过程实战项目分享-从零开发到上线
  • 10
    【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
  • 1
    前端起dev从110秒减少到7秒, 开发体验大幅提升
    16
  • 2
    无前端经验如何快速搭建游戏站:使用 windsurf 从零到上线的详细指南
    32
  • 3
    【01】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-优雅草卓伊凡拟开发一个一站式家政服务平台-前期筹备-暂定取名斑马家政软件系统-本项目前端开源-服务端采用优雅草蜻蜓Z系统-搭配ruoyi框架admin后台-全过程实战项目分享-从零开发到上线
    38
  • 4
    VSCode AI提效工具,通义灵码前端开发体验
    94
  • 5
    开箱即用的GO后台管理系统 Kratos Admin - 前端权限
    12
  • 6
    以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
    46
  • 7
    大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡
    84
  • 8
    【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
    34
  • 9
    【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    159
  • 10
    详解智能编码在前端研发的创新应用
    122