<template> <div class="com-main"> <carousel v-if="indexBanner.length" :banner="indexBanner" :height="'538px'"></carousel> <sub-nav :secondaryBanner="secondaryBanner"></sub-nav> <section class="com-width-1200 com-margin-auto"> <pc-title :title="'Trending Products'"></pc-title> <div class="card-wrap com-margin-auto"> <card v-for="(item, k) in indexGoodsRankLists" :key="k" :cardData="item" ref="card" @addCompare="addCompareList"></card> <transition @before-enter="beforeEnter" @enter="enter" @after-enter="afterEnter"> <div class="ball" v-show="shopCarBall" ref="ball"> <div class="linner_ball"></div> </div> </transition> </div> </section> <a :href="midBanner[0]?.link" target="_target" v-if="midBanner.length"> <el-image lazy :src="midBanner[0]?.image" alt="why choose us" class="middle_banner" fit="cover"></el-image> </a> <section class="com-width-1400 com-margin-auto row-card"> <row-card v-for="(item, k) in articleList" :key="k" :data="item"></row-card> <!-- <subscription></subscription> --> </section> </div> </template> <script> export default { name: 'IndexPage', layout: 'default', async asyncData({ $axios, req }) { // type:1、首页顶部banner,2、首页小图推荐,3、中部banner,4、,5、推荐文章栏目,6、底部banner,7、社交链接 const temp = await $axios .get('/c-api/banner/list') .then(res => res.result?.data || []) .catch(e => { console.log(e) }) console.log(temp, 'temp') const indexBanner = temp.filter(i => i.type === 1) const secondaryBanner = temp.filter(i => i.type === 2) // await $axios // .post('home/indexBanner', { // site: 1, // type: 2, // }) // .catch(e => { // console.log(e) // }) const indexGoodsRankLists = await $axios .post('home/indexGoodsRankLists', { site: 1, }) .catch(e => { console.log(e) }) const midBanner = await $axios .post('home/indexBanner', { site: 1, type: 3, }) .catch(e => { console.log(e) }) const articleList = await $axios .post('home/indexBanner', { site: 1, type: 5, }) .catch(e => { console.log(e) }) // console.log(indexBanner.result.data, 'indexBanner') return { indexBanner, secondaryBanner, indexGoodsRankLists: indexGoodsRankLists.result, midBanner: midBanner.result.data, articleList: articleList.result.data, } }, data() { return { indexBanner: [], secondaryBanner: [], indexGoodsRankLists: [], midBanner: [], articleList: [], shopCarBall: false, shopCarBallEl: null, ss: null, } }, created() {}, methods: { addCompareList(target) { this.shopCarBallEl = target this.shopCarBall = true }, // 动画开始 beforeEnter(el) { // 获取元素的大小及其相对于视口的位置 if (process.client) { const dom = this.shopCarBallEl.getBoundingClientRect() const comparePosition = document .querySelector('.compare-list') .getBoundingClientRect() const offsetX = comparePosition.left - dom.left const offsetY = dom.top - comparePosition.top - 20 el.style.display = '' // y轴是曲直向上的,x轴是蜿蜒的向右的 el.style.transform = `translate3D( -${offsetX}px,${offsetY}px,0)` } }, enter(el, done) { // 触发重绘,来实现动画的移动过程 if (process.client) { this.ss = document.body.offsetHeight el.style.transform = `translate3D( 0,0,0)` el.addEventListener('transitionend', done) } }, afterEnter(el) { this.shopCarBall = false el.style.display = 'none' }, }, } </script> <style lang="scss" scoped> .card-wrap { display: grid; justify-items: center; justify-content: space-evenly; // grid-template-columns: repeat(5,1fr); } .middle_banner { width: 100%; height: 580px; margin: 0 0 30px; } .ball { position: fixed; top: 86px; right: 19%; width: 20px; height: 20px; border-radius: 50%; background: #e90000; transition: all 0.5s linear; z-index: 9999; .linner_ball { transition: all 0.5s linear; } } </style>