vue结合better-scroll实现商品详情联动效果

移动端开发---菜单栏与商品左右联动 这里截取better-scroll官网的说明,有兴趣可以去阅读官网:https://www.wenjiangs.com/doc/2fh58adz。 阅读详情

better-scroll

ps:商品详情联动效果, 当滑动到某个位置时出现tab标签栏, 点击tab项时滑动到对应位置并激活当前类。


滑动元素吸顶.可参考

效果图

在这里插入图片描述

安装better-scroll

  • 安装: npm i better-scroll -S
  • 组件中引入: import BScroll from 'better-scroll'
  • better-scroll官网

template

注意 content的高度不超过父容器的高度,是不能滚动的哦。

<template>
    <div class='goodsWrap'>
        <div class="contentList" ref="right">
            <div>
                <ul ref="r_item">
                    <li class="right-item-hook">
                        <div class="bannerBox">
                            <img src="uploads/banner/20200420/e3cd62c7c283c4e25f372bc80c446cfd.jpeg" alt="">
                        </div>

                        <div class="goodsDescBox" ref="boxItem">
                            商品描述
                            <!-- 添加测试数据撑开高度 -->
                        </div>
                    </li>
                    <li class="right-item-hook">
                        <div class="goods-detail-wrap">
                            商品详情
                             <!-- 添加测试数据撑开高度 -->
                        </div>
                    </li>
                </ul>
            </div>
        </div>

        <!-- 滑动到某个点出现置顶 tab标签 -->
        <div class="fixedBar" :style="`opacity: ${backgroundColor}`" v-show="hiddenTopBar" :class="hiddenTopBar == true ? 'isFixed' : ''">
            <div class="goBack" @click="back">
                <img src="../../assets/images/goBack_black.png" alt="">
            </div>
            <div ref="left">
                <ul class="ul" ref="l_item">
                    <li v-for="(item, index) in categoryList" :key="index" :class="{active: currentIndex == index}" @click="selectItem(index, $event)">
                        {{item.name}}
                    </li>
                </ul>
            </div>
        </div>

    </div>
</template>

使用better-scroll

<script>
import BScroll from "better-scroll";

export default {
    name: "goodsDetail",
    data() {
        return {
            backgroundColor: "", //背景颜色
            hiddenTopBar: false, //是否显示tab
            categoryList: [{ name: "商品" }, { name: "详情" }], //tab标签
            currentIndex: 0, //当前元素下标
        };
    },
    mounted() {
        this.$nextTick(() => {
            // 实例化 BScroll
            this._initScrollY();

            //获取右侧tops
            this._initTops();
        })
    },
    destroyed() {
        this.$refs.listScroll && this.$refs.listScroll.destroy();
    },
    methods: {
        back() {
            this.$router.go(-1);
        },
        
        // 初始化better-scroll
        _initScrollY() {
            // 创建左侧滑动
            this.lefts = new BScroll(this.$refs.left, {
                probeType: 3, // 是否会截流scroll事件
                scrollY: true,  // 是否开启Y轴滚动方向
                click: true, // 是否开启点击事件
                useTransition: false, // 防止iphone微信滑动卡顿
                bounce: true, // 是否启用回弹动画效果
                momentumLimitDistance: 5 // 符合惯性拖动的最小拖动距离
            });
            //创建右侧滑动
            this.rights = new BScroll(this.$refs.right, {
                probeType: 2, //这里可以取4个值,具体参考官方文档
                click: true,
                useTransition: false // 防止iphone微信滑动卡顿
            });

            // 给右侧绑定的BScroll绑定监听事件,获取滑动过程中的位置
            this.rights.on("scroll", pos => {
                this.scrollY = Math.abs(Math.round(pos.y));
				
				// 是否显示标题
                let tops = this.$refs.boxItem.offsetTop;
                if (this.scrollY >= tops) {
                    this.hiddenTopBar = true;
                } else {
                    this.hiddenTopBar = false;
                }

                //设置背景颜色的透明度
                if (tops && this.scrollY) {
                    // this.backgroundColor = `rgba(250, 252, 255, ${this.scrollY / (this.scrollY + 44)})`;
                    this.backgroundColor = `${this.scrollY / (this.scrollY + 10)}`;
                } else if (this.scrollY == 0) {
                    this.backgroundColor = "transparent";
                }
            });

            //获取停下来的位置
            // 给右侧绑定的BScroll绑定监听事件,获取滑动结束时的位置
            this.rights.on("scrollEnd", pos => {
                this.scrollY = Math.abs(Math.round(pos.y));
                console.log(this.scrollY);
                for (let i = 0; i < this.tops.length; i++) {
                    if (this.scrollY > this.tops[i] && this.scrollY < this.tops[i + 1]) {
                        // this.currentIndex = i;
                        if (!this.clickEvent) { //handle是否选中当前元素
                            this.currentIndex = i;
                        }
					
                        if (i > this.$refs.l_item.children.length - 3) {
                            var tmp =
                                i - (this.$refs.l_item.children.length - 3);

                            //当滚动到倒数第2个位置时左侧列表向上滚动一个距离
                            this.lefts.scrollToElement(
                                this.$refs.l_item.children[tmp], 100, 0, 0
                            );
                        }
                        if (i < this.$refs.l_item.children.length - 3) {
                            //当滚动到第3个位置时左侧列表向下滚动一个距离
                            this.lefts.scrollToElement(
                                this.$refs.l_item.children[0], 100, 0, 0
                            );
                        }
                        this.clickEvent = false; //handle
                    }
                }
            });
        },

        //获取当前li的top
        _initTops() {
            var tops = []; //定义一个空数组
            let top = 0;
            tops[0] = 0; //第一个li的坐标为0

            var lis = this.$refs.r_item.children; //获取到了每个li
            //Array.protoype.slice.call(lis) 将具有length属性的对象转成数组 lis可能是个对象
            Array.prototype.slice.call(lis).forEach((li, index) => {
                // top = top + li.clientHeight; //当前的位置=上一个的位置+这个的高度
                top = top + li.clientHeight + 40; //【根据需要调整】
                tops.push(top);
            });

            this.tops = tops;
        },

        // 滑动某个点联动tab项
        selectItem(index, event) {
            this.currentIndex = index;

            this.clickEvent = true;
            if (!event._constructed) {
                return;
            } else {
                let rightItems = this.$refs.right.getElementsByClassName(
                    "right-item-hook"
                );
                let el = rightItems[index];
                this.rights.scrollToElement(el, 300, 0, -40); //-40:【根据需要调整:标题高度】
            }
        },
    }
};
</script>

style

<style lang='scss' scoped>
    @import '../../assets/style/mixin';
    .goodsWrap {
        @include bg($f5);
        @include wh(100%, 100%);
        overflow: hidden;
        .bannerBox {
            @include wh(100%, 705px);
            margin: 0 auto;
            img {
                @include wh(100%, 100%);
            }
        }
        .goodsDescBox {
            padding: 10px 30px 20px;
            @include bg($white);
        }
     
        .goods-detail-wrap {
            @include bg($white);
        }

        .contentList {
            position: absolute;
            width: 100%;
            height: 100%;
            top: 0px;
            left: 0;
            right: 0;
            bottom: 0;
            overflow: hidden;
            -webkit-overflow-scrolling: touch;
        }
        .isFixed {
            position: fixed;
            top: 0;
            // transition: all .5s;
            background: linear-gradient(0deg, 
            #ffffff 0%, 
            #f5f5f5 100%);
        }

        .fixedBar {
            @include fcc;
            z-index: 10;
            position: absolute;
            @include wh(100%, 82px);
            .goBack {
                @include ct;
                left: 8px;
                @include wh(60px, 60px);
                @include fcc;
                img {
                    @include wh(34px, 34px);
                }
            }
            .ul {
                @include fc;
                li {
                    @include sc(30px, $fc);
                    position: relative;
                    padding-bottom: 8px;
                    &:not(:first-of-type) {
                        margin-left: 60px;
                    }
                }
                .active {
                    color: $main;
                    &::after {
                        content: '';
                        @include cl;
                        bottom: 0;
                        @include wh(54px, 6px);
                        @include bg($main);
                        @include borderRadius(3px);
                    }
                }
            }
        }
    }
</style>

感谢.参考文章

better-scroll技术总结 需要实现的功能: 1 从首页跳进列表页,传入index参数,nav要根据index值滚动到对应的dom位置 2 点击 nav => 触发点击的dom滚动到顶部,(每次点击nav,data和title都需要初始化滚动位置) 3 data数据更新,title数据更新 4 点击 title => title 可以横向滚动,data数据也要滚动到与title对应的数据位置 npm: n... 阅读详情

相关推荐

vue利用better-scroll实现通讯录式列表滚动和左右联动效果

better-scroll实现通讯录式列表滚动和左右联动效果

z12845464的博客 2385

vue商品列表滚动效果_Vue仿京东移动端web版商品详情页滚动样式

1 2 34 5 6 7 8 Document9 10 1112 13 14 15 16 17 18 @click="onScrollGoods">商品19 ...

weixin_35404745的博客 958

vue仿淘宝商品详情demo

使用vue2仿照了淘宝商品详情以及加入购物车。包含的页面有首页、分类更多、商品详情,其中商品详情的加入购物车利用了vue的组件功能

vue element-ui el-table 的滚动条联动效果

容易踩坑的就是 之前dialoge没显示,就是在mounted里面去获取dom元素,一直报错,解决方法就是监听dialoge,当弹出后,dom渲染完了 再去获取就好了。 二:还有一种写在 el-dialog 弹窗里面的 ,如果还是按上面的写会报错,需要修改下。把scrollLeft或者scrollTop赋给Btable,需求效果如图所示,可以上下 或者左右。鼠标控制Atable滚动条的时候,反之Btable赋给Atable,

欢迎来到 动感地带 2137

2025年(第十一届)全国大学生统计建模大赛论文及选题分析

基于数据驱动决策:整个研究围绕给定的洪水灾害相关数据进行深入挖掘和分析,从数据清洗、特征分析、模型建立到最终预测,每一步都以数据为基础,通过对数据的有效利用来揭示洪水灾害发生的相关规律和特征,为洪水灾害的风险评估和预测提供依据,符合数据引领未来决策的理念。实际应用导向:洪水灾害是现实中严重影响人类生命财产安全和社会经济发展的重要问题,本研究旨在实现对洪水灾害的预测,其成果可直接应用于防洪减灾工作,如洪水预警、风险评估与区划等,对实际防灾减灾工作具有重要的指导意义,体现了以数据为支撑服务实际应用的特点。

qq_52590045的博客 1万+

固定时间收敛的控制器设计(基础知识)

针对控制系统的有限时间收敛和固定时间收敛给出一些常用定理。

qq_40241332的博客 1万+

android中点击listview中的item跳转到同一页面_「Vue项目」中的滚动组件&联动效果从0到1(建议收藏)

前言最近的一个项目做的是vue组件中的一个应用,「处理滚动列表」,这个应该是很常见的需求了,在项目中遇到的痛点,难点,如何一步步解决的,以及小细节一些优化。借鉴某课的思路,仿QQ音乐效果,记录一下,自己字母解决这个难题,分享给你们,「希望对你们做移动端滚动列表问题有所帮助」GitHub仓库效果处理滚动列表最终效果从最终效果来看,实现了三个我的难点第一个就是右侧快速入口,点击一个字母跳转到相应的部分...

weixin_39794347的博客 440

西门子S7-1200/1500 PLC编程与应用技巧

西门子S7-1200 PLC是一款紧凑型的控制器,适用于小型到中型的自动化控制任务。紧凑设计:集成了I/O模块,减少了控制柜的空间需求。高性能:高达25µs的扫描时间,能够快速响应。模块化扩展:支持扩展输入输出模块、通信模块和智能模块,满足不同的应用需求。多种编程语言:支持Ladder图(梯形图)、功能块图(FBD)、结构化文本(ST)等多种编程语言。西门子S7-1200与S7-1500 PLC是强大且灵活的工业控制系统,适用于各种自动化应用。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 2666

Ant-Design-Vue 实现a-table表格和按钮联动滚动

页面上有A, B,C 三个按钮和一个a-table ,当选中A时, 表格展示A的数据并开始向下滚动, 当到达最下方时,按钮B选中,表格展示B的数据并重新开始滚动如此循环…默认选中A。

收集、分享 1277

电荷灵敏前置放大器噪声优化策略:从理论到实践

本文深入探讨了电荷灵敏前置放大器的噪声优化策略,从理论分析到实践应用。文章系统解析了并联电流噪声与串联电压噪声的来源,并引入噪声等效原理与“冷电容”模型作为统一分析工具。通过详解a、b、c三类噪声的频谱特性,为实战优化提供了清晰指导。核心策略包括选用高跨导、低漏电流FET,优化静态工作点,采用共源-共基结构,精心设计反馈网络,以及实施严格的PCB布局、屏蔽与接地,旨在全面提升微弱信号检测系统的信噪比。

weixin_29292431的博客 466

vue3:实现ECharts3D地图详细示例,echarts实现3D地图map3D,vue3如何利用echarts绘制3d地图立体城市省市地区分布,可视化数据大屏3D炫酷中国地图(复制源码,开箱即用)

echarts实现中国地图记录篇之3D地图,Echarts地图之——如何让地图显示出3d感,【3d地图】vue中使用echarts geo3D,echarts实现某个市3D地图展示,vue3中使用echarts实现中国地图,3D地图图表,echarts实现3D地图——map3D,数据大屏3d地图,vue3+echarts绘制中国地图,3D地图,省、市、县,【3d地图】vue3中使用echarts geo3D,echarts实现某个市3D地图展示,ECharts3D地图(详细示例——附有具体注释),echar

✅ 精选推荐文章 3669

vue中使用better-scroll实现滑动以及左右联动效果

一、首先需要在项目中引入better-scroll 1. 在package.json 直接写入 "better-scroll":"^1.15.1" 版本以github上为准(目前最新) 2.cpnm install 在node_modules 可以查看版本是否安装 3.直接在你的组件里面写入import BScroll from 'better-scroll'; 二、better-s...

mm_hello11的博客 7897

ICC2:mem出pin的Off Grid问题

这个命令本意是解决跨制成调用IP时在IP出pin位置加一定的routing blockage,限制绕线在一定范围内只能走直线出pin,用来解决off-grid问题也有很好的效果。在ICC2做先进工艺时会有off-grid的问题,off-grid可以理解为绕线没有在preferred方向track上。测试发现,2022版本以前的ICC2绕线容易有off-grid问题。主要在mem出pin的M2/M3层次上,切换版本绕线能很大程度上解决这个问题。我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?

m0_61544122的博客 1625

走进移动端世界,实现左右菜单联动效果轻松上手(vue+better-scroll)

走进移动端世界,实现左右菜单联动效果轻松上手(vue+better-scroll)

希望看完文章的你能够带着答案离开。 5395

基于YOLOv26的卫星遥感环境监测系统

本文介绍了一个基于YOLOv26的卫星遥感环境监测系统。该系统采用分层架构设计,包含数据采集、预处理、目标检测、图像分析、变化检测等核心模块。技术栈包括YOLOv26、PyTorch、OpenCV等深度学习框架和图像处理工具,以及GDAL、rasterio等地理信息处理库。系统支持获取多种卫星数据源(如Sentinel、Landsat、MODIS)的遥感图像,并进行时间序列分析。通过代码示例展示了数据采集模块的实现,包括卫星图像获取和模拟生成功能。该系统可应用于环境要素检测、变化监测等场景,为环境监测提供智

一键难忘的博客 934

TC397 EB MCAL开发从0开始系列 之 [15.1] Fee配置实战 - 双扇区demo

TC397 EB MCAL Fee模块实战之双扇区配置使用

yy九歌的博客 1125

Vue 中使用better-scroll实现左右联动的效果

Vue 中使用better-scroll实现左右联动的效果 效果图 1. 说明 在使用better-scroll的时候需要先在全局注册一个实例化的对象this.leftScroll 和 this.rightScroll,方便在之后的代码中使用 在销毁页面的时候要清除掉实例化的对象,避免造成性能的溢出beforeDestroy() { this.left_Scroll.destroy()...

小火车况且况且况且的博客 913

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

vue实现商品分类左右联动

vue中better-scroll实现商品分类左右联动 结合better-scroll插件实现商品分类左右联动交互方式。 前提准备 安装: npm i better-scroll -S 组件中引入: import BScroll from 'better-scroll' better-scroll官网 相关文章: better-scroll监听元素吸顶 better-scroll商品详情联动 步骤: 先实现左联右 再实现右联左 效果图 1. 初始化数据 data() { return

Smile_ping的博客 6602

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

vue+better-scroll左右联动滑动

vue+better-scroll左右联动滑动 效果图: 功能:实现左边点击,右边跟着滑动,右边滑动,右边跟着变化 css: *{ padding:0px; margin:0px; } ul{ list-style: none; } .content{ ...

_小郑有点困了的博客 1338

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

vue2.0——项目开发_better-scroll 实现移动端滑动

better-scroll + vue2.0 实现移动端滑动——左右联动效果:滑动右侧时,左侧也能有相应的变化;点击左侧时,右侧也能自动定位到相应的位置。如下图所示界面,左侧为分栏,右侧为分栏详情。滑动右边使左边联动的大概的思路:      1)要知道右侧的列表中,每一个分栏所占的高度,存进一个数组中。      2)实现左边联动,则必须要监控 “scroll”事件,获取其高度      3)将sc

xustart7720的博客 2809

vue2.0和better-scroll实现左右联动效果

在做移动端商城或者其他页面的时候,经常会遇到左右联动的效果,今天小编vue2.0和better-scroll这个插件一起实现左右联动效果。 实现上面的效果,思路一定很重要,还有需求 1. 左边一级分类和右边二级分类形成联动 2. 当滑动右侧分类列表时, 更新左侧分类选中 3. 点击左侧一级分类项时, 右侧列表滑动到对应位置 在vue脚手架的时候,引入第三方插件better-scrol...

will5451的博客 799

vue中使用better-scroll实现菜单和列表联动的滚动效果,附完整演示代码,(可直接复制)

实现类似这种效果: 安装better-scroll npm install better-scroll --save vue中引入 import BScroll from 'better-scroll' 完整示例demo(含css,js,html,和data数据): 可直接复制观看: 含有详细注释 <template> <div id="app"> &l...

codingWeb的博客 2352

Vue使用better-scroll左右菜单联动

说明 最近想做一个vue商城小项目,练习一下vue的语法,刚刚好碰到了需要左右菜单实现联动,因此就接触了 better-scroll。 github地址 中文文档。 代码 页面结构以及数据 //页面结构 <template> <div id="wrap"> <div class="goodMenu" ref...

weixin_30819163的博客 1073

vue中scroll 的使用

        滚动位置固定:在vue中通过路由切换页面时组件会自动滚动到顶部,需要监听滚动行为才能让滚动位置固定,better-scroll解决了这个问题。 常用效果:移动端很常见的效果,当滑动右边部分的时候,左边会联动显示与当前内容相符合的标题高亮,当点击左边某一个标题的时候,右边会自动滑动到相应的内容。 npm install better-scroll --save import ...

BeiBeiTian的博客 2万+

Vue中better-scroll实现左右侧BScroll联动nextTick

better-scroll用法及掉过的坑引用 引用 ```javascript <script> import BScroll from 'better-scroll' export default { watch: { menus() { this.$nextTick(() => { this._initRightLiTops() this._initBScroll() }) }, }, methods

youngAda的专栏 492

better-scroll:实现菜单和内容联动的效果

1、基本使用 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X...

dnswek的博客 1197
上一篇: vue中使用echarts
下一篇: 微信支付——H5,小程序支付
Smile_ping
博客等级 码龄11年 3758粉丝 216原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值