Vue利用相反数实现飘窗动画效果

目录
  • 前言
  • 实现思路与分析
    • 1.画一个矩形元素作为飘窗,并使用固定定位
    • 2.编写初始化函数,设定飘窗初始化规则
    • 3.鼠标悬浮在飘窗时停止移动
    • 4.鼠标离开飘窗时继续移动
    • 5.关闭飘窗
    • 6.监听窗口的大小
  • 完整 demo 示例

前言

飘窗,即一个类似小窗子的在网页上移动的矩形元素,通常被用于一些通知类的应用场景, 飘窗与横幅相比,更显眼更具有强调感和动画感,在视觉上更有冲击性,在体验上互动性也更强。

先看下效果图

实现思路与分析

1.画一个矩形元素作为飘窗,并使用固定定位

css 绘制一个固定宽高的矩形,并使用 position:fixed,利用固定定位便于飘窗在屏幕任意位置移动。

<div
        v-if="show"
        @mouseover="mouseover"
        @mouseout="mouseout"
        class="box"
        :style="{'top':top + 'px','left':left + 'px'}">
    <span @click="close">关闭</span>
    <div>
        特别提示:这仅仅是一个测试,不要慌。
    </div>
</div>

2.编写初始化函数,设定飘窗初始化规则

设置最大的top和left值 = 根元素可视区域宽高 - 飘窗的宽高 - 边距

this.maxTop = document.documentElement.clientHeight - 150 - 20
this.maxLeft = document.documentElement.clientWidth - 200 - 20

设置移动规则:分别设置水平方向和垂直方向两个步长 stepX 和 stepY,设置两个步长是为了分别利用其相反数以实现忘相反方向移动的目的: 即是当遇到水平方向的边界时,stepX = -stepX;遇到垂直方向的边界时,stepY = -stepY。

绝妙啊,这个相反数的应用,如果不用相反数该咋写?欢迎评论区分享

move () {
   if (this.top >= this.maxTop || this.top < 0) {
      this.stepY = -this.stepY
   }
   if (this.left >= this.maxLeft || this.left < 0) {
      this.stepX = -this.stepX
   }

   this.top += this.stepY
   this.left += this.stepX
},

3.鼠标悬浮在飘窗时停止移动

利用 onmouseover 事件,鼠标悬浮在飘窗时,清除定时器也就是停止了 top 和 left 的值的变更也就是停止了飘窗的移动。

mouseover () {
   clearInterval(this.timer)
},

4.鼠标离开飘窗时继续移动

利用 onmouseout 事件,当鼠标离开飘窗时,再利用定时器,继续变更 top 和 left,也就是继续移动飘窗。 注意开启定时器前清除下定时器,这一步是为了保证只有一个定时器会让飘窗移动。 因为 top 和 left,在飘窗停止移动式并没有改变,所以能很好地延续了移动路线。

mouseout () {
  clearInterval(this.timer)
  this.timer = setInterval(() => {
    this.move()
  }, 20)
},

5.关闭飘窗

关闭飘窗做两件事,一是令 v-if 的值为 false,即设置飘窗元素不可见(移除元素);二是清除定时器。

close () {
  clearInterval(this.timer)
  this.show = false
},

6.监听窗口的大小

window.onresize 监听浏览器窗口的大小,窗口大小被改变时调用飘窗初始化函数 init(),重置飘窗。

onresize () {
  const that = this
  window.onresize = function () {
    that.init()
  }
},

完整 demo 示例

<template>
  <div>
    <h1>飘窗 demo</h1>
    <div
      v-if="show"
      @mouseover="mouseover"
      @mouseout="mouseout"
      class="box"
      :style="{'top':top + 'px','left':left + 'px'}">
      <span @click="close">关闭</span>
      <div>
        特别提示:这仅仅是一个测试,不要慌。
      </div>
    </div>
  </div>
</template>

<script>
export default {
  name: 'MoveWindow',
  data () {
    return {
      show: true, // 是否展现飘窗
      stepX: 1, // 水平方向的步长
      stepY: 1, // 垂直方向的步长
      timer: null, // 定时器
      maxTop: 0, // 最大的 top 值
      maxLeft: 0, // 最大的 left 值
      top: 0,
      left: 0,
    }
  },
  mounted () {
    this.init()
  },
  beforeDestroy () {
    // dom 销毁前清除定时器
    clearInterval(this.timer)
  },
  methods: {
    // 初始化飘窗规则
    init () {
      // 设置最大的top和left值:根元素可视区域宽高 - 飘窗的宽高 - 边距
      this.maxTop = document.documentElement.clientHeight - 150 - 20
      this.maxLeft = document.documentElement.clientWidth - 200 - 20

      // 设置 top 和 left 的初始值
      this.top = 0
      this.left = 0

      // 创建定时器前清除定时器,避免类似在 onresize 中调用 init() 时,产生多个定时器
      clearInterval(this.timer)
      this.timer = setInterval(() => {
        this.move()
      }, 20)

      this.onresize()
    },
    // 移动函数
    move () {
      if (this.top >= this.maxTop || this.top < 0) {
        this.stepY = -this.stepY
      }
      if (this.left >= this.maxLeft || this.left < 0) {
        this.stepX = -this.stepX
      }

      this.top += this.stepY
      this.left += this.stepX
    },
    // 鼠标悬浮在飘窗时停止移动
    mouseover () {
      clearInterval(this.timer)
    },
    // 鼠标离开飘窗时恢复移动
    mouseout () {
      clearInterval(this.timer)
      this.timer = setInterval(() => {
        this.move()
      }, 20)
    },
    // 关闭飘窗
    close () {
      clearInterval(this.timer)
      this.show = false
    },
    // 窗口大小调整时重置飘窗规则
    onresize () {
      const that = this
      window.onresize = function () {
        that.init()
      }
    },
  }
}
</script>

<style scoped lang="scss">
.box {
  background: #9cdf65;
  width: 200px;
  height: 150px;
  border-radius: 5px;
  position: fixed;
  text-align: left;
  padding: 10px;
  color: #ffffff;
  top: 0;
  left: 0;

  > span {
    text-align: right;
    position: absolute;
    right: 10px;
    top: 10px;
    color: #1e87f0;
    cursor: pointer;
  }

  > div {
    margin-top: 30px;
  }
}
</style>

以上就是Vue利用相反数实现飘窗动画效果的详细内容,更多关于Vue飘窗动画的资料请关注我们其它相关文章!

(0)

相关推荐

  • vue+animation动画实现跑马灯效果

    本文实例为大家分享了vue+animation动画实现跑马灯效果的具体代码,供大家参考,具体内容如下 1.单行显示,每行只显示一条 效果图 上代码 <template>   <div class="container">     <div class="box">       <!-- 假设lists列表有4个项,设置ul的宽度为800%(相对于box),设置li的宽度为12.5%(相对于ul是12.5%:相对于box是10

  • vue实现翻牌动画

    本文实例为大家分享了vue实现翻牌动画的具体代码,供大家参考,具体内容如下 应用场景 常用于大屏订单数量展示 原理 利用css writing-mode: vertical-rl 使数字垂直排列 利用css transform 使数字滚动 实现思路 根据css先让数字垂直排列,总共设置8列 根据组件传递的数值,如果不满8位,递归补零 补零之后,循环根据 translate(-50%, -${numberArr[index] * 10}%,查看动画 <template>     <div

  • 如何利用vue实现css过渡和动画

    目录 一.过渡和动画的区别 二.使用Vue实现基础得css过渡与动画 1. 动画 2. 过渡 三.使用transition标签实现单元素/组件的过渡和动画效果 1. transition 的基本介绍 2. transition 的过渡class 3. 过渡示例 4. 动画示例 5. transition的name属性 6. 自定义过渡类名 7.同时设置过渡和动画 8. duration属性 9. 使用js实现动画 四.组件和元素切换动画的实现 五.列表动画 六.状态动画 总结 一.过渡和动画的区

  • vue实现页面刷新动画

    本文实例为大家分享了vue实现页面刷新动画的具体代码,供大家参考,具体内容如下 做一个vue的页面刷新动画,找了好多动画样式,感谢大佬们造的轮子. 主要就是在index.html文件里面写一个动画样式,在页面刷新的时候让他去前面做动画,等我们的样式可以加载的时候去把这个动画样式给移除掉就可以了,而判断我们的样式是否加载好可以用created生命周期去判断,因为这个生命周期是在浏览器解析完html的各种样式后触发的,所以可以在app.vue的created生命周期里面把动画样式移除 接下来是代码

  • vue使用动画实现滚动表格效果

    本文实例为大家分享了vue使用动画实现滚动表格效果的具体代码,供大家参考,具体内容如下 需求 在一些大屏项目中,需要使用到表格行数据滚动.本文介绍在vue项目中使用动画实现滚动表格. vue代码如下 <template>   <div style="cursor: default;margin:9px 10px 18px">     <div class="table-header table-row">       <di

  • Vue利用相反数实现飘窗动画效果

    目录 前言 实现思路与分析 1.画一个矩形元素作为飘窗,并使用固定定位 2.编写初始化函数,设定飘窗初始化规则 3.鼠标悬浮在飘窗时停止移动 4.鼠标离开飘窗时继续移动 5.关闭飘窗 6.监听窗口的大小 完整 demo 示例 前言 飘窗,即一个类似小窗子的在网页上移动的矩形元素,通常被用于一些通知类的应用场景, 飘窗与横幅相比,更显眼更具有强调感和动画感,在视觉上更有冲击性,在体验上互动性也更强. 先看下效果图 实现思路与分析 1.画一个矩形元素作为飘窗,并使用固定定位 css 绘制一个固定宽高

  • iOS利用UIBezierPath + CAAnimation实现路径动画效果

    前言 上次给大家介绍了iOS利用UIBezierPath + CAAnimation实现路径动画效果的相关内容,今天实现一个根据心跳路径实现一个路径动画,让某一视图沿着路径进行运动.. 效果图如下: 核心代码 1-首先通过 drawRect 绘制心形路径 - (void)drawRect:(CGRect)rect { // Drawing code // 初始化UIBezierPath UIBezierPath *path = [UIBezierPath bezierPath]; // 首先设置

  • iOS利用MJRefresh实现自定义刷新动画效果

    本文主要介绍iOS 利用MJRefresh实现自定义动画的上拉刷新下拉加载效果,一般的类型(包括更新时间与loading图案)这里不做介绍. 要想实现此功能,首先得有一套load的图片数组. 接下来就是实现过程: 引入头文件: #import "MJRefresh.h" //自定义一个方法实现 - (void)prepareRefresh { NSMutableArray *headerImages = [NSMutableArray array]; for (int i = 1; i

  • Vue实现回到顶部和底部动画效果

    本文实例为大家分享了Vue实现回到顶部和底部动画效果的具体代码,供大家参考,具体内容如下 代码: <template> <div> <div class="scroll" :class="{show:isActive}"> <div id="toTop" @click="toTop(step)"><</div> <div id="toBottom

  • vue中实现弹出层动画效果的示例代码

    1 <template> <div class="home"> <!-- 首先将要过渡的元素用transition包裹,并设置过渡的name --> <transition name="mybox"> <div class="box" v-show="boxshow"></div> </transition> <button @click

  • 如何利用JS实现时间轴动画效果

    目录 css动画 什么是时间轴动画? 动画对象 动画函数 思考 总结 css动画 在前端开发中,一些简单的动效往往是使用 css3 的 @keyframes 来实现的 ,如: .div1 { width: 100px; height: 100px; background: red; animation: changeColor 2s; } @keyframes changeColor { 0% {background: red;} 50% {background: yellow;} 100% {

  • iOS中利用UIBezierPath + CAAnimation实现心跳动画效果

    前言 最近在开发ios项目空闲之余,决定练习下UIBezierPath进行绘图和CAAnimation动画的使用,制作了一个心跳的动画,很简单的示例,下面话不多说了,来一起看看详细的介绍: GIF示例: 核心代码 1-首先通过 drawRect 绘制心形view - (void)drawRect:(CGRect)rect { // 间距 CGFloat padding = 4.0; // 半径(小圆半径) CGFloat curveRadius = (rect.size.width - 2 *

  • vue中使用animate.css实现炫酷动画效果

    目录 1.安装(在vscode终端中,使用npm安装) 2.引入 3.代码实现 animate.css 是一个来自国外的 CSS3 动画库,它提供了抖动(shake).闪烁(flash).弹跳(bounce).翻转(flip).旋转(rotateIn/rotateOut).淡入淡出(fadeIn/fadeOut)等多达 60 多种动画效果,几乎包含了所有常见的动画效果.这些效果在大多数支持CSS3的浏览器上都能保持一致.简单来说,我们使用它,只需要写很少的代码,就可以实现非常炫酷的动画效果. 官

  • vue2.0 中使用transition实现动画效果使用心得

    实践 这里将通过四个实践小案例来体验和学习css过渡,css动画,javascript钩子,列表过渡的应用.至于案例用到的知识点就请自行学习官网文档. 1.css过渡–实践 先来看看demo效果: 这个案例其实很简单,通过一个transition来触发多个子元素的过渡效果,我们只需要定义元素对应的过渡效果就可以,其他事情vue会帮我们搞定,由此可以扩展出其他酷炫的过渡场景效果.先来看看这个简单案例的代码实现: <template> <div class="app"&g

  • 详解Vue中过度动画效果应用

    一.实现动画过渡效果的几种方式 实现动画必须要将要进行动画的元素利用<transition>标签进行包裹 1.利用CSS样式实现过渡效果 <transition name="fade"></transition> 1.v-enter: 定义进入过渡的开始状态.在元素被插入时生效,在下一个帧移除. 2.v-enter-active: 定义进入过渡的结束状态.在元素被插入时生效,在 transition/animation 完成之后移除. 3.v-lea

随机推荐