【css】伪元素实现跟随鼠标移动的渐变效果

主要功能是在按钮上实现鼠标跟随渐变效果。每当用户将鼠标移动到按钮上时,按钮会显示一个以鼠标位置为中心的渐变效果。

1. 核心部分: 监听鼠标在元素内移动

监听鼠标在元素内移动,并触发该事件。

javascript 复制代码
const handleMouseMove = (e: MouseEvent) => {
  if (btnRef.value) {
      // 获取按钮相对于视口的位置和尺寸
      let rect = btnRef.value.getBoundingClientRect();
      let x = e.clientX - rect.left;
      let y = e.clientY - rect.top;
      //   将鼠标的相对位置设置为按钮的 CSS 自定义属性
      btnRef.value!.style.setProperty("--x", x + "px");
      btnRef.value!.style.setProperty("--y", y + "px");
  }
};
  • getBoundingClientRect():获取按钮相对于视口的位置和尺寸。
  • 计算鼠标相对于按钮的位置:x 和 y 分别表示鼠标在按钮内的相对 x 和 y 坐标。
  • 设置 CSS 自定义属性 (--x 和 --y):通过 btnRef.value.style.setProperty("--x", x + "px") 等语句,将鼠标的相对位置设置为按钮的 CSS 自定义属性。

2. 核心部分:伪元素实现渐变:

::before 伪元素用于创建一个随鼠标移动的渐变圆形。

css 复制代码
/* 创建一个随鼠标移动的渐变圆形 */
.btn-mouse::before {
  /* 初始状态半径为0,不可见 */
  --size: 0;
  content: "";
  position: absolute;
  left: var(--x);
  top: var(--y);
  /* 使得渐变圆心位于鼠标位置 */
  width: var(--size);
  height: var(--size);
  /* 实现圆形渐变效果,颜色从粉色过渡到透明 */
  background: radial-gradient(circle closest-side, pink, transparent);
  transform: translate(-50%, -50%);
  transition: width 0.2s ease, height 0.2s ease;
}
/* 当按钮被悬浮时,半径扩大渐变圆,使其可见 */
.btn-mouse:hover::before {
  --size: 200px;
}
  • left: var(--x); top: var(--y);使得渐变圆心位于鼠标位置。
  • 初始状态--size: 0; 表示渐变圆初始大小为 0,不可见。
  • 悬停状态 :当按钮被悬停时,--size: 200px 扩大渐变圆,使其可见。
  • 渐变效果 :通过 radial-gradient(circle closest-side, pink, transparent) 实现圆形渐变效果,颜色从粉色过渡到透明

3. 全部代码:

html 复制代码
<template>
  <div class="p-24">
    <button class="btn-mouse" @mousemove="handleMouseMove" ref="btnRef">
      <span>Hover me</span>
    </button>
  </div>
</template>
<script setup lang="ts">
const btnRef = ref<HTMLElement | null>(null);
const handleMouseMove = (e: MouseEvent) => {
  if (btnRef.value) {
    // 获取按钮相对于视口的位置和尺寸
    let rect = btnRef.value.getBoundingClientRect();
    let x = e.clientX - rect.left;
    let y = e.clientY - rect.top;
    //   将鼠标的相对位置设置为按钮的 CSS 自定义属性
    btnRef.value!.style.setProperty("--x", x + "px");
    btnRef.value!.style.setProperty("--y", y + "px");
  }
};
</script>
<style scoped>
.btn-mouse {
  position: relative;
  background: #49a7ff;
  padding: 8px 16px;
  font-size: 18px;
  color: white;
  cursor: pointer;
  border: none;
  outline: none;
  /* 跟随鼠标移动的渐变圆形。超出部分隐藏*/
  overflow: hidden;
}

.btn-mouse span {
  position: relative;
}
/* 创建一个随鼠标移动的渐变圆形 */
.btn-mouse::before {
  /* 初始状态半径为0,不可见 */
  --size: 0;
  content: "";
  position: absolute;
  left: var(--x);
  top: var(--y);
  /* 使得渐变圆心位于鼠标位置 */
  width: var(--size);
  height: var(--size);
  /* 实现圆形渐变效果,颜色从粉色过渡到透明 */
  background: radial-gradient(circle closest-side, pink, transparent);
  transform: translate(-50%, -50%);
  transition: width 0.2s ease, height 0.2s ease;
}
/* 当按钮被悬浮时,半径扩大渐变圆,使其可见 */
.btn-mouse:hover::before {
  --size: 200px;
}
</style>
相关推荐
GISer_Jing4 分钟前
AI Agent操作系统架构师:Harness Engineer解析
前端·人工智能·ai·aigc
英俊潇洒美少年13 分钟前
css中专门用来提升渲染性能、减少重排重绘的属性
前端·css
天若有情67327 分钟前
前端HTML精讲01:别再乱 div 一把抓,吃透语义化标签才是进阶第一步
前端·html
Highcharts.js27 分钟前
React 开发者的图表库生态:Highcharts React
前端·react.js·前端框架
阿部多瑞 ABU28 分钟前
文明文化悖论
前端·人工智能·ai写作
流光墨佰35 分钟前
我做了一个专为油猴打造的轻量级 Vue 组件注入库
vue.js
钛态1 小时前
Flutter 三方库 react 泛前端核心范式框架鸿蒙原生层生态级双向超能适配:跨时空重塑响应式单向数据流拓扑与高度精密生命周期树引擎解耦视图渲染控制中枢(适配鸿蒙 HarmonyOS ohos)
前端·flutter·react.js
全栈前端老曹1 小时前
【前端地图】地图开发基础概念——地图服务类型(矢量图、卫星图、地形图)、WGS84 / GCJ-02 / BD09 坐标系、地图 SDK 简介
前端·javascript·地图·wgs84·gcj-02·bd09·地图sdk
只与明月听1 小时前
RAG深入学习之向量数据库
前端·人工智能·python
吕不说1 小时前
AI 面试总挂?可能是表达出了问题:三层表达法 + STAR 进阶框架
前端