2017-12-16 22 views
0

내가 필요한 이미지 슬라이더 예제를 만들었습니다. 다양한 크기의 이미지를 사용할 때 스타일 문제가 발생합니다. 요소가 배열을 떠날 때 그 위치는 절대 값으로 설정되고, 부드러운 전환을 위해 필요한 것은 무엇입니까, 그러나 이미지도 위로 이동합니다.Vue.js transition-group에서 크기가 다른 img의 v-align 스타일을 수정하는 방법은 무엇입니까?

중간에 정렬하거나 배열에 들어가기에 좋은 수직 정렬을하고 싶습니다. 그러나 어떤 식 으로든 얻을 수는 없습니다.

또 다른 문제는 내가 해결하고 싶은 것은 잠시 후 창을 나온 다음 다시 돌아 왔을 때입니다. 한 번에 모든주기를 실행하는 애니메이션은 애니메이션을 멈추고 실행하는 대신 현재 상태에 도달합니다. 어쩌면 그것은 내 책임이지만 브라우저는 블러 윈도우를 잡기 위해 좋은 이벤트를 제공하지 않거나 잘못 되었습니까? According to this discussion

어떤 아이디어 주셔서 감사합니다.

let numbers = [{key:1},{key:2},{key:3},{key:4},{key:5},{key:6},{key:7}] 
 
    
 
let images = [ 
 
    { key:1, 
 
    src:"http://lorempixel.com/50/100/sports/"}, 
 
    { key:2, 
 
    src:"http://lorempixel.com/50/50/sports/"}, 
 
    { key:3, 
 
    src:"http://lorempixel.com/100/50/sports/"}, 
 
    { key:4, 
 
    src:"http://lorempixel.com/20/30/sports/"}, 
 
    { key:5, 
 
    src:"http://lorempixel.com/80/20/sports/"}, 
 
    { key:6, 
 
    src:"http://lorempixel.com/20/80/sports/"}, 
 
    { key:7, 
 
    src:"http://lorempixel.com/100/100/sports/"} 
 
] 
 
    
 
new Vue({ 
 
    el: '#rotator', 
 
    data: { 
 
    items: images, 
 
    lastKey: 7, 
 
    direction: false 
 
    }, 
 
    mounted() { 
 
    setInterval(() => { 
 
     if (this.direction) { this.prevr() } else { this.nextr() } 
 
    }, 1000) 
 
    }, 
 
    methods: { 
 
    nextr() { 
 
    \t let it = this.items.shift() 
 
     it.key = ++this.lastKey 
 
     this.items.push(it) 
 
    }, 
 
    prevr() { 
 
    \t let it = this.items.pop() 
 
     it.key = ++this.lastKey 
 
     this.items.unshift(it) 
 
    } 
 
    } 
 
})
.litem { 
 
    transition: all 1s; 
 
    display: inline-block; 
 
    margin-right: 10px; 
 
    border: 1px solid green; 
 
    background-color: lightgreen; 
 
    padding: 10px 10px 10px 10px; 
 
    height: 100px; 
 
} 
 
.innerDiv { 
 
    border: 1px solid red; 
 
} 
 
.container { 
 
    overflow: hidden; 
 
    white-space: nowrap; 
 
    height: 250px; 
 
    border: 1px solid blue; 
 
    background-color: lightblue; 
 
} 
 
.list-enter { 
 
    opacity: 0; 
 
    transform: translateX(40px); 
 
} 
 
.list-leave-to { 
 
    opacity: 0; 
 
    transform: translateX(-40px); 
 
} 
 
.list-leave-active { 
 
    position: absolute; 
 
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.11/vue.js"></script> 
 

 
<div id="rotator"> 
 
    
 
    <button @click="direction = !direction"> 
 
     change direction 
 
    </button> 
 
    
 
    <transition-group 
 
    name="list" 
 
    tag="div" 
 
    class="container"> 
 
    
 
     <div 
 
     v-for="item in items"    
 
     :key="item.key" class="litem"> 
 
     <!-- 
 
      <div 
 
      class='innerDiv'> 
 
       {{ item.key }} 
 
      </div> 
 
     --> 
 
     <div class='innerDiv'> 
 
      <img :src='item.src'> 
 
     </div> 
 
    </div> 
 
    </transition-group> 
 
</div>

답변

0

그것은 잠시 tooks하지만 결국에 나는 방향으로 기능을 변경하여 애니메이션을 슬라이딩을위한 더 나은 결과를 가지고 있다고 생각합니다.

하나의 성가신 생각은 슬라이딩 방향을 전환 할 때 애니메이션이 '마이크로 초'가 다음 상태로 바뀌고 올바른 애니메이션으로 돌아오고 나서 애니메이션이 예상대로 계속되도록하는 것입니다. 그것은 한 방향으로 만 일어나고 있으며 나는 그것을 고치는 법을 모른다. 또한 마지막 상자는 한 번만 다르게 동작합니다. 아무 단서도 전혀.

그래서 단지 98 %의 솔루션

let images = [ 
 
    {key:1, domKey:1, src:"http://lorempixel.com/50/100/sports/" }, 
 
    {key:2, domKey:2, src:"http://lorempixel.com/50/50/sports/" }, 
 
    {key:3, domKey:3, src:"http://lorempixel.com/100/50/sports/" }, 
 
    {key:4, domKey:4, src:"http://lorempixel.com/20/30/sports/" }, 
 
    {key:5, domKey:5, src:"http://lorempixel.com/80/20/sports/" }, 
 
    {key:6, domKey:6, src:"http://lorempixel.com/20/80/sports/" }, 
 
    {key:7, domKey:7, src:"http://lorempixel.com/100/100/sports/" } 
 
] 
 

 
let setPositionRelative = el => el.style.position = "relative" 
 

 
new Vue({ 
 
    el: '#rotator', 
 
    data: { 
 
    items: images, 
 
    lastKey: 7, 
 
    direction: true, 
 
    changeDirectionRequest: false 
 
    }, 
 
    mounted() { 
 
    \t Array.from(this.$el.querySelectorAll("div[data-key]")).map(setPositionRelative) 
 
    setInterval(() => { 
 
     if(this.changeDirectionRequest) { 
 
     this.changeDirectionRequest = false 
 
     this.direction = !this.direction 
 
     if (this.direction) 
 
     \t Array.from(this.$el.querySelectorAll("div[data-key]")).map(setPositionRelative) 
 
     else 
 
     \t Array.from(this.$el.querySelectorAll("div[data-key]")).map(el => el.style.position = "") 
 
     } 
 
     if (this.direction) this.prevr() 
 
     else this.nextr() 
 
    }, 1000) 
 
    }, 
 
    methods: { 
 
    nextr() { 
 
     let it = this.items.shift() 
 
     it.key = ++this.lastKey 
 
     this.items.push(it) 
 
    }, 
 
    prevr() { 
 
    \t let it = this.items.pop() 
 
     it.key = ++this.lastKey 
 
     this.items.unshift(it) 
 
     setPositionRelative(this.$el.querySelector("div[data-domkey='"+it.domKey+"']")) 
 
    } 
 
\t } 
 
})
.container { 
 
    overflow: hidden; 
 
    white-space: nowrap; 
 
    height: 200px; 
 
    border: 1px solid blue; 
 
    background-color: lightblue; 
 
    display: flex; 
 
    align-items: center; 
 
} 
 
.innerDiv { 
 
    border: 1px solid red; 
 
    width: auto; 
 
    height: auto; 
 

 
    display:-moz-box; 
 
    -moz-box-pack:center; 
 
    -moz-box-align:center; 
 

 
    display:-webkit-box; 
 
    -webkit-box-pack:center; 
 
    -webkit-box-align:center; 
 

 
    display:box; 
 
    box-pack:center; 
 
    box-align:center; 
 
} 
 
.litem { 
 
    transition: all 1s; 
 
    margin-right: 10px; 
 
    border: 1px solid green; 
 
    background-color: lightgreen; 
 
    padding: 10px 10px 10px 10px; 
 
} 
 
.list2-enter, .list-enter { 
 
    opacity: 0; 
 
    transform: translateX(40px); 
 
} 
 
.list2-leave-to, .list-leave-to { 
 
    opacity: 0; 
 
    transform: translateX(-40px); 
 
} 
 
.list-leave-active { 
 
    position: absolute; 
 
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.11/vue.js"></script> 
 

 
<div id="rotator"> 
 
    <button @click="changeDirectionRequest = true">change direction</button> 
 
    <transition-group name="list" tag="div" class="container"> 
 
    <div v-for="item in items" 
 
      :key="item.key" 
 
      :data-domkey="item.domKey" 
 
      class="litem"> 
 
      
 
     <div class='innerDiv'> 
 
      <img :src='item.src'> 
 
     </div> 
 
    </div> 
 
    </transition-group> 
 
</div>

:-)