微信小程序实现菜单左右联动效果

本文实例为大家分享了微信小程序实现菜单左右联动效果的具体代码,供大家参考,具体内容如下

原理

首先是获取数据,并且获取数据的长度(需要根据长度来计算元素的高度),通过遍历数据的内容通过题目和元素个数的相加得到高度,当消失高度小于等于某个元素的高度就设定索引值给左边的菜单目录实现右边滑动左边联动,左边的菜单点击事件联动比较简单就不说

代码实现

wxml

<view class="menu">
        <view class="left-box">
            <scroll-view class="left_menu" scroll-with-animation  scroll-y="true" scroll-into-view="{{leftViewId}}">
                <text class="menu-item {{index==currentIndex?'menu-active':''}}" wx:for="{{navList}}" wx:key="this" data-id="menu{{index}}" data-i="{{index}}" bindtap="changeMenu">{{item.c_name}}</text>
            </scroll-view>
        </view>
        <view class="right-box">
            <scroll-view class="right_menu" scroll-y='true'  scroll-with-animation scroll-into-view="{{rightViewId}}"  bindscroll="getScroll" enable-flex>
                <view wx:for="{{navList}}" wx:key="this" class='pro-item' id="menu{{index}}">
                    <view class="right_menu_head">{{item.c_name}}</view>
                    <view class="list-box">
                        <view class="menu_list" wx:for-item='items' wx:for="{{item.list}}" wx:key="this">
                        <image src="{{items.url}}"></image>
                        <view>{{items.goodsName}}</view>
                    </view>
                </view>
                </view>
            </scroll-view>
        </view>
</view>

wxss,这里使用的是less语法,vscode插件可编译

.menu{
    .left-box{
        width: 180rpx;
        border-right: 1px solid #dfdfdf;
        position: fixed;
        left: 0;
        z-index: 10;
        top: 370rpx;
        box-sizing: border-box;
        height: 90%;
        background: #f0f0f0;

        .menu-item{
            display: inline-block;
            width: 180rpx;
            height: 88rpx;
            font-size: 26rpx;
            line-height: 88rpx;
            background: #fff;
            text-align: center;
            border-bottom: 1px solid #dfdfdf;
        }

        .menu-active{
            background: #f0f0f0;
            border-left: 10rpx  solid #333999;
        }
    }
    
    .right-box{
        width: 74%;
        position: fixed;
        top: 360rpx;
        height: 77%;
        right: 0;
        border-left: 20rpx;
        box-sizing: border-box;
        margin-top: 20rpx;

        .right_menu{
            height: 100%;
            box-sizing: border-box;

            .pro-item{

                .right_menu_head{
                    height: 80rpx;
                    line-height: 80rpx;
                    font-size: 26rpx;
                    font-weight: 600;
                }

                &:last-child{
                    margin-bottom: 156rpx;
                }

                .list-box{
                    width: 100%;
                    // min-height: 380rpx;
                    display: flex;
                    flex-wrap: wrap;
                    background: #fff;
                    box-sizing: border-box;
                    border-radius: 10rpx;
                    font-size: 20rpx;

                    .menu_list{
                        width: 33.3%;
                        font-size: 20rpx;
                        padding: 20rpx 0;
                        text-align: center;
                        font-style: '微软雅黑';

                        image{
                            width: 100rpx;
                            height: 100rpx;
                        }

                        view{
                            color: #333;
                            text-overflow: ellipsis;
                            white-space: nowrap;
                            overflow: hidden;
                          }
                    }
                }
            }
        }
    }
}

js文件

data:{
    navList:[..],//数据
    currentIndex: 0,//左边对应的索引
    rightViewId: '',//点击事件右边的索引
}

getScroll(e) {//微信小程序中绑定滑动函数,每滑动一下都会触发
        let top = e.detail.scrollTop,
            h = 0,
            _this = this;

        for (let i = 0; i < this.data.navList.length; i++) {
            let dishSize = this.data.navList[i].list.length;//获取数据对应展示商品的json
            h += 38 + parseInt(dishSize / 3 * 80);//获取当前元素的高度,38是标题高度,80是元素高度

            if (top <= h) {//满足条件立刻停止循环,就会一直停留再当前索引,不满足当前就会自动到下一个菜单
                _this.setData({
                    currentIndex: i
                })
                break;
            }

        }

    },
    changeMenu(e) {
        console.log(this.data.heightArr, this.data.topArr);

        this.setData({
            currentIndex: e.currentTarget.dataset.i,
            rightViewId: e.currentTarget.dataset.id
        })

    }

展示图片

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 微信小程序scroll-view实现左右联动效果

    微信小程序利用scroll-view实现左右联动,供大家参考,具体内容如下 点击左边的按钮时,右边可以跳动到指定的位置 首先要注意使用scroll-view竖屏滚动,需要给scroll-view固定高度 其次在点击时,需要给需要滚动的scroll-view加上scroll-into-view,其值应该是子元素的id,且id不能以数字 开头 滚动右边,左边菜单跳到相应的位置 其实现的思想是,在右边滚动屏滚动时,得到滚动的距离.将右边滚动屏中各模块到达顶部的距离计算出来放到一个数组中.第一个模块的滚

  • 微信小程序实现左右联动

    本文实例为大家分享了微信小程序实现左右联动的具体代码,供大家参考,具体内容如下 最近学校课程系统分析项目使用了微信小程序来进行搭建,在选择了点餐项目后,对主页进行实现时,想要实现像麦当劳点餐一样,左边表示类别,右边表示菜品,通过点击左边的类,右边会滚动到对应的类,滚动右边的菜品,左边当前滚动到的菜品类别也回高亮显示.那么首先先展示一下成果吧! 虽然这个功能很小,但我觉得一旦搞清楚scroll-view的原理就很有用处. 首先查看微信小程序的官方文档:scroll-view 下面来按照我自己的理解

  • 微信小程序实现联动菜单

    最近为了实现课程设计,也做了一些前端的东西,今天想要做一个联动菜单来实现一些功能.实现了,也来做做笔记. 第1步:了解一下 左右侧菜单其实简单来讲就是把一个区域分成左右两个部分.关于组件,我觉得可以直接去微信开发文档看.通过代码,我觉得应该是可以理解的.话步多讲,直接上代码.(首先说明一点的是,我还是个刚刚接触前端的小白,可能有些写得不太好得,往各位博友多多指出改进得建议,相互学习) 第2步:先看一下效果啦 运行效率还是可以的很快,无卡顿现象. 第3步:实现(代码) 这里我只放了其中一部分,也是

  • 微信小程序scroll-view实现左右联动

    本文实例为大家分享了微信小程序scroll-view实现左右联动的具体代码,供大家参考,具体内容如下 需求:项目中做了一个选择城市的需求,要求全国所有的省市区都按照中文首字母分类并排序,左侧的城市列表和右侧的字母列表实现双向联动. 第一步:根据腾讯提供的javascript SDK提供的接口,获取所有的省市区,并将省市区按照首字母进行分类排序. let _this = this; _this.mapCtx = wx.createMapContext("myMap"); // 实例化AP

  • 微信小程序实现菜单左右联动

    本文实例为大家分享了微信小程序实现菜单左右联动的具体代码,供大家参考,具体内容如下 今天记录一个个人写的二级联动示例. 下面是效果图: 功能实现关键是使用控件scroll-view,下面直接上示例代码. 页面对应的js文件: Page({ data: { select_index:0, scroll_height:0, left: [{ id: 1, title: '选项一' }, { id: 2, title: '选项二' }, { id: 3, title: '选项三' }, { id: 4

  • 微信小程序实现左右联动的实战记录

    前言 最近在学习小程序,实现了左右联动的功能,记录一下思绪,方便以后参考. 最终的界面如下, 点击左边任意一个项目,右边会跳到相应项目的起始位置,右边滑动,左则会跳到相应的位置. 实现思路 在这里,右则每一项的高度都是固定的,方便定位当前滑动距离在哪一个大项(左则)里.右则的 scroll-view 使用了一项关键的属性:scroll-into-view,这个属性用来确定 scrollTop 的值的,当 scroll-into-view 的值和 scroll-view 里面的元素的id的值相等时

  • 微信小程序实现左右列表联动

    本文实例为大家分享了微信小程序实现左右列表联动的具体代码,供大家参考,具体内容如下 效果图: 直接上代码: wxml界面: <view class='header'> <text class='headerClass'>分类</text> <text class='headerPin'>/品牌</text> <view class="search"> <image src='/images/搜索.png'&g

  • 微信小程序实现购物页面左右联动

    本文实例为大家分享了微信小程序实现购物页面左右联动的具体代码,供大家参考,具体内容如下 效果图: wxml <view class="pro-container"> <scroll-view class="left-menu" scroll-y scroll-with-animation="true" scroll-top="{{leftMenuTop}}"> <view class="

  • 微信小程序实现菜单左右联动效果

    本文实例为大家分享了微信小程序实现菜单左右联动效果的具体代码,供大家参考,具体内容如下 原理 首先是获取数据,并且获取数据的长度(需要根据长度来计算元素的高度),通过遍历数据的内容通过题目和元素个数的相加得到高度,当消失高度小于等于某个元素的高度就设定索引值给左边的菜单目录实现右边滑动左边联动,左边的菜单点击事件联动比较简单就不说 代码实现 wxml <view class="menu">         <view class="left-box"

  • 微信小程序实现商品数据联动效果

    微信小程序实现商品数据联动 直接复制代码更改可以看出效果,然后根据自己想要进行调整 注: 以下商品图片用于测试,如有侵权请通知,会删除相关图片. js部分: // pages/demo1/demo1.js //存放右侧分类的高度累加数组 var heightList = []; //记录scroll-view滚动过程中距离顶部的高度 var distanceToTop = 0; Page({ /** * 页面的初始数据 */ data: { curActive: 0, //当前选中项 produ

  • 微信小程序自定义菜单导航实现楼梯效果

    设计初衷 在开发页面时,往往需要实现,点击页面的导航菜单页面滚动到相应位置,滚动页面实现菜单选项的高亮.在html开发中,我们可以用到a标签锚点实现,jq的动画相结合实现类似效果.在框架中vant UI框架也为我们实现了这一效果. 微信小程序该如何实现?? 效果展示 当菜单导航滚动到页面顶部时,菜单吸顶 当点击菜单按钮时,切换到对应区域(过渡到该区域,有动画效果) 当内容区滚动到某类区域时,对应区域的菜单按钮高亮 设计思路 1.吸顶效果的实现 获取菜单导航距离页面顶部距离wx.createSel

  • 微信小程序实现侧边栏二级联动

    本文实例为大家分享了微信小程序实现侧边栏二级联动的具体代码,供大家参考,具体内容如下 实现效果如下 实现步骤 样式布局(.wxml文件) <scroll-view scroll-y="{{true}}"                style="height:{{height}}px;"                class="nav-right-menu">       <!-- 一级菜单 -->   <vi

  • 微信小程序实现商品属性联动选择

    本文实例为大家分享了微信小程序实现商品属性联动选择的具体代码,供大家参考,具体内容如下 效果演示: 代码示例 1.commodity.xml <!-- <view class="title">属性值联动选择</view> --> <!--options--> <view class="commodity_attr_list"> <!--每组属性--> <view class="a

  • 微信小程序 利用css实现遮罩效果实例详解

    微信小程序 利用css实现遮罩效果实例详解 实现效果图: 如图所示,使用css实现小程序的遮罩效果,代码如下 js文件代码: //index.js //获取应用实例 var app = getApp() Page({ data: { flag: false }, a: function(){ this.setData({flag: false}) }, b: function(){ this.setData({flag: true}) } }) wxss文件代码: .b1{position:fi

  • 微信小程序实现验证码获取倒计时效果

    本文实例为大家分享了微信小程序实现获取验证码倒计时效果的具体代码,供大家参考,具体内容如下 wxml <button disabled='{{disabled}}' data-id="2" bindtap="getVerificationCode"> {{time}} </button> js var interval = null //倒计时函数 Page({ data: { date:'请选择日期', fun_id:2, time: '获

  • 详解微信小程序用定时器实现倒计时效果

    平常在微信小程序开发的时候,因项目的需求,倒计时必不可少,下面主要讲解定时器在微信小程序中的使用. 这里要先声明一点的就是,该篇主要实现倒计时功能,而且实现是时长较短的倒计时,其他的优化什么的不作主要考虑. 如果实现简单的60s倒计时效果,我们可直接使用setInterval即可,但是在微信小程序中,我们需要用微信小程序的语法,这时就会遇到一个难题,那就是怎么关闭定时器的问题,下面给出实例. WXML代码 <view class='countDown'>倒计时:<text style='

随机推荐