前端——框选技术的实现

本文涉及的产品
文本翻译,文本翻译 100万字符
图片翻译,图片翻译 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;
}
相关文章
|
2月前
|
前端开发 JavaScript 测试技术
前端测试技术中,如何提高集成测试的效率?
前端测试技术中,如何提高集成测试的效率?
|
2月前
|
Cloud Native 前端开发 JavaScript
前端开发者必看:不懂云原生你就OUT了!揭秘如何用云原生技术提升项目部署与全栈能力
【10月更文挑战第23天】随着云计算的发展,云原生逐渐成为技术热点。前端开发者了解云原生有助于提升部署与运维效率、实现微服务化、掌握全栈开发能力和利用丰富技术生态。本文通过示例代码介绍云原生在前端项目中的应用,帮助开发者更好地理解其重要性。
107 0
|
2月前
|
前端开发 JavaScript API
惊呆了!这些前端技术竟然能让你的网站实现无缝滚动效果!
【10月更文挑战第30天】本文介绍了几种实现网页无缝滚动的技术,包括CSS3的`scroll-snap`属性、JavaScript的Intersection Observer API以及现代前端框架如React和Vue的动画库。通过示例代码展示了如何使用这些技术,帮助开发者轻松实现流畅的滚动效果,提升用户体验。
244 29
|
2月前
|
前端开发 JavaScript 搜索推荐
HTML与CSS在Web组件化中的核心作用及前端技术趋势
本文探讨了HTML与CSS在Web组件化中的核心作用及前端技术趋势。从结构定义、语义化到样式封装与布局控制,两者不仅提升了代码复用率和可维护性,还通过响应式设计、动态样式等技术增强了用户体验。面对兼容性、代码复杂度等挑战,文章提出了相应的解决策略,强调了持续创新的重要性,旨在构建高效、灵活的Web应用。
56 6
|
2月前
|
前端开发 JavaScript 搜索推荐
前端懒加载:提升页面性能的关键技术
前端懒加载是一种优化网页加载速度的技术,通过延迟加载非首屏内容,减少初始加载时间,提高用户访问体验和页面性能。
|
2月前
|
缓存 JavaScript 前端开发
JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用
本文深入讲解了 JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用。
73 5
|
2月前
|
移动开发 前端开发 JavaScript
惊!这些前端技术竟然能让你的网站在移动端大放异彩!
随着互联网技术的发展,移动设备成为主要的上网工具。本文介绍了几种关键的前端技术,包括响应式设计、图片优化、字体选择、HTML5和CSS3的应用、性能优化及手势操作设计,帮助开发者提升网站在移动端的显示效果和用户体验。示例代码展示了如何实现简单的双向绑定功能。
48 3
|
2月前
|
数据采集 前端开发 安全
前端测试技术
前端测试是确保前端应用程序质量和性能的重要环节,涵盖了多种技术和方法
|
2月前
|
编解码 前端开发 JavaScript
前端界的黑科技:掌握这些技术,让你的网站秒变未来感十足!
【10月更文挑战第31天】前端技术日新月异,黑科技层出不穷,让网页更加美观、交互更加丰富。本文通过响应式布局与媒体查询、前端框架与组件化开发等案例,展示这些技术如何让网站充满未来感。响应式布局使网站适应不同设备,前端框架如React、Vue则提高开发效率和代码质量。
60 3
|
2月前
|
JSON 前端开发 搜索推荐
惊!这些前端技术竟然能让你的网站实现个性化推荐功能!
【10月更文挑战第30天】随着互联网技术的发展,个性化推荐已成为提升用户体验的重要手段。前端技术如JavaScript通过捕获用户行为数据、实时更新推荐结果等方式,在实现个性化推荐中扮演关键角色。本文将深入解析这些技术,并通过示例代码展示其实际应用。
102 4

热门文章

最新文章