Implement CSS grid click effect

This commit is contained in:
aronmal 2022-10-24 00:35:28 +02:00
parent b0b118c1b3
commit 63e26e62fa
Signed by: aronmal
GPG key ID: 816B7707426FC612
5 changed files with 231 additions and 115 deletions

View file

@ -0,0 +1,65 @@
import { CSSProperties, useEffect, useMemo, useState } from 'react'
import '../styles/home.scss'
function Homepage() {
const [columns, setColumns] = useState(floorClient(document.body.clientWidth))
const [rows, setRows] = useState(floorClient(document.body.clientHeight))
const [quantity, setQuantity] = useState(columns * rows)
const [position, setPosition] = useState([0, 0])
const [active, setActve] = useState(false)
useEffect(() => {
function handleResize() {
setColumns(floorClient(document.body.clientWidth))
setRows(floorClient(document.body.clientHeight))
}
handleResize()
window.addEventListener('resize', handleResize)
}, [])
useEffect(() => {
const timeout = setTimeout(() => setQuantity(columns * rows), 500)
return () => clearTimeout(timeout)
}, [columns, rows])
function floorClient(number: number) {
return Math.floor(number / 50)
}
function createTile(index: number) {
const x = index % columns
const y = Math.floor(index / columns)
const xDiff = (x - position[0]) / 10
const yDiff = (y - position[1]) / 10
const pos = (Math.sqrt(xDiff * xDiff + yDiff * yDiff)).toFixed(2)
return (
<div
key={index}
className={"tile " + (active ? 'active' : '')}
style={{ '--delay': pos + 's' } as CSSProperties}
onClick={() => {
setPosition([x, y])
setActve(e => !e)
}}
>
{/* {pos} */}
</div>
)
}
const createTiles = useMemo(() => {
console.log(3, columns, rows, quantity)
// return <p>{quantity}</p>
return (
<div id='tiles' style={{ '--columns': columns, '--rows': rows } as CSSProperties}>
{Array.from(Array(quantity)).map((tile, index) => createTile(index))}
</div>
)
}, [quantity, position])
return createTiles
}
export default Homepage