以Codepen为例.我有一个悬停效果,渐变跟随鼠标光标.
我有两个CSS变量,分别为--x
和--y
,用于跟踪鼠标在按钮上的位置.
background: radial-gradient(circle closest-side, pink, transparent)
时,它会在正确的位置创建渐变.
Document.querySelector()
和EventTarget.addEventListener()
为'mousemove'
事件注册处理程序.
Element.getBoundingClientRect()
和CSSStyleDeclaration.setProperty()
更新--x
和--y
个CSS变量的值.
现在,我try 在带有MUI按钮的React Typescript中将其重新创建为样式化组件.
Button.tsx
import React from 'react';
import { styled, Theme } from '@mui/material/styles';
import { Button, SxProps } from '@mui/material';
const HoverButton = styled(Button)(({ theme }) => ({
borderRadius: 100,
".mouse-cursor-gradient-tracking": {
position: "relative",
background: "#7983ff",
padding: "0.5rem 1rem",
fontSize: "1.2rem",
border: "none",
color: theme.palette.secondary.contrastText,
cursor: "pointer",
outline: "none",
overflow: "hidden",
},
".mouse-cursor-gradient-tracking span": {
position: "relative",
},
".mouse-cursor-gradient-tracking:before": {
--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",
},
".mouse-cursor-gradient-tracking:hover:before": {
"--size": "200px"
},
}));
export function SubmitButton(props: { children: React.ReactNode; sx?: SxProps<Theme> }) {
let button:<Element | null> = document.querySelector('.mouse-cursor-gradient-tracking');
button.addEventListener('mousemove', e => {
let rect = e.target.getBoundingClientRect();
let x = e.clientX - rect.left;
let y = e.clientY - rect.top;
button.style.setProperty('--x', x + 'px');
button.style.setProperty('--y', y + 'px');
});
return (
<HoverButton type="submit" variant="contained" sx={props.sx}>
{props.children}<span>Hover me</span>
</HoverButton>
);
}