vue 左右末端滑動導航


個人實際開發中用到的效果問題總結出來便於自己以后開發查看調用,如果也適用其他人請隨意拿走勿噴就行!

介紹一下這個導航是什么,他是鍵盤事件左右鍵移動到可視窗口末端然后會滑動一個導航,一直移動一直滑動,直到最后一個停止,反方向一樣。

當初有用vue input標簽寫過,其中有bug,就是光標在滑動的時候就失去控制了,所以我用原生js配合vue解決這個問題,下面是代碼。

HTML代碼

<template>
  <div class="hello">
    <h1>{{ msg }}</h1>
    <div>{{code[1].img}}</div>
    <img  alt="">
    <div style="width:534px;height:40px;border:1px #333 solid;margin: 50px auto;overflow: hidden;">
      <div id='div' style="width:100%;height:40px;white-space:nowrap;transition: transform .5s;transform: translateX(0) translateY(0);">
         <span
         class="input"
         v-for="(itme,index) in data"
         style="margin-right: 30px;line-height:40px;display:inline;border:0;"
         :class="ID == index ? color : ''">{{itme}}</span>
      </div>
    </div>{{ID}}{{rightWidth}}
  </div>
</template>

CSS代碼

<style scoped>
  *{
    margin: 0;
    padding:0;
  }
  .color{
    background: aqua;
  }
  
</style>

JS代碼

<script>
export default {
  name: 'HelloWorld',
  data () {
    return {
      msg: 'Welcome to Your Vue.js App',
      code:['111',{img:'../../build/logo.png'}],
      data:['十萬個冷笑話','妖怪名單','狐妖小紅娘','一人之下','王牌御史','海賊王','火影忍者','七龍珠','通職者'],
      ID:0,
      color:'color',
      right:0,  //存儲可視寬度
      rightID:0,  //過渡id
      rightWidth:0  //過渡距離
    }
  },
  mounted(){
    var testLength = document.getElementsByClassName('input');
    for(var f = 0;f < testLength.length;f++){
      testLength[f].style.width = testLength[f].value.length * 14 + 'px';
    }
  },
  created() {  
    var _this = this;
    document.addEventListener("keydown", _this.watchEnter);
  },  
  destroyed() {
    //移除監聽左右按鍵
    var _this = this;
    document.removeEventListener("keydown", _this.watchEnter);
  },
  methods:{
    //監聽左右按鈕事件
    watchEnter(e) {
      var oDiv = document.getElementById('div');
      var keyNum = window.event ? e.keyCode : e.which; //獲取被按下的鍵值
      //判斷如果用戶按下了左右鍵(keycody=39 37)
      if (keyNum == 39) {
        if(this.ID < oDiv.childNodes.length -1){
          var rightOffsetWidth = this.right + oDiv.childNodes[this.ID].offsetWidth + 30;
          this.right = rightOffsetWidth;
        }
        if(this.right >= oDiv.offsetWidth - 34 && this.ID < oDiv.childNodes.length -1){
          var _rightOffsetWidth = this.rightWidth + oDiv.childNodes[this.rightID].offsetWidth + 30;
          oDiv.style.transform = 'translateX(-'+_rightOffsetWidth+'px) translateY(0)';
          this.rightWidth = _rightOffsetWidth;
          this.rightID+=1;
          this.right = this.right - oDiv.childNodes[this.rightID].offsetWidth - 30;
        }
        if(this.ID >= oDiv.childNodes.length -1){
          this.ID = oDiv.childNodes.length -1;
        }else{
          this.ID+=1;
        }
      }else if(keyNum == 37){
        if(this.ID > 0){
          if(this.ID == 0){
            var leftOffsetWidth = this.right - oDiv.childNodes[this.ID].offsetWidth - 30;
          }else{
            var leftOffsetWidth = this.right - oDiv.childNodes[this.ID - 1].offsetWidth - 30;
          }
          this.right = leftOffsetWidth;
        }else{
          this.right = 0;
        }
        if(this.right < 0 && this.ID > 0){
          if(this.rightID == 0){
            var _leftOffsetWidth = this.rightWidth - oDiv.childNodes[this.rightID].offsetWidth - 30;
            var leftRight = oDiv.childNodes[this.rightID].offsetWidth + 30;
          }else if(this.rightID > 0){
            var _leftOffsetWidth = this.rightWidth - oDiv.childNodes[this.rightID - 1].offsetWidth - 30;
            var leftRight = oDiv.childNodes[this.rightID - 1].offsetWidth + 30;
          }
          oDiv.style.transform = 'translateX(-'+_leftOffsetWidth+'px) translateY(0)';
          this.rightWidth = _leftOffsetWidth;
          this.rightID-=1;
          this.right = this.right + leftRight;
        }
        if(this.ID <= 0){
          this.ID = 0;
        }else{
          this.ID-=1;
        }
      }
    },
  }
}
</script>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM