最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 【编辑器】简洁的框选效果

    正文概述 掘金(饥饿的程序媛)   2021-07-16   503

    最终效果:

    【编辑器】简洁的框选效果

    1、先写一个可以滚动的内容

    【编辑器】简洁的框选效果

    2、声明框选 有效区 

    编辑器的灵魂是什么:所有的操作都是在一个黑板上进行,我们只能在这个黑板上进行绘制、操作,这个黑板叫做编辑器有效区。

    var selectContainer = document.getElementById('container'); //选框有效区
    

    【编辑器】简洁的框选效果

    3、鼠标按下时,进入一个总的方法

    selectContainer.onmousedown = function () {
        alert(2222222);        //测试在有效区内,鼠标按下响应的事件
    }
    

    4、鼠标按下:在容器里新添加一个方形div

    (demo一直在换颜色....)

    【编辑器】简洁的框选效果

    var selection = document.createElement('div');
    
    selectContainer.onmousedown = function (e) {        
        selection.style.cssText="width: 100px; height: 100px; background: lightblue; opacity: 0.4";
        document.getElementById('container').appendChild(selection);
    }
    

    这个浅蓝色的方块就是我们未来的框选框。但是框选框的起始位置(x,y),我们要相对于有效区绝对定位。所以,代码进一步写成:

    #container {
        width: 400px;
        height: 300px;
        overflow-y: auto;
        position: relative;
        border: 1px solid #ddd;
    }
    
    
    selection.style.cssText="width: 100px; height: 100px; background: lightblue; opacity: 0.4; position: absolute";
    

    并且此时我们要声明两个变量:水平坐标,垂直坐标(框选框左上角的点)。

    var startX = 0;
    var startY = 0;
    
    selectContainer.onmousedown = function (e) {        
        startX = e.clientX - selectContainer.offsetLeft + selectContainer.scrollLeft;
        startY = e.clientY - selectContainer.offsetTop + selectContainer.scrollTop;
        /* 鼠标相对于视口的水平坐标 - 外框container偏移的位置(固定) + 滚动偏移
        
        ***这里是很容易写出bug的地方***
        写框选框的时候,很多人会把框选框相对于整个页面定位
        但是这样的话,在我们框选住一个方块 同时又让编辑区内容滚动 的时候,
        框选框不会覆盖到滚动部分的内容,而是会出现框选框 傻傻地fixed在一个地方 的现象,也就是和编辑区的内容结合不起来。
        ***结束***
       
        */
    

    得到了鼠标点击的位置后,我们试着把浅蓝色方块定位到鼠标点击的位置。

    selection.style.left = startX;
    selection.style.top = startY;
    

    我们现在得到了鼠标点击的定位点,接下来就要找到鼠标放下的定位点和框选框的宽高。

    5、找方块的范围

    首先,我们的方块范围是通过鼠标移动的多少来决定的,所以我们要写一个鼠标按下后的移动事件:

    selectContainer.onmousemove = function (e) {
        if (e.buttons == 1 || e.which == 1) {    //多加一个条件:鼠标左键按住
            alert("移动了!");
        }
    }
    

    然后,要让死的方块跟着鼠标拖拽的位置动起来。但是在这之前,我们要把刚刚的浅蓝色小方块重置样式(宽高设0,默认隐藏)

    selection.style.cssText="width: 0; height: 0; background: lightblue; opacity: 0.4; position: absolute; display: none;";
    

    重置过后,写动态框选框的代码,如下:

    selection.style.display = "block";
    selection.style.width = Math.abs(_x - startX) + "px";
    selection.style.height = Math.abs(_y - startY) + "px";
    

    6、鼠标放下的交互

    selectContainer.onmouseup = function (e) {
        selection.style.display = "none";
    }
    

    7、框选框和备选节点

    框选结束后,有一部分节点是被选中的状态,我们未来会对这些节点进行一些批量的操作。
    所以,要有个装这些节点的空容器:

    //首先获取所有可被选中的备选节点
    var lines = document.getElementsByClassName("line");
    
    //被选中节点的容器
    var selectedEls = [];
    

    再往前推,计算框选框选中了多少节点。

    8、框选框和备选项的关系

    selectContainer.onmouseup = function (e) {
        var a = selection.offsetLeft;
        var b = selection.offsetWidth;
        var c = selection.offsetTop;
        var d = selection.offsetHeight;
    
        for (var i = 0; i < lines.length; i++) {                
            var sr = lines[i].offsetWidth + lines[i].offsetLeft;        //备选项最右侧
            var sb = lines[i].offsetHeight + lines[i].offsetTop;        //备选项最底侧
            // 备选项 最右侧 sl > 框选框 水平偏移 a
            // 备选项 最底部 st > 框选框 垂直偏移 c
            // 备选项 距左侧距离 lines[i].offsetLeft < 框选框 水平偏移 a + 框选框宽度 b
            // 备选项 距顶部距离 lines[i].offsetTop < 框选框 垂直偏移 c + 框选框高度 d 
            if(sr > a && sb > c && lines[i].offsetLeft < a + b && lines[i].offsetTop < c + d) {
                lines[i].style.background = "#0082cc";
                selectedEls.push(lines[i]);
            } else {
                ......        
            }
        }    
    
        selection.style.display = "none";
    }
    

    起源地下载网 » 【编辑器】简洁的框选效果

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元