vue 로 간단 한 책 을 모방 한 윤 방 도 를 작성 하 는 예제 코드

5467 단어 vue윤파 도
1.최종 효과 먼저 보 여주 기:

2.해결 방향
Vue 의 이념 은 데이터 로 보 기 를 구동 하 는 것 이기 때문에 요 소 를 바 꾸 는 margin-top 을 통 해 스크롤 효 과 를 실현 하 는 것 을 거부 합 니 다.css 스타일 을 작성 하고 그림 마다 class 를 바 꾸 면 라운드 효 과 를 얻 을 수 있 습 니 다.애니메이션 효 과 는 transition 에 맡 깁 니 다.윤 방 도 를 두 개(mainSlide 와 extraSlide)로 볼 수 있 습 니 다.각 그림 의 위 치 는 그림 과 같 습 니 다.

3.코드 구현
각 슬라이드 스타일:

$width: 800px;   //     
$height: 300px;   //     
$bWidth: 500px;   //      
$sWidth: $width - $bWidth; //      
$sHeight: $height / 2; //      
#slider-wrapper{
  width: $width;
  height: $height;
  margin: 0 auto;
  cursor: pointer;
  background: #ddd;
  border-radius: 5px;
  box-shadow: 0 1px 6px rgba(0,0,0,0.117647), 0 1px 4px rgba(0,0,0,0.117647);
  display: flex;
  overflow: hidden;
  div{
    display: inline-block;
  }
}
.main-slide{
  width: $bWidth;
  height: $height;
  float: left;
  transition: all .4s ease;
}
.extra-slide{
  width: $sWidth;
  position: relative;
  .extra-slide-item{
    position: absolute;
    width: $sWidth;
    height: $sHeight;
    left: 0;
    transition: .4s ease-out;
  }
  .extra-slide-top{
    top: -$sHeight;
  }
  .extra-slide-middle-first{
    top: 0;
    z-index: 2
  }
  .extra-slide-middle-second{
    top: $sHeight;
    z-index: 2
  }
  .extra-slide-bottom{
    top: $height
  }
  .extra-slide-hide{
    display: none!important;
  }
}
템 플 릿 은 두 개의 라운드 맵 을 포함 합 니 다:

<div id="slider-wrapper" @mouseover="stop" @mouseout="start">
  <!--    1,mainSlide -->
  <div class="main-slide" :style="`background: url(${slideConfig[nowIndex].src})`"></div>
  <!--    2,extraSlide -->
  <div class="extra-slide">
    <div class="extra-slide-item" :class="slideClass(i)" v-for="(v, i) in slideConfig" :key="i" :style="`background: url(${v.src}); background-size: cover`"></div>
  </div>
</div>
scripts 부분 에서 nowIndex 를 설정 하고 nowIndex 를 정기 적 으로 변경 합 니 다.모든 그림 의 class 는 이 nowIndex 에 따라 변 합 니 다.여 기 는 es6 의 map 형식 을 사 용 했 습 니 다.자세 한 내용 은 클릭:https://www.jb51.net/article/111734.htm

export default {
  name: 'slider',
  data: function() {  
    return {
      slideInterval: null,
      nowIndex: 0,
      slideLength: this.slideConfig.length
    }
  },
  props: {
    slideConfig: {
      type: Array
    }
  },
  methods: {
    //   index          
    resetIndex(i) {
      return i > this.slideLength - 1 ? i - this.slideLength : i
    },
    slideClass(i) {
      let nowIndex = this.nowIndex
      // Map  key           ,  Map     if else    
      let map = new Map([
        [this.resetIndex(nowIndex), 'extra-slide-top'],
        [this.resetIndex(nowIndex + 1), 'extra-slide-middle-first'],
        [this.resetIndex(nowIndex + 2), 'extra-slide-middle-second'],
        [this.resetIndex(nowIndex + 3), 'extra-slide-bottom']
      ])
      //    class  nowIndex      
      return map.get(i) ? map.get(i) : 'extra-slide-hide'
    },
    start() {
      //     nowIndex
      this.slideInterval = setInterval(() => {
        this.nowIndex = this.nowIndex > this.slideLength - 2 ? 0 : this.nowIndex + 1
        console.log(this.nowIndex)
      }, 2000)
    },
    stop() {
      clearInterval(this.slideInterval)
      this.slideInterval = null
    }
  },
  mounted() {
    this.start()
  },
  destroyed() {
    this.stop()
  }
}
slideConfig,구성 요소 의 props:

const prefix = '/src/assets/'
const slideConfig = [{
 src: prefix + 's1.jpg',
 title: ' 1',
 desc: '  1'
}, {
 src: prefix + 's2.jpg',
 title: ' 2',
 desc: '  2'
}, {
 src: prefix + 's3.jpg',
 title: ' 3',
 desc: '  3'
}, {
 src: prefix + 's4.jpg',
 title: ' 4',
 desc: '  4'
}, {
 src: prefix + 's5.jpg',
 title: ' 5',
 desc: '  5'
}, {
 src: prefix + 's6.jpg',
 title: ' 6',
 desc: '  6'
}]
export default slideConfig
사용:

<slider :slideConfig="slideConfig" />
2018/3/12 16:55:slideConfig 가 Props 로 수정 되 었 습 니 다.slider.vue 를 추출 하면 바로 사용 할 수 있 습 니 다.
gitHub 전송 문:https://github.com/bougieL/jianshuslider
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기