Skip to content

Instantly share code, notes, and snippets.

@fwindpeak
Created March 6, 2024 06:04
Show Gist options
  • Select an option

  • Save fwindpeak/ab91a3ec1266f962a8c53d177a3642fc to your computer and use it in GitHub Desktop.

Select an option

Save fwindpeak/ab91a3ec1266f962a8c53d177a3642fc to your computer and use it in GitHub Desktop.
Inspiration from coze.com.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Hover Light Card</title>
</head>
<body class="flex-center">
<div class="card-list">
<div class="card flex-center">Card Content</div>
<div class="card flex-center">Card Content</div>
<div class="card flex-center">Card Content</div>
<div class="card flex-center">Card Content</div>
<div class="card flex-center">Card Content</div>
<div class="card flex-center">Card Content</div>
<div class="card flex-center">Card Content</div>
<div class="card flex-center">Card Content</div>
</div>
<script>
const rotate = {x: 0, y: 10};
const card = {width: 200, height: 400};
const saveCursorPosition = function (x, y) {
rotate.x = (card.width - x * 2) / card.width * 10;
rotate.y = (card.height - y * 2) / card.height * 10;
document.documentElement.style.setProperty('--x', `${x}px`);
document.documentElement.style.setProperty('--y', `${y}px`);
document.documentElement.style.setProperty('--card-width', `${card.width}px`);
document.documentElement.style.setProperty('--card-height', `${card.height}px`);
document.documentElement.style.setProperty('--rotate-x', `${rotate.x}deg`);
document.documentElement.style.setProperty('--rotate-y', `${rotate.y}deg`);
}
const cardList = document.getElementsByClassName('card')
for (const card of cardList) {
card.addEventListener('mousemove', e => {saveCursorPosition(e.offsetX, e.offsetY);})
}
</script>
<style>
body {
margin: 0;
padding: 0;
background-color: #111;
height: 100vh;
color: #fff;
}
.flex-center {
display: flex;
justify-content: center;
align-items: center;
}
.card-list {
display: flex;
flex-wrap: wrap
}
.card {
width: 200px;
height: 400px;
margin: 1.5em;
background-color: hsla(0, 0%, 100%, .03);
border-radius: 0.5em;
cursor: pointer;
display: flex;
flex-direction: column;
overflow: hidden;
padding: 1.5em 0 0 1.5em;
position: relative;
transition: all .2s linear;
will-change: auto;
}
.card:hover {
transform: perspective(800px) rotateX(var(--rotate-x)) rotateY(var(--rotate-y));
transform-style: preserve-3d;
cursor: pointer;
}
.card:hover:after {
content: '';
position: absolute;
top: var(--y);
left: var(--x);
transform: translate(-50%, -50%);
background: rgba(77, 82, 232, .6);
border-radius: 50%;
-webkit-filter: blur(64px);
filter: blur(64px);
height: 15em;
mix-blend-mode: soft-light;
transform: translateZ(100);
width: 15em;
}
</style>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment