Browse Source

feat:增加移动端随心装宣传页

xzh 4 years ago
parent
commit
cc1f97b9ec

BIN
mobile/src/assets/images/refactor/coreProduct/sxz/item1.png


BIN
mobile/src/assets/images/refactor/coreProduct/sxz/item2.png


BIN
mobile/src/assets/images/refactor/coreProduct/sxz/item3.png


BIN
mobile/src/assets/images/refactor/coreProduct/sxz/left-arrow.png


BIN
mobile/src/assets/images/refactor/coreProduct/sxz/r05.jpeg


BIN
mobile/src/assets/images/refactor/coreProduct/sxz/r05_s.jpeg


BIN
mobile/src/assets/images/refactor/coreProduct/sxz/r06.jpeg


BIN
mobile/src/assets/images/refactor/coreProduct/sxz/r06_s.jpeg


BIN
mobile/src/assets/images/refactor/coreProduct/sxz/right-arrow.png


+ 182 - 0
mobile/src/components/common/comparePic.vue

@@ -0,0 +1,182 @@
+<template>
+  <div class="compare-pic" ref="compare-pic">
+    <img :class="`img-item img-item-0`" :src="imgs[0]" />
+    <div
+      class="beetween-ctrls"
+      @mousedown="handleMousedown"
+      @touchstart="handleMousedown"
+      :style="{ left: `${newPosition}%` }"
+    >
+      <div class="line"></div>
+      <div class="circle-ctrls">
+        <div class="animation-circle"></div>
+      </div>
+    </div>
+    <div
+      :class="`img-item img-item-1`"
+      :style="{
+        'background-image': `url(${imgs[1]})`,
+        width: `${100 - newPosition}%`,
+      }"
+    ></div>
+  </div>
+</template>
+
+<script>
+export default {
+  props: {
+    imgs: Array
+  },
+  data () {
+    return {
+      newPosition: 50,
+      maxWidth: 0
+    }
+  },
+  methods: {
+    handleMousedown (event) {
+      this.onDragStart(event)
+      window.addEventListener('mousemove', this.onDragging)
+      window.addEventListener('touchmove', this.onDragging)
+      window.addEventListener('mouseup', this.onDragEnd)
+      window.addEventListener('touchend', this.onDragEnd)
+      window.addEventListener('contextmenu', this.onDragEnd)
+    },
+    onDragEnd () {
+      window.removeEventListener('mousemove', this.onDragging)
+      window.removeEventListener('touchmove', this.onDragging)
+      window.removeEventListener('mouseup', this.onDragEnd)
+      window.removeEventListener('touchend', this.onDragEnd)
+      window.removeEventListener('contextmenu', this.onDragEnd)
+    },
+    onDragStart (event) {
+      this.dragging = true
+      this.isClick = true
+      const rect = this.$refs['compare-pic'].getClientRects()
+      this.maxWidth = rect[0].width
+      if (event.type === 'touchstart') {
+        event.clientY = event.touches[0].clientY
+        event.clientX = event.touches[0].clientX
+      }
+      this.startX = event.clientX
+    },
+    onDragging (event) {
+      this.isClick = false
+      // this.displayTooltip();
+      let diff = 0
+      console.log(event)
+      if (event.type === 'touchmove') {
+        event.clientY = event.touches[0].clientY
+        event.clientX = event.touches[0].clientX
+      }
+      this.currentX = event.clientX
+
+      diff = ((this.currentX - this.startX) / this.maxWidth) * 100
+      this.startX = this.currentX
+      this.setPosition(this.newPosition + diff)
+    },
+    setPosition (newPosition) {
+      if (newPosition === null || isNaN(newPosition)) return
+      if (newPosition < 0) {
+        newPosition = 0
+      } else if (newPosition > 100) {
+        newPosition = 100
+      }
+      this.newPosition = newPosition
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped>
+.compare-pic {
+  position: relative;
+  height: 100%;
+  width: 100%;
+}
+.img-item {
+  width: 100%;
+  height: 100%;
+  background-size: cover;
+  background-repeat: no-repeat;
+  background-position: center center;
+  user-select: none;
+  &-1 {
+    position: absolute;
+    right: 0;
+    top: 0;
+    z-index: 1;
+    width: 50%;
+    background-position: top right;
+  }
+}
+.beetween-ctrls {
+  position: absolute;
+  height: 100%;
+  top: 0;
+  left: 50%;
+  transform: translate(-50%, 0);
+  z-index: 2;
+  .line {
+    height: 100%;
+    width: 3px;
+    background: #fff;
+  }
+}
+.circle-ctrls {
+  width: 52px;
+  height: 52px;
+  cursor: pointer;
+  border-radius: 50%;
+  background: rgba(255, 255, 255, 0.4);
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  margin: -26px 0 0 -26px;
+  user-select: none;
+  &::before,
+  &::after {
+    content: "";
+    position: absolute;
+    top: 50%;
+    transform: translate(0, -50%);
+    background: url(~@/assets/images/refactor/coreProduct/sxz/left-arrow.png)
+      no-repeat center center;
+    background-size: contain;
+    width: 11px;
+    height: 20px;
+  }
+  &::before {
+    left: 7px;
+  }
+  &::after {
+    right: 7px;
+    background-image: url(~@/assets/images/refactor/coreProduct/sxz/right-arrow.png);
+  }
+  .animation-circle {
+    width: 52px;
+    height: 52px;
+    border: 2px solid rgba(255, 255, 255, 0.4);
+    animation: mymove-data 1s infinite;
+    border-radius: 50%;
+    position: absolute;
+    top: 50%;
+    left: 50%;
+    transform: translate(-50%, -50%);
+  }
+}
+@keyframes mymove-data {
+  from {
+    width: 52px;
+    height: 52px;
+    opacity: 0.4;
+  }
+
+  to {
+    width: 75px;
+    height: 75px;
+    // transform: translateX(-20px) translateY(-20px);
+    opacity: 0;
+  }
+}
+</style>

+ 9 - 0
mobile/src/lang/zh/modules/conduct.js

@@ -11,6 +11,15 @@ module.exports = {
         "itemTitle6": "10分钟全自动出结果,高效快速(约100㎡)",
         "itemTitle7": "强大编辑后台,让空间延伸表达"
     },
+    "sxz": {
+        "bannerTitle": "随心装",
+        bannerSubTitle: '快速打造心中家的模样',
+        "itemTitle1": "1:1精准复刻真实房源",
+        "itemTitle2": "实物家具建模,让您所见即所得",
+        "itemTitle3": "快速打造3D家装效果,<br/>让人工智能真正服务于生活",
+        "itemTitle4": "高效全屋渲染,秒级响应拒绝等待",
+        itemTitle5: '变装前后同屏看,一眼对比屋内变化'
+    },
     "coreTech": {
         "bannerTitle": "核心技术",
         bannerSubTitle: "让数字化飞入寻常百姓家",

+ 91 - 0
mobile/src/pages/coreProduct/sxz.vue

@@ -0,0 +1,91 @@
+<template>
+  <div class="conduct-sxz">
+    <div class="banner">
+      <h1 v-html="$t('conduct.sxz.bannerTitle')"></h1>
+      <h4 v-html="$t('conduct.sxz.bannerSubTitle')"></h4>
+    </div>
+    <ul class="desc-video">
+      <li v-for="item in list" :key="item.name">
+        <h1 class="common-title" v-html="item.name"></h1>
+        <img :src="item.img" v-if="typeof item.img === 'string'">
+        <div class="img-item-w" v-else>
+            <comparePic :imgs="item.img" />
+          </div>
+      </li>
+    </ul>
+  </div>
+</template>
+
+<script>
+import { i18n } from '@/lang'
+import comparePic from '@/components/common/comparePic'
+export default {
+  data () {
+    return {
+      list: [
+        {
+          name: i18n.t('conduct.sxz.itemTitle1'),
+          img: require('@/assets/images/refactor/coreProduct/sxz/item1.png')
+        },
+        {
+          name: i18n.t('conduct.sxz.itemTitle2'),
+          img: require('@/assets/images/refactor/coreProduct/sxz/item2.png')
+        },
+        {
+          name: i18n.t('conduct.sxz.itemTitle3'),
+          img: require('@/assets/images/refactor/coreProduct/sxz/item3.png')
+        },
+        {
+          name: this.$t('conduct.sxz.itemTitle4'),
+          img: [require('@/assets/images/refactor/coreProduct/sxz/r06_s.jpeg'), require('@/assets/images/refactor/coreProduct/sxz/r06.jpeg')],
+          runAnimation: true
+        },
+        {
+          name: this.$t('conduct.sxz.itemTitle5'),
+          img: [require('@/assets/images/refactor/coreProduct/sxz/r06_s.jpeg'), require('@/assets/images/refactor/coreProduct/sxz/r06.jpeg')],
+          runAnimation: true
+        }
+      ]
+    }
+  },
+  components: {
+    comparePic
+  }
+}
+</script>
+
+<style lang="less" scoped>
+.conduct-sxz {
+  .banner {
+    width: 100%;
+    height: 140px;
+    display: flex;
+    padding-left: 42px;
+    font-size: 22px;
+    color: #202020;
+    font-weight: bold;
+    background: #D4D4D4;
+    flex-direction: column;
+    justify-content: center;
+    background: url(~@/assets/images/refactor/conduct/exhibition/banner.png) no-repeat center center;
+    background-size: cover;
+  }
+  h4 {
+    font-size: 16px;
+    margin-top: 20px;
+  }
+  ul {
+    padding: 27px 20px 0;
+  }
+  li {
+    margin-bottom: 56px;
+  }
+  img {
+    margin-top: 30px;
+    width: 100%;
+  }
+  .img-item-w {
+    margin-top: 30px;
+  }
+}
+</style>

+ 5 - 0
mobile/src/router/index.js

@@ -31,6 +31,11 @@ let router = new Router({
       component: resolve => require(['@/pages/coreProduct'], resolve)
     },
     {
+      path: '/sxz',
+      name: 'sxz',
+      component: resolve => require(['@/pages/coreProduct/sxz'], resolve)
+    },
+    {
       path: '/conduct/:type',
       name: 'conduct',
       component: resolve => require(['@/pages/conduct'], resolve)

+ 1 - 1
pc/src/page/coreProducts/sxz.vue

@@ -45,7 +45,7 @@ export default {
         },
         {
           name: this.$t('conduct.sxz.itemTitle4'),
-          img: [require('@/assets/images/core-products/sxz/r05_s.jpeg'), require('@/assets/images/core-products/sxz/r05.jpeg')],
+          img: [require('@/assets/images/core-products/sxz/r06_s.jpeg'), require('@/assets/images/core-products/sxz/r06.jpeg')],
           runAnimation: true
         },
         {

+ 12 - 1
pc/src/page/layout/header/index.vue

@@ -83,7 +83,18 @@ export default {
       isWide,
       count: 0,
       navs: [
-        {text: this.$t('header.core_product'),  link: '/coreProducts'},
+        {text: this.$t('header.core_product'),  link: '/coreProducts'
+          // items: [
+          //   {
+          //     text: this.$t('header.core_product'),
+          //     link: '/coreProducts'
+          //   },
+          //   {
+          //     text: '随心装',
+          //     link: '/sxz'
+          //   }
+          // ]
+        },
         {text: this.$t('header.solutions'), items: [
           {
             text: this.$t('header.solutionsHouse'),