如何在光标进入时将按钮移到光标附近,而在光标离开时如何移远一点

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在光标进入时将按钮移到光标附近,而在光标离开时如何移远一点相关的知识,希望对你有一定的参考价值。

我正在尝试创建一个鼠标移动动画。当光标靠近按钮时,我称之为borderline-距按钮一定距离,按钮将移至光标方向。

这里,为了清楚和理解,我用css显示了两个用borderline划线的步骤。我通过计算按钮的中心点并减小并为x和y轴添加按钮的宽度和高度,从代码创建了最近的borderline

并且我想通过与我相同的方法来解决此问题,而不是通过将其他event-listener添加到按钮的parent-elements

这是我尝试过的。。

const button = document.querySelector(".button");
let  width, height, x: buttonX, y: buttonY  = button.getBoundingClientRect(); // gives you width, height, left-X,top-y of the button

buttonX = buttonX + width / 2; //  center point of button on x-axis
buttonY = buttonY + height / 2; //  center point of button on y-axis

/*************** Functions ***************/

let distance = width;
let mouseHasEntered = true;
let mouseIsInButtonTerritory;

function mouseMove(e) 
  const x = e.x; // current x of cursor
  const y = e.y; // current y of cursor

  const leftBorderLine = buttonX - distance;
  const rightBorderLine = buttonX + distance;
  const topBorderLine = buttonY - distance;
  const bottomBorderline = buttonY + distance;
  const xWalk = (x - buttonX) / 2; // the distance to move the button when mouse moves on X axis
  const yWalk = (y - buttonY) / 2; // the distance to move the button when mouse moves on Y axis

  mouseIsInButtonTerritory =
    x > leftBorderLine &&
    x < rightBorderLine &&
    y > topBorderLine &&
    y < bottomBorderline; // becomes true if  mouse is inside all of these border-line

  if (mouseIsInButtonTerritory) 
    if (mouseHasEntered) 
      // this must happen only once to create outside borderline
      //creating another level borderline by incresing distance;
      // while cursor is returing the button comes out of nearest border-line and return from this borderline
      distance = distance + distance;
      mouseHasEntered = false;
    
    catchCursor(xWalk, yWalk); // call the function when mouse in in the button's territory
   else 
    resetPositon();
  


function catchCursor(xWalk, yWalk) 
  // translates the button in the direction where cursor is.
  button.style.transform = `translate($xWalkpx, $yWalkpx)`;


function resetPositon() 
  // resets the postion of the button as it was initial.
  button.style.transform = `translate($0px, $0px)`;
  mouseHasEntered = true;
  // when button is return to it's position (mouseHasEntered = true) lets to increase the initial borderline of button for the next time


/*************** Event-handler ***************/

window.addEventListener("mousemove", mouseMove);
window.addEventListener("mouseout", resetPositon);
*,
*::before,
*::after 
  margin: 0;
  padding: 0;
  box-sizing: border-box;


:root 
  --gutter-lg: 4rem;
  --gutter-md: 3rem;
  --gutter-sm: 1rem;
  --gutter-xm: 1rem;
  --color-white: #fff;
  --color-black: #000;


body 
  background: var(--color-black);
  font: 16px verdana;
  color: var(--color-white);


.banner 
  display: flex;
  height: 100vh;


.button 
  margin: auto;
  cursor: pointer;
  transition: all 0.2s ease-out;


.button-wrap-wrapper 
  width: 192px;
  height: 192px;
  border: 1px dashed #fff;
  margin: auto;
  display: flex;


.button-wrap 
  width: 128px;
  height: 128px;
  margin: auto;
  /* background: orange; */
  display: flex;
  justify-content: center;
  align-items: center;
  border: 1px dashed #fff;


.button__like-text 
  display: block;
  color: var(--color-black);
  background: var(--color-white);
  width: var(--gutter-lg);
  height: var(--gutter-lg);
  border-radius: 50%;
  display: flex;
  align-items: center;
  justify-content: center;
<section class="banner">
      <div class="button-wrap-wrapper">
        <div class="button-wrap">
          <div class="button">
            <span class="button__like-text">
              Like
            </span>
          </div>
        </div>
      </div>
    </section>

无法正常工作的是:mouseIsInButtonTerritory变为真实,我在这里尝试增加borderline

 if (mouseHasEntered) 
      // this must happen only once to create outside borderline
      //creating another level borderline by incresing distance;
      // while cursor is returing the button comes out of nearest border-line and return from this borderline
      distance = distance + distance;
    

按钮一直保持跟随光标。

我要解决的问题是,如果光标从两个borderline

中都出来,则按钮必须越过第一个borderline并靠近最后一个borderline,然后返回到该位置处于初始阶段。

我没有走错地方。是否有缺少的任何东西?

我正在尝试创建一个鼠标移动动画。当光标靠近按钮时,我将其称为边界线-距按钮一定距离,按钮将移至光标方向。在这里我...

答案

如果我正确理解了您的意图,我认为您需要:

另一答案
  • 您应在鼠标离开时重置距离。

以上是关于如何在光标进入时将按钮移到光标附近,而在光标离开时如何移远一点的主要内容,如果未能解决你的问题,请参考以下文章

JavaFX:在进入 TextArea 时将插入符号/光标放在 TextArea 的末尾

vim 中将光标从行头移到行尾的快捷键是啥

在Excel中的一个单元格里光标怎么上下移动

使用Xshell连接到LINUX进行vi编辑时,进入编辑模式,按下end键,光标无法移到行位,home也不能到行首,其它的Delete键也是不能使用,如何解决?

vim

vim中,将光标移至第60行,并且删除行尾的15个字符,如何执行命令?