Vue实现实现一个带底部标识的横向滚动导航栏

写在前面:

        此文章参考了 csdn 中另外两位大佬的文章,在他们的基础上又加上自己的写法。

        地址1: 这个是 uniapp 实现的uniapp: 实现一个优美的带底部标识的横向滚动导航栏_uniapp横向滚动导航条_CC#的博客-CSDN博客

        地址2:仿淘宝菜单栏左右滑动(VUE 移动端)_计算菜单分类滚动距离_浅暖呀丶的博客-CSDN博客

正文:

        先看效果,没有做滚动到一定距离强制翻页,和底部导航实时滑动。  

      

 

1. 将拿到的数据拆分成8个一组

// this.fastData.datas为接口返回的菜单数组
    let menuArr = [];
    // 处理nav为每8个一组
    if (this.fastData.datas.length) {
      let [start, end, result] = [null, null, []]
      for (let i = 0; i < Math.ceil(this.fastData.datas.length / 8); i++) {
        start = i * 8
        end = start + 8
        result.push(this.fastData.datas.slice(start, end))
      }
      menuArr = result;
      this.menus=menuArr;
    }

2. 布局

<!--    导航区域-->
    <div class="home-index__nav" ref="menuItemsNav" @scroll="scrollNav" >
      <div class="home-index__nav-item" v-for="(item,index) in menus">
        <div class="home-index__nav-list" v-for="(nav,key) in item" :key="key" @click="itemLink(nav)">
          <i class='fast-icon iconfont' :class="nav.FICONURL===''?'icon-xiaoshou':nav.FICONURL"
             :style="{ color: nav.FICONCOLOR }"></i>
          <div class="home-index__nav-title area-row">{{nav.FNAME}}</div>
        </div>
      </div>
    </div>

    <!--    底部滚动条-->
    <div style="height:6px;margin-top:7px;" class="mb">
      <div class="home-index__nav-scroll" :style="{width:showSmallLength<=0?'100%':showSmallLength+'px'}"
           v-if="menus.length >= 2"
      >
        <span :style="{left:left+'px'}"></span>
      </div>
    </div>

3. 样式

::-webkit-scrollbar {
  /*隐藏滚轮*/
  display: none;
}
.home-index__nav {
  white-space: nowrap;
  max-height: 168px;
  padding: 12px 0;
  overflow-x: scroll;
  width: 375px;
}
.home-index__nav-item {
  display: inline-flex;
  width: 100%;
  height: 100%;
  flex-wrap: wrap;
  margin-top: 0;
}
.home-index__nav-title {
  font-size: 12px;
  color: #454545;
  margin-top: 3px;
}
.home-index__nav-list {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  width: 25%;
  margin-top: 15px;
  &:nth-child(-n+4) {
    margin-top: 0;
  }
  i {
    font-size: 25px;
  }
}
.home-index__nav-scroll {
  position: relative;
  height: 6px;
  background: #E4E4E4;
  border-radius: 10px;
  margin: 0 auto 10px auto;
}
.home-index__nav-scroll span {
  position: absolute;
  width: 18px;
  height: 6px;
  background: #CBAA65;
  border-radius: 10px;
  display: inline-block;
}

4. 逻辑

  data() {
    return {
      fastData: {},
      menus: [],
      showSmallLength: '',
      left: 0,
    }
  },




// 获取菜单栏的左右滚动距离
    scrollNav(e) {
      let menuItemsNav = this.$refs.menuItemsNav;  // div上设置 ref="menuItemsNav"
      console.log(menuItemsNav.scrollLeft);
      // menuItemsNav.scrollLeft 盒子向右滑动的距离,也是向向左偏移量
      let left;
      let menus = this.menus;
      if(menus.length >1) {  //18 为底部带颜色滑块的宽度 总宽:375 单位px
        if(menuItemsNav.scrollLeft / 375 >= 1) {
          left = menuItemsNav.scrollLeft / 375 * 18;
        }else if(menuItemsNav.scrollLeft < 100){
          left = 0;
        }
      }

      this.left = left;  // 通过控制偏移量,来控制滑块位置
    },


    getRatio() { // 这个方法最好在created中最后调用,也可以不写方法,直接写在created中
      // 底部总宽度(不是带颜色滑块宽度) 为数组长度 * 18
      let menus = this.menus;
      this.showSmallLength = menus.length * 18;  // 18 为底部带颜色滑块的宽度
    }

欢迎大神补充指导

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用 Vue 的自定义指令和事件绑定来实现多个横向滚动公告,并且鼠标移出停止滚动。具体步骤如下: 1. 在父组件中定义一个数据属性来存储鼠标是否悬浮在公告上的状态,例如 `isHover`。 2. 在子组件中使用 `v-for` 渲染多个横向滚动公告,并给每个公告绑定一个自定义指令 `v-scroll` 和一个 `mouseenter` 事件和一个 `mouseleave` 事件。 3. 在自定义指令中,使用 `setInterval` 函数来实现公告的滚动,同时判断鼠标是否悬浮在公告上,如果悬浮则停止滚动。 4. 在 `mouseenter` 事件和 `mouseleave` 事件中,改变 `isHover` 的值,以便在自定义指令中判断。 下面是一个简单的实现示例: 父组件: ``` <template> <div> <scroll-notice v-for="(item, index) in notices" :key="index" :text="item"></scroll-notice> </div> </template> <script> import ScrollNotice from './ScrollNotice.vue'; export default { data() { return { isHover: false, // 鼠标是否悬浮在公告上 notices: [ '公告1', '公告2', '公告3' ] } }, components: { ScrollNotice } } </script> ``` 子组件: ``` <template> <div class="notice" v-scroll="scroll" @mouseenter="handleMouseEnter" @mouseleave="handleMouseLeave"> {{ text }} </div> </template> <script> export default { props: { text: String }, methods: { scroll() { if (!this.$parent.isHover) { // 判断是否悬浮 // 公告滚动的逻辑 } }, handleMouseEnter() { this.$parent.isHover = true; }, handleMouseLeave() { this.$parent.isHover = false; } }, directives: { scroll: { bind(el, binding, vnode) { // setInterval 函数实现公告滚动 }, unbind(el, binding, vnode) { // clearInterval 函数停止公告滚动 } } } } </script> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值