首页 > 其他分享 >vue 页面滚动时自动切换Tab标签,点击标签自动滚动页面

vue 页面滚动时自动切换Tab标签,点击标签自动滚动页面

时间:2023-08-23 11:05:33浏览次数:49  
标签:flex cont 标签 height background 滚动 display block 页面

功能: 手机端实现 切换头部tab定位到下文内容,滚动页面内容时自动定位到相对应tab

逻辑:监听+tab切换

完整代码:

以下是完整代码:

<template>

    <div class="box">

        <div class="tab" ref="tab">

            <div v-for="(item, index) in tabs" :key="index">

                <div :class="{ active: active === index }" @click="switchTab(index)">

                    {{ item }}

                </div>

            </div>

        </div>

        <div class="cont" ref="cont">

            <div class="cont_1" ref="cont_1">内容一</div>

            <div class="cont_2" ref="cont_2">内容二</div>

            <div class="cont_3" ref="cont_3">内容三</div>

        </div>

        <div class="back-top" @click="backTop"></div>

    </div>

</template>

<script>

    export default {

        data() {

            return {

                tabs: ['tab1', 'tab2', 'tab3'],

                active: 0,

                cont1: null,

                cont2: null,

                cont3: null,

                isClickTab: false,

            };

        },

        methods: {

            backTop() {

                // 回到顶部

                this.cont1.scrollIntoView({

                    block: 'start',

                    behavior: 'smooth',

                });

            },

            switchTab(index) {

                // 根据当前index切换到对应的页面内容

                if (index === 0) {

                    this.cont1.scrollIntoView({

                        block: 'start',

                        behavior: 'smooth',

                    });

                } else if (index === 1) {

                    this.cont2.scrollIntoView({

                        block: 'start',

                        behavior: 'smooth',

                    });

                } else {

                    this.cont3.scrollIntoView({

                        block: 'start',

                        behavior: 'smooth',

                    });

                }

            },

        },

        mounted() {

            this.cont1 = this.$refs['cont_1'];

            this.cont2 = this.$refs['cont_2'];

            this.cont3 = this.$refs['cont_3'];

            const tabH = this.$refs['tab'].offsetHeight;

            // 添加scroll事件监听

            this.$refs['cont'].addEventListener('scroll', () => {

                if (this.cont3.getBoundingClientRect().top <= tabH) {

                    this.active = 2;

                    return false;

                }

                if (this.cont2.getBoundingClientRect().top <= tabH) {

                    this.active = 1;

                    return false;

                }

                if (this.cont1.getBoundingClientRect().top <= tabH) {

                    this.active = 0;

                }

            });

        },

    };

</script>

<style lang="less" scoped>

    .box {

        font-size: 28px;

        overflow-x: auto;

        height: 100vh;

        display: -webkit-flex;

        display: flex;

        flex-direction: column;

        overflow-y: hidden;

        .tab {

            height: 88px;

            background: #fff;

            line-height: 88px;

            color: #666;

            display: -webkit-flex;

            display: flex;

            justify-content: space-around;

            .active {

                font-size: 32px;

                color: #333;

                &::after {

                    display: block;

                    content: '';

                    width: 36px;

                    height: 6px;

                    margin: auto;

                    margin-top: -10px;

                    background: rgba(255, 51, 0, 1);

                    border-radius: 3px;

                }

            }

        }

        .cont {

            height: 300px;

            flex-grow: 1;

            overflow: auto;

            .cont_1 {

                height: 400px;

                background: pink;

            }

            .cont_2 {

                height: 800px;

                background: yellow;

            }

            .cont_3 {

                height: 100%;

                background: lightgreen;

            }

        }

        .back-top {

            width: 80px;

            height: 80px;

            border-radius: 50%;

            position: fixed;

            bottom: 120px;

            right: 32px;

        }

    }

</style>

标签:flex,cont,标签,height,background,滚动,display,block,页面
From: https://blog.51cto.com/u_16234758/7200181

相关文章

  • 利用svg标签绕过xss校验
    SVG中的<use>元素用于重用其他元素,主要用于联接<defs>和alike,而我们却用它来引用外部SVG文件中的元素元素通过其id被引用,在<use>标签的xlink:href属性中以'#'井字符开头,外部元素的引用同样如此基本结构如下所示: test.html<svg><usexlink:href='external.svg#rectangle'/></......
  • docker上建一个jenkins容器 连gitee上代码 当更改代码后,浏览器页面更新
    1.dockerpulljenkinszh/jenkins-zh  2.设置端口  3访问本机的浏览器 跳转 4在cmd窗口输入命令 找到密码,输入,点击继续按钮 5下载默认推荐的插件 6填写账号和密码必须写自己设置的容器的账号和密码 7.  8进入主页面 9插件管理点击......
  • 什么是 HTML 编程里页面元素的 margin 属性
    在前端开发中,margin是一种重要的CSS属性,用于控制元素之间的空间和距离。它不仅影响元素的外观,还可以影响整个页面的布局。本文将详细解释margin的概念、用途以及通过示例演示如何在HTML中使用margin来控制元素之间的间距。概念margin是CSS(层叠样式表)中的一个属性,用于控制元素的......
  • Matplotlib 轴标签和标题
    Matplotlib轴标签和标题设置轴标签和标题时,如果使用中文,可能会出现乱码情况,可以使用以下两行代码解决plt.rcParams['font.sans-serif']=[u'SimHei']#SimHei就是中文字体#因为设置了中文后,负号就乱码了,所以还要设置负号的编码plt.rcParams['axes.unicode_minus']=False#......
  • EAS_客户端关闭编辑页面,序时簿列表页面没刷新
    可以在关闭时调用如下代码publicvoidactionSave_actionPerformed(ActionEvente)throwsException{booleanflag=auditBill_save();if(flag){//已审核的单子修改保存后直接关闭窗口ObjectuiObject=this.getUIContext().get(UIContext......
  • mybatis <foreach>标签动态增删改查方式
    摘要目录<foreach>标签动态增删改查mybatis<foreach>实战有了建表以及插入,当然少不了删除和更新mapper.xml中<foreach&目录<foreach>标签动态增删改查mybatis<foreach>实战有了建表以及插入,当然少不了删除和更新mapper.xml中<foreach>标签使用适用场景 <......
  • ios开发之--pop到指定页面
    1推出到根视图控制器[self.navigationControllerpopToRootViewControllerAnimated:YES];2推出到指定的视图控制器 for(UIViewController*controllerinself.navigationController.viewControllers){if([controllerisKindOfClass:[AViewControllerclass]]){......
  • swift--设置app图标和启动页面
    1,如下图:选择上图步骤1,然后选择步骤2,aapp图标,尺寸上面都有,b启动图,我这是创建好的,如果没有创建,先创建c这块需要置为空接着步骤b进入下图  选择1,点击2选择上图,可以看到3已经创建成功备注1:如下图按照步骤,找到a,然后取消选中fdsfgasfa备注2:选择启动图片资源,如下图按照上......
  • ios开发之--首页 导航栏隐藏 下一级页面显示,pop回来显示白条
    解决方法,在首页中实现如下两个方法,代码如下:-(void)viewWillDisappear:(BOOL)animated{[superviewWillDisappear:animated];[self.navigationControllersetNavigationBarHidden:NOanimated:NO];}-(void)viewWillAppear:(BOOL)animated{[superviewWillAppear......
  • Web_PHP_DedeCMS_{dede:sql}标签用法;
    {dede:sqlsql='selecta.title,a.litpic,z.expert,d.level,d.titles,d.resumefromdede_archivesasa,dede_addonzjtbasz,dede_addondocterasdwherea.id=z.aidandz.expert=d.nameANDa.litpicisnotnullGROUPBYa.titleLIMIT2'} <div......