zoukankan      html  css  js  c++  java
  • vuewaves点击容器出现水波纹效果

    1. 创建 waves.css文件
    .waves-ripple {
    
        position: absolute;
    
        border-radius: 100%;
    
        background-color: rgba(0, 0, 0, 0.15);
    
        background-clip: padding-box;
    
        pointer-events: none;
    
        -webkit-user-select: none;
    
        -moz-user-select: none;
    
        -ms-user-select: none;
    
        user-select: none;
    
        -webkit-transform: scale(0);
    
        -ms-transform: scale(0);
    
        transform: scale(0);
    
        opacity: 1;
    
    }
    
    .waves-ripple.z-active {
    
        opacity: 0;
    
        -webkit-transform: scale(2);
    
        -ms-transform: scale(2);
    
        transform: scale(2);
    
        -webkit-transition: opacity 1.2s ease-out, -webkit-transform 0.6s ease-out;
    
        transition: opacity 1.2s ease-out, -webkit-transform 0.6s ease-out;
    
        transition: opacity 1.2s ease-out, transform 0.6s ease-out;
    
        transition: opacity 1.2s ease-out, transform 0.6s ease-out, -webkit-transform 0.6s ease-out;
    
    }

      2. 创建 waves.js 文件

    import './waves.css'
    
    const context = '@@wavesContext'
    
    function handleClick(el, binding) {
    
      function handle(e) {
    
        const customOpts = Object.assign({}, binding.value)
    
        const opts = Object.assign({
    
          ele: el, // 波纹作用元素
    
          type: 'hit', // hit 点击位置扩散 center中心点扩展
    
          color: 'rgba(0, 0, 0, 0.15)' // 波纹颜色
    
        },
    
        customOpts
    
        )
    
        const target = opts.ele
    
        if (target) {
    
          target.style.position = 'relative'
    
          target.style.overflow = 'hidden'
    
          const rect = target.getBoundingClientRect()
    
          let ripple = target.querySelector('.waves-ripple')
    
          if (!ripple) {
    
            ripple = document.createElement('span')
    
            ripple.className = 'waves-ripple'
    
            ripple.style.height = ripple.style.width = Math.max(rect.width, rect.height) + 'px'
    
            target.appendChild(ripple)
    
          } else {
    
            ripple.className = 'waves-ripple'
    
          }
    
          switch (opts.type) {
    
            case 'center':
    
              ripple.style.top = rect.height / 2 - ripple.offsetHeight / 2 + 'px'
    
              ripple.style.left = rect.width / 2 - ripple.offsetWidth / 2 + 'px'
    
              break
    
            default:
    
              ripple.style.top =
    
                (e.pageY - rect.top - ripple.offsetHeight / 2 - document.documentElement.scrollTop ||
    
                  document.body.scrollTop) + 'px'
    
              ripple.style.left =
    
                (e.pageX - rect.left - ripple.offsetWidth / 2 - document.documentElement.scrollLeft ||
    
                  document.body.scrollLeft) + 'px'
    
          }
    
          ripple.style.backgroundColor = opts.color
    
          ripple.className = 'waves-ripple z-active'
    
          return false
    
        }
    
      }
    
      if (!el[context]) {
    
        el[context] = {
    
          removeHandle: handle
    
        }
    
      } else {
    
        el[context].removeHandle = handle
    
      }
    
      return handle
    
    }
    
    export default {
    
      bind(el, binding) {
    
        el.addEventListener('click', handleClick(el, binding), false)
    
      },
    
      update(el, binding) {
    
        el.removeEventListener('click', el[context].removeHandle, false)
    
        el.addEventListener('click', handleClick(el, binding), false)
    
      },
    
      unbind(el) {
    
        el.removeEventListener('click', el[context].removeHandle, false)
    
        el[context] = null
    
        delete el[context]
    
      }
    
    }

      3. 创建 index.js 文件

    import waves from './waves'
    
    const install = function(Vue) {
    
      Vue.directive('waves', waves)
    
    }
    
    if (window.Vue) {
    
      window.waves = waves
    
      Vue.use(install); // eslint-disable-line
    
    }
    
    waves.install = install
    
    export default waves

      4. 使用

    使用的话 直接在div上使用v-waves标签即可
    
    <div v-waves class="card-panel"> </div>
    
    <script>
    
    import waves from '@/directive/waves' //引入
    
    export default { 
    
     directives: { waves } //注册
    
    }
    
    </script>

    转 : https://www.jianshu.com/p/883a30aa8dd6

    或 https://ext.dcloud.net.cn/plugin?id=1671

  • 相关阅读:
    旧文备份:CANopen协议PDO的几种传输方式
    CANopen 基础
    单片机FLASH与RAM、ROM的关系
    在CANopen网络中通过LSS服务设置节点地址和网络波特率
    STM32F103 CAN中断发送功能的再次讨论
    由RS-232串口到PROFIBUS-DP总线的转换接口设计
    profibus 的DPV0 和DPV1
    PROFIBUS-DP
    profibus总线和profibus dp的区别
    获取验证码倒计时
  • 原文地址:https://www.cnblogs.com/fps2tao/p/15746113.html
Copyright © 2011-2022 走看看