首页 > 其他分享 >vue2实现tabs侧边导航栏点击内容跳转到对应位置,且内容滚动导航栏切换对应tab

vue2实现tabs侧边导航栏点击内容跳转到对应位置,且内容滚动导航栏切换对应tab

时间:2023-01-04 18:44:17浏览次数:42  
标签:el color 100% height width 跳转 导航 对应 left

vue2实现tabs侧边导航栏点击内容跳转到对应位置,且内容滚动导航栏切换对应tab

1、tabs使用了 element的插件tabs, 省的自己写滑动动画

2、左侧有用到了 element的插件 NavMenu导航菜单,项目涉及到了切换页面

 

 

 

 

<template>
  <div class="updateDesc_wrapper">
    <div class="updateDesc_con">
      <div class="update_left">
        <div class="update_img">
          <img class="updateImg" src="@/assets/image/update-desc/updateImg.png" />
        </div>
        <div class="update_menu">
          <el-menu default-active="1-1" class="el-menu-vertical-demo updateMenu">
            <el-submenu index="1">
              <template slot="title">
                <span>更新说明</span>
              </template>
              <el-menu-item-group>
                <el-menu-item index="1-1">
                  <img class="img1" src="@/assets/image/update-desc/updateIcon1.png" />
                  <img class="img2" src="@/assets/image/update-desc/updateIcon2.png" />
                  <span>2022-12-30 首页更新说明</span>
                </el-menu-item>
                <!-- <el-menu-item index="1-2">
                  <img class="img1" src="@/assets/image/update-desc/updateIcon1.png" />
                  <img class="img2" src="@/assets/image/update-desc/updateIcon2.png" />
                  <span>2022-12-30 首页更新说明</span>
                </el-menu-item> -->
              </el-menu-item-group>
            </el-submenu>
          </el-menu>
        </div>
      </div>
      <div class="update_right">
        <div class="update_conten" ref="content_wrapper">
          <div class="conten_tit">
            <span class="tit_text">首页更新说明</span>
            <span class="tit_date">发布日期:2022-12-15</span>
          </div>
          <div class="conten_info">
            <div class="content_wrapper">
              <div ref="cont_1" class="roll_box">
                <div class="con_tit">
                  1. 侧边导航优化,全新交互体验
                </div>
                <div class="con_info">
                  <img src="@/assets/image/update-desc/updateSy1.png" />
                </div>
              </div>
              <div ref="cont_2" class="roll_box">
                <div class="con_tit">
                  2. 综合搜索升级:全局统一,轻松查询
                </div>
                <div class="con_info">
                  <p>查企业、查业务、查空壳、查集团 、查政策 、查产业、查研报、查舆情、查融资、查功能</p>
                  <img src="@/assets/image/update-desc/updateSy2.png" />
                  <p><strong>搜索联想功能及搜索结果展示,</strong>同时页面右侧提供历史记录和推荐卡片快捷功能,进一步提升用户体验。</p>
                  <img src="@/assets/image/update-desc/updateSy3.png" />
                </div>
              </div>
              <div ref="cont_3" class="roll_box">
                <div class="con_tit">
                  3. 自定义功能入口
                </div>
                <div class="con_info">
                  <p>根据用户偏好自定义添加快速入口;点击更多可进入“全部功能”页面并支持搜索。</p>
                  <img src="@/assets/image/update-desc/updateSy4.png" />
                </div>
              </div>
              <div ref="cont_4" class="roll_box">
                <div class="con_tit">
                  4. 上线“更新说明”
                </div>
                <div class="con_info">
                  <img src="@/assets/image/update-desc/updateSy5.png" />
                </div>
              </div>
            </div>
          </div>
        </div>
        <div class="update_tab">
          <el-tabs tab-position="right" class="updateTab" @tab-click="scrollTo" :activeName="isScrollNow"
            style="height: fit-content;">
            <el-tab-pane label="1. 侧边导航优化" name="0"></el-tab-pane>
            <el-tab-pane label="2. 综合搜索升级" name="1"></el-tab-pane>
            <el-tab-pane label="3. 自定义功能入口" name="2"></el-tab-pane>
            <el-tab-pane label="4. 上线“更新说明”" name="3"></el-tab-pane>
          </el-tabs>
        </div>
      </div>
    </div>
  </div>
</template>
<script>
export default {
  name: 'update-desc',
  components: {
  },
  data() {
    return {
      isScrollNow: '0'
    }
  },
  mounted() {
    window.addEventListener('scroll', this.onScroll, true)
  },
  created() {
    window.removeEventListener('scroll', this.onScroll, false)
  },
  methods: {
    // 右侧跳转方法
    scrollTo(tab) {
      document.getElementsByClassName('roll_box')[tab.index].scrollIntoView({
        behavior: 'smooth',
        block: 'start',
      })
    },
    // 内容部分滚动方法
    onScroll() {
      const navContents = document.querySelectorAll('.roll_box')
      const offsetTopArr = []
      navContents.forEach((item) => {
        offsetTopArr.push(item.offsetTop)
      })
      const scrollTop = this.$refs.content_wrapper.scrollTop + 240
      let navIndex = 0
      for (let n = 0; n < offsetTopArr.length; n++) {
        if (scrollTop >= offsetTopArr[n]) {
          navIndex = n
          this.isScrollNow = String(navIndex)
          // 滑动底部选中最后一个选项
          if (
            this.$refs.content_wrapper.scrollHeight
            - this.$refs.content_wrapper.scrollTop
            <= this.$refs.content_wrapper.clientHeight + 50
          ) {
            this.isScrollNow = String(offsetTopArr.length - 1)
          }
        }
      }
    },
  },
}
</script>

<style lang="less" scoped>
.updateDesc_wrapper {
  height: 100%;

  .updateDesc_con {
    display: flex;
    justify-content: space-between;
    background: #fff;
    height: 100%;

    .update_left {
      width: 240px;
      border-right: 1px solid rgba(229, 230, 235, 0.7);

      .update_img {
        width: 100%;

        .updateImg {
          width: 100%;
        }
      }

      .update_menu {
        width: 100%;

        /deep/ .updateMenu {
          border-right: none;

          .el-submenu__title {
            padding: 0 !important;
            padding-left: 40px !important;
            text-align: left;
            color: #1D2128;
            height: 40px;
            line-height: 40px;
          }

          .el-menu-item-group__title {
            display: none;
          }

          .el-submenu__icon-arrow {
            color: transparent;
            background: url(../../assets/image/update-desc/updateIcon3.png) no-repeat;
            background-size: contain;
            position: absolute;
            top: 50%;
            right: inherit;
            left: 25px;
            margin-top: -5px;
            font-size: 14px;
            display: block;
            width: 8px;
          }

          .el-submenu.is-opened>.el-submenu__title .el-submenu__icon-arrow {
            transform: rotateZ(90deg);
          }

          .el-submenu .el-menu-item {
            height: 32px;
            line-height: 32px;
            border-left: 2px solid #fff;
            padding: 0 20px 0 40px !important;
            text-align: left;

            img {
              width: 11px;
            }

            .img2 {
              display: none;
            }

            span {
              font-size: 12px;
              color: #1D2128;
              margin-left: 10px;
            }

            &.is-active {
              background: #D1E2FF;
              border-left: 2px solid #2D5CF6;

              .img1 {
                display: none;
              }

              .img2 {
                display: inline;
              }

              span {
                color: #2D5CF6;
              }
            }
          }
        }
      }
    }

    .update_right {
      width: calc(100% - 240px);
      height: 100%;
      display: flex;
      justify-content: space-between;

      .update_conten {
        width: calc(100% - 240px);
        height: 100%;
        overflow-y: auto;
        padding: 24px 60px;
        box-sizing: border-box;

        .conten_tit {
          display: flex;
          justify-content: space-between;
          align-items: center;
          padding-bottom: 16px;
          border-bottom: 1px solid #E5E6EB;

          .tit_text {
            font-weight: 700;
            font-size: 20px;
            line-height: 28px;
            color: #1D2128;
          }

          .tit_date {
            font-size: 14px;
            line-height: 22px;
            color: #86909C;

          }
        }

        .conten_info {
          width: 100%;

          .content_wrapper {
            .roll_box {
              text-align: left;

              .con_tit {
                margin-top: 24px;
                font-weight: 700;
                font-size: 16px;
                line-height: 24px;
                color: #2D5CF6;
                position: relative;

                &::before {
                  content: "";
                  position: absolute;
                  display: block;
                  width: 16px;
                  height: 16px;
                  border-radius: 50%;
                  left: -6px;
                  top: 0px;
                  background: linear-gradient(90deg, rgba(123, 97, 255, 0.3) 0%, rgba(97, 160, 255, 0.3) 107.5%);
                }
              }

              .con_info {
                p {
                  font-size: 14px;
                  line-height: 22px;
                  margin-top: 16px;
                  color: #1D2128;

                }

                img {
                  width: 100%;
                  margin-top: 16px;
                }
              }
            }
          }
        }
      }

      .update_tab {
        width: 240px;
        padding-top: 16px;

        /deep/ .updateTab {
          .el-tabs__header {
            float: left;
            text-align: left;
          }

          .el-tabs__nav {
            float: none !important;
          }

          .el-tabs__item {
            font-size: 14px;
            color: #86909C;
          }

          .el-tabs__item.is-active {
            color: #2D5CF6;
          }

          .el-tabs__active-bar {
            background-color: #2D5CF6;
          }
        }
      }
    }
  }
}
</style>

 

标签:el,color,100%,height,width,跳转,导航,对应,left
From: https://www.cnblogs.com/whqbk/p/17025735.html

相关文章

  • Android-Intent界面跳转
    1、问题描述在登陆界面中点击一个button时,触发后台检验用户名密码的正确性,如果符合数据库那么就登陆成功,本文简单介绍该结构,不设计数据库等调用,仅为两个验证字符串。2、结果......
  • 2023-01-04 云开发跳转小程序报错Permission denied
    问题描述:静态网页跳转小程序,报错Permissiondenied,还显示systemerror。原因:权限不足。解决方案:第一步,打开云开发控制台,找到设置==》权限设置,在【未登录用户访问云资源......
  • C#版本与.NET版本对应关系以及各版本的特性
      C#版本.NET版本发布日期特性C#1.0.NETFramework1.02002-02-13委托、事件C#1.1.NETFramework1.12003-04-24APM(异步编程模型)C#2.0.NETFram......
  • EasyAR4.0稀疏空间地图室内导航
    现有的AR室内导航,一种方案是利用运动跟踪实现,但是偏移较大。比较靠谱或者说能满足商业使用的还是稀疏空间地图。(ARCore管叫云锚点)实现效果如下:EasyAR稀疏云地图室内导航......
  • 【Django框架】Python和Django对应版本
    Django版本Python版本2.23.5、3.6、3.7、3.8(在2.2.8中添加)、3.9(在2.2.17中添加)3.13.6、3.7、3.8、3.9(在3.1.3中添加)3.23.6、3.7、3.8、3.9、3.1......
  • BBS项目(二): 登录功能 首页导航条搭建 首页主体部分 个人站点页面搭建 文章分类与标签
    目录登录功能pillow模块生成验证码前端发送ajax请求后端auth模块校验sweetalert弹窗提示登录失败首页导航条搭建修改密码退出登录首页主体部分首页前端框架搭建admin后台管......
  • vue文件跳转到html文件写法
    前言在同一个项目中,vue文件跳转到html文件中详解我的项目中html页面统一放到public文件夹内了,如图postalPay.html文件  现在要从xxx.vue文件中跳转到postalPay.ht......
  • 欢迎访问,博客导航
    欢迎访问!下面向您介绍本博客的相关内容~文章目录​​1博客简介​​​​1.1博客概况​​​​1.2转载与咨询​​​​2博客相关资源​​​​2.1主要内容​​​​2.2主要专......
  • React 小案例 无线首页底部导航组件
    效果:底部页面导航点击当前图标图标高亮页面结构1.将所用到的小图标文件放置在static文件夹下2.在src下新建tabbar文件夹,用于存放组件资源3.页面代码注意:将本页面的css引入......
  • React 小案例 路由跳转
    在上篇的基础上做路由跳转:​​上篇​​安装路由及代码:安装:cnpmi-Sreact-router-dom1.在pages里创建四个跳转页面 2.在src文件夹下创建router.js,router.js全部内容:首先引......