用原生js实现矩形框选,同时加入vue中使用 (修复bug)_-moz-user-select bug

//当鼠标按下时,按钮事件

trainSelected.onmousedown

//当鼠标指针移出时,

trainSelected.onmousemove

//当松开鼠标按钮时,

trainSelected.onmouseup

附加信息:如何得到AID 和 BID 的具体信息:

第一步:通过@mousemove=“move()” 方法绑定id

第二步:通过:

//取出来:矩形里开始位置的Aid 和 结束位置的Bid

move(data){

if (!this.pressed) return

// console.log(“data”,data);

this.pressData.push(data);

},

第三步:定义数组:this.pressData = []; //圈中的值,初始化

最后:

//当松开鼠标按钮时,

trainSelected.onmouseup = (event) =>{

console.log(“end”,this.pressData, this.pressData[0], this.pressData[this.pressData.length-1]);

AID= this.pressData, this.pressData[0],

BID = this.pressData[this.pressData.length-1];

}

由于我没放真实的 数组id 在 这里 @mousemove=“move()”    move( 数组id)

所以end 打印的都没有值:

具体代码如下:

<template>
    <div unselectable="on" onselectstart="return false;" style="-moz-user-select:none;">
        <div id = "bottom" ></div>
        <div id="trainSelected" @mousemove="move()">aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa</div>
    </div>
</template>

<script>
export default {
    data(){
        return{
            pressed: false, 
            pressData:null,
        }
    },
    methods:{
       //取出来:矩形里开始位置的Aid 和 结束位置的Bid
        move(data){
            if (!this.pressed) return
            // console.log("data",data);
            this.pressData.push(data);
        },
        boxSelection(){
            this.pressData = []; //圈中的值,初始化
            var stateBar = document.getElementById("bottom");
            var trainSelected = document.getElementById('trainSelected');
            //当鼠标按下时,按钮事件
            trainSelected.onmousedown = (e) =>{
                this.pressed = true;
                // console.log('开始',e , e.clientY, e.clientY)

            var posx = e.clientX;
            var posy = e.clientY;
            var div = document.createElement("div");
            div.className = "tempDiv";
            div.style.left = e.clientX+"px";
            div.style.top = e.clientY+"px";
            // document.body.appendChild(div);
            trainSelected.appendChild(div);
            //当鼠标指针移出时,
            trainSelected.onmousemove = (ev) =>{
                div.style.left = Math.min(ev.clientX, posx) + "px";
                div.style.top = Math.min(ev.clientY, posy) + "px";
                div.style.width = Math.abs(posx - ev.clientX)+"px";
                div.style.height = Math.abs(posy - ev.clientY)+"px";

                // aid的left=矩形的left; top=top+height
                // bid的left=矩形的left+width; top=top+height

                //Aid 的位置坐标
                // let AId_left = e.clientX;
                // let AId_hight = (e.clientY + Math.abs(posy - ev.clientY));

                //Bid 的位置坐标
                // let BId_left = e.clientX + Math.abs(posx - ev.clientX);
                // let BId_hight = (e.clientY + Math.abs(posy - ev.clientY));
                stateBar.innerHTML = "MouseX: " + ev.clientX + "<br/>MouseY: " + ev.clientY;
                //当松开鼠标按钮时,
                trainSelected.onmouseup = (event) =>{
                    console.log("end",this.pressData, this.pressData[0], this.pressData[this.pressData.length-1]);
                    this.pressed = false;
                    // console.log('结束', event.clientX, event.clientY)
                    div.parentNode.removeChild(div);
                    trainSelected.onmousemove = null;
                    trainSelected.onmouseup = null;
                    // this.show = true;
                }
            }
            }
        },
    },
    created(){

    },
    mounted(){
        this.boxSelection();
    }
}
</script>

<style>
*{
    padding:0;
    margin:0;
}
/* /鼠标移动时禁止选中文字/ */
div{
    -moz-user-select: none;
    -khtml-user-select: none;
    user-select: none;
    cursor: pointer;
}
#bottom{
    position:absolute;
    bottom:0px;
    width:100%;
    height:40px;
    border:1px solid #000;
    background:#000;
    color:#fff;
}
.tempDiv{
    border:1px dashed blue;
    background:#5a72f8;
    position:absolute;
    width:0;
    height:0;
    filter:alpha(opacity:10);
    opacity:0.1;
}
#trainSelected {
    height: 200px;
    width: 100%;
}
</style>

如需要更详细的代码请上github done:https://github.com/nieyangyang712/vue-Rectangular-box-selection

修复bug:

当鼠标超过一个屏了,画的矩形消失了,不显示? 为什么?

修改办法:

在js里面:

修复bug:鼠标的右键事件会影响鼠标的滑动位置,多生成一个矩形框;

解决办法:

1.在 onmousedown 方法里面 禁止右键事件
if(e.button ==2) return false; //禁止鼠标右键事件

2.点击时候,移除创建的矩形框
            //点击后---松开鼠标按钮时
            trainSelected.onmouseup = (event) =>{
                    this.pressed = false; // 禁止拖动
                    trainSelected.onmousemove = null;
                    trainSelected.onmouseup = null;
                    // div.parentNode.removeChild(div); // 移除框选的虚线框
                    // console.log(event,event.button);
                    if(event.button == 0 && event.button == 1 && event.button == 2){
                        div.parentNode.removeChild(div); // 移除框选的虚线框 
                    }
                    // console.log(1);
                    for(let i= 0; i < preBoxs.length; i++){
                        if(preBoxs[i]){
                            trainSelected.removeChild(preBoxs[i])
                        }
                    }
                } 

更多方法请移步github:https://github.com/nieyangyang712/mouse-drawing-rectangle

最后

其实前端开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。

这里再分享一个复习的路线:(以下体系的复习资料是我从各路大佬收集整理好的)

《前端开发四大模块核心知识笔记》

最后,说个题外话,我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在IT学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值