爬行的蜗牛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: golang Linux PHP
查看: 60|回复: 0

CSS卡片悬停交互动画(附源代码)

[复制链接]

94

主题

36

回帖

849

积分

管理员

积分
849
发表于 2024-11-5 20:25:33 | 显示全部楼层 |阅读模式
640.gif


这是一个CSS实现的卡片悬停交互效果,当鼠标悬停在卡片上时,会出现一个随着鼠标移动而移动的光圈。

主要实现原理是通过JavaScript获取鼠标的X/Y轴坐标,并使用CSS的radial-gradient函数和自定义属性来动态更新光圈的位置,从而创建出这种交互效果。

源代码

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <style>
  5.   :root {
  6.   --bg-color: rgb(20, 20, 20);
  7.   --card-color: rgb(23, 23, 23);
  8. }

  9. body {
  10.   align-items: center;
  11.   background-color: var(--bg-color);
  12.   display: flex;
  13.   height: 100vh;
  14.   justify-content: center;
  15.   margin: 0px;
  16.   overflow: hidden;
  17.   padding: 0px;
  18. }

  19. #cards {
  20.   display: flex;
  21.   flex-wrap: wrap;
  22.   gap: 8px;  
  23.   max-width: 916px;
  24.   width: calc(100% - 20px);
  25. }

  26. #cards:hover > .card::after {
  27.   opacity: 1;
  28. }

  29. .card {
  30.   background-color: rgba(255, 255, 255, 0.1);
  31.   border-radius: 10px;
  32.   cursor: pointer;
  33.   display: flex;
  34.   height: 260px;
  35.   flex-direction: column;
  36.   position: relative;
  37.   width: 300px;  
  38. }

  39. .card::before {
  40.   background: radial-gradient(
  41.     800px circle at var(--mouse-x) var(--mouse-y),
  42.     rgba(255, 255, 255, 0.06),
  43.     transparent 40%
  44.   );
  45.   z-index: 3;
  46. }


  47. .card:hover::before{
  48.   opacity: 1;
  49. }

  50. .card::before,
  51. .card::after {
  52.   border-radius: inherit;
  53.   content: "";
  54.   height: 100%;
  55.   left: 0px;
  56.   opacity: 0;
  57.   position: absolute;
  58.   top: 0px;
  59.   transition: opacity 500ms;
  60.   width: 100%;
  61. }

  62. .card::before {
  63.   background: radial-gradient(
  64.     800px circle at var(--mouse-x) var(--mouse-y),
  65.     rgba(255, 255, 255, 0.06),
  66.     transparent 40%
  67.   );
  68.   z-index: 3;
  69. }

  70. .card::after {  
  71.   background: radial-gradient(
  72.     600px circle at var(--mouse-x) var(--mouse-y),
  73.     rgba(255, 255, 255, 0.3),
  74.     transparent 40%
  75.   );
  76.   z-index: 1;
  77. }

  78. .card > .card-content {
  79.   background-color: var(--card-color);
  80.   border-radius: inherit;
  81.   display: flex;
  82.   flex-direction: column;
  83.   flex-grow: 1;
  84.   inset: 1px;
  85.   padding: 10px;
  86.   position: absolute;
  87.   z-index: 2;
  88. }
  89. </style>
  90. </head>
  91. <body>
  92.   <div id="cards">
  93.   <div class="card">
  94.     <div class="card-content"></div>
  95.   </div>
  96.    <div class="card">
  97.     <div class="card-content"></div>
  98.   </div>
  99.   <div class="card">
  100.     <div class="card-content"></div>
  101.   </div>
  102. </div>
  103. </body>
  104. <script>
  105. document.getElementById("cards").onmousemove = e => {
  106.   for(const card of document.getElementsByClassName("card")) {
  107.     const rect = card.getBoundingClientRect(),
  108.           x = e.clientX - rect.left,
  109.           y = e.clientY - rect.top;

  110.     card.style.setProperty("--mouse-x", `${x}px`);
  111.     card.style.setProperty("--mouse-y", `${y}px`);
  112.   };
  113. }
  114. </script>
  115. </html>
复制代码


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表