- 查看: 329
- 回复: 1
实现原理
在相关代码中,我们会使用源自 astro 官方的 JS 库 astrojs/solid-js 和 solid-js 。实现这个动效很简单,这仅是一个 React 组件,用于处理鼠标移动事件,并根据鼠标的位置动态设置 Card 的 CSS 变量,从而实现光晕跟随鼠标移动的交互效果。
步骤
创建 src/components/ScriptComp.tsx ,写入以下内容
JavaScript:
import type { Component } from "solid-js";
export const ScriptComp: Component = () => {
const handleOnMouseMove = (e: any) => { // 截取目标元素
const { currentTarget: target } = e;
if (!target) return;
const rect = target.getBoundingClientRect(),
x = e.clientX - rect.left, // 即时获取鼠标x,y坐标
y = e.clientY - rect.top;
target.style.setProperty("--mouse-x", `${x}px`); // 根据鼠标坐标更改css属性,下同
target.style.setProperty("--mouse-y", `${y}px`);
};
for (const card of document.querySelectorAll(".card")) { // 遍历astro的.card元素
//@ts-ignore
card.onmousemove = (e) => handleOnMouseMove(e); // 添加事件监听器
}
return <></>
}
同时需要我们在应用页面添加以下内容
JavaScript:
import { ScriptComp } from "../../components/ScriptComp";
~~~
</CardGrid>
<ScriptComp client:only="solid-js" />
你还需要在 astro 的 tsconfig.json 和 astro.config.mjs 内修改配置为
JSON:
{
"extends": "astro/tsconfigs/strict",
"compilerOptions": {
"jsx": "preserve",
"jsxImportSource": "solid-js"
}
}
JavaScript:
import solid from '@astrojs/solid-js';
~~~
export default defineConfig({
integrations: [
solid(),
~~~
搞定!
- 内容版权许可
- CC BY-NC 署名-非商业性使用
领取红包用户





