原文: How to Make a Custom Mouse Cursor with CSS and JavaScript
你是否曾经访问过一个网站,并为其功能感到惊讶?其中一个可能是一个很酷的鼠标光标,与你习惯的常规箭头或指针光标不同。
这确实可以改善用户体验,最近我一直在想它是如何工作的。所以我开始做一些研究,我发现了它是如何做到的。
在这篇文章中,我将解释如何制作一个自定义的鼠标指针。在本文结束时,你将学会如何用两种不同的方法制作这些光标,即使用 CSS 和 JavaScript。然后,你将准备好用不同的创意光标来美化你的网站,以增加互动性。准备好了吗?让我们开始吧。
前提
本文对初学者友好,但要理解一些概念,你应该具备以下基本知识:
- HTML
- 基本的 CSS
- 基本的 JavaScript
如何用 CSS 定制鼠标光标
用 CSS 来定制鼠标指针是非常简单的,因为 CSS 已经有一个属性来处理这个问题。我们所要做的就是识别这个属性并使用它。
作为前端工程师,我们经常使用这个属性,它就是万能的 cursor
属性。是的,这个属性让我们有能力制作一个自定义游标。
在我们去看一个实际的例子之前,让我们先看看与 CSS cursor
属性相关的值。虽然大多数开发者只使用了几个重要的值,但还有更多的值是我们应该看的。
从上面的代码片断和结果来看,你可以通过将鼠标光标悬停在包含每个 CSS cursor
属性值名称的那些方框上,看到并测试出 CSS 的不同鼠标光标。
现在,我如何使用 CSS 来定制鼠标光标?要使用这个方法,你只需要告诉 CSS 你打算用什么图片,并使用 url
值将 cursor
属性指向图片的 URL。
body {
cursor: url('image-path.png'),auto;
}
从上面的代码片段中,你可以看到我在文档主体上设置了这个,所以无论光标在哪里移动,它都可以适用于光标。它有在 url()
中指定的图像。
该属性的下一个值是一个后备值,以备图片无法加载或由于一些内部故障而无法找到。我相信你不希望你的网站“没有光标“,所以添加一个回退是非常重要的。你也可以根据需求添加尽可能多的后备 URL。
body {
cursor: url('image-path.png'), url('image-path-2.svg),
url('image-path-3.jpeg'), auto;
}
你也可以在你的网页的某个特定元素或部分上定制光标。下面是一个 CodePen 的例子:
这就是在 CSS 中定制光标的全部内容。现在让我们来看看如何在 JavaScript 中做到这一点。
如何用 JavaScript 制作自定义鼠标光标
为了用 JavaScript 实现这一点,你需要操作 DOM 来获得所需的结果。
首先,让我们看看 HTML:
HTML
<div class="cursor rounded"></div>
<div class="cursor pointed"><div>
从上面的代码片段中,我创建了两个 div
来表示光标。我们的计划是通过 JavaScript 来操作这些 div,这样它们在网页上的移动就会被 JavaScript 的 mousemove
事件利用鼠标移动的 X 和 Y 坐标进行滚动。
现在让我们来看看 CSS 的部分,这将使我们的工作更有意义。
如何用 CSS 设计自定义光标的样式
body{
background-color: #1D1E22;
cursor: none;
}
.rounded{
width: 30px;
height: 30px;
border: 2px solid #fff;
border-radius: 50%;
}
.pointed{
width: 7px;
height: 7px;
background-color: white;
border-radius: 50%;
}
看一下上面的 CSS 代码,我禁用了光标(记得 cursor:none
吗), 这将使光标不可见,只允许我们的自定义光标显示。
我对这些 div
设置了样式,使它们具有独特的“光标式”外观。你绝对可以用它做得更多,也许可以添加背景图片、表情符号、贴纸等等,只要有图片就可以了。现在,让我们看一下 JavaScript。
如何使用 JavaScript 来使光标移动
const cursorRounded = document.querySelector('.rounded');
const cursorPointed = document.querySelector('.pointed');
const moveCursor = (e)=> {
const mouseY = e.clientY;
const mouseX = e.clientX;
cursorRounded.style.transform = `translate3d(${mouseX}px, ${mouseY}px, 0)`;
cursorPointed.style.transform = `translate3d(${mouseX}px, ${mouseY}px, 0)`;
}
window.addEventListener('mousemove', moveCursor)
我在全局窗口对象上添加了一个事件监听器来监听任何鼠标移动。当鼠标移动时,moveCursor
函数表达式被调用,它接收事件对象作为参数。有了这个参数,我就能在页面的任何一点上获得鼠标的 X 和 Y 坐标。
我已经使 用JavaScript querySelector
从 DOM 中选择了每种光标。所以我所要做的就是根据鼠标的 X 和 Y 坐标移动它们,方法是用 translate3d
值控制样式上的 transform
属性。这样,当鼠标移动到网页上的任何一点时,这些 div 就能移动。
而你所看到的反斜线被称为模板字面量。这样就可以很容易地写出变量,把它们附加到字符串中。另一种方法是将变量与字符串连接起来。
很简单,对吗?
下面是一个 CodePen 示例和上述代码片段的结果:
哪种方法效果最好
现在就看你作为开发者选择哪种最适合你的方法了。如果你想使用一些漂亮的表情符号或图像作为光标,你可以选择使用 CSS。另一方面,你可能想使用 JavaScript,这样你就可以根据自己的选择定制复杂的形状,并对光标的移动进行动画处理。
无论哪种方式都可以,只要你能得到你想要的结果,并打动你的网站的所有访问者。
我希望你从这篇文章中学到了很多东西,我期待着看到你用这些知识建立的网站。
想了解更多的 CSS 技巧,请在 Twitter 上关注我。
谢谢你阅读本文。