js 拉框选中多个元素


看到云盘里,使用js实现鼠标拉框 选中多个,来个效果图



实现如下:

    
var SelectPlugin = function(c, r){    

    // 是否需要(允许)处理鼠标的移动事件,默认识不处理
    var select = false;
    
    var rect = document.getElementById(r);
    // 设置默认值,目的是隐藏图层
    rect.style.width = 0;
    rect.style.height = 0;
    rect.style.visibility = 'hidden';
    //让你要画的图层位于最上层
    rect.style.zIndex = 1000;
    
    // 记录鼠标按下时的坐标
    var downX = 0;
    var downY = 0;
    // 记录鼠标抬起时候的坐标
    var mouseX2=downX;
    var mouseY2=downY;

    this.init = function(){
        /*
            这两句代码是最重要的时候,没有这两句代码,你的拉框,就只能拉框,在鼠标松开的时候,
            拉框停止,但是不能相应鼠标的mouseup事件.那么你想做的处理就不能进行.
            这两句的作用是使当前的鼠标事件不在冒泡,也就是说,不向其父窗口传递,所以才可以相应鼠标抬起事件,
            这个部分我也理解的不是特别的清楚,如果你需要的话,你可以查资料.但是这两句话确实最核心的部分,
            为了这两句话,为了实现鼠标拉框,我搞了几天的时间.
        */
        window.event.cancelBubble = true;
        window.event.returnValue = false; 
    }
    
    //处理鼠标按下事件
    this.down = function(event){
        // 鼠标按下时才允许处理鼠标的移动事件
        select = true;
        //让你要画框的那个图层显示出来
        //rect.style.visibility = 'visible';
        // 取得鼠标按下时的坐标位置
        downX = event.clientX;
        downY = event.clientY; 
        
        //设置你要画的矩形框的起点位置
        rect.style.left = downX;
        rect.style.top = downY;
    }

    //鼠标移动事件,最主要的事件
    this.move = function (event){
        
        // 取得鼠标移动时的坐标位置
        mouseX2 = event.clientX;
        mouseY2 = event.clientY;
        
        // 设置拉框的大小    
        rect.style.width = Math.abs( mouseX2 - downX );
        rect.style.height = Math.abs( mouseY2 - downY );    
        /*
        
        这个部分,根据你鼠标按下的位置,和你拉框时鼠标松开的位置关系,可以把区域分为四个部分,根据四个部分的不同,
        我们可以分别来画框,否则的话,就只能向一个方向画框,也就是点的右下方画框.
        
        */
        if(select){
             
           rect.style.visibility = 'visible';

            // A part
            if( mouseX2 < downX && mouseY2 < downY ){
                rect.style.left = mouseX2;
                rect.style.top = mouseY2 ;    
            }
            
            // B part
            if( mouseX2 > downX && mouseY2 < downY){
                rect.style.left = downX ;
                rect.style.top = mouseY2;    
            }
            
            // C part
            if( mouseX2 < downX && mouseY2 > downY){
                rect.style.left = mouseX2;
                rect.style.top = downY ;    
            }
            
            // D part
            if( mouseX2 > downX && mouseY2 > downY ){
                rect.style.left = downX ;
                rect.style.top = downY;
            }            
            return get_select_list();
        }
         
    }


    
    //鼠标抬起事件
    this.up = function(event){
        //鼠标抬起,就不允许在处理鼠标移动事件
        select = false;
        //隐藏图层
        rect.style.visibility = 'hidden';
        return get_select_list()
    }

    
    function get_select_list(){
        var objs_id_list = [];
        var temp = document.getElementById(c).childNodes; 
        for(var i=0; i<temp.length; i++){   
              if(temp[i].nodeType == 1 && temp[i].id && temp[i].id != r){    
                     objs_id_list.push(temp[i].id);    
              }   
         }
        console.log(objs_id_list)
        var r1= getRectangle(r);
        var sel_list = [];
        for(i in objs_id_list){
            var id = objs_id_list[i];
            var r2 = getRectangle(id);
            if(crossRect(r1,r2)){
                sel_list.push(id);
            }
        }
        console.log(sel_list);
        return sel_list;
    }
    
       
         
    function getRectangle(id){
        var obj = document.getElementById(id);
        var rectangle = new Object();
        rectangle.x = obj.offsetLeft;
        rectangle.y = obj.offsetTop;
        rectangle.width = parseInt(obj.style.width);
        rectangle.height = parseInt(obj.style.height);
        return rectangle;
    }

    function crossRect(r1,r2){
        var nMaxLeft = 0;
        var nMaxTop = 0;
        var nMinRight = 0;
        var nMinBottom = 0;

        //计算两矩形可能的相交矩形的边界
        nMaxLeft = r1.x >= r2.x ? r1.x : r2.x;
        nMaxTop = r1.y >= r2.y ? r1.y : r2.y;
        nMinRight = (r1.x + r1.width) <= (r2.x + r2.width) ? (r1.x + r1.width) : (r2.x + r2.width);
        nMinBottom = (r1.y + r1.height) <= (r2.y + r2.height) ? (r1.y + r1.height) : (r2.y + r2.height);
        // 判断是否相交
        if (nMaxLeft > nMinRight || nMaxTop > nMinBottom){
            return false;
        }else{
            return true;
        }
    }
            
}


<html>
    <head>
        <meta http-equiv="content-type" content="text/html; charset=gbk">
        <title>拉框</title>
        <style>
        #lay1 {
           -moz-user-select: none; /*火狐*/
           -webkit-user-select: none;  /*webkit浏览器*/
           -ms-user-select: none;   /*IE10*/
           -khtml-user-select: none; /*早期浏览器*/
           user-select: none;
        }
        #rect{
            position:absolute;
            border: 2px dashed rgb(141, 141, 141);
            background-color: black;
            opacity: .1;
            filter: alpha(opacity=10);
            filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=10);
            -ms-filter:'progid:DXImageTransform.Microsoft.Alpha(Opacity=10)';
        }
        </style>
    </head>
    <body>
        <div id='lay1'
            οnmοusedοwn='down(event)'
            οnmοuseup='up(event)'
            οnmοusemοve='move(event)'
            style='width:400px;height:400px;visibility:visible;border:solid 1px blue;margin-top:100px;'
        >           
            <button id="btn" style="margin:50px;height:20px;width:50px">dsdsd</button> 
             <button id="btn1" style="margin:50px;height:20px;width:50px">dsdsd</button> 
              <button id="btn2" style="margin:50px;height:20px;width:50px">dsdsd</button> 
               <button id="btn3" style="margin:50px;height:20px;width:50px">dsdsd</button> 
                <button id="btn4" style="margin:50px;height:20px;width:50px">dsdsd</button> 
                 <button id="btn5" style="margin:50px;height:20px;width:50px">dsdsd</button> 
            <div id='rect'
                style=''            
            ></div>    
    </div>
    
        <script language="javascript" src="rect_select.js"></script>

        <script language="javascript">
            var select_list;
            var select_plug = new SelectPlugin("lay1", "rect");
            select_plug.init();
            function down(event){
                select_plug.down(event);
            }
            function move(event){
                select_plug.move(event);
            }
            function up(event){
                select_list = select_plug.up(event);
            }

            
            
        </script>

    </body>

</html>


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Fabric.js 提供了一个叫做 "selectable" 的功能,可以实现框选中多个元素。在初始化 canvas 时,设置 "selectable" 属性为 true 即可启用框选择功能。例如: ``` var canvas = new fabric.Canvas('c'); canvas.selection = true; ``` 选中的元素可以使用 canvas.getActiveObjects() 或 canvas.getActiveGroup() 获取。 如果要在框选中时进行一些额外操作,可以给 canvas 绑定 "before:selection:cleared" 事件。 ### 回答2: Fabric.js 是一个基于HTML5 canvas的强大的绘图库,它提供了许多功能和特性,可以方便地在网页上创建和编辑图形。 要实现框选中多个元素,可以使用 Fabric.js 的选择功能。在 Fabric.js 中,可以通过调用 `canvas.selection` 方法来启用或禁用选择功能。 首先,要启用选择功能,需要将 `canvas.selection` 的属性值设置为 true: ```javascript canvas.selection = true; ``` 接下来,我们需要监听鼠标按下和抬起事件,以确定用户是否在画布上绘制了一个选择框。在鼠标按下事件中,我们记录下按下的坐标,而在鼠标抬起事件中,我们记录下抬起的坐标,并根据这两个坐标创建一个矩形对象,表示选择框。 ```javascript var startSelection = { x: 0, y: 0 }; var endSelection = { x: 0, y: 0 }; canvas.on('mouse:down', function(options) { var pointer = canvas.getPointer(options.e); startSelection.x = pointer.x; startSelection.y = pointer.y; }); canvas.on('mouse:up', function(options) { var pointer = canvas.getPointer(options.e); endSelection.x = pointer.x; endSelection.y = pointer.y; // 创建一个矩形对象 var rect = new fabric.Rect({ left: Math.min(startSelection.x, endSelection.x), top: Math.min(startSelection.y, endSelection.y), width: Math.abs(startSelection.x - endSelection.x), height: Math.abs(startSelection.y - endSelection.y), fill: 'rgba(0, 0, 255, 0.3)', // 可以根据需求来设置选择框的样式 selectable: false, // 选择框不可选中 }); canvas.add(rect); }); ``` 以上代码会在画布上创建一个矩形对象,代表用户绘制的选择框。接下来,我们可以使用 `canvas.getActiveObjects()` 方法来获取所有被选择的元素。 ```javascript var selectedObjects = canvas.getActiveObjects(); ``` 最后,我们可以在控制台输出被选择的元素的相关信息,比如它们的位置和尺寸等。 ```javascript selectedObjects.forEach(function(object) { console.log('Selected object:', object); }); ``` 通过以上的步骤,我们可以实现框选中多个元素的功能。 ### 回答3: Fabric.js 是一个用于绘制交互式图形的JavaScript库。它提供了丰富的功能和工具来处理图像、文本和形状等元素。 在Fabric.js中,要实现框选中多个元素,可以通过以下步骤来实现: 1. 首先,创建一个新的矩形对象,作为框选择的区域。可以使用Fabric.js的Rectangle类来创建。设置矩形的`left`、`top`、`width`和`height`属性,使其与鼠标的拖动相匹配。 2. 在鼠标按下事件中,在画布上添加这个矩形对象,并将其设置为不可见。 3. 在鼠标移动事件中,更新矩形对象的属性,使其与鼠标拖动的位置相匹配。可以使用鼠标移动事件的坐标和矩形的初始位置来计算新的位置。 4. 在鼠标释放事件中,遍历画布上的所有元素,并检查每个元素是否与矩形相交。可以使用`intersects()`方法来判断两个区域是否相交。 5. 如果元素与矩形相交,则将其添加到选中的元素列表中。 6. 最后,根据需要,可以对选中的元素进行一些操作,例如改变颜色、改变大小等。 以上就是使用Fabric.js实现框选中多个元素的基本步骤。根据具体需求,还可以根据选中元素的数量和位置来进行更复杂的操作。Fabric.js的文档中还有更多的示例和详细的API说明,可以帮助更好地理解和使用该库。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值