|
@@ -1,174 +1,99 @@
|
|
<template>
|
|
<template>
|
|
<div class="coll-layout" ref="layout">
|
|
<div class="coll-layout" ref="layout">
|
|
- <div class="coll-content" ref="content"
|
|
|
|
- :style="{transform: 'translateX(' + contentLeft + 'px)', width: maxWidth + 'px'}"
|
|
|
|
- :class="{animation: !pauseAnimation}"
|
|
|
|
- >
|
|
|
|
- <div
|
|
|
|
- v-for="(item, i) in items"
|
|
|
|
- :key="i"
|
|
|
|
- @click="clickHandle($event, item)"
|
|
|
|
- :style="{width: itemWidth + 'px', marginRight: itemRight + 'px'}">
|
|
|
|
- <img :src="item.abbr">
|
|
|
|
- </div>
|
|
|
|
- </div>
|
|
|
|
-
|
|
|
|
- <img class="definition">
|
|
|
|
- <img class="definition">
|
|
|
|
-
|
|
|
|
|
|
+ <cir-slide :items="items" @focuschange="change" class="cir-slide">
|
|
|
|
+ <img slot="item" slot-scope="{data}" class="img-item" :src="data.abbr" :class="{active: active === data}">
|
|
|
|
+ </cir-slide>
|
|
<h3 class="title">{{active.title}}</h3>
|
|
<h3 class="title">{{active.title}}</h3>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
</template>
|
|
|
|
|
|
<script>
|
|
<script>
|
|
-import slide from '@/components/slide'
|
|
|
|
-
|
|
|
|
-function loadTouch (start, move, end) {
|
|
|
|
- let startHandle = (ev) => {
|
|
|
|
- start()
|
|
|
|
- let startX = ev.touches[0].pageX
|
|
|
|
- let moveHandle = (ev) => {
|
|
|
|
- ev.stopPropagation()
|
|
|
|
- ev.preventDefault()
|
|
|
|
-
|
|
|
|
- move(ev.touches[0].pageX - startX)
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- let endHandle = () => {
|
|
|
|
- ev.stopPropagation()
|
|
|
|
- ev.preventDefault()
|
|
|
|
-
|
|
|
|
- end()
|
|
|
|
- document.documentElement.removeEventListener('touchmove', moveHandle, {passive: false})
|
|
|
|
- document.documentElement.removeEventListener('touchend', endHandle, {passive: false})
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- document.documentElement.addEventListener('touchmove', moveHandle, {passive: false})
|
|
|
|
- document.documentElement.addEventListener('touchend', endHandle, {passive: false})
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- return startHandle
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-function getPoint (dom, targetDom) {
|
|
|
|
- let x = 0
|
|
|
|
- let y = 0
|
|
|
|
-
|
|
|
|
- while (dom !== targetDom && dom !== document.documentElement) {
|
|
|
|
- x += dom.offsetLeft
|
|
|
|
- y += dom.offsetTop
|
|
|
|
- dom = dom.offsetParent
|
|
|
|
- }
|
|
|
|
- return { x, y }
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
|
|
+import CirSlide from '@/components/cir-slide'
|
|
export default {
|
|
export default {
|
|
name: 'collection',
|
|
name: 'collection',
|
|
data () {
|
|
data () {
|
|
let items = [
|
|
let items = [
|
|
{
|
|
{
|
|
- title: '牧童归家1',
|
|
|
|
- abbr: require('@/assets/images/coll_abbr_1.png'),
|
|
|
|
- image: require('@/assets/images/coll_relic_1.png')
|
|
|
|
|
|
+ title: '埃米尔·加莱的盘子',
|
|
|
|
+ abbr: require('@/assets/images/coll_abbr_1.png')
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ title: '吃古柯叶的祭司',
|
|
|
|
+ abbr: require('@/assets/images/coll_abbr_2.png')
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ title: '好时光”龙像',
|
|
|
|
+ abbr: require('@/assets/images/coll_abbr_3.png')
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ title: '花瓶',
|
|
|
|
+ abbr: require('@/assets/images/coll_abbr_4.png')
|
|
},
|
|
},
|
|
{
|
|
{
|
|
- title: '牧童归家2',
|
|
|
|
- abbr: require('@/assets/images/coll_abbr_2.png'),
|
|
|
|
- image: require('@/assets/images/coll_relic_2.png')
|
|
|
|
|
|
+ title: '皇家花瓶',
|
|
|
|
+ abbr: require('@/assets/images/coll_abbr_5.png')
|
|
},
|
|
},
|
|
{
|
|
{
|
|
- title: '牧童归家3',
|
|
|
|
- abbr: require('@/assets/images/coll_abbr_3.png'),
|
|
|
|
- image: require('@/assets/images/coll_relic_3.png')
|
|
|
|
|
|
+ title: '黄金盘',
|
|
|
|
+ abbr: require('@/assets/images/coll_abbr_6.png')
|
|
},
|
|
},
|
|
{
|
|
{
|
|
- title: '牧童归家4',
|
|
|
|
- abbr: require('@/assets/images/coll_abbr_4.png'),
|
|
|
|
- image: require('@/assets/images/coll_relic_4.png')
|
|
|
|
|
|
+ title: '绝代艳后玛丽·安托瓦内特花瓶',
|
|
|
|
+ abbr: require('@/assets/images/coll_abbr_7.png')
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ title: '莫切人物陶罐像',
|
|
|
|
+ abbr: require('@/assets/images/coll_abbr_8.png')
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ title: '牧童归家',
|
|
|
|
+ abbr: require('@/assets/images/coll_abbr_9.png')
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ title: '琴图里佩瓷钵',
|
|
|
|
+ abbr: require('@/assets/images/coll_abbr_10.png')
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ title: '青瓷盘',
|
|
|
|
+ abbr: require('@/assets/images/coll_abbr_11.png')
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ title: '双耳细颈瓶颈瓶',
|
|
|
|
+ abbr: require('@/assets/images/coll_abbr_12.png')
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ title: '陶瓷壶',
|
|
|
|
+ abbr: require('@/assets/images/coll_abbr_13.png')
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ title: '陶制火鸡造型盖碗',
|
|
|
|
+ abbr: require('@/assets/images/coll_abbr_14.png')
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ title: '锡釉陶器',
|
|
|
|
+ abbr: require('@/assets/images/coll_abbr_15.png')
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ title: '伊兹尼克瓶克瓶',
|
|
|
|
+ abbr: require('@/assets/images/coll_abbr_16.png')
|
|
}
|
|
}
|
|
]
|
|
]
|
|
|
|
|
|
return {
|
|
return {
|
|
- screenW: window.outerWidth,
|
|
|
|
- contentLeft: 0,
|
|
|
|
- items,
|
|
|
|
- active: items[0],
|
|
|
|
- pauseAnimation: false
|
|
|
|
|
|
+ items: items,
|
|
|
|
+ active: items[0]
|
|
}
|
|
}
|
|
},
|
|
},
|
|
methods: {
|
|
methods: {
|
|
- async clickHandle (ev, item) {
|
|
|
|
- this.active = item
|
|
|
|
-
|
|
|
|
- let result = getPoint(ev.target, this.$refs.layout)
|
|
|
|
- let $old = document.querySelector('.definition:not(.active)')
|
|
|
|
- let $active = document.querySelector('.definition.active')
|
|
|
|
-
|
|
|
|
- if ($active) {
|
|
|
|
- $active.classList.remove('active')
|
|
|
|
- setTimeout(() => {
|
|
|
|
- $active.classList.remove('animation')
|
|
|
|
- }, 300)
|
|
|
|
|
|
+ change (item) {
|
|
|
|
+ console.log(item)
|
|
|
|
+ if (this.active === item) {
|
|
|
|
+ } else {
|
|
|
|
+ this.active = item
|
|
}
|
|
}
|
|
-
|
|
|
|
- $old.style.left = result.x + this.contentLeft + 'px'
|
|
|
|
- $old.style.top = result.y + 'px'
|
|
|
|
- $old.style.width = this.itemWidth + 'px'
|
|
|
|
-
|
|
|
|
- setTimeout(() => {
|
|
|
|
- $old.classList.add('animation')
|
|
|
|
- $old.classList.add('active')
|
|
|
|
- $old.setAttribute('src', this.active.image)
|
|
|
|
- }, 10)
|
|
|
|
- }
|
|
|
|
- },
|
|
|
|
- computed: {
|
|
|
|
- itemWidth () {
|
|
|
|
- return this.screenW * 0.266
|
|
|
|
- },
|
|
|
|
- itemRight () {
|
|
|
|
- return this.screenW * 0.058
|
|
|
|
- },
|
|
|
|
- maxWidth () {
|
|
|
|
- return (this.itemWidth + this.itemRight) * this.items.length
|
|
|
|
}
|
|
}
|
|
},
|
|
},
|
|
- mounted () {
|
|
|
|
- let $content = this.$refs.content
|
|
|
|
- let screenW = window.outerWidth
|
|
|
|
-
|
|
|
|
- this.startHandle = loadTouch(
|
|
|
|
- () => {
|
|
|
|
- this.pauseAnimation = true
|
|
|
|
- this.startX = this.contentLeft
|
|
|
|
- },
|
|
|
|
- (x) => {
|
|
|
|
- this.contentLeft = this.startX + x
|
|
|
|
- },
|
|
|
|
- () => {
|
|
|
|
- this.pauseAnimation = false
|
|
|
|
-
|
|
|
|
- let mxWidth = $content.offsetWidth
|
|
|
|
- let left = -this.contentLeft
|
|
|
|
-
|
|
|
|
- let syncLeft = left > mxWidth - screenW
|
|
|
|
- ? mxWidth - screenW : left < 0
|
|
|
|
- ? 0 : null
|
|
|
|
-
|
|
|
|
- if (syncLeft !== null) {
|
|
|
|
- setTimeout(() => {
|
|
|
|
- this.contentLeft = -syncLeft
|
|
|
|
- })
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- )
|
|
|
|
-
|
|
|
|
- $content.addEventListener('touchstart', this.startHandle, false)
|
|
|
|
- },
|
|
|
|
- beforeDestroy () {
|
|
|
|
- this.$refs.content.removeEventListener('touchstart', this.startHandle, false)
|
|
|
|
- },
|
|
|
|
- components: {slide}
|
|
|
|
|
|
+ components: {cirSlide: CirSlide}
|
|
}
|
|
}
|
|
</script>
|
|
</script>
|
|
|
|
|