
在网页交互设计中,有时需要创建一种视觉效果:一个元素不仅能跟随用户的鼠标移动,还能同时指向屏幕的某个固定点(例如屏幕中心)。这要求我们精确计算元素的平移(translate)和旋转(rotate)变换。
实现此效果的关键在于以下几点:
首先,我们需要一个用于展示效果的HTML元素。这里我们使用一个 div,并为其设置一个 id 以便JavaScript操作。
<div id="myDiv"></div>
为了让 myDiv 能够自由定位和旋转,我们需要为其定义一些基础样式。
#myDiv {
cursor: none; /* 隐藏鼠标光标,增强沉浸感 */
position: absolute; /* 绝对定位,方便通过JS控制位置 */
top: 0;
left: 0;
width: 100px;
height: 100px;
background-color: lightgray; /* 备用背景色 */
transform-origin: center center; /* 设置旋转中心为元素自身中心 */
/* transform: rotate(-100deg); */ /* 初始旋转,可用于SVG校准或特定效果 */
background: url(https://upload.wikimedia.org/wikipedia/commons/8/89/Flashlight.svg) no-repeat center / contain; /* 使用手电筒SVG作为背景图 */
}
body {
overflow: hidden; /* 防止页面出现滚动条,尤其是在隐藏光标时 */
}样式说明:
JavaScript是实现动态效果的核心。我们需要监听鼠标移动事件,并根据鼠标位置计算元素的平移和旋转。
// 获取屏幕的中心点坐标,这将是我们的元素始终指向的目标
const centerX = window.innerWidth / 2;
const centerY = window.innerHeight / 2;
// 获取要操作的DOM元素
const myDiv = document.getElementById('myDiv');
document.addEventListener('mousemove', (event) => {
// 获取鼠标当前的X和Y坐标
const mouseX = event.clientX;
const mouseY = event.clientY;
// 计算从鼠标位置到屏幕中心的向量 (deltaX, deltaY)
// 这里的deltaX和deltaY是从鼠标指向中心点的方向
const deltaX = centerX - mouseX;
const deltaY = centerY - mouseY;
// 使用 Math.atan2 计算角度(弧度),然后转换为度数
// atan2(y, x) 返回的弧度值范围是 (-PI, PI]
let angle = Math.atan2(deltaY, deltaX) * (180 / Math.PI);
// 定义元素与鼠标之间的固定偏移距离
const distance = 50;
// 计算元素的平移位置,使其与鼠标保持一定的偏移
// 这里将元素的左上角放置在鼠标位置左上角 'distance' 像素处
const translateX = mouseX - distance;
const translateY = mouseY - - distance; // 修正:应为 mouseY - distance
// 假设SVG图像的默认朝向不是0度(指向右侧),
// extraRotationForSVG用于校准SVG的初始方向,使其在角度为0时指向正确方向
// 实际值需要根据SVG图像的内部绘制方向进行调整
const extraRotationForSVG = 210;
// 应用CSS transform,同时进行平移和旋转
myDiv.style.transform = `translate(${translateX}px, ${translateY}px) rotate(${angle + extraRotationForSVG}deg)`;
});JavaScript 代码详解:
将上述HTML、CSS和JavaScript代码组合,即可实现所需效果。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>动态元素跟随鼠标并指向屏幕中心</title>
<style>
body {
margin: 0;
padding: 0;
overflow: hidden; /* 防止页面滚动 */
background-color: #f0f0f0;
}
#myDiv {
cursor: none; /* 隐藏鼠标光标 */
position: absolute;
top: 0;
left: 0;
width: 100px;
height: 100px;
background-color: transparent; /* 背景色透明,只显示SVG */
transform-origin: center center; /* 旋转中心 */
background: url(https://upload.wikimedia.org/wikipedia/commons/8/89/Flashlight.svg) no-repeat center / contain;
/* transform: rotate(-100deg); */ /* 如果需要初始CSS旋转,可以在此设置 */
}
</style>
</head>
<body>
<div id="myDiv"></div>
<script>
const myDiv = document.getElementById('myDiv');
// 初始计算屏幕中心
let centerX = window.innerWidth / 2;
let centerY = window.innerHeight / 2;
// 监听窗口大小变化,实时更新中心点
window.addEventListener('resize', () => {
centerX = window.innerWidth / 2;
centerY = window.innerHeight / 2;
});
document.addEventListener('mousemove', (event) => {
const mouseX = event.clientX;
const mouseY = event.clientY;
// 计算从鼠标位置到屏幕中心的向量
const deltaX = centerX - mouseX;
const deltaY = centerY - mouseY;
// 使用 Math.atan2 获取角度,并转换为度数
let angle = Math.atan2(deltaY, deltaX) * (180 / Math.PI);
// 定义元素与鼠标之间的固定偏移距离
const distance = 50;
// 计算元素的平移位置
const translateX = mouseX - distance;
const translateY = mouseY - distance;
// SVG图像的额外旋转校准值
// 这个值需要根据实际SVG的默认朝向进行调整,确保它正确指向目标以上就是动态元素跟随鼠标并指向屏幕中心教程的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号