Создание компонента увеличителя изображений в React
Создайте компонент увеличителя изображений в ReactJs. С помощью пошаговых инструкций и примеров кода вы узнаете, как повысить удобство работы пользователей, позволяя им увеличивать изображения, чтобы рассмотреть их поближе. Следуйте дальше, чтобы создать свой собственный настраиваемый компонент увеличителя изображений и повысить свои навыки веб-разработки!
Шаг 1: Создание структуры компонента
Для начала давайте определим базовую структуру нашего компонента увеличителя изображений. Мы определим функцию компонента и установим его начальное состояние.
import React, { useState } from 'react';
function ImageMagnifier({
src,
width,
height,
magnifierHeight = 100,
magnifierWidth = 100,
zoomLevel = 1.5
}) {
const [[x, y], setXY] = useState([0, 0]);
const [[imgWidth, imgHeight], setSize] = useState([0, 0]);
const [showMagnifier, setShowMagnifier] = useState(false);
// Rest of the component code will be added in subsequent steps
}
Шаг 2: Управление событиями мыши
Далее давайте обработаем события мыши, чтобы управлять появлением лупы при наведении курсора на изображение.
<img
src={src}
style={{ height: height, width: width }}
onMouseEnter={(e) => {
const elem = e.currentTarget;
const { width, height } = elem.getBoundingClientRect();
setSize([width, height]);
setShowMagnifier(true);
}}
onMouseMove={(e) => {
const elem = e.currentTarget;
const { top, left } = elem.getBoundingClientRect();
const x = e.pageX - left - window.pageXOffset;
const y = e.pageY - top - window.pageYOffset;
setXY([x, y]);
}}
onMouseLeave={() => {
setShowMagnifier(false);
}}
alt={"img"}
/>
Шаг 3: Рендеринг лупы
Теперь давайте добавим элемент лупы и придадим ему стиль в зависимости от положения курсора и размеров изображения.
<div
style={{
display: showMagnifier ? "" : "none",
position: "absolute",
pointerEvents: "none",
height: `${magnifierHeight}px`,
width: `${magnifierWidth}px`,
top: `${y - magnifierHeight / 2}px`,
left: `${x - magnifierWidth / 2}px`,
opacity: "1",
border: "1px solid lightgray",
backgroundColor: "white",
backgroundImage: `url('${src}')`,
backgroundRepeat: "no-repeat",
backgroundSize: `${imgWidth * zoomLevel}px ${imgHeight * zoomLevel}px`,
backgroundPositionX: `${-x * zoomLevel + magnifierWidth / 2}px`,
backgroundPositionY: `${-y * zoomLevel + magnifierHeight / 2}px`
}}
></div>
Мы сделали это. Вот полный код и демонстрация:
// ImageMagnifier.js
import { useState } from 'react';
const ImageMagnifier = ({
src,
className,
width,
height,
alt,
magnifierHeight = 150,
magnifierWidth = 150,
zoomLevel = 3
}) => {
const [showMagnifier, setShowMagnifier] = useState(false);
const [[imgWidth, imgHeight], setSize] = useState([0, 0]);
const [[x, y], setXY] = useState([0, 0]);
const mouseEnter = (e) => {
const el = e.currentTarget;
const { width, height } = el.getBoundingClientRect();
setSize([width, height]);
setShowMagnifier(true);
}
const mouseLeave = (e) => {
e.preventDefault();
setShowMagnifier(false);
}
const mouseMove = (e) => {
const el = e.currentTarget;
const { top, left } = el.getBoundingClientRect();
const x = e.pageX - left - window.scrollX;
const y = e.pageY - top - window.scrollY;
setXY([x, y]);
};
return <div className="relative inline-block">
<img
src={src}
className={className}
width={width}
height={height}
alt={alt}
onMouseEnter={(e) => mouseEnter(e)}
onMouseLeave={(e) => mouseLeave(e)}
onMouseMove={(e) => mouseMove(e)}
/>
<div
style={{
display: showMagnifier ? '' : 'none',
position: 'absolute',
pointerEvents: 'none',
height: `${magnifierHeight}px`,
width: `${magnifierWidth}px`,
opacity: '1',
border: '1px solid lightgrey',
backgroundColor: 'white',
borderRadius: '5px',
backgroundImage: `url('${src}')`,
backgroundRepeat: 'no-repeat',
top: `${y - magnifierHeight / 2}px`,
left: `${x - magnifierWidth / 2}px`,
backgroundSize: `${imgWidth * zoomLevel}px ${imgHeight * zoomLevel}px`,
backgroundPositionX: `${-x * zoomLevel + magnifierWidth / 2}px`,
backgroundPositionY: `${-y * zoomLevel + magnifierHeight / 2}px`,
}}
/>
</div>
};
export default ImageMagnifier;
// App.js
import React from 'react';
import ImageMagnifier from './ImageMagnifier';
const App = () => {
return (
<div>
<ImageMagnifier
src="../images/demo-img.jpg"
width={300}
height={200}
magnifierHeight={100}
magnifierWidth={100}
zoomLevel={2}
alt="Sample Image"
/>
</div>
);
};
export default App;
Заключение
Вот и все! Мы успешно создали простой, но функциональный компонент лупы для изображений в React. Теперь пользователи могут наводить курсор на изображения, чтобы внимательно их рассмотреть, благодаря нашей интуитивно понятной функции лупы.
Не стесняйтесь настраивать и улучшать этот компонент в соответствии с вашими потребностями. Счастливого кодинга!