<!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>
#link {
display: block;
width: 200px;
height: 100px;
padding: 0;
margin: 0;
position: fixed;
left: 0;
top: 0;
background-color: pink;
cursor: pointer;
}
h2:first-child {
color: red;
}
</style>
<script>
window.onload = function () {
let link = document.getElementById("link");
let w = document.documentElement.clientWidth;
let h = document.documentElement.clientHeight;
let gox = 1; //控制是否反向
let goy = 1;
let speed = 1; // Adjust the speed here
let animationFrameId; // Used to store the requestAnimationFrame id
/*
这个move()函数是用来实现link元素的动画移动的。
1.let x = link.offsetLeft; 和 let y = link.offsetTop;:这两行代码获取了
link元素相对于其包含元素的左侧和顶部的偏移量。
2.if (x > w - 200 || x < 0) gox = -gox; 和 if (y > h - 100 || y < 0) goy = -goy;
这两行代码检查 link 元素是否到达了视口的边界。如果 link 的左侧超过视口宽度减去200像素
(假设 link 的宽度是200像素),或者左侧偏移小于0,那么水平方向的移动方向将反转。
同样的,如果 link 的顶部超过视口高度减去100像素(假设 link 的高度是100像素),
或者顶部偏移小于0,那么垂直方向的移动方向将反转。
3.link.style.left = x + speed * gox + "px"; 和 link.style.top = y + speed * goy + "px";
这两行代码更新了 link 元素的 left 和 top 样式属性,通过将原始偏移量与速度和运动方向相乘来实现动画效果。
在水平方向上,speed * gox 控制了 link 元素的水平速度和方向;在垂直方向上,speed * goy 控制了 link
元素的垂直速度和方向。
4.animationFrameId = requestAnimationFrame(move);:这一行代码使用 requestAnimationFrame()
方法来调度下一次动画帧,并将 move() 函数作为回调函数。这样可以创建一个平滑的动画效果,浏览器会在下一次
重绘之前执行该回调函数,以确保动画效果的流畅性。animationFrameId 变量用于存储 requestAnimationFrame()
返回的请求 ID,以便稍后可以使用 cancelAnimationFrame() 方法取消动画帧的请求。
link.style.left = x + speed * gox + "px";
实际上是将计算后的结果赋给了 link 元素的 style.left 属性,这会导致元素的位置发生改变。
因此,每次调用时 x + speed * gox + "px" 的值都会被重新计算,并且赋给了 link.style.left,
这会使元素的位置随之改变。所以每次调用时 console.log(x + speed * gox + "px"); 输出的值都会不同。
*/
function move() {
let x = link.offsetLeft;
let y = link.offsetTop;
if (x > w - 200 || x < 0) gox = -gox;
link.style.left = x + speed * gox + "px";
if (y > h - 100 || y < 0) goy = -goy;
link.style.top = y + speed * goy + "px";
animationFrameId = requestAnimationFrame(move);
}
link.onmouseenter = function () {
cancelAnimationFrame(animationFrameId); // Stop the animation
};
link.onmouseleave = function () {
move(); // Resume animation loop
};
move(); // Start the animation loop
};
</script>
</head>
<body>
<a id="link" href="https://www.baidu.com" target="_blank"></a>
<div>
<h2>这是文字</h2>
<h2>这是文字</h2>
<h2>这是文字</h2>
<h2>这是文字</h2>
<h2>这是文字</h2>
<h2>这是文字</h2>
<h2>这是文字</h2>
<h2>这是文字</h2>
<h2>这是文字</h2>
<h2>这是文字</h2>
<h2>这是文字</h2>
<h2>这是文字</h2>
<h2>这是文字</h2>
<h2>这是文字</h2>
<h2>这是文字</h2>
<h2>这是文字</h2>
<h2>这是文字</h2>
<h2>这是文字</h2>
<h2>这是文字</h2>
<h2>这是文字</h2>
<h2>这是文字</h2>
<h2>这是文字</h2>
<h2>这是文字</h2>
<h2>这是文字</h2>
<h2>这是文字</h2>
<h2>这是文字</h2>
<h2>这是文字</h2>
<h2>这是文字</h2>
<h2>这是文字</h2>
<h2>这是文字</h2>
<h2>这是文字</h2>
<h2>这是文字</h2>
<h2>这是文字</h2>
<h2>这是文字</h2>
<h2>这是文字</h2>
<h2>这是文字</h2>
</div>
</body>
</html>