Image
Example
Steps
Install Package
npm install classnames
Copy Code
components/Image/index.tsx
import { memo, useState } from 'react'
import type { FC } from 'react'
import classnames from 'classnames'
import { createPortal } from 'react-dom'
export interface Props {
className?: string
src?: string
alt?: string
}
const Image: FC<Props> = ({ src, alt, className }) => {
const [isOpen, setIsOpen] = useState<boolean>(false)
return (
<>
<img
src={src}
alt={alt}
className={classnames(className, 'cursor-pointer')}
onClick={() => setIsOpen(true)}
/>
{isOpen &&
createPortal(
<div
className="fixed inset-0 z-30 overflow-y-auto"
aria-labelledby="modal-title"
aria-modal="true"
role="dialog"
>
<div
className="flex min-h-screen items-end justify-center p-0 text-center md:block"
onClick={() => setIsOpen(false)}
>
<div
className="fixed inset-0 bg-black opacity-30 transition-opacity"
aria-hidden="true"
></div>
<span
className="hidden h-screen align-middle md:inline-block"
aria-hidden="true"
>
​
</span>
<div className="my-8 inline-block w-full transform overflow-hidden align-middle transition-all sm:px-8">
<img
src={src}
alt={alt}
className="mx-auto select-none shadow-xl"
/>
</div>
</div>
</div>,
document.body
)}
</>
)
}
export default memo(Image)
Usage
<Image src="https://i.pravatar.cc" />
Props
기존 <img />
의 속성들을 그대로 사용하면 됩니다.