Поведение:
- При наведении на книгу она слегка приподнимается (translate-y).
- При нажатии , выбранная книга развернется и отобразится подробная информация.
- Однако при нажатии книга неожиданно «растягивается» или меняет размер, прежде чем принять окончательное состояние.
Вот текущее состояние состояние проблемы: веб-сайт
Код:
Вот соответствующий код:
Код: Выделить всё
// Book.js
import { motion } from "framer-motion";
import Image from "next/image";
import { useState } from "react";
export default function Book({ data, isSelected, onSelect, isAnyHovered, onHover }) {
const { title, author, route, year } = data;
const [isHovered, setIsHovered] = useState(false);
const [imageSize, setImageSize] = useState({ width: 0, height: 0 });
const handleImageLoad = ({ target }) => {
setImageSize({ width: target.naturalWidth / 4, height: target.naturalHeight / 4 });
};
const getImageClassName = () => {
let className = "transition-all duration-800";
if (isHovered) {
className += " opacity-100 -translate-y-2";
} else {
className += " opacity-40 translate-y-0";
}
return className;
};
return (
onSelect(data)}>
{
setIsHovered(true);
onHover(data);
}}
onMouseLeave={() => {
setIsHovered(false);
onHover(null);
}}
/>
{isSelected && (
{title}
by {author}
{year}
)}
);
}
Код: Выделить всё
// page.js
import { motion, AnimatePresence } from "framer-motion";
import { useState } from "react";
import Book from "./Book";
export default function Home() {
const [books, setBooks] = useState([]);
const [selectedBook, setSelectedBook] = useState(null);
const [hoveredBook, setHoveredBook] = useState(null);
const handleSelectBook = (book) => {
setSelectedBook(selectedBook === book ? null : book);
};
return (
[list]
{books.map((book) => (
))}
[/list]
);
}
- Элемент motion.li использует макет Framer Motion, который может
вызывать эффект растяжения. - Компонент Image динамически
вычисляет свой размер с помощью naturalWidth и naturalHeight. Может ли этот
перерасчет способствовать возникновению проблемы? - Классы перехода и
преобразования Tailwind (translate-y,transition-all и т. д.) могут быть
конфликтует с макетом Framer Motion.
- Удаление макета из motion.li, но это нарушает анимацию.
- Отключение всех классов перехода Tailwind — это не решило проблему.
- Жесткое кодирование ширины и высоты изображения вместо вычисления их динамически — это уменьшило, но не устранило эффект растяжения.
- Почему происходит растягивающаяся анимация, когда книга нажали?
- Как предотвратить странный эффект изменения размера/растяжения, сохранив при этом анимацию при наведении и выборе без изменений?
Подробнее здесь: https://stackoverflow.com/questions/793 ... my-bookshe