小程序滚动监听,并动画控制某元素的显示隐藏

场景:

当页面滚动高度超过元素1高度时,元素2(动画的)显示或隐藏。
在小程序中如何做到滚动监听并动态获取元素高度呢?
在开发者工具中预览效果

f0g2j-tutqz.gif
解决思路:

1.在页面渲染完成后(onReady函数里) 去获取元素1在页面上距离顶部的高度fixedTop;
2.用监听页面滚动函数 onPageScroll得到当前页面滚动高度,注意,这里得到的高度是“页面在垂直防线已滚动的距离(单位px)” ;

  1. 如上动图可知,元素1距离页面顶部的高度 = 页面已滚动的距离 + 一个平面的高度
  2. wx.getSystemInfo获得设备信息,其中设备的屏幕高度字段为res.screenHeight
具体解决过程:

我们先来看看不考虑现实隐藏的效果的实现过程
.js文件

  /**
   * 监听用户滑动页面事件--返回页面在垂直方向已滚动的距离(单位px)
   */
  onPageScroll(e){
    let isfixed = 0
    if(parseInt(e.scrollTop) + parseInt(this.data.screenHeight) > this.data.fixedTop) isfixed = 1
      else isfixed = 0;

    this.setData({isfixed });
    
  },


  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady: function () {

    let query = wx.createSelectorQuery();
    query.select('#notic').boundingClientRect(res => { //获取元素1距离页面顶部高度
      this.setData({
        fixedTop: res.top
      })
    }).exec()

    wx.getSystemInfo({ //获取屏幕高度
      success: (res => {
        this.setData({
          screenHeight: res.screenHeight
        })
      })
    })

  },

.wxml 文件

<view wx:if="{{isfixed}}" class="btn">附近更多活动(我是元素2)</view>

动态的控制isfixed,就可以控制到元素2的显示隐藏啦。
注意一点, wx.createSelectorQuery()获取元素的top值是指元素的margin之外的开始计算的。这里我给 元素2 设置了50的margin,为了计算的精确性,我们应该高度判断的语句减去 元素2 的margin值,例如 if(parseInt(e.scrollTop) + parseInt(this.data.screenHeight) - 100 > this.data.fixedTop) isfixed = 1




下面来看看是怎么加显示隐藏的动画的。
实现方法:用小程序的动画api实现 或 css过度实现
下来来看具体实现过程:

方法1. 小程序wx.createAnimation api实现。
createAnimation具体的用法可看官方文档,这里只说动图的实现效果,实现代码如下:

animation.png

<view wx:if="{{isfixed}}" animation="{{animate}}" class="btn">附近更多活动(我是元素2)</view>

上图(animation.png)可以看到,先是创建一个动画函数opacityAnimate,然后在onPageScroll函数中当满足条件时调用该0动画函数,我们给动画传一个为1的值,而css的opacity: 1时即透明度为0,即元素显示。而条件不满足时传0,元素透明,即不显示。
在wxml文件中,动画用animation属性来绑定,如上的wxml代码。
这里我同时用了wx:if 和 animation ,从前面我们知道wx:if就可以控制元素的显示隐藏,只是想要看到过度效果,所以后面加了animation动画。那么这里可不可只写animation来控制显隐呢,答案是可以的,但是animation我们控制的是元素的透明度,元素隐藏只是透明度为0,元素实际上是还在的。这种情况下,如果元素中绑定了事件,点击到透明的元素,一样会触发到绑定事件,所以以防万一还是用wx:if和animation同时控制妥当些。

方法2. 用css过度实现
在控制元素的opacity属性时,可以给元素加一个transition过度属性,看起来就有个动画效果不会那么生硬了。
具体实现如下:

transition.png

<view 
    wx:if="{{isfixed}}" 
    class="btn" 
    style="transition: all 0.3s;opacity: {{isfixedShow ? 1 : 0}};"
>附近更多活动(我是元素2)</view>

用transition来过度一个元素的opacity时要注意一点,,这个元素必须是先存在的,然后再去控制opacity。如上例子,
wxml文件中,元素同时用来isfixedisfixedShow两个字段来控制。
js文件中(红框部分)isfixedShow是根据isfixed变化后的100ms后才变换的,为什么要延迟呢?其实延迟多长时间可以自己酌情控制,这里想说的是“一个元素的opacity的属性想用transition来过度时,这个元素必须是先存在的”,即先有这个元素(isfixed为true) ,然后再去控制元素的透明度opacity的值。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明先生_x阅读 15,967评论 3 119
  • 这几天外甥女们过来玩了,早上去工作的时候,小外甥女帮我开了门,然后对我说:你要早点回来陪我玩呀。当时并没有回答...
    鸟琴y阅读 446评论 0 0
  • 比情商更重要的是逆商 如果说情商是和他人相处的能力,那么逆商,就是和自己相处的能力
    湛敏阅读 220评论 2 1
  • 一天吃一个鸡蛋的后果是怎样,你知道吗?一天一个鸡蛋,不仅能提高记忆力,还能保护视力,帮助减肥。但有些人对鸡蛋心有疑...
    沃麦加阅读 4,042评论 3 1
  • 这段时期 最多的还是画自己 随便画画 画的二黑 结。
    一白的画洞阅读 246评论 1 2