微信小程序 - 實現左右菜單聯動功能

  今天給大家分享一下如何實現微信小程序左右菜單欄聯動效果(相關代碼模塊我已單獨整理放到github上面了,歡迎前來start),具體過程如下:

效果圖:

在這裏插入圖片描述

github地址:https://github.com/sunshime/weChatSkill

一、wxml文件

  這裏需要注意的一點是:右邊列表循環的那一項必須要加上 id="scroll-{{index}}" ,少了這個是無法實現左邊聯動右邊的效果的,這個坑我踩了很多次,所以在這裏重點強調一下。

<!-- 實現左右聯動效果 -->
<view class="link">
	<!-- 左邊 -->
	<scroll-view class="left" scroll-y scroll-with-animation scroll-top="{{scrollTops}}">
		<view class="item {{tabCur===index?'active':''}}" wx:for="{{list}}" wx:key="index" data-index="{{index}}" bindtap="tabNav">{{item.name}}</view>
	</scroll-view>

	<!-- 右邊 -->
	<scroll-view class="right" scroll-y scroll-with-animation scroll-into-view="scroll-{{rightCur}}" bindscroll="scrollLink">
		<!-- 重點: id="scroll-{{index}}"  這個必須要有 不然實現不了左邊聯動右邊的效果-->
		<view wx:for="{{list}}" wx:key="{{index}}" class="right-cont" id="scroll-{{index}}">
			<view class="title">{{item.name}}</view>
			<view class="content">
				<view class="list-item" wx:for="{{item.list}}" wx:key="{{indexs}}" wx:for-index="indexs" wx:for-item="items">{{items}}</view>
			</view>
		</view>
	</scroll-view>
</view>

二、wxss文件

.link {
  width: 100%;
  height: 100%;
  display: flex;
}

.left {
  width: 220rpx;
  /* 這裏的高度可以寫也可以不寫,效果還是可以實現的,不過最好還是寫上吧 */
  height: 100vh;
  background-color: rgb(229, 243, 243);
  text-align: center;
  color: #333;
}

.left .item {
  line-height: 50px;
  font-size: 34rpx;
}

.active {
  background-color: tomato;
  color: #fff;
}

.right {
  /* 這裏的高度可寫也可不寫,效果還是可以實現的,不過最好還是寫上吧 */
  height: 100vh;
  background-color: #f8f8f8;
  padding: 0 30rpx;
}

.right-cont {
  padding-bottom: 30rpx;
  border-bottom: 1rpx solid #ccc;
}

.title {
  text-align: center;
  font-size: 36rpx;
  color: #333;
  padding-top: 60rpx;
  padding-bottom: 20rpx;
}

.content {
  padding: 0 5rpx 0 20rpx;
}

.list-item{
  font-size: 32rpx;
  color: #333;
  line-height: 50rpx;
}

三、js文件

import category from '../../api/category'

Page({

  /**
   * 頁面的初始數據
   */
  data: {
    list: category,
    scrollTops: 0,  // 要滾動的高度
    tabCur: 0,  // 當前項
    rightCur: 0,  // 用於實現左邊聯動右邊
  },
  // 切換左邊菜單並聯動右邊
  tabNav(e) {
    let index = e.currentTarget.dataset.index;
    this.setData({
      tabCur: index,
      rightCur: index,
      // 實現左邊自動滑動到某個位置 4表示自動滑動到 第五項 (4爲索引值)
      scrollTops: (index - 4) * 50
    })
  },
  /**
   * 滑動右邊對應左邊菜單切換
   * 1、拿到該元素的高度,設定它的top和bottom
   * 2、判斷滑動的距離是否大於 設定的top並小於設定的bottom,然後對應左邊菜單的滑動
   */
  scrollLink(e) {
    let list = this.data.list
    let itemHeight = 0;
    for (let i = 0; i < list.length; i++) {
      //拿到每個元素
      let els = wx.createSelectorQuery().select("#scroll-" + i);
      els.fields({
        size: true
      }, function (res) {
        list[i].top = itemHeight;
        itemHeight += res.height;
        list[i].bottom = itemHeight
      }).exec()
    }

    this.setData({
      list
    })

    // 拿到滾動的高度
    let scrollTop = e.detail.scrollTop;
    for (let i = 0; i < list.length; i++) {
      if (scrollTop > list[i].top && scrollTop < list[i].bottom) {
        this.setData({
          tabCur: i,
          scrollTops: (i - 4) * 50
        })
        return false
      }
    }
  }
})
引入的category文件(我這邊是分開寫的,所以這裏單獨列出來)
const category = [{
    name: '梨花雪',
    list: [
      '時光年輪一圈圈轉着。',
      '現在,他站在原地,回首望去,從前點點滴滴,瑣瑣碎碎。',
      '猛然發現,自己已走過了這麼多。',
      '他想,如果再次遇到下雪天,他會毫不猶豫迎上去,',
      '因爲那裏,有舊時光味道。他仍在懷念,仍在留戀。懷念,白雪紛揚日子。'
    ]
  }, {
    name: '冰雪消融',
    list: [
      '友情是每個人都應有的東西,而且相當的珍貴,',
      '在朋友之間,難免會產生分歧,讓友情結冰,',
      '但我現在知道,友情上消融的冰雪是暖的。'
    ]
  },
  {
    name: '境由心造',
    list: [
      '有人安於某種生活,有人不能。',
      '因此能安於自已目前處境的不妨就如此生活下去,不能的只好努力另找出路。',
      '你無法斷言哪裏纔是成功的,也無法肯定當自已到達了某一點之後,會不會快樂。',
      '有些人永遠不會感到滿足,他的快樂只建立在不斷地追求與爭取的過程之中,',
      '因此,他的目標不斷地向遠處推移。這種人的快樂可能少,但成就可能大。'
    ]
  },
  {
    name: '處世之道',
    list: [
      '有一羣豪豬,就是野豬啊,身上長刺的那種野豬,',
      '大家擠在一起過冬,它們老有一個困惑,',
      '就是不知道大家在一起以什麼樣的距離最好,',
      '離得稍微遠一點,冬天就冷,互相借不着熱氣,大家就往一起湊湊。',
      '結果一旦湊近了,彼此的刺都扎着對方了。',
      '就又開始遠離。',
      '但是再遠的話大家又覺得寒冷,',
      '又想借助別人的溫暖,就再湊,湊着湊着又受傷了,',
      '然後再拉遠,多少次磨合以後豪豬們終於找到了一種最最恰如其分的距離,',
      '那就是在彼此不傷害的前提下,保持着羣體的溫暖'
    ],
  },
  {
    name: '夏天',
    list: [
      '夏天的夜色很美,清爽的晚風哼着小曲來到了我們身邊,',
      '給我們送來了一絲絲涼意。',
      '夜空中,星星眨着眼睛,靜靜地聽着月亮姐姐講故事。',
      '這動聽的故事,激發了星星們的想象,',
      '星星們都在竊竊私語地討論着,難道是在討論演講稿,到哪裏發表演講嗎?',
      '周圍一片寧靜,只有晚風在低低地吟唱,',
      '月光灑向永不停息的小河,灑向盛開在夜晚的流星花,彷彿一切都活了。',
      '螢火蟲提着小燈籠,殷勤地照看着花兒、草兒,讓他們快快長大、開花。'
    ]
  }, {
    name: '風箏',
    list: [
      '一隻跌落在腳邊的風箏把我拉回到現實。',
      '是啊!無論風箏飛的多高、多遠,但都離不開手中的絲線,',
      '最後還是要回到地面。人不也一樣嗎?',
      '長大了,成家了,但無論離開故鄉多遠,離開親人多遠,你的心還在故鄉,還在父母親人的身邊啊!'
    ]
  }, {
    name: '春雨',
    list: ['我赤腳站到院中,踩在青石板上,',
      '任雨水在我臉上流淌,我不禁擡起頭望着那天空,',
      '努力的想要看清春雨的樣子,卻怎麼也看不清,',
      '只聽得見耳邊的聲音,那麼清晰那麼讓人心情舒暢。',
      '這溫柔的春雨,帶來他最動聽的聲音,擊打着石臺,',
      '發出清脆的響聲,聲音透過雨簾,透進了我的心。'
    ]
  }, {
    name: '擁有',
    list: [
      '擁有誠實,就捨棄了虛僞;',
      '擁有充實,就捨棄了無聊;擁有踏實,就捨棄了浮躁。',
      '不論是有意的丟棄,還是意外的失去,只要曾經真實的擁有,在一些時候,大度的捨棄不也是一種境界嗎?',
      '在不經意所失去的, 你還可以重新去爭取。 ',
      '丟掉了愛心, 你可以在春天裏尋覓, 丟掉了意志, 你要在冬天重新磨礪。 ',
      '但是丟掉了懶惰, 你卻不能把它拾起。 ',
      '慾望太多, 反成了累贅, 還有什麼比擁有淡泊的心胸, 更能讓自己充實、 滿足呢? '
    ]
  }, {
    name: "信任",
    list: [
      '信任一個人有時需要許多年的時間。',
      '因此,有些人甚至終其一生也沒有真正信任過任何一個人,',
      '倘若你只信任那些能夠討你歡心的人,那是毫無意義的;',
      '倘若你信任你所見到的每一個人,那你就是一個傻瓜;',
      '倘若你毫不猶疑、匆匆忙忙地去信任一個人,那你就可能也會那麼快地被你所信任的那個人背棄;',
      '倘若你只是出於某種膚淺的需要去信任一個人,那麼旋踵而來的可能就是惱人的猜忌和背叛;',
      '但倘若你遲遲不敢去信任一個值得你信任的人,那永遠不能獲得愛的甘甜和人間的溫暖,你的一生也將會因此而黯淡無光。'
    ]
  }, {
    name: '生命',
    list: [
      '應當承認,生命就是希望。',
      '應當說,卑鄙和庸俗不該得意過早,不該誤認爲它們已經成功地消滅了高尚和真純。',
      '僞裝也同樣不能持久,因爲時間像一條長河在滔滔沖刷,',
      '卑鄙者、奸商和俗棍不可能永遠戴着教育家、詩人和戰士的桂冠。',
      '在他們暢行無阻的生涯盡頭,他們的後人將長久地感到羞辱。'
    ]
  }, {
    name: '閒情',
    list: [
      '終日休息着,睡和醒的時間界限,便分得不清。',
      '有時在中夜,覺得精神很圓滿。',
      '——聽得疾雷雜以疏雨,每次電光穿入,',
      '將窗臺上的金鐘花,輕淡清澈的映在窗簾上,又急速的隱抹了去。',
      '而餘影極分明的,印在我的腦膜上。我看見“自然”的淡墨畫,這是第一次。'
    ]
  }, {
    name: '背影',
    list: [
      '我與父親不相見已二年餘了,我最不能忘記的是他的背影。',
      '那年冬天,祖母死了,父親的差使也交卸了,正是禍不單行的日子,',
      '我從北京到徐州,打算跟着父親奔喪回家。',
      '到徐州見着父親,看見滿院狼藉的東西,又想起祖母,不禁簌簌地流下眼淚。',
      '父親說,“事已如此,不必難過,好在天無絕人之路!”'
    ]
  }, {
    name: '鄉愁',
    list: [
      '經過多年的風雨磨礪,我們突然意識到:',
      '那些曾在生命中撫慰過我們的精神驛站,',
      '那些曾溫暖和光明過我們的貧寒童年的火光,',
      '卻在不經意間,漸漸地離我們遠了,',
      '模糊了——譬如母親、譬如童年的老屋、隔壁家羊角辮搖搖擺擺的阿嬌一種難以驅遣的巨大空虛和孤寂襲來,',
      '淚水頓時涌上來。這時,我們患了一種蔓延了幾個世紀的病——鄉愁'
    ]
  }, {
    name: '天池',
    list: [
      '從第一眼瞥見天池到和她告別,我一直沉默不語。',
      '我不願用一點聲音,來彈破這寧靜。',
      '天池一日我的心情是寧靜的,這是我最珍愛的心境。',
      '山光湖色隨着日影的移動而變幻。',
      '午餐後,睡了一會兒,一陣冷氣襲來,就像全身浴在冰山雪水之中。',
      '我悄悄起來,不願驚醒別人,獨自走到廊上,',
      '再次仔細觀察天池:雪峯與杉林,白與黑相映,格外分明,',
      '雪山後涌起的白雲給強烈陽光照得白銀一樣刺眼。'
    ]
  }, {
    name: '秋天',
    list: [
      '秋姑娘又來到了果園裏。',
      '果園裏的果子成熟了,葡萄架上掛滿了一串串紫裏透紅的大葡萄,',
      '它們相互掩映着自己的身體,太陽出來了,',
      '照射在葡萄上就像一顆顆透明的紫色寶石。',
      '桔樹上,一個個金黃色的桔子,讓人看了忍不住想咬一口。',
      '假如你剝開桔皮,你就可以看見一瓣瓣桔子就像一彎彎虧月時的月亮,晶瑩剔透。'
    ]
  }, {
    name: '早晨',
    list: [
      '清晨的江邊,沒有車水馬龍的喧囂,',
      '沒有人聲鼎沸的吵雜,也沒有讓人深感壓抑的匆匆人羣。',
      '清晨的江邊,有的只是垂柳的迎風飄拂,',
      '有的只是枝頭小鳥的婉轉歌唱,',
      '有的只是江風中蘊含着的淡淡的腥味。',
      '清晨的江邊,很靜,',
      '靜的可以撫平內心的煩躁,',
      '清晨的江邊,很美,綠樹紅花、微風拂面,不允許你攜帶任何憂傷。'
    ]
  }, {
    name: '夏天',
    list: [
      '夏天是萬物生機勃勃的季節,百花爭奇鬥豔,',
      '那麼你知道都有哪些花是夏季開放的嗎?跟隨美文網小編一起來看看吧。',
      ' 描寫夏天植物的美文摘抄:荷花吟 微風拂過平靜的湖面,給湖面留下片片',

    ]
  }, {
    name: '欒樹',
    list: [
      '欒樹 十二月初,深圳,我在校園的青石板小路上撿到了欒樹的蒴果。',
      ' 欒樹蒴果看上去有種似曾相識的漂亮--三瓣又薄又脆的果皮圍攏成三棱形,',
      '前端小心翼翼地開着口'
    ]
  }, {
    name: '荷塘',
    list: [
      '又是一年荷塘色 初夏早上六點,',
      '清亮透明的月兒還躲藏在雲朵裏,不忍離去,',
      '校園內行人稀少,我騎着單車,晃晃悠悠的耷拉着星鬆的睡眼。',
      '校園內景色如常,照樣是綠'
    ]
  }
]

export default category;

  以上就是實現的代碼,相應的各個步驟解釋我直接在代碼中註釋了,大家可以多看幾次代碼的實現過程,然後做出自己需要的效果。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章