RSKMR
RSKMR

Reputation: 1892

Html Javascript + Mouse click hold event

I have html and when the mouse is clicked and dragged, any intersecting boxes will be highlighted blue. On mouse up, the selection highlight disappears.

  .root {
    align-items: center;
    display: flex;
    flex-direction: column;
    margin-top: 100px;
  }

  .row {
    display: flex;
  }

  .box {
    border: 1px solid;
    height: 100px;
    width: 100px;
  }
<div class="root">
  <div class="row">
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
  </div>
  <div class="row">
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
  </div>
  <div class="row">
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
  </div>
  <div class="row">
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
  </div>
  <div class="row">
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
  </div>
</div>

enter image description here

Upvotes: 0

Views: 686

Answers (1)

rand_program
rand_program

Reputation: 1180

It is been a great practice for me, hope that it will helps you too.

Here is the code.

When mousedown event triggered i started listening mouseover event and when mouseup event triggered i am killing mouseover event[document] this makes buttons transparent again when mouseup event trigged.

const rootElement = document.getElementById('root');

const boxLeft = rootElement.offsetLeft;
const boxTop = rootElement.offsetTop;
const boxRight = rootElement.offsetLeft + rootElement.offsetWidth;
const boxBottom = rootElement.offsetTop + rootElement.
offsetHeight;


const boxes = document.getElementsByClassName('box');


let mouseEnterXposition;
let mouseEnterYposition;
let mouseLeaveXposition;
let mouseLeaveYposition;

let goingRight;
let goingDown;

let boxesOffSetTopArray = [];
let boxesOffSetLeftArray = [];

let minTopEnterValue = 9999;
let minLeftEnterValue = 9999;

let minLeftOutValue = 9999;
let minTopOutValue = 9999;

rootElement.addEventListener("dragstart", (e) =>{
    e.preventDefault();
})


rootElement.addEventListener("mousedown", (e) => {

    rootElement.addEventListener("mouseover", mouseOverEvent, false);

    mouseEnterXposition = e.clientX;
    mouseEnterYposition = e.clientY;

 
    for (let i  = 0; i < boxes.length; i++){
        boxesOffSetLeftArray.push(boxes[i].offsetLeft);
    }
 
    

    for (let i = 0; i < boxesOffSetLeftArray.length; i++){
        if (mouseEnterXposition > boxesOffSetLeftArray[i]){
            if (minLeftEnterValue > Math.abs(mouseEnterXposition - boxesOffSetLeftArray[i])){
                minLeftEnterValue = boxesOffSetLeftArray[i];
            }
        }
    }

    
    for (let i  = 0; i < boxes.length; i++){
        boxesOffSetTopArray.push(boxes[i].offsetTop);
    }


    for (let i = 0; i < boxesOffSetTopArray.length; i++){
        if (mouseEnterYposition > boxesOffSetTopArray[i]){
            if (minTopEnterValue > Math.abs(mouseEnterYposition - boxesOffSetTopArray[i])){
                minTopEnterValue = boxesOffSetTopArray[i];
            }
        }
    }

    
})

document.addEventListener("mouseup", () => {
    for (let i = 0; i < boxes.length; i++){
        boxes[i].style.backgroundColor = "transparent";

    rootElement.removeEventListener("mouseover",mouseOverEvent);
}});





function mouseOverEvent (e){
    mouseLeaveXposition = e.clientX;
    mouseLeaveYposition = e.clientY;

    if (mouseLeaveXposition > mouseEnterXposition){
        goingRight = true;
    }
    else{
        goingRight = false;
    }

    if (mouseLeaveYposition > mouseEnterYposition){
        goingDown = true;
    }
    else{
        goingDown = false;
    }


    for (let i = 0; i < boxesOffSetLeftArray.length; i++){
        if (mouseLeaveXposition > boxesOffSetLeftArray[i]){
            if (minLeftOutValue > Math.abs(mouseLeaveXposition - boxesOffSetLeftArray[i])){
                minLeftOutValue = boxesOffSetLeftArray[i];
            }
        }
    }


    for (let i = 0; i < boxesOffSetTopArray.length; i++){
        if (mouseLeaveYposition > boxesOffSetTopArray[i]){
            if (minTopOutValue > Math.abs(mouseLeaveYposition - boxesOffSetTopArray[i])){
                minTopOutValue = boxesOffSetTopArray[i];
            }
        }
    }

    
    for (let i = 0; i < boxes.length; i++){
        if (goingRight && goingDown){
          if (boxes[i].offsetTop >= minTopEnterValue){
            if (boxes[i].offsetLeft >= minLeftEnterValue){
                if (boxes[i].offsetTop < minTopOutValue + boxes[i].offsetHeight){
                    if (boxes[i].offsetLeft  <= minLeftOutValue){
                        boxes[i].style.backgroundColor = "blue";
                        continue;
                    }
                }
            }
          }
          boxes[i].style.backgroundColor = "transparent";
        }
        else if (!goingRight && goingDown){
            if (boxes[i].offsetTop >= minTopEnterValue){
                if (boxes[i].offsetLeft <= minLeftEnterValue){
                    if (boxes[i].offsetTop < minTopOutValue + boxes[i].offsetHeight){
                        if (boxes[i].offsetLeft + boxes[i].offsetWidth > minLeftOutValue){
                            boxes[i].style.backgroundColor = "blue";
                            continue;
                        }
                        
                    }
                }
            }
            boxes[i].style.backgroundColor = "transparent";
        }
        else if (goingRight && !goingDown){
            if (boxes[i].offsetTop <= minTopEnterValue){
                if (boxes[i].offsetLeft >= minLeftEnterValue){
                    if (boxes[i].offsetTop >= minTopOutValue){
                        if (boxes[i].offsetLeft <= minLeftOutValue){
                            boxes[i].style.backgroundColor = "blue";
                            continue;
                        }
                        
                    }
                }
            }
            boxes[i].style.backgroundColor = "transparent";
        }
        else if (!goingRight && !goingDown){
            if (boxes[i].offsetTop <= minTopEnterValue){
                if (boxes[i].offsetLeft <= minLeftEnterValue){
                    if (boxes[i].offsetTop >= minTopOutValue){
                        if (boxes[i].offsetLeft + boxes[i].offsetWidth > minLeftOutValue){
                            boxes[i].style.backgroundColor = "blue";
                            continue;
                        }
                    }
                }
            }
            boxes[i].style.backgroundColor = "transparent";
        }
    }
}
html{
  font-size: 62.5%;
}


*,
*::before,
*::after {
  box-sizing: border-box;
}



body{
  min-height: 100vh;
  overflow: hidden;
  display: grid;
  place-content: center;
  margin:0;
  background-color: bisque;
}


.row {
  display: flex;
  flex-direction: row;
}

.box {
  border: 1px solid;
  height: 10rem;
  width: 10rem;

}
 <div id="root">
      <div class="row">
        <div class="box"></div>
        <div class="box"></div>
        <div class="box"></div>
        <div class="box"></div>
        <div class="box"></div>
        <div class="box"></div>
      </div>
      <div class="row">
        <div class="box"></div>
        <div class="box"></div>
        <div class="box"></div>
        <div class="box"></div>
        <div class="box"></div>
        <div class="box"></div>
      </div>
      <div class="row">
        <div class="box"></div>
        <div class="box"></div>
        <div class="box"></div>
        <div class="box"></div>
        <div class="box"></div>
        <div class="box"></div>
      </div>
      <div class="row">
        <div class="box"></div>
        <div class="box"></div>
        <div class="box"></div>
        <div class="box"></div>
        <div class="box"></div>
        <div class="box"></div>
      </div>
      <div class="row">
        <div class="box"></div>
        <div class="box"></div>
        <div class="box"></div>
        <div class="box"></div>
        <div class="box"></div>
        <div class="box"></div>
      </div>
    </div>

Upvotes: 1

Related Questions