周末没有啥事 看到了一个非常有意思的插件 就是 在使用谷歌浏览器的时候,可以把鼠标的默认样式换一个皮肤。就像下面的这种样子。
实际谷歌浏览器插件开发对于有前端编程基础的小伙伴 还是比较容易的,实际也是写 html css js 。
所以这个插件使用的技术:
html css 和 js 实现。
先看一下 最终实现的样子
大概插件就是这样的,使用方式 在下面选择我们喜欢的图标,然后选中后,点击应用选择 。这个时候我们再使用浏览器的时候 发现我们的鼠标光标 就变了一个皮肤。
周末闲着没事,就简单的也写了一个类似的插件,正好也是练习一下自己的前端技术。 插件功能大概实现了 光标皮肤切换。写完后 简单的测试了一下 ,可以使用。
分享一下代码结构
bash
<!-- 作者:json -->
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="自定义光标皮肤,让您的浏览体验更加个性化">
<title>自定义光标皮肤</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
:root {
--primary-color: #3498db;
--primary-dark: #2980b9;
--danger-color: #e74c3c;
--danger-dark: #c0392b;
--text-color: #333;
--text-light: #7f8c8d;
--text-dark: #2c3e50;
--bg-gradient: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
--card-bg: rgba(255, 255, 255, 0.8);
--shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
--shadow-hover: 0 8px 15px rgba(0, 0, 0, 0.1);
--border-radius: 10px;
--transition: all 0.3s ease;
}
body {
width: 360px;
min-height: 480px;
font-family: 'Microsoft YaHei', sans-serif;
background: var(--bg-gradient);
color: var(--text-color);
padding: 20px;
overflow-x: hidden;
}
.container {
display: flex;
flex-direction: column;
height: 100%;
}
header {
position: sticky;
top: 0;
z-index: 100;
background: var(--bg-gradient);
padding-bottom: 15px;
margin-bottom: 20px;
box-shadow: var(--shadow);
border-radius: var(--border-radius);
}
.header-content {
text-align: center;
margin-bottom: 15px;
}
h1 {
font-size: 24px;
margin-bottom: 10px;
color: var(--text-dark);
text-shadow: 1px 1px 2px rgba(0,0,0,0.1);
}
.subtitle {
font-size: 14px;
color: var(--text-light);
margin-bottom: 15px;
}
.actions {
display: flex;
justify-content: center;
margin-bottom: 10px;
}
.status {
text-align: center;
font-size: 14px;
color: #27ae60;
height: 20px;
margin-top: 5px;
transition: var(--transition);
}
.cursor-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 15px;
margin-bottom: 20px;
padding-top: 5px;
}
.cursor-item {
background-color: var(--card-bg);
border-radius: var(--border-radius);
padding: 15px;
cursor: pointer;
transition: var(--transition);
display: flex;
flex-direction: column;
align-items: center;
box-shadow: var(--shadow);
position: relative;
height: 120px; /* 固定高度,确保所有项目大小一致 */
justify-content: space-between; /* 确保内容均匀分布 */
will-change: transform; /* 优化动画性能 */
}
.cursor-item:hover {
transform: translateY(-5px);
box-shadow: var(--shadow-hover);
}
.cursor-item.active {
background-color: rgba(52, 152, 219, 0.2);
border: 2px solid var(--primary-color);
}
.cursor-item.active::after {
content: "✓";
position: absolute;
top: 5px;
right: 5px;
color: var(--primary-color);
font-weight: bold;
}
.cursor-preview {
width: 64px;
height: 64px;
margin-bottom: 10px;
display: flex;
align-items: center;
justify-content: center;
background-color: rgba(255, 255, 255, 0.5);
border-radius: 8px;
padding: 5px;
position: relative;
}
.cursor-preview img {
max-width: 32px; /* 限制最大宽度为32px */
max-height: 32px; /* 限制最大高度为32px */
width: auto; /* 保持宽高比 */
height: auto; /* 保持宽高比 */
object-fit: contain; /* 确保图片完全显示 */
display: block; /* 消除底部间隙 */
image-rendering: pixelated; /* 像素图片更清晰 */
image-rendering: -moz-crisp-edges;
image-rendering: crisp-edges;
}
/* 添加放大效果,方便用户查看小图标 */
.cursor-preview:hover img {
transform: scale(1.5);
transition: transform 0.2s ease;
}
.cursor-name {
font-size: 12px;
text-align: center;
color: var(--text-dark);
width: 100%;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
button {
background-color: var(--primary-color);
color: white;
border: none;
padding: 10px 20px;
border-radius: 5px;
cursor: pointer;
font-size: 16px;
transition: var(--transition);
box-shadow: var(--shadow);
}
button:hover {
background-color: var(--primary-dark);
transform: translateY(-2px);
box-shadow: var(--shadow-hover);
}
button:disabled {
background-color: #bdc3c7;
cursor: not-allowed;
transform: none;
box-shadow: none;
}
.reset-btn {
background-color: var(--danger-color);
margin-left: 10px;
}
.reset-btn:hover {
background-color: var(--danger-dark);
}
.loading {
display: none;
text-align: center;
margin: 20px 0;
}
.loading-spinner {
border: 4px solid rgba(0, 0, 0, 0.1);
border-left-color: var(--primary-color);
border-radius: 50%;
width: 30px;
height: 30px;
animation: spin 1s linear infinite;
margin: 0 auto;
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
.empty-state {
text-align: center;
padding: 40px 20px;
color: var(--text-light);
}
.empty-state p {
margin-bottom: 15px;
}
/* 添加响应式设计 */
@media (max-width: 320px) {
.cursor-grid {
grid-template-columns: repeat(2, 1fr);
}
}
/* 添加暗黑模式支持 */
@media (prefers-color-scheme: dark) {
:root {
--card-bg: rgba(30, 39, 46, 0.8);
--text-color: #f5f6fa;
--text-light: #dcdde1;
--text-dark: #f5f6fa;
--bg-gradient: linear-gradient(135deg, #2f3640 0%, #1e272e 100%);
--shadow: 0 4px 6px rgba(0, 0, 0, 0.3);
--shadow-hover: 0 8px 15px rgba(0, 0, 0, 0.4);
}
.cursor-preview {
background-color: rgba(0, 0, 0, 0.2);
}
button:disabled {
background-color: #4b6584;
}
}
/* 添加无障碍支持 */
.sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border-width: 0;
}
/* 键盘导航焦点样式 */
.cursor-item:focus-visible {
outline: 3px solid var(--primary-color);
outline-offset: 2px;
}
button:focus-visible {
outline: 3px solid white;
outline-offset: 2px;
}
</style>
</head>
<body>
<div class="container">
<header>
<div class="header-content">
<h1>自定义光标皮肤</h1>
<p class="subtitle">选择您喜欢的光标样式,让浏览体验更加个性化</p>
<p class="subtitle">更多资源:www.wwwoop.com</p>
</div>
<div class="actions">
<button id="apply-btn" disabled>应用选择</button>
<button id="reset-btn" class="reset-btn">恢复默认</button>
</div>
<div id="status" class="status" aria-live="polite"></div>
</header>
<div id="loading" class="loading" aria-hidden="true">
<div class="loading-spinner"></div>
<p class="sr-only">正在加载光标...</p>
</div>
<div id="cursor-grid" class="cursor-grid" role="listbox" aria-label="光标选项列表">
<!-- 光标选项将通过JavaScript动态加载 -->
</div>
<div id="empty-state" class="empty-state" style="display: none;">
<p>没有找到光标皮肤</p>
<p>请确保images文件夹中有光标图片</p>
</div>
</div>
<script src="popup.js"></script>
</body>
</html>
以上就是 html 代码
插件写完后,也装到了自己的谷歌浏览器上测试了一下,可以正常使用。但是不保证是否还有细节性的bug。如果有小伙伴 对这个插件有兴趣,可以拿去玩一玩。
代码完全开源 ,因为是自己写的插件,所以没有上架到谷歌应用商店,大家拿到插件后,有开发能力的小伙伴可以自由发挥。直接安装使用也是可以的。
https://wwwoop.com/home/Index/projectInfo?goodsId=56&typeParam=1&subKey=0