zoukankan      html  css  js  c++  java
  • 按钮点击效果(水波纹)

    近来看到个不错的按钮点击效果,当点击时产生一次水波涟漪效果,挺好玩的,于是简单的实现了下(没考虑低版本浏览器兼容问题)

    先看看效果吧,如下图(录制gif软件有点渣,看起来卡卡的...)

    这种效果可以由元素内嵌套canves实现,也可以由css3实现。

    Canves实现

    网上摘了一份canves实现的代码,略微去掉了些重复定义的样式并且给出js注释,代码如下

    html代码

    <a class="btn color-1 material-design" data-color="#2f5398">Press me!</a>
    View Code

    css代码

    * {
      box-sizing: border-box;
      outline: none;
    }
    body {
      font-family: 'Open Sans';
      font-size: 100%;
      font-weight: 300;
      line-height: 1.5em;
      text-align: center;
    }
    .btn {
      border: none;
      display: inline-block;
      color: white;
      overflow: hidden;
      margin: 1rem;
      padding: 0;
      width: 150px;
      height: 40px;
      text-align: center;
      line-height: 40px;
      border-radius: 5px;
    }
    .btn.color-1 {
      background-color: #426fc5;
    }
    .btn-border.color-1 {
      background-color: transparent;
      border: 2px solid #426fc5;
      color: #426fc5;
    }
    .material-design {
      position: relative;
    }
    .material-design canvas {
      opacity: 0.25;
      position: absolute;
      top: 0;
      left: 0;
    }
    .container {
      align-content: center;
      align-items: flex-start;
      display: flex;
      flex-direction: row;
      flex-wrap: wrap;
      justify-content: center;
      margin: 0 auto;
      max-width: 46rem;
    }
    View Code

    js代码

    var canvas = {},
        centerX = 0,
        centerY = 0,
        color = '',
        containers = document.getElementsByClassName('material-design')
        context = {},
        element = {},
        radius = 0,
        // 根据callback生成requestAnimationFrame动画
        requestAnimFrame = function () {
          return (
            window.requestAnimationFrame       || 
            window.mozRequestAnimationFrame    || 
            window.oRequestAnimationFrame      || 
            window.msRequestAnimationFrame     || 
            function (callback) {
              window.setTimeout(callback, 1000 / 60);
            }
          );
        } (),
        // 为每个指定元素生成canves
        init = function () {
          containers = Array.prototype.slice.call(containers);
          for (var i = 0; i < containers.length; i += 1) {
            canvas = document.createElement('canvas');
            canvas.addEventListener('click', press, false);
            containers[i].appendChild(canvas);
            canvas.style.width ='100%';
            canvas.style.height='100%';
            canvas.width  = canvas.offsetWidth;
            canvas.height = canvas.offsetHeight;
          }
        },
        // 点击并且获取需要的数据,如点击坐标、元素大小、颜色
        press = function (event) {
          color = event.toElement.parentElement.dataset.color;
          element = event.toElement;
          context = element.getContext('2d');
          radius = 0;
          centerX = event.offsetX;
          centerY = event.offsetY;
          context.clearRect(0, 0, element.width, element.height);
          draw();
        },
        // 绘制圆形,并且执行动画
        draw = function () {
          context.beginPath();
          context.arc(centerX, centerY, radius, 0, 2 * Math.PI, false);
          context.fillStyle = color;
          context.fill();
          radius += 2;
          // 通过判断半径小于元素宽度,不断绘制 radius += 2 的圆形
          if (radius < element.width) {
            requestAnimFrame(draw);
          }
        };
    
    init();
    View Code

    CSS3实现

    接下来就是纯手打的代码了...觉得还是css3实现的方便些,可能是css写习惯了...

    html代码

    <a class="waves ts-btn">Press me!</a>

    css代码

    .waves{
        position:relative;
        cursor:pointer;
        display:inline-block;
        overflow:hidden;
        text-align: center;
        -webkit-tap-highlight-color:transparent;
        z-index:1;
    }
    .waves .waves-animation{
        position:absolute;
        border-radius:50%;
        width:25px;
        height:25px;
        opacity:0;
        background:rgba(255,255,255,0.3);
        transition:all 0.7s ease-out;
        transition-property:transform, opacity, -webkit-transform;
        -webkit-transform:scale(0);
        transform:scale(0);
        pointer-events:none
    }
    .ts-btn{
        width: 200px;
        height: 56px;
        line-height: 56px;
        background: #f57035;
        color: #fff;
        border-radius: 5px;
    }

    js代码

        document.addEventListener('DOMContentLoaded',function(){
    
          var duration = 750;
    
          // 样式string拼凑
          var forStyle = function(position){
            var cssStr = '';
            for( var key in position){
              if(position.hasOwnProperty(key)) cssStr += key+':'+position[key]+';';
            };
            return cssStr;
          }
    
          // 获取鼠标点击位置
          var forRect = function(target){
            var position = {
              top:0,
              left:0
            }, ele = document.documentElement;
            'undefined' != typeof target.getBoundingClientRect && (position = target.getBoundingClientRect());
            return {
                top: position.top + window.pageYOffset - ele.clientTop,
                left: position.left + window.pageXOffset - ele.clientLeft
            }
          }
    
          var show = function(event){
            var pDiv = event.target,
              cDiv = document.createElement('div');
            pDiv.appendChild(cDiv);
            var rectObj = forRect(pDiv),
              _height = event.pageY - rectObj.top,
              _left = event.pageX - rectObj.left,
              _scale = 'scale(' + pDiv.clientWidth / 100 * 10 + ')';
            var position = {
              top: _height+'px',
              left: _left+'px'
            };
            cDiv.className = cDiv.className + " waves-animation",
            cDiv.setAttribute("style", forStyle(position)),
            position["-webkit-transform"] = _scale,
            position["-moz-transform"] = _scale,
            position["-ms-transform"] = _scale,
            position["-o-transform"] = _scale,
            position.transform = _scale,
            position.opacity = "1",
            position["-webkit-transition-duration"] = duration + "ms",
            position["-moz-transition-duration"] = duration + "ms",
            position["-o-transition-duration"] = duration + "ms",
            position["transition-duration"] = duration + "ms",
            position["-webkit-transition-timing-function"] = "cubic-bezier(0.250, 0.460, 0.450, 0.940)",
            position["-moz-transition-timing-function"] = "cubic-bezier(0.250, 0.460, 0.450, 0.940)",
            position["-o-transition-timing-function"] = "cubic-bezier(0.250, 0.460, 0.450, 0.940)",
            position["transition-timing-function"] = "cubic-bezier(0.250, 0.460, 0.450, 0.940)",
            cDiv.setAttribute("style", forStyle(position));
            var finishStyle = {
              opacity: 0,
              "-webkit-transition-duration": duration + "ms",
              "-moz-transition-duration": duration + "ms",
              "-o-transition-duration": duration + "ms",
              "transition-duration": duration + "ms",
              "-webkit-transform" : _scale,
              "-moz-transform" : _scale,
              "-ms-transform" : _scale,
              "-o-transform" : _scale,
              top: _height + "px",
              left: _left + "px",
            };
            setTimeout(function(){
              cDiv.setAttribute("style", forStyle(finishStyle));
              setTimeout(function(){
                pDiv.removeChild(cDiv);
              },duration);
            },100)
          }
          document.querySelector('.waves').addEventListener('click',function(e){
            show(e);
          },!1);
        },!1);

    就这些,原理也简单,获取点击位置 >  添加样式   顺便,中秋快乐~

  • 相关阅读:
    javascript 去掉 url 中的不可打印字符串
    双链表 哈希 go 实现lFU 缓存算法
    博客园嵌入背景音乐
    博客园嵌入B站视频教程
    基于C++二叉树链表实现同学录信息系统
    C++ 二叉树知识点
    datatable 自定义排序 及 多列排序
    jq 提取字符串中的数字
    wamp下thinkPHP3.2 系统不支持:redis 解决方法
    editable文档
  • 原文地址:https://www.cnblogs.com/ys-ys/p/5874343.html
Copyright © 2011-2022 走看看