欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

css hover水滴涟漪效果

程序员文章站 2022-03-31 19:09:30
...

 

实现逻辑

1 . 给盒子添加遮罩层 , 初始大小为0 , hover效果放大

2 . 判断鼠标进入位置 , 上下左右四个方向

3 . 拿到鼠标在盒子内的 X/Y 坐标位置 , e.pageY - $(this).offset().top

4 . 鼠标进入动画 : 把鼠标的X/Y轴坐标 , 添加给遮罩层 , 作为定位的left和top , 并添加放大动画

5 . 鼠标移除动画 : 判断出去的位置 , 给遮罩层添加left和top , 并添加缩小动画

 

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>

  <style>
    * {
      margin: 0;
      padding: 0;
    }

    html,
    body {
      height: 100%;
      width: 100%;
    }

    ul {
      width: 1400px;
      list-style: none;
      display: flex;
      justify-content: space-between;
      padding: 100px;
      margin: 0 auto;
    }

    li {
      width: 23%;
      height: 400px;
      background: rgb(98, 190, 190, .5);
      position: relative;
      overflow: hidden;
      transition: all 1s;
      overflow: hidden;
    }

    li:hover {
      box-shadow: 0 0 5px rgba(98, 190, 190, .5),
        0 0 25px rgba(98, 190, 190, .5),
        0 0 50px rgba(98, 190, 190, .5),
        0 0 200px rgba(98, 190, 190, .5);
      border-radius: 5px;
    }

    .ripple {
      display: block;
      position: absolute;
      border-radius: 100%;
      transform: scale(0);
      background: rgba(28, 198, 122, .3);
      transform: translate(-50%, -50%);
      width: 150px;
      height: 150px;
      opacity: 0;
    }

    @keyframes ripple {
      0% {
        opacity: 1;
        transform: translate(-50%, -50%) scale(0);
      }

      100% {
        opacity: 1;
        transform: translate(-50%, -50%) scale(10);
      }
    }

    @keyframes ripplehide {
      0% {
        opacity: 1;
        transform: translate(-50%, -50%) scale(10);
      }

      100% {
        opacity: 1;
        transform: translate(-50%, -50%) scale(0);
      }
    }


    .ani {
      animation: ripple 0.8s ease-in;
      animation-fill-mode: forwards;
    }


    .anihide {
      animation: ripplehide 0.8s ease-in;
      animation-fill-mode: forwards;
    }
  </style>
</head>

<body>
  <ul>
    <li>
      <div class="ripple"></div>
    </li>
    <li>
      <div class="ripple"></div>
    </li>
    <li>
      <div class="ripple"></div>
    </li>
    <li>
      <div class="ripple"></div>
    </li>


  </ul>
</body>
<script src="./js/jquery-3.1.1.min.js"></script>
<script>
  // 鼠标移入事件
  $('ul li').mouseenter(function (e) {
    $(this).find('.ripple').removeClass('anihide').addClass('ani')
    $(this).find('.ripple').css({
      top: e.offsetY + 'px',
      left: e.offsetX + 'px',
    })
  })


  $('ul li').mouseleave(function (e) {

    // 获取li的宽高
    var w = $(this).outerWidth()
    var h = $(this).outerHeight()

    var x = (e.pageX - this.offsetLeft - (w / 2)) * (w > h ? (h / w) : 1);
    var y = (e.pageY - this.offsetTop - (h / 2)) * (h > w ? (w / h) : 1);
    // 判断出去的位置     //上右下左  0 1 2 3
    // Math.atan2(y, x)   x轴的角度
    // 弧度 = 角度 * Math.PI / 180
    var direction = Math.round((((Math.atan2(y, x) * (180 / Math.PI)) + 180) / 90) + 3) % 4;


    // 鼠标在文档出去的位置 = 鼠标距离文档的位置 - 元素距离文档的位置
    var t = e.pageY - $(this).offset().top
    var l = e.pageX - $(this).offset().left

    switch (direction) {
      case 0:
        $(this).find('.ripple').css({
          top: 0,
          left: l
        })
        console.log(l);
        $(this).find('.ripple').removeClass('ani').addClass('anihide')
        break;
      case 1:
        $(this).find('.ripple').css({
          top: t,
          left: $(this).outerWidth()
        })
        $(this).find('.ripple').removeClass('ani').addClass('anihide')
        break;
      case 2:
        $(this).find('.ripple').css({
          top: $(this).outerHeight(),
          left: l
        })
        console.log(l, t);
        $(this).find('.ripple').removeClass('ani').addClass('anihide')
        break;
      case 3:
        $(this).find('.ripple').css({
          top: t,
          left: 0
        })
        $(this).find('.ripple').removeClass('ani').addClass('anihide')
        break;

      default:
        break;
    }

  })
</script>

</html>

 

 

css hover水滴涟漪效果

相关标签: js