我正在try 创建一个"工具提示",它跟随鼠标移动,当鼠标离开它的位置时消失.然而,创建的工具提示速度很慢,它不能平稳地跟随我的鼠标移动,而且看起来很不稳定.如何修复此问题?

https://stackblitz.com/edit/angular-851aej?file=src%2Fapp%2Fapp.component.ts,src%2Fapp%2Fapp.component.html

TS:

export class AppComponent {
  name = 'Angular';

  constructor(private el: ElementRef) {}

  first(e: { pageX: any; pageY: any }) {
    console.log(e.pageX, e.pageY);

    this.el.nativeElement.querySelector('#first').style.left =
      e.pageX.toString() + 'px';
    this.el.nativeElement.querySelector('#first').style.top =
      e.pageY.toString() + 'px';
    this.el.nativeElement.querySelector('#first').classList.add('show');
  }

  second(e: { pageX: any; pageY: any }) {
    this.el.nativeElement.querySelector('#first').style.left = '0px';
    this.el.nativeElement.querySelector('#first').style.top = '0px';

    this.el.nativeElement.querySelector('#first').classList.remove('show');
  }
}

HTML:

<div (mouseover)="first($event)" (mouseleave)="second($event)"class="place-welcome">
<h2>This is a Panel</h2>
<p>Hello my darling</p>
</div>

<div id="first">asdasdasdasd</div>

推荐答案

不要使用mouseovermouseleave,而是使用:

  • 100以检测鼠标何时进入div.这是显示工具提示的位置.
  • 100以检测鼠标何时在div内移动.这是放置工具提示的位置.
  • 100以检测鼠标何时离开div.这是隐藏工具提示的位置.

此外:

  • 不要在一个函数中多次执行同一元素查询,而是执行一次查找并将其存储在变量中.您甚至可以在组件初始化时只执行一次查找,但这取决于组件的进一步逻辑.
  • 确保工具提示设置为pointer-eventsnone;如果没有,鼠标进入和离开工具提示时会产生干扰.

将所有这些放在一起,可以得到以下代码:

Component:

import { Component, ElementRef } from '@angular/core';

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css'],
})
export class AppComponent {
  name = 'Angular';

  constructor(private el: ElementRef) {}

  get tooltip() {
    return this.el.nativeElement.querySelector('#first');
  }

  enter() {
    this.tooltip.classList.add('show');
  }

  move(e: { pageX: number; pageY: number }) {
    const tooltipStyle = this.tooltip.style;
    tooltipStyle.left = e.pageX + 'px';
    tooltipStyle.top = e.pageY + 'px';
  }

  leave() {
    this.tooltip.classList.remove('show');
  }
}

Template:

<div
  (mouseenter)="enter()"
  (mousemove)="move($event)"
  (mouseleave)="leave()"
  class="place-welcome"
>
  <h2>This is a Panel</h2>
  <p>Hello my darling</p>
</div>

<div id="first">asdasdasdasd</div>

Stylesheet:

#first {
  position: absolute;
  opacity: 0;
  pointer-events: none;
}

.place-welcome {
  width: 100%;
  height: 300px;
  background: red;
}

.show {
  opacity: 1 !important;
}

查看StackBlitz

Javascript相关问答推荐

是什么原因导致此Angular 16电影应用程序中因类型错误而不存在属性?

使用JavaScript在ionic Web应用程序中更新.pane和.view的背景 colored颜色

我试图实现用户验证的reduxstore 和操作中出了什么问题?

docx.js:如何在客户端使用文档修补程序

MongoDB中的引用

React Code不在装载上渲染数据,但在渲染上工作

Msgraph用户邀请自定义邮箱模板

无法检测卡片重叠状态的问题

JS,当你点击卡片下方的绿色空间,而它是在它的背后转动时,

在WordPress中使用带有WPCode的Java代码片段时出现意外令牌错误

AddEventListner,按键事件不工作

处理TypeScrip Vue组件未初始化的react 对象

在渲染turbo流之后滚动到元素

我怎样才能点击一个元素,并获得一个与 puppeteer 师导航页面的URL?

rxjs在每次迭代后更新数组的可观察值

在Press Reaction本机和EXPO av上播放单个文件

无法在Adyen自定义卡安全字段创建中使用自定义占位符

使用python,我如何判断一个html复选框是否被隐藏,以及它是否被S选中?

如何在不将整个文件加载到内存的情况下,在Node.js中实现Unix粘贴命令?

Google OAuth 2.0库和跨域开放程序的问题-策略错误