前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >天黑了、让我为你关窗帘吧!

天黑了、让我为你关窗帘吧!

作者头像
Snine
发布2022-10-04 21:26:16
2080
发布2022-10-04 21:26:16
举报
文章被收录于专栏:前端开发笔录前端开发笔录

今天遇到朋友发来的一个需求,需要做一个窗户上下拉窗帘的小小的交互,于是就有了今天的小DEMO,要实现下图一个效果,需要开窗帘,关窗帘,中途还可以暂停,就这样一个小小的效果,我们来分析一下思路开始实现吧。

window.gif
window.gif

分析思路

看看上图设计非常简单,一个窗口,一个窗帘,窗户不动,窗帘需要被控制移动,那我知道这个需求的第一时间,我们的脑子里就有了基础布局了,很简单的布局,绘制一个div 将窗帘设为div的背景图,再将窗帘设置为绝对定位,此时布局已经完成。

代码语言:javascript
复制
<div class="window">
     <img :src='src' class="curtains" :style="{ top: `${top}px`}"" />
</div>
代码语言:javascript
复制
.window{
  width: 400px;
  height: 400px;
  background-image: url(https://file.jiangly.com/images/36762512.png);
  background-size: 400px 400px;
  position: relative;
  overflow: hidden;
}

.curtains{
  position: absolute;
  width: 300px;
  height: 410px;
  top: -410px;
  left: 55px;
}

通过简单布局,此时窗帘已经被我们隐藏到窗户上面了,我们只需要对窗帘的top值就行改变,就可以打开关闭窗帘了,所以我们为其绑定一个Top

接下来,就是如何控制他了,我们加上三个按钮,分别是开始,暂停,结束,此时我们分别对其绑定上,三个事件,当我们点击开始的时候,窗帘下降,意味着top值会变大,所以,我们在点击开始的时候,设置一个定时器对top值累加即可:

代码语言:javascript
复制
function open(){
    this.timer =  setInterval( () =>{
        this.top += 10
    }, 50)
}

同理,当我们关闭的时候,就需要对其累减了

代码语言:javascript
复制
function open(){
    this.timer =  setInterval( () =>{
        this.top -= 10
    }, 50)
}

似乎看起来没有问题,但是如果我们点击开启,就会一直往下,所以我们需要一个边界判断,例如我们开启的时候,当top值达到了最大的top值的时候,我们就需要关闭定时器

代码语言:javascript
复制
function open(){
    this.timer =  setInterval( () =>{
        this.top += 10
        if(this.top > maxHeight) clearInterval(this.timer) 
    }, 50)
}

反之,当我们关闭的时候,当top大于-maxHeight的时候,我们同样关闭定时器,同样点击暂停按钮就单纯之间关闭定时器即可,看似没有问题了,现在这种场景已经可以正式运行了。

但是测试会发现,重复点击开始会越来越快,很明显,我们没有对开启事件做限制,重复点击会一直加载新的定时器,所以在点击开启的时候我们还需要对其进行判断,窗帘是否在移动中,如果是第二次点击则不生效。

所以此时我们需要加入一个新的变量,窗帘的状态status,当首次点击开始或者关闭按钮的时候,初次启动定时器就需要赋予其状态为movein,移动中,只有当达到边界或者手动点击暂停的时候,我们在关闭定时器的同时,再改变其状态为完成。

然后在每次点击开启或者关闭的时候判断窗帘是否在移动中,如果是,则阻止此次点击。

好了,一个开关窗户的效果就做好了,这就是一个需求的思路分析和解决步骤,在下面体验一下吧!

在线体验

码上掘金体验地址

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022 年 09 月,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 分析思路
  • 在线体验
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档