5.goods商品列表页开发

goods组件显示的区域是固定的,也没有滚动条,所以是采用绝对布局的,左右分为menu栏和foods栏,左边固定布局,右边自适应布局,采用flex布局。

写CSS样式的时候,尽量用class,少用tag,因为class的查找效率优于tag,尤其是嵌套层级比较多的时候。左边的menu栏有些是一行有些是多行,要做到不管单行还是多行都是垂直是居中,可以用display:table,table布局是实现垂直居中的有效布局。menu-item设置display:table,text设置display:table-cell,vertical-align:center

<ul>
  <li v-for="(item, index) in goods" class="menu-item" :class="{‘current‘:currentIndex===index}" @click="selectMenu(index, $event)">
    <span class="text border-1px">
  <span v-show="item.type>0" class="icon" :class="classMap[item.type]"></span>
  {{item.name}}
    </span>
  </li>
</ul>

右边的food栏用两个<ul v-for="XXX">来实现遍历

每个食品的显示分为左边icon和右边的content,用flex布局来实现,左边固定宽度,右边自适应布局。goods组件的右边的food栏,除了最后一个食品的下面都有1px的border,要去掉最后一个食品的border,课程中是在mixin中写了一个border-none()的样式,把after的伪类设置为display:none。也可以用另一种方式来实现,由于border是通过after伪类来实现的,那么如果给最后一个食品的after伪类设置为border:none应该就可以去掉border了。

border-none()
  &:after
    display: none

food-item设置了18px的margin,但是由于相邻两个food-item的上下margin是会重合的,所以要再设置一个padding-bottom,但是最后一个food-item就会有一个18px的margin-bottom和18px的padding-bottom,所以最后一个fodd-tiem的margin-bottom要设置为0。

.food-item
  display: flex
  margin: 18px
  padding-bottom: 18px
  border-1px(rgba(7, 17, 27, 0.1))

用better scroll库实现滚动效果, new BScroll()有两个参数,第一个是dom对象,第二个是可选对象。给dom对象增加ref属性,<div class="foods-wrapper" ref="menuWrapper">,在js中用this.$refs获取dom对象,this.meunScroll = new BScroll(this.$refs.menuWrapper, {});

DOM对象是异步更新的,所以要把滚动的初始化函数放在¥nextTick()函数中,$nextTick 是在下次 DOM 更新循环结束之后执行延迟回调,在修改数据之后使用 $nextTick,则可以在回调中获取更新后的 DOM。

要实现左边的menu和右边的food的连动,要计算出右边每一个类的food的高度区间,用getElementsByClassNames获取每一个类food的DOM对象,用函数clientHeight得到的DOM对象的高度。

_calculateHeight() {
  let foodList = this.$refs.foodsWrapper.getElementsByClassName(‘food-list-hook‘);
  let height = 0;
  this.listHeight.push(height);
  for (let i = 0; i < foodList.length; i++) {
    let item = foodList[i];
    height += item.clientHeight;
    this.listHeight.push(height);
  }

}

然后拿到实时的y值与高度区间值对比,在BScroll函数中传入参数probeType:3就可以获取实时滚动的位置,用this.foodsscroll.on()监听滚动事件

this.foodsScroll = new BScroll(this.$refs.foodsWrapper, {
  click: true,
  probeType: 3
});
this.foodsScroll.on(‘scroll‘, (pos) => {
  this.scrollY = Math.abs(Math.round(pos.y));
  });
},

当food栏滚动时,获取当前的坐标,与区间对比,得到对应的index,更新左边的menu栏,对应index的menu-item会获得一个current的class。用better Scroll之后,点击时会有两个事件,一个是浏览器原生事件,一个是better Scroll派发的时间,其中浏览器原生事件都没有_constructed属性,better scroll派发的事件有_constructed属性。

<li v-for="(item, index) in goods" class="menu-item" :class="{‘current‘:currentIndex===index}" @click="selectMenu(index, $event)">

computed: {
  currentIndex() {
    for (let i = 0; i < this.listHeight.length; i++) {
      let height1 = this.listHeight[i];
      let height2 = this.listHeight[i + 1];
      if (!height2 || (this.scrollY >= height1 && this.scrollY < height2)) {
        return i;
      }
    }
    return 0;
  }
}

点击左边的menu列表时,根据index,通过scrollToElement把右边的列表滚动到对应的位置

selectMenu(index, event) {
  if (!event._constructed) {
    return;
  }
  let foodList = this.$refs.foodsWrapper.getElementsByClassName(‘food-list-hook‘);
  let el = foodList[index];
  this.foodsScroll.scrollToElement(el, 300);
},

购物车组件开发

时间: 2024-10-19 11:08:21

5.goods商品列表页开发的相关文章

【vue】饿了么项目-goods商品列表页开发

1.flex 属性是 flex-grow.flex-shrink 和 flex-basis 属性的简写属性. flex-grow 一个数字,规定项目将相对于其他灵活的项目进行扩展的量. flex-shrink 一个数字,规定项目将相对于其他灵活的项目进行收缩的量. flex-basis 项目的长度.合法值:"auto"."inherit" 或一个后跟 "%"."px"."em" 或任何其他长度单位的数字.

ecshop实现商品列表页属性筛选区品牌筛选以LOGO形式展示

很多时候ecshop分类页的品牌都是以名称的形式显示的,下面ECSHOP开发中心的技术和大家说说ecshop 如何实现商品列表页属性筛选区品牌筛选以LOGO形式展示 1.修改 category.php 文件,将(大概220行) 找到 1 $sql = "SELECT b.brand_id, b.brand_name, COUNT(*) AS goods_num ". 替换成 1 $sql = "SELECT b.brand_id,b.brand_logo, b.brand_n

让ECSHOP商品列表页和商品详细页分类树跟首页一样

如何让商品列表页或商品详情页的分类树都跟首页一样,也是显示全部所有的分类呢?修改方法:1.商品列表页修改方法:打开category.php 文件将$smarty->assign('categories',       get_categories_tree($cat_id));修改为$smarty->assign('categories',       get_categories_tree());2.商品详情页修改方法:将$smarty->assign('categories',   

(生鲜项目)07. api view实现商品列表页

第一步: 环境配置 1. DRF官网: https://www.django-rest-framework.org/ 仔细查看自己当前的python版本以及django版本是否支持DRF, 然后就看看哪些支持的模块还没有下载, 由于之前安装过xadmin了, 所以这里正常情况下还有coreapi, pygments, django-guardian没有安装, 在虚拟环境中去安装就行了 注: 如果在安装coreapi的时候报错, 并且提示utf-8 decode错误, 那么就去修改pip的编码格式

(生鲜项目)08. ModelSerializer 实现商品列表页, 使用Mixin来实现返回, 以及更加方便的ListAPIView, 以及分页的设置

第一步: 学会使用ModelSerializer, 并且会使用ModelSerializer相互嵌套功能 1. goods.serializers.py from rest_framework import serializers from goods.models import Goods, GoodsCategory # 让goods的category字段全量显示 class CategorySerializer(serializers.ModelSerializer): class Met

ecshop模板将商品列表页属性筛选区的品牌以LOGO形式显示

ecshop模板将商品列表页属性筛选区的品牌以LOGO形式显示 商品列表页属性筛选区品牌以LOGO形式显示1.修改 category.php 文件将(大概215行) $sql = "SELECT b.brand_id, b.brand_name, COUNT(*) AS goods_num ". 修改为 $sql = "SELECT b.brand_id,b.brand_logo, b.brand_name, COUNT(*) AS goods_num ". 把商品

在ECSHOP商品列表页和搜索页面,最后出现空商品的解决办法

有客户购买了我们的ecshop模板后,自己做了大量的修改和改动,后来出现了商品列表页面和搜索页面出现了多一个商品的问题.没有商品数据,但是多显示了一个商品的样式.下面就由我们68ecshop为大家解决一下这个问题吧!解决的方法如下:<!– {if $goods.goods_id} –> <!– {/if} –>代码框起来即可解决.

商品列表页一次添加多个规格

可能题目的表述不是特别清晰,具体有一下截图看这会比较明显 页面上的功能描述1. 当页面加载完成后,需要根据不同规格的商品刷新出对应规格商品的价格,2.重置默认数量,这个功能在input标签中设置默认的value值即可,或者添加一个js函数,重置对应class集合中的值,这个不多说,比较简单,3.点击添加购物车,需要把例如上图中的不同规格中的商品能全部添加到购物车 解题思路,要求1,这个任务比较简单,由于这种方式,后台里的商品规格选项必须用单选按钮来做,否则页面效果不容易实现具体要实现什么样式自己

ecshop商品列表页,循环显示当前分类的二级分类以及分类下的商品

1.includes\lib_goods.php,在最末尾添加几个function /** * 获得指定分类下的子分类 * * @access public * @param integer $cat_id 分类编号 * @return array */ function get_children_tree($cat_id) { if ($cat_id >0 ) { $sql = 'SELECT count(*) FROM ' . $GLOBALS['ecs']->table('categor