vue-shop项目( four)

vue-shop项目( four)


商品详情页面的设计与实现

商品的详细页面是商城的主页的子页面。用户单击主页面中的某一个页面后进入商品的详情页面,对于用户而言详情页面至关重要,详情页面可以直接影响用户的购买意愿。为此对商城设计并实现了一系列的功能,放大效果、商品的概要信息、宝贝的详情和评价等方便用户的消费决策。请添加图片描述

请添加图片描述


一、、图片的放大效果的实现

在views/shopinfo文件夹下新建Enlarge.vue 在template中定义商品的照片图片的放大工具、缩略图,通过商品照片触发mousenteer事件、mouseleavee事件赫尔mousemove事件执行相应的方法。
在script标签中编写鼠标在商品图片上移入移出时所执行的方法。在mouseEnter方法中是指放大的工具赫尔放大的图片显示;在mouseLeave中设置图片放大工具和图片的隐藏;在mouseMove通过元素的定位属性设置图片放大工具和放大的图片位置实现放大效果。

<template>
      <div class="clearfixLeft" id="clearcontent">
        <div class="box">
          <div class="enlarge" @mouseenter="mouseEnter" @mouseleave="mouseLeave" @mousemove="mouseMove">
            <img :src="bigImgUrl[n]" title="细节展示放大镜特效">
            <span class="tool"></span>
            <div class="bigbox">
              <img :src="bigImgUrl[n]" class="bigimg">
            </div>
          </div>
          <ul class="tb-thumb" id="thumblist">
            <li :class="{selected:n == index}" v-for="(item,index) in smallImgUrl" :key="index" @mouseover="setIndex(index)">
              <div class="tb-pic tb-s40">
                <a href="javascript:void(0)"><img :src="item"></a>
              </div>
            </li>
          </ul>
        </div>
        <div class="clear"></div>
      </div>
</template>

<script>
  export default {
    data: function(){
      return {
        n: 0,//缩略图索引
        smallImgUrl: [//缩略图数组
          require('@/assets/images/01_small.jpg'),
          require('@/assets/images/02_small.jpg'),
          require('@/assets/images/03_small.jpg')
        ],
        bigImgUrl: [//商品图片数组
          require('@/assets/images/01.jpg'),
          require('@/assets/images/02.jpg'),
          require('@/assets/images/03.jpg')
        ]
      }
    },
    methods: {
      mouseEnter: function () {//鼠标进入图片的效果
        document.querySelector('.tool').style.display='block';
        document.querySelector('.bigbox').style.display='block';
      },
      mouseLeave: function () {//鼠标移出图片的效果
        document.querySelector('.tool').style.display='none';
        document.querySelector('.bigbox').style.display='none';
      },
      mouseMove: function (e) {
        var enlarge=document.querySelector('.enlarge');
        var tool=document.querySelector('.tool');
        var bigimg=document.querySelector('.bigimg');
        var ev=window.event || e;//获取事件对象
        //获取图片放大工具到商品图片左端距离
        var x=ev.clientX-enlarge.offsetLeft-tool.offsetWidth/2+document.documentElement.scrollLeft;
        //获取图片放大工具到商品图片顶端距离
        var y=ev.clientY-enlarge.offsetTop-tool.offsetHeight/2+document.documentElement.scrollTop;
        if(x<0) x=0;
        if(y<0) y=0;
        if(x>enlarge.offsetWidth-tool.offsetWidth){
          x=enlarge.offsetWidth-tool.offsetWidth;//图片放大工具到商品图片左端最大距离
        }
        if(y>enlarge.offsetHeight-tool.offsetHeight){
          y=enlarge.offsetHeight-tool.offsetHeight;//图片放大工具到商品图片顶端最大距离
        }
        //设置图片放大工具定位
        tool.style.left = x+'px';
        tool.style.top = y+'px';
        //设置放大图片定位
        bigimg.style.left = -x * 2+'px';
        bigimg.style.top = -y * 2+'px';
      },
      setIndex: function (index) {
        this.n=index;//设置缩略图索引
      }
    }
  }
</script>
<style src="@/assets/css/optstyle.css" scoped></style>
<style src="@/assets/css/infoStyle.css" scoped></style>
<style scoped>
  .enlarge{
    border:1px solid #CDCDCD;
    position:relative;
    width: 400px;
    height: 400px;
  }
  .tool{
    display: none;
    position: absolute;
    top: 0;
    left: 0;
    width: 200px;
    height: 200px;
    background: goldenrod;
    opacity: 0.6;
    cursor: move;
  }
  .bigbox{
    width:400px;
    height:400px;
    overflow:hidden;
    position:absolute;
    top: 0;
    left: 410px;
    z-index:1;
    display: none;
  }
  .bigbox img{
    width: 800px;
    height: 800px;
    position: absolute;
    top: 0;
    left: 0;
  }
</style>

二、商品概要功能的实现

商品概要功能,包含商品的名称、价格、和配送地址等信息。用户快速阅览商品的基本信息可以了解销量等问题。方便用户快速决策,节省浏览时间。

<template>
  <div>
    <ol class="mr-breadcrumb mr-breadcrumb-slash">
      <li><a href="javascript:void(0)">首页</a></li>
      <li><a href="javascript:void(0)">分类</a></li>
      <li class="mr-active">内容</li>
    </ol>

    <div class="scoll">
      <section class="slider">
        <div class="flexslider">
          <ul class="slides">
            <li>
              <img src="@/assets/images/01.jpg" title="pic">
            </li>
            <li>
              <img src="@/assets/images/02.jpg">
            </li>
            <li>
              <img src="@/assets/images/03.jpg">
            </li>
          </ul>
        </div>
      </section>
    </div>

    <!--放大镜-->

    <div class="item-inform">
      <Enlarge/>

      <div class="clearfixRight">

        <!--规格属性-->
        <!--名称-->
        <div class="tb-detail-hd">
          <h1>
            {{goodsInfo.name}}
          </h1>
        </div>
        <div class="tb-detail-list">
          <!--价格-->
          <div class="tb-detail-price">
            <li class="price iteminfo_price">
              <dt>促销价</dt>
              <dd><em>¥</em><b class="sys_item_price">{{goodsInfo.unitPrice | formatPrice}}</b></dd>
            </li>
            <li class="price iteminfo_mktprice">
              <dt>原价</dt>
              <dd><em>¥</em><b class="sys_item_mktprice">599.00</b></dd>
            </li>
            <div class="clear"></div>
          </div>

          <!--地址-->
          <dl class="iteminfo_parameter freight">
            <dt>配送至</dt>
            <div class="iteminfo_freprice">
              <div class="mr-form-content address">
                <select data-mr-selected>
                  <option value="a">浙江省</option>
                  <option value="b">吉林省</option>
                </select>
                <select data-mr-selected>
                  <option value="a">温州市</option>
                  <option value="b">长春市</option>
                </select>
                <select data-mr-selected>
                  <option value="a">瑞安区</option>
                  <option value="b">南关区</option>
                </select>
              </div>
              <div class="pay-logis">
                快递<b class="sys_item_freprice">10</b></div>
            </div>
          </dl>
          <div class="clear"></div>

          <!--销量-->
          <ul class="tm-ind-panel">
            <li class="tm-ind-item tm-ind-sellCount canClick">
              <div class="tm-indcon"><span class="tm-label">月销量</span><span class="tm-count">1015</span></div>
            </li>
            <li class="tm-ind-item tm-ind-sumCount canClick">
              <div class="tm-indcon"><span class="tm-label">累计销量</span><span class="tm-count">6015</span></div>
            </li>
            <li class="tm-ind-item tm-ind-reviewCount canClick tm-line3">
              <div class="tm-indcon"><span class="tm-label">累计评价</span><span class="tm-count">640</span></div>
            </li>
          </ul>
          <div class="clear"></div>

          <!--各种规格-->
          <dl class="iteminfo_parameter sys_item_specpara">
            <dt class="theme-login">
              <div class="cart-title">可选规格<span class="mr-icon-angle-right"></span></div>
            </dt>
            <dd>
              <!--操作页面-->

              <div class="theme-popover-mask"></div>

              <div class="theme-popover">
                <div class="theme-span"></div>
                <div class="theme-poptit">
                  <a href="javascript:;" title="关闭" class="close">×</a>
                </div>
                <div class="theme-popbod dform">
                  <form class="theme-signin" name="loginform" action="" method="post">

                    <div class="theme-signin-left">

                      <div class="theme-options">
                        <div class="cart-title">颜色</div>
                        <ul>
                          <li class="sku-line selected">荣耀金<i></i></li>
                          <li class="sku-line">冰河银<i></i></li>
                          <li class="sku-line">雅典灰<i></i></li>
                        </ul>
                      </div>
                      <div class="theme-options">
                        <div class="cart-title">套装</div>
                        <ul>
                          <li class="sku-line selected">保护套装<i></i></li>
                          <li class="sku-line">原厂电源<i></i></li>
                          <li class="sku-line">存储套装<i></i></li>
                        </ul>
                      </div>
                      <div class="theme-options">
                        <div class="cart-title number">数量</div>
            <dd>
              <input id="min" class="mr-btn mr-btn-default" @click="reduce" type="button" value="-"/>
              <input id="text_box" type="text" value="1" v-model="number" style="width:30px;"/>
              <input id="add" class="mr-btn mr-btn-default" @click="add" type="button" value="+"/>
              <span id="Stock" class="tb-hidden">库存<span class="stock">1000</span></span>
            </dd>

        </div>
        <div class="clear"></div>

        <div class="btn-op">
          <div class="btn mr-btn mr-btn-warning">确认</div>
          <div class="btn close mr-btn mr-btn-warning">取消</div>
        </div>
      </div>
      <div class="theme-signin-right">
        <div class="img-info">
          <img src=""/>
        </div>
        <div class="text-info">
          <span class="J_Price price-now">¥39.00</span>
          <span id="Stock" class="tb-hidden">库存<span class="stock">1000</span></span>
        </div>
      </div>

      </form>
    </div>
  </div>

  </dd>
  </dl>
  <div class="clear"></div>
  <!--活动	-->
  <div class="shopPromotion gold">
    <div class="hot">
      <dt class="tb-metatit">店铺优惠</dt>
      <div class="gold-list">
        <p>购物满2件打8折,满37</p>
      </div>
    </div>
    <div class="clear"></div>
  </div>
  </div>

  <div class="pay">
    <div class="pay-opt">
      <a href="index.html"><span class="mr-icon-home mr-icon-fw">首页</span></a>
      <a><span class="mr-icon-heart mr-icon-fw">收藏</span></a>

    </div>
    <li>
      <div class="clearfix tb-btn tb-btn-buy theme-login">
        <a id="LikBuy" title="点此按钮到下一步确认购买信息" @click="show">立即购买</a>
      </div>
    </li>
    <li>
      <div class="clearfix tb-btn tb-btn-basket theme-login">
        <a id="LikBasket" title="加入购物车" @click="show"><i></i>加入购物车</a>
      </div>
    </li>
  </div>

  </div>

  <div class="clear"></div>

  </div>
  </div>
</template>

<script>
  import Enlarge from '@/views/shopinfo/Enlarge'
  import {mapState,mapActions} from 'vuex'//引入mapState和mapActions
  export default {
    components: {
      Enlarge
    },
    data: function(){
      return {
        number: 1,//商品数量
        goodsInfo: {//商品基本信息
          img : require("@/assets/images/honor.jpg"),
          name : "华为 荣耀 畅玩4X 白色 移动4G手机",
          num : 0,
          unitPrice : 499,
          isSelect : true
        }
      }
    },
    computed: {
      ...mapState([
              'user'//this.user映射为this.$store.state.user
      ])
    },
      watch: {
        number: function (newVal,oldVal) {
            if(isNaN(newVal) || newVal == 0){//输入的是非数字或0
                this.number = oldVal;//数量为原来的值
            }
        }
      },
    filters: {
      formatPrice : function(value){
        return value.toFixed(2);//保留两位小数
      }
    },
    methods: {
      ...mapActions([
              'getListAction'//this.getListAction()映射为this.$store.dispatch('getListAction')
      ]),
      show: function () {
          if(this.user == null){
              alert('亲,请登录!');
              this.$router.push({name:'login'});//跳转到登录页面
          }else{
            this.getListAction({//执行方法并传递参数
              goodsInfo: this.goodsInfo,
              number: parseInt(this.number)
            });
              this.$router.push({name:'shopcart'});//跳转到购物车页面
          }
      },
      reduce: function () {
        if(this.number >= 2){
          this.number--;//商品数量减1
        }

      },
      add: function () {
        this.number++;//商品数量加1
      }
    }
  }
</script>
<style src="@/assets/css/optstyle.css" scoped></style>
<style src="@/assets/css/infoStyle.css" scoped></style>


总结

了解需求,解决需求。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hackers luthiers

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值