برنامه نویسی

با حرکت فریم، انیمیشن‌های مکان‌نمای سفارشی خیره‌کننده ایجاد کنید

سلام dev.to جامعه!

در این پست، می خواهم به اشتراک بگذارم که چگونه می توانیم با استفاده از Framer Motion، انیمیشن های مکان نما و دکمه های سفارشی را در یک برنامه React ایجاد کنیم. Framer Motion یک کتابخانه انیمیشن قدرتمند برای React است که برای ایجاد انیمیشن های تعاملی که تجربه کاربر را بهبود می بخشد، عالی است.

درباره پروژه

این پروژه یک برنامه ساده React است که شامل مکان نما سفارشی و انیمیشن های دکمه های مختلف است. هدف ما این است که تعاملات کاربران را جذاب تر و لذت بخش تر کنیم. برای دیدن دموی زنده زیر را بررسی کنید.

نسخه ی نمایشی

شروع شدن

ابتدا اجازه دهید پروژه را با استفاده از Vite راه اندازی کنیم.

1. راه اندازی پروژه

npm create vite@latest custom-cursor-framer-motion -- --template react
cd custom-cursor-framer-motion
npm install
npm run dev
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

2. نصب Framer Motion

بعد، Framer Motion را نصب کنید:

npm install framer-motion
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ایجاد مکان نما سفارشی

برای سفارشی کردن مکان نما، از Framer Motion برای ایجاد یک motion.div استفاده می کنیم که به حرکات ماوس با انیمیشن پاسخ می دهد. ما همچنین از Context API برای مدیریت حالت متغیر انیمیشن مکان نما در سطح جهانی استفاده خواهیم کرد.

ایجاد زمینه

ابتدا یک زمینه برای مدیریت انواع انیمیشن مکان نما ایجاد کنید:

// src/components/CustomCursor.jsx
import { createContext, useState, useContext } from 'react';
const CursorContext = createContext();
export const useCursorContext = () => useContext(CursorContext);
export const CursorContextProvider = ({ children }) => {
  const [initialCursorVariant, setInitialCursorVariant] = useState('');
  const [animateCursorVariant, setAnimateCursorVariant] = useState('');
// This function allows for smooth transitions between cursor states
  const animateCursor = (variant) => {
    setInitialCursorVariant(animateCursorVariant);
    setAnimateCursorVariant(variant);
  };
  return (
    CursorContext.Provider
      value={{
        initialCursorVariant,
        setInitialCursorVariant,
        animateCursorVariant,
        setAnimateCursorVariant,
        animateCursor,
      }}
    >
      {children}
    CursorContext.Provider>
  );
};
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مؤلفه مکان نما سفارشی

در اینجا کد مولفه مکان نما آمده است که از Framer Motion برای انیمیشن ها استفاده می کند و موقعیت و ظاهر مکان نما را مدیریت می کند:

// src/components/CustomCursor.jsx
import { motion, useMotionValue } from 'framer-motion';
import { useEffect } from 'react';
import '../assets/style/custom-cursor.css';
import { useCursorContext } from '../components/CursorContext.jsx';

function Cursor() {
  const { initialCursorVariant, animateCursorVariant, animateCursor } = useCursorContext();
  const cursorX = useMotionValue();
  const cursorY = useMotionValue();

  const variants = {
    cursorEnter: {
      border: '1px solid #eeff00',
      boxShadow: '0 0 1px 0px #eeff00 inset, 0 0 1px 0px #eeff00',
      scale: 2,
      borderRadius: '50%',
      backgroundColor: 'transparent',
      transition: {
        duration: 0.2,
      },
    },
    cursorLeave: {
      scale: 0,
      border: 0,
      backgroundColor: 'transparent',
      transition: {
        duration: 0.2,
      },
    },
    buttonHover: {
      scale: 1,
      backgroundColor: '#eeff00',
      borderRadius: '50%',
    },
  };

  useEffect(() => {
    const app = document.querySelector('#app');
    const mouseMoveHandler = (e) => {
      cursorX.set(e.clientX - 12);
      cursorY.set(e.clientY - 12);
    };
    const mouseEnterHandler = () => {
      animateCursor('cursorEnter');
    };
    const mouseLeaveHandler = () => {
      animateCursor('cursorLeave');
    };
    window.addEventListener('mousemove', mouseMoveHandler);
    app.addEventListener('mouseenter', mouseEnterHandler);
    app.addEventListener('mouseleave', mouseLeaveHandler);
    return () => {
      window.removeEventListener('mousemove', mouseMoveHandler);
      app.removeEventListener('mouseenter', mouseEnterHandler);
      app.removeEventListener('mouseleave', mouseLeaveHandler);
    };
  }, [animateCursor, cursorX, cursorY]);

  return (
    motion.div
      className="cursor"
      variants={variants}
      initial={initialCursorVariant}
      animate={animateCursorVariant}
      style={{
        translateX: cursorX,
        translateY: cursorY,
        transformOrigin: 'center',
      }}
    />
  );
}

export default Cursor;
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

توضیح:

  • useMotionValue: این قلاب از Framer Motion برای ایجاد مقادیر حرکتی استفاده می شود که با موقعیت مکان نما به روز می شوند.
  • انواع: سبک های مختلفی را برای حالت های مکان نما تعریف می کند، مانند هنگام ورود به یک منطقه خاص یا نگه داشتن ماوس روی دکمه ها.
  • useEffect: شنوندگان رویداد را برای حرکت ماوس و تعامل مکان نما تنظیم می کند. موقعیت مکان نما را به روز می کند و ظاهر آن را بر اساس وضعیت مکان نما تغییر می دهد.
  • motion.div: این عنصر مکان نما متحرک است که با توجه به وضعیت مکان نما فعلی استایل و متحرک شده است.

انیمیشن های دکمه ای

تعریف انیمیشن برای دکمه ها نیز ساده است. در اینجا نمونه‌ای از دکمه‌ای است که با نگه‌داشتن ماوس روی آن یا کلیک کردن، انیمیشن‌ها را پخش می‌کند:

// src/components/ButtonHover.jsx
import { motion } from 'framer-motion';
import '../assets/style/button-hover.css';
import { useCursorContext } from '../components/CursorContext.jsx';

function ButtonHover() {
  const { animateCursor } = useCursorContext();
  const mouseEnterHandler = () => {
    animateCursor('buttonHover');
  };
  const mouseLeaveHandler = () => {
    animateCursor('cursorEnter');
  };
  return (
    motion.button
      className="button-hover"
      onMouseEnter={mouseEnterHandler}
      onMouseLeave={mouseLeaveHandler}
      initial={{
        backgroundColor: '#000',
        color: '#fff',
      }}
      whileHover={{
        backgroundColor: '#eeff00',
        color: '#000',
      }}
      whileTap={{
        scale: 0.9,
      }}
    >
      Hover and Click Me!
    motion.button>
  );
}

export default ButtonHover;
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

توضیح:

  • استفاده از CursorContext: تابع animateCursor را از متن مکان نما بازیابی می کند تا ظاهر مکان نما را بر اساس تعامل دکمه تغییر دهد.
  • mouseEnterHandler: هنگامی که ماوس وارد ناحیه دکمه می شود، انیمیشن مکان نما روی دکمه هاور تنظیم می شود.
  • mouseLeaveHandler: هنگامی که ماوس از ناحیه دکمه خارج می شود، انیمیشن مکان نما به cursorEnter برمی گردد.
  • حرکت.دکمه: این عنصر دکمه از Framer Motion برای انیمیشن ها از جمله افکت های شناور و کلیک استفاده می کند. رنگ پس زمینه خود را تغییر می دهد و با کلیک کمی کاهش می یابد.

جزء برنامه

در اینجا کد اصلی است برنامه مؤلفه ای که تمام بخش های برنامه را ادغام می کند:

// src/App.jsx
import './App.css';
import CustomCursor from './components/CustomCursor.jsx';
import ButtonHover from './components/ButtonHover.jsx';
import { CursorContextProvider } from './components/CursorContext.jsx';

function App() {
  return (
    div id="app">
      CursorContextProvider>
        CustomCursor />
        div className="center">
          ButtonHover />
        div>
      CursorContextProvider>
    div>
  );
}

export default App;
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

توضیح:

  • CursorContextProvider: برنامه را می‌پیچد تا زمینه مکان‌نما را برای همه اجزای فرزند فراهم کند، و اطمینان حاصل کند که موقعیت مکان‌نمای سفارشی و انیمیشن‌ها در سطح جهانی مدیریت می‌شوند.
  • مکان نما سفارشی: مؤلفه ای که مکان نما سفارشی را رندر و متحرک می کند.
  • ButtonHover: یک جزء دکمه با انیمیشن های شناور و کلیک.

فایل های CSS

برای یک ظاهر طراحی، این پروژه شامل فایل های CSS زیر است:

  • src/assets/style/custom-cursor.css: شامل سبک های مکان نما سفارشی است.
  • src/assets/style/button-hover.css: شامل سبک های افکت شناور دکمه است.
  • src/App.css: یک ظاهر طراحی کلی برای طرح بندی برنامه.

می‌توانید این فایل‌های CSS را مستقیماً در پروژه آزمایشی بررسی کنید تا نحوه اعمال سبک‌ها را درک کنید و در صورت نیاز آنها را سفارشی کنید.

نسخه نمایشی زنده و کد

می توانید پروژه کامل و نسخه ی نمایشی زنده را از طریق پیوند StackBlitz زیر بررسی کنید:

پروژه StackBlitz


نظرات و سوالات خود را در مورد این پروژه در نظرات به اشتراک بگذارید! کد نویسی مبارک! 🎉


نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا