Как отключить анимацию движения Framer в мобильной версии?

Я пытаюсь создать веб-сайт React с помощью Framer Motion, проблема в том, что созданная мной анимация хорошо выглядит на рабочем столе, но не на мобильных. Итак, планирую отключить анимацию. Как мне это сделать?

3 ответа

Не зная подробностей, я бы порекомендовал использовать для этого варианты . Внутри вашего функционального компонента создайте переменную, которая проверяет мобильные устройства. Затем заполняйте варианты только в том случае, если эта переменная ложна. Обратите внимание, что это не работает при изменении размера страницы. Компонент должен быть отрисован повторно.

Я создал для вас коробку с кодами, чтобы вы ее опробовали!

Для получения дополнительной информации о вариантах, проверьте этот курс

Еще один простой способ, который я сделал сам, когда возник именно этот вопрос. Ниже мы используем тернарную операцию для создания объекта, который мы затем распространяем, используя синтаксис расширения .

      const attributes = isMobile ? {
    drag: "x",
    dragConstraints: { left: 0, right: 0 },
    animate: { x: myVariable },
    onDragEnd: myFunction
} : { onMouseOver, onMouseLeave };

<motion.div {...attributes}> {/* stuff */} </motion.div>

Как видите, я хочу использовать onMouseEnter и onMouseLeave на рабочем столе без анимации. На мобильном я хочу наоборот. Это работает на меня отлично. Надеюсь, это тоже поможет.

Даниэль

Вот как мы это сделали:

      import {
  type ForwardRefComponent,
  type HTMLMotionProps,
  motion as Motion,
} from 'framer-motion';
import { forwardRef } from 'react';

const ReducedMotionDiv: ForwardRefComponent<
  HTMLDivElement,
  HTMLMotionProps<'div'>
> = forwardRef((props, ref) => {
  const newProps = {
    ...props,
    animate: undefined,
    initial: undefined,
    transition: undefined,
    variants: undefined,
    whileDrag: undefined,
    whileFocus: undefined,
    whileHover: undefined,
    whileInView: undefined,
    whileTap: undefined,
  };

  return <Motion.div {...newProps} ref={ref} />;
});

export const motion = new Proxy(Motion, {
  get: (target, key) => {
    if (key === 'div') {
      return ReducedMotionDiv;
    }

    // @ts-expect-error - This is a proxy, so we can't be sure what the key is.
    return target[key];
  },
});

export {
  AnimatePresence,
  type Variants,
  type HTMLMotionProps,
  type MotionProps,
  type TargetAndTransition,
  type Transition,
  type Spring,
} from 'framer-motion';

Тот же принцип, что и другие ответы, просто полный пример.

Другие вопросы по тегам