当前位置: 首页 > article >正文

挑战用React封装100个组件【004】

项目地址
https://github.com/hismeyy/react-component-100

组件描述
组件适用于展示图片的地方,提供了small,medium,large三种大小。可以删除图片,也可以全屏预览图片。

样式展示

在这里插入图片描述
在这里插入图片描述

前置依赖

今天我们的这个挑战需要用用到了 react-icons 依赖,因此,我们需要先安装它。

# 使用 npm
npm install react-icons

# 或者使用 yarn
yarn add react-icons

使用的话,大家可以看这个网站。大家进去可以找需要的图标。具体使用里面有介绍,非常简单。
react-icons 图标
好了,下面我们展示代码。

代码展示

Img.tsx
import { useState } from 'react'
import './Img.css'
import { MdClose } from 'react-icons/md';

interface ImgProps {
    src: string;
    alt: string;
    size?: 'small' | 'medium' | 'large';
    onClose?: () => void;
}

const Img = ({ src, alt, size = 'small', onClose }: ImgProps) => {
    const [showPreview, setShowPreview] = useState(false);
    const [visible, setVisible] = useState(true);

    const handleClose = () => {
        setVisible(false);
        if (onClose) {
            onClose();
        }
    };

    if (!visible) return null;

    return (
        <div className={`img-container img-${size}`}>
            <button className={`img-close img-close-${size}`} onClick={handleClose}><MdClose /></button>
            <div className={`img img-${size}`} onClick={() => setShowPreview(true)}>
                <img src={src} alt={alt} />
            </div>

            {showPreview && (
                <div className="img-preview-overlay" onClick={() => setShowPreview(false)}>
                    <div className="img-preview-content">
                        <img src={src} alt={alt} />
                    </div>
                </div>
            )}
        </div>
    )
}

export default Img
Img.css
.img-container {
    position: relative;
}

.img {
    overflow: hidden;
    display: flex;
    align-items: center;
    justify-content: center;
    cursor: pointer;
    border-radius: 5%;
}

.img-small {
    width: 80px;
    height: 80px;
    font-size: 10px;
}

.img-medium {
    width: 160px;
    height: 160px;
    font-size: 14px;
}

.img-large {
    width: 240px;
    height: 240px;
    font-size: 16px;
}

.img img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    object-position: center;
}

.img::after {
    content: "预 览";
    display: flex;
    align-items: center;
    justify-content: center;
    color: #fff;
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    background-color: rgba(0, 0, 0, 0.6);
    opacity: 0;
    border-radius: 5%;
    transition: opacity 0.3s ease;
}

.img:hover::after {
    opacity: 1;
}

.img-preview-overlay {
    position: fixed;
    top: 0;
    left: 0;
    width: 100vw;
    height: 100vh;
    background-color: rgba(0, 0, 0, 0.9);
    display: flex;
    align-items: center;
    justify-content: center;
    z-index: 1000;
    animation: fadeIn 0.3s ease;
}

.img-preview-content {
    max-width: 90%;
    max-height: 90vh;
    position: relative;
}

.img-preview-content img {
    max-width: 100%;
    max-height: 90vh;
    object-fit: contain;
}

@keyframes fadeIn {
    from {
        opacity: 0;
    }

    to {
        opacity: 1;
    }
}


.img-close {
    all: unset;
    background-color: rgb(114, 114, 114);
    border-radius: 50%;
    color: #fff;
    font-size: 20px;
    cursor: pointer;
    display: flex;
    align-items: center;
    justify-content: center;
    font-weight: bold;
    position: absolute;
    transition: all 0.3s ease;
    z-index: 5;
}

.img-close:hover {
    background-color: rgb(82, 82, 82);
    transform: scale(1.1);
}

.img-close-small {
    width: 10px;
    height: 10px;
    top: -2px;
    right: -2px;
    font-size: 10px;
}

.img-close-medium {
    width: 15px;
    height: 15px;
    top: -3px;
    right: -3px;
    font-size: 15px;
}

.img-close-large {
    width: 20px;
    height: 20px;
    top: -5px;
    right: -5px;
    font-size: 16px;
}

使用

App.tsx
import './App.css'
import Img from './components/img/img01/Img'

function App() {
  const handleImageClose = () => {
    console.log('图片被关闭了');
  };

  return (
    <>
      <Img
        src="https://picsum.photos/500/500"
        alt="Random image"
        size="large"
        onClose={handleImageClose}
      />
    </>
  );
}

export default App

http://www.kler.cn/a/419087.html

相关文章:

  • go-学习
  • YOLO 标注工具 AutoLabel 支持 win mac linux
  • C++练级计划-> 《IO流》iostream fstream sstream详解
  • 基于Matlab实现三维点坐标生成点云(源码+数据)
  • 智慧银行反欺诈大数据管控平台方案(一)
  • npm : 无法加载文件 D:\nodejs\npm.ps1,因为在此系统上禁止运行脚本
  • UaGateway:实现OPC DA和OPC UA的高效转换
  • FFmpeg一些常用的命令
  • ElasticSearch的学习
  • JAVA中HashMap、TreeMap、LinkedHashMap 的用法与注意事项
  • 简单搭建qiankun的主应用和子应用并且用Docker进行服务器部署
  • AI高中数学教学视频生成技术:利用通义千问、MathGPT、视频多模态大模型,语音大模型,将4个模型融合 ,生成高中数学教学视频,并给出实施方案。
  • MySQL索引与分区:性能优化的关键
  • openbmc dbus架构简析(二)
  • DDR3与MIG IP核详解(一)
  • ESP32-S3模组上跑通ES8388(12)
  • SpringBoot集成swagger3
  • 【Docker】部署nginx
  • 常用元器件使用方法36:USB转串口芯片CH340X
  • 【07】MySQL中的DQL(数据查询语言)详解
  • 【JavaWeb maven基础知识总结】
  • RabbitMQ rabbitmq.conf配置文件详解
  • 算法训练营day22(二叉树08:二叉搜索树的最近公共祖先,插入,删除)
  • spring boot3.3.5 logback-spring.xml 配置
  • git基本操作说明
  • 网络原理(1)(JavaEE)