React 组件可放大图像,同时保持鼠标悬停时的尺寸 - React + Bootstrap

Jur*_*rij 5 javascript css css-transforms reactjs bootstrap-4

所以这几天我一直在到处寻找,但找不到任何有用的东西。我正在使用 React 和 Bootstrap。我想要一个无状态的功能组件,它采用图像路径并返回 img 元素,当鼠标悬停在该元素上时,会放大图像,同时保持元素的尺寸相同。

我努力了:

  1. 更改 onMouseOver 和 onMouseOut 事件中的 style 属性,如下所示
import React from "react";

const ImageHoverZoom = ({ imagePath }) => {
  return (
    <img
      src={imagePath}
      alt=""
      style={{ overflow: "hidden" }}
      onMouseOver={(e) => (e.currentTarget.style = { transform: "scale(1.25)", overflow: "hidden" })}
      onMouseOut={(e) => (e.currentTarget.style = { transform: "scale(1)", overflow: "hidden" })}
    />
  );
};

export default ImageHoverZoom;
Run Code Online (Sandbox Code Playgroud)
  1. 创建自定义 css 类并将其应用到 img 元素。

索引.css:

.hover-zoom {
  overflow: hidden;
}

.hover-zoom img {
  transition: all 0.3s ease 0s;
  width: 100%;
}

.hover-zoom img:hover {
  transform: scale(1.25);
}
Run Code Online (Sandbox Code Playgroud)

imageHoverZoom.jsx:

import React from "react";

const ImageHoverZoom = ({ imagePath }) => {
  return (
    <img
      src={imagePath}
      alt=""
      className="hover-zoom"
    />
  );
};

export default ImageHoverZoom;
Run Code Online (Sandbox Code Playgroud)
  1. 我也尝试过带有状态的类组件
import React, { Component } from "react";

class ImageHoverZoom extends Component {
  state = {
    path: this.props.imagePath,
    mouseOver: false,
  };

  render() {
    const { path, mouseOver } = this.state;
    return (
      <img
        className={`img-fluid w-100`}
        src={path}
        onMouseOver={() => this.setState({ mouseOver: true })}
        onMouseOut={() => this.setState({ mouseOver: false })}
        style={
          mouseOver 
            ? { transform: "scale(1.25)", overflow: "hidden"} 
            : { transform: "scale(1)", overflow: "hidden"}
        }
        alt=""
      />
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

理想情况下,我不想使用状态,因为我知道它会异步更新,而且我觉得当鼠标悬停在图像上时,这会导致客户端出现一些滞后。非常感谢您的帮助,提前谢谢您!

编辑:

我在我的项目以及一个全新的项目中尝试了拉胡尔下面的答案。这是相关的(我认为)文件。和以前一样。鼠标悬停时没有任何变化。

应用程序.js

import "./App.css";
import ImageHoverZoom from "./common/imageHoverZoom";

function App() {
  return <ImageHoverZoom imagePath="http://picsum.photos/400/600" />;
}

export default App;
Run Code Online (Sandbox Code Playgroud)

imageHoverZoom.jsx

import React from "react";

const ImageHoverZoom = ({ imagePath }) => {
  return (
    <div className="img-wrapper">
      <img src={imagePath} alt="" className="hover-zoom" />
    </div>
  );
};
export default ImageHoverZoom;
Run Code Online (Sandbox Code Playgroud)

索引.css

.img-wrapper {
  overflow: hidden;
}
.hover-zoom img:hover {
  transform: scale(1.25);
}
Run Code Online (Sandbox Code Playgroud)

Rah*_*hul 6

将 img 标签包裹在 div 中,然后隐藏 div 的溢出:

const ImageHoverZoom = ({ imagePath }) => {
return (
    <div className="img-wrapper">
        <img
            src={imagePath}
            alt=""
            className="hover-zoom"
        />
    </div>
);
};
export default ImageHoverZoom;
Run Code Online (Sandbox Code Playgroud)

将样式添加到 img-wrapper:

.img-wrapper{
  overflow:hidden;
}
img.hover-zoom:hover {
  transform: scale(1.25);
}
Run Code Online (Sandbox Code Playgroud)