上推动画

<template>
  <div class="box">
    <div class="tab"></div>
    <div class="content-box">
      <div ref="wrapBox" class="wrapBox">
        <div class="scrollBox">
          <ul v-for="(item, i) in list" :key="i" ref="listItem">
            <h2 class="letter">{{item.letter}}</h2>
            <ul v-for="(iitem, ii) in item.letterList" :key="ii">
              <li class="name">{{iitem}}</li>
            </ul>
          </ul>
        </div>
      </div>
      <!--  -->
      <div class="currentTitle" v-if="scrollY<0" ref="currentTitle">
        <p>{{currentTitle}}</p>
      </div>
      <!-- 右侧导航栏 -->
      <div class="rightBar" @touchstart='onShortcutTouchstart' @touchmove.stop.prevent='onShortcuutTouchMove'>
        <span ref="letterList" :class="[currentIndex === i ?'active':'']" v-for="(item, i) in list" :key="i" :data-index='i'>{{item.letter}}</span>
      </div>
    </div>
  </div>
</template>
<style scoped>
  .box{
    background-color: #222;
  }
  .tab{
    height: 44px;
  }
  .letter{
    background-color: #ddd;
  }
  .wrapBox{
    position: fixed;
    top: 44px;
    bottom: 0;
    width: 100%;
    overflow: hidden;
  }
  .content-box{
    position: fixed;
    width: 100%;
    bottom: 0;
    overflow: hidden;
    top: 0;
    top: 44px;
  }
  .name{
    line-height: 40px;
  }
  .rightBar{
    position: absolute;
    display: flex;
    flex-direction: column;
    top: 50%;
    right: 0;
    text-align: center;
    padding: 0 20px;
    transform: translateY(-50%)
  }
  .active{
    color: red;
  }
  .currentTitle{
    position: absolute;
    top: 0;
    width: 100%;
    height: 32px;
    line-height: 32px;
    background-color: #dddddd;
    color: #000;
    /* transition: all 0.8s; */
  }
</style>
<script>
import BScroll from 'better-scroll'
const TITLE_HEIGHT = 32
export default {
  data () {
    return {
      diff: -1,
      // currentTitle: '热门',
      scrollY: -1, 
      currentIndex: 0,
      list: [
        {
          letter: '热门',
          letterList: ['薛之谦','薛之谦','薛之谦','薛之谦','薛之谦','薛之谦','薛之谦','薛之谦']
        },{
          letter: 'A',
          letterList: ['A-Lin','A-Lin','A-Lin','A-Lin','A-Lin','A-Lin','A-Lin']
        },{
          letter: 'B',
          letterList: ['本兮','本兮','本兮','本兮','本兮','本兮','本兮','本兮']
        },{
          letter: 'C',
          letterList: ['陈奕迅','陈奕迅','陈奕迅','陈奕迅','陈奕迅','陈奕迅','陈奕迅','陈奕迅','陈奕迅','陈奕迅']
        },{
          letter: 'H',
          letterList: ['华晨宇','华晨宇','华晨宇','华晨宇','华晨宇']
        },{
          letter: 'L',
          letterList: ['林俊杰','林俊杰','林俊杰','林俊杰','林俊杰']
        },{
          letter: 'M',
          letterList: ['马伊利','马伊利','马伊利','马伊利','马伊利','马伊利','马伊利','马伊利']
        }
      ]
    }
  },
  watch: {
    list() {
      setTimeout(() => {
        this.calculateHeight()
      }, 20);
    },
    scrollY (newY) {
      const listHeight = this.listHeight
      // 当滚动到顶部,newY > 0
      if(newY > 0) {
        this.currentIndex = 0
        return
      }
      // 当在中间滚动
      for(let i=0; i<listHeight.length - 1; i++) {
        let height1 = listHeight[i]
        let height2 = listHeight[i+1]
        if(-newY >= height1 && -newY < height2) {
          this.currentIndex = i
          this.diff = height2 + newY
          return
        }
      }
      // 当滚动到底部,且 -newY 大于最后一个元素的上限
      this.currentIndex = listHeight.length - 2
    },
    // 如果达到顶部,添加一个动画来缓冲上面的头部切换字母
    diff (newVal) {
      let fixedTop = (newVal > 0 && newVal < TITLE_HEIGHT) ? newVal - TITLE_HEIGHT : 0
        if (this.fixedTop === fixedTop) {
          return
        }
        this.fixedTop = fixedTop
        this.$refs.currentTitle.style.transform = `translate3d(0,${fixedTop}px,0)`
    }
  },
  computed: {
    currentTitle () {
      if(this.scrollY > 0) {
        return ''
      } 
      return this.list[this.currentIndex] ? this.list[this.currentIndex].letter : ''
    }
  },
  created () {
    this.touch = {}
    this.listenScroll = true
  },
  mounted () {
    this._initScroll()
    // 这个方法可以放在watch中,左边滚动部分封装成一个组件,然后传入渲染的数据,监听这个渲染的数据,这里因为没有做组件,所以手动调用一下
    this.calculateHeight()  
  },
  methods: {
    _initScroll () {
      this.scroll = new BScroll(this.$refs.wrapBox, {
        scrollY: true,
        probeType: 3
      })
      if(this.listenScroll) {
        this.scroll.on('scroll', pos => {
          this.scrollY = pos.y
        })
      }
    },
    // 点击右侧的字母
    onShortcutTouchstart (e) {
      let anchorIndex = e.target.getAttribute('data-index')  //获取右侧索引
      // 点击右侧的字母栏,左边跳转到对应的字母
      // this.$refs.wrapBox.scrollToElement(this.$refs.listItem[anchorIndex], 0)
      this.scrollToElement(this.$refs.listItem[anchorIndex], 0)
      // 点击高亮
      this.scrollY = -this.listHeight[anchorIndex]
      // 滚动右侧字母
      let firstTouch = e.touches[0]
      this.touch.y1 = firstTouch.pageY
      this.touch.anchorIndex = anchorIndex
    },
    // 滚动右侧的字母
    onShortcuutTouchMove (e) {
      let ANCHOR_HEIGHT = 21  //右侧每个字母的高度
      let firstTouch = e.touches[0]
      this.touch.y2 = firstTouch.pageY
      let delta = Math.floor((this.touch.y2 - this.touch.y1) / ANCHOR_HEIGHT)
      let anchorIndex = parseInt(this.touch.anchorIndex) + delta
      this.scrollToElement(this.$refs.listItem[anchorIndex], 0)
      // 实现点击高亮
      // 这里的anchorIndex可能超过listHeight的范围而导致 this.listHeight[anchorIndex]  NaN 所以这里要对 anchorIndex 添加一层校验
      if(!this.listHeight[anchorIndex] && anchorIndex !== 0) {
        return
      }
      this.scrollY = -this.listHeight[anchorIndex]
    },
    // 计算左边每一块字母的高度,使得左边的滚动右边对应字母高亮
    calculateHeight () {
      this.listHeight = []
      const list = this.$refs.listItem
      let height = 0
      this.listHeight.push(height)
      for(let i=0; i<list.length; i++) {
        let item = list[i]
        height += item.clientHeight
        this.listHeight.push(height)
      }
    },
    scrollTo () {
      this.scroll && this.scroll.scrollTo.apply(this.scroll, arguments)
    },
    scrollToElement () {
      this.scroll && this.scroll.scrollToElement.apply(this.scroll, arguments)
    }
  }
}
</script>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ADAS是指先进驾驶辅助系统(Advanced Driver Assistance System),是车辆电子技术领域的一个重要方向。它通过传感技术、计算机技术和控制技术等手段来协助驾驶员驾驶车辆,增强行车安全和驾驶体验,为未来智能驾驶发展打下基础。 ADAS功能包括了很多模块,主要分为感知模块、决策模块和执行模块三部分,并通过通信技术实现高可靠性的实时数据传输。其中,感知模块主要负责采集车辆周围环境信息,如距离、角度、速度等;决策模块通过分析这些信息做出行驶建议,辅助驾驶员完成决策;执行模块负责实现这些决策,自动控制车辆的加速、制动和转向等动作。 动画技术可以直观地展示这些模块的工作原理,帮助人们更好地理解ADAS功能的作用以及实现方式。在动画中,通过3D建模技术将车辆、传感器、控制芯片等元素制作成真实模型,在虚拟环境中模拟ADAS功能的使用过程,展示其优秀的性能和巨大的应用前景。 总的来说,ADAS功能动画在普及ADAS技术和增强驾驶员安全意识等方面具有重要的作用。它可以让人们对ADAS系统有更深入的了解和认识,进一步推动ADAS技术的普及和应用,为人类出行增添更多便利和安全。 ### 回答2: ADAS(Advanced Driver Assistance Systems)指的是高级驾驶辅助系统。它是一种搭载在汽车上的智能交通系统,可以通过传感器、摄像头、雷达等技术,实时监测汽车周围的情况,对驾驶员的驾驶行为进行监控,提供警告提示,以降低交通事故的风险。 在ADAS功能中,常见的功能包括:自动紧急刹车、盲区监测、车道偏离警报、自适应巡航控制、交通标志辨识、自动泊车等。这些功能通过传感器和摄像头等方法,收集并分析车辆周围的各种信息,将警告提示或控制信号发送给车辆控制系统,帮助驾驶员减少发生交通事故的风险。 ADAS功能在汽车安全领域具有重要的作用。它可以帮助驾驶员提高安全性能,增加行驶的舒适性和方便性,同时也是自动驾驶技术的重要组成部分。随着科技的不断进步和汽车行业的快速发展,ADAS功能也将不断升级和完善,为汽车行业和广大驾驶员带来安全、智能和便捷的出行体验。 ### 回答3: ADAS即先进驾驶辅助系统,是一种集成多种科技功能的汽车安全基础系统。ADAS功能动画CSDN包含了对智能驾驶技术、车道偏离预警、交通标志识别、自动泊车、自动驾驶等功能进行了详细介绍的视频教程。 在智能驾驶技术方面,ADAS功能动画CSDN向大家介绍了车道保持辅助、自适应巡航、自动制动等技术,这些技术能够让司机更加安全地行驶车辆,在减少车祸事故及其严重后果方面起到重要的作用。 除此之外,该视频还介绍了车道偏离预警技术,这项技术能够及时警示驾驶员车辆偏离车道,避免很多车祸的发生。同时,交通标志识别功能也在该视频中得到了重点介绍,这种技术能够自动识别交通标志并提醒驾驶员注意遵守相关交通法规。 另外,在自动泊车方面,该视频还详细介绍了车辆的自动泊车技术,这项技术能够免去驾驶员寻找停车位以及泊车的烦恼,提高泊车的效率和安全性。 总之,ADAS功能动画CSDN给我们带来了深入了解智能汽车技术的机会,对我们了解车辆行驶安全技术、提升智能化驾驶水平具有重要意义。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值