# 小程序制作滚动动画的顶部导航栏

微信小程序制作滚动动画的顶部导航栏

# 制作组件headerNavbar

<view class='header' style='height:{{navbarBtn.height}}px;'>
    <view class="navbar-icon" style="padding-top:{{navbarBtn.top }}px;" wx:if='{{navbarData.showCapsule ? navbarData.showCapsule : true}}'>
        <van-icon  wx:if='{{haveBack}}' bindtap="goBack" name="arrow-left" class="floatL" size="24px" />
        <van-icon  wx:if='{{!haveBack}}' bindtap="goHome" name="arrow-left" class="floatL" size="24px" />
    </view>
</view>
1
2
3
4
5
6
/*
 * @Author: 时不待我 790002517@qq.com
 * @Date: 2023-03-20 16:35:47
 * @LastEditors: 时不待我 790002517@qq.com
 * @LastEditTime: 2023-03-26 15:40:54
 */
// components/Goindex/Goindex.js
const app = getApp();
Component({
  /**
   * 组件的属性列表
   */
  properties: {
    navbarData: { // 由父页面传递的数据
      type: Object,
      value: {},
      observer: function (newVal, oldVal) {
      }
    }
  },
  data: {
    haveBack: true, // 是否有返回按钮,true 有 false 没有 若从分享页进入则为 false
    navbarBtn: { // 胶囊位置信息
      height: 0,
      width: 0,
      top: 0,
      bottom: 0,
      right: 0
    },
    showMenu: true, // 菜单的显示状态
  },

  /**
   * 组件的初始数据
   */
  data: {

  },

  /**
   * 组件的方法列表
   */
  methods: {
    goHome() {
      wx.redirectTo({
        url: '/pages/card/card',
      })
    },
    goBack: function () {
      wx.navigateBack({
        delta: 1
      });
    },

  },
  // 微信7.0.0支持wx.getMenuButtonBoundingClientRect()获得胶囊按钮高度
  attached: function () {
    let statusBarHeight = app.globalData.systeminfo.statusBarHeight  // 状态栏高度
    let headerPosi = app.globalData.systeminfo.headerBtnPosi // 胶囊位置信息

    let btnPosi = { // 胶囊实际位置,坐标信息不是左上角原点
      height: statusBarHeight + 44,
      width: headerPosi.width,
      // 胶囊top
      top: statusBarHeight * 1.09,
      // 屏幕宽度 - 胶囊right
      right: app.globalData.systeminfo.screenWidth - headerPosi.right
    }
    let haveBack;
    if (getCurrentPages().length === 1) { // 当只有一个页面时
      haveBack = false;
    } else {
      haveBack = true;
    }
    this.setData({
      haveBack: haveBack, // 获取是否是通过分享进入的小程序
      navbarBtn: btnPosi
    })

  },

  lifetimes: {
    ready() {

    },
  }

})

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
.header{
    display:flex;
    align-items: center;
    position: fixed;
    z-index: 99999;
    width: 100%;
    position: fixed;
    top: 0;
    left: 0;
    z-index: 2;

}
1
2
3
4
5
6
7
8
9
10
11
12

# 页面使用

<scroll-view scroll-y="{{true}}" style="height:100vh" data-status-bar-height="44" scroll-with-animation id="headers" throttle="{{false}}" >
     <view class="animalDetails" >
      <headerNavbar ></headerNavbar>
    </view>
</scroll-view>
1
2
3
4
5
_animate() {
    //跨组件元素选择器
    this.animate('.animalDetails>>>.header', [{
      backgroundColor: 'transparent',

    }, {
      backgroundColor: '#FFF',
    }], 1000, {
      scrollSource: '#headers',
      timeRange: 1000,
      startScrollOffset: 0,
      endScrollOffset: 44,
    })

    //跨组件元素选择器
    this.animate('.animalDetails>>>.floatL>>>.van-icon', [{
      color: '#FFF',

    }, {
      color: '#000',
    }], 1000, {
      scrollSource: '#headers',
      timeRange: 1000,
      startScrollOffset: 0,
      endScrollOffset: 44,
    })

  },
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28