在录视频教程时,经常会需要在不同网页之间切换,网页上面移动鼠标、键盘输入等操作。最终的效果是看不到鼠标,导致整个画面像是静止的,并且画面比较小,看不清。Houzikeji给出一个javascript的方案。

鼠标特效

既然我们的目标是浏览器,我们是否能做点鼠标特效,这样就会比较显眼。我们经常会在一些网站上看到鼠标追踪的效果。
话不多说,直接看代码。代码由GPT生成,我们做了适当修改。
这段代码会生成一些小蓝点,追踪鼠标的特效。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
var css = '.trajectory-point { \
  position: fixed; \
  width: 10px; \
  height: 10px; \
  border-radius: 50%;\
  background-color: rgba(0, 0, 255, 0.5);\
  z-index:100;\
  pointer-events: none;  /* 让鼠标事件可以穿过这个元素 */ \
  transition: opacity 1s; \
}',
    head = document.head || document.getElementsByTagName('head')[0],
    style = document.createElement('style');

head.appendChild(style);
style.type = 'text/css';
style.appendChild(document.createTextNode(css));


document.body.addEventListener('mousemove', function(e) {
  //var x = e.clientX;
  //var y = e.clientY;
  var zoom = parseFloat(getComputedStyle(document.body).zoom);
  var x = (e.pageX - window.pageXOffset) / zoom;
  var y = (e.pageY - window.pageYOffset) / zoom;

  var point = document.createElement('div');
  point.className = 'trajectory-point';
  point.style.left = (x - 5) + 'px';  /* 减去5是为了让轨迹点的中心和鼠标的位置对齐 */
  point.style.top = (y - 5) + 'px';

  document.body.appendChild(point);

  setTimeout(function() {
    point.style.opacity = 0;  /* 1秒后,轨迹点的透明度变为0,即轨迹点开始消失 */
  }, 0);

  setTimeout(function() {
    document.body.removeChild(point);  /* 1秒后,从文档中移除轨迹点 */
  }, 1000);
});

鼠标显示

鼠标特效显示完了之后,会消失。这段代码加了一个圆圈追踪鼠标,本来想做一个放大镜的效果。代码同样由GPT生成。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
var css2 = '.magnifier { \
  position: fixed;\
  width: 200px;\
  height: 200px;\
  border-radius: 50%;\
  border: 1px solid black;\
  box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.5);\
  background-repeat: no-repeat;\
  z-index:100;\
  pointer-events: none;  /* 让鼠标事件可以穿过这个元素 */\
}',
    head = document.head || document.getElementsByTagName('head')[0],
    style2 = document.createElement('style');

head.appendChild(style2);
style2.type = 'text/css';
style2.appendChild(document.createTextNode(css2));

var magnifier = document.createElement('div');
magnifier.className = 'magnifier';
document.body.appendChild(magnifier);

document.body.addEventListener('mousemove', function(e) {
  //var x = e.pageX;
  //var y = e.pageY;
  var zoom = parseFloat(getComputedStyle(document.body).zoom);
  var x = (e.pageX - window.pageXOffset) / zoom;
  var y = (e.pageY - window.pageYOffset) / zoom;

  magnifier.style.left = (x - 100) + 'px';  /* 减去100是为了让放大镜的中心和鼠标的位置对齐 */
  magnifier.style.top = (y - 100) + 'px';

  magnifier.style.backgroundImage = 'url(' + document.documentElement.innerHTML + ')';
  magnifier.style.backgroundPosition = (-x * 2 + 100) + 'px ' + (-y * 2 + 100) + 'px';
  magnifier.style.backgroundSize = (document.documentElement.offsetWidth * 2) + 'px ' + (document.documentElement.offsetHeight * 2) + 'px';
});

页面放大

同时增加了一个右键菜单,可以对页面进行放大的操作,这样就可以看清楚页面内容了。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
var contextMenu = document.createElement('div');
contextMenu.style.display = 'none';
contextMenu.style.background = '#fff';
contextMenu.style.border = '1px solid #ccc';
document.body.appendChild(contextMenu);

// 创建放大菜单项
var zoomInItem = document.createElement('div');
zoomInItem.textContent = '放大到150%';
zoomInItem.onclick = function() {
  document.body.style.zoom = '150%';
  contextMenu.style.display = 'none';
};
contextMenu.appendChild(zoomInItem);

// 创建还原菜单项
var resetZoomItem = document.createElement('div');
resetZoomItem.textContent = '还原缩放';
resetZoomItem.onclick = function() {
  document.body.style.zoom = '100%';
  contextMenu.style.display = 'none';
};
contextMenu.appendChild(resetZoomItem);

// 监听右键点击事件
document.addEventListener('contextmenu', function(e) {
  e.preventDefault();
  contextMenu.style.position = 'fixed';
  var zoom = parseFloat(getComputedStyle(document.body).zoom);
  var x = (e.pageX - window.pageXOffset) / zoom;
  var y = (e.pageY - window.pageYOffset) / zoom;

  contextMenu.style.left = x + 'px';
  contextMenu.style.top = y + 'px';
  contextMenu.style.display = 'block';
});

// 点击其他地方时隐藏右键菜单
document.addEventListener('click', function() {
  contextMenu.style.display = 'none';
});

最终效果

最终效果如页面所示。