theme: channing-cyan
highlight: a11y-dark
小巧实践|巧用相反数实现飘窗
前言
飘窗,即一个类似小窗子的在网页上移动的矩形元素,通常被用于一些通知类的应用场景, 飘窗与横幅相比,更显眼更具有强调感和动画感,在视觉上更有冲击性,在体验上互动性也更强。
先看下效果图
实现思路与分析
1.画一个矩形元素作为飘窗,并使用固定定位
css 绘制一个固定宽高的矩形,并使用 position:fixed,利用固定定位便于飘窗在屏幕任意位置移动。
```html
关闭
``` ### 2.编写初始化函数,设定飘窗初始化规则 设置最大的top和left值 = 根元素可视区域宽高 - 飘窗的宽高 - 边距 ```js this.maxTop = document.documentElement.clientHeight - 150 - 20 this.maxLeft = document.documentElement.clientWidth - 200 - 20 ``` 设置移动规则:分别设置水平方向和垂直方向两个步长 stepX 和 stepY,设置两个步长是为了分别利用其相反数以实现触边后往相反方向移动的目的: 即是当遇到水平方向的边界时,stepX = -stepX;遇到垂直方向的边界时,stepY = -stepY。 **绝妙啊,这个相反数的应用,如果不用相反数该咋写?欢迎评论区分享** ```js 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 的值的变更也就是停止了飘窗的移动。 ```js mouseover () { clearInterval(this.timer) }, ``` ### 4.鼠标离开飘窗时继续移动 利用 onmouseout 事件,当鼠标离开飘窗时,再利用定时器,继续变更 top 和 left,也就是继续移动飘窗。 注意开启定时器前清除下定时器,这一步是为了保证只有一个定时器会让飘窗移动。 因为 top 和 left,在飘窗停止移动式并没有改变,所以能很好地延续了移动路线。 ```js mouseout () { clearInterval(this.timer) this.timer = setInterval(() => { this.move() }, 20) }, ``` ### 5.关闭飘窗 关闭飘窗做两件事,一是令 v-if 的值为 false,即设置飘窗元素不可见(移除元素);二是清除定时器。 ```js close () { clearInterval(this.timer) this.show = false }, ``` ### 6.监听窗口的大小 window.onresize 监听浏览器窗口的大小,窗口大小被改变时调用飘窗初始化函数 init(),重置飘窗。 ```js onresize () { const that = this window.onresize = function () { that.init() } }, ``` ## 完整 demo 示例 ```html
特别提示:这仅仅是一个测试,不要慌。
飘窗 demo
关闭
特别提示:这仅仅是一个测试,不要慌。
```