https://www.vmall.com/index.html
1. 代码

2. 创建元素方法
2.1. 通过createElement()
- 需要搭配append()方法
1 | // 产品展示元素 |
2.2. 使用innerHTML
- 将所有子元素内容拼接好后通过innerHTML渲染到网页
1 | function createEle2() { |
3. 过滤实现
resultList数组中存放的一直是原始数据
通过数组的filter方法筛选数据
- 匿名函数返回true时,数据会被保留
- typeFlag - 分类栏的数据保留标志,serviceFlag - 服务优惠栏的数据保留标志,只有当两者都为true时,才能确保数据是符合过滤标准的
分类栏的过滤
- 当 typeFilters数组为空时,for循环不会执行,所有原始数据通过筛选
- 当 typeFilters数组存入数据,如 [“笔记本”]时,判断resultList数据每一项的skuName中是否包含”笔记本”字符串。若没有,则typeFlag为false,立即退出循环,也可以退出这次筛选,因为typeFlag已经为false,return的一定是false
服务优惠栏的过滤
- 当 serviceFilters数组为空时,for循环也不会执行,所有原始数据通过筛选
- 当 serviceFilters数组存入数据,如 [“仅看有货”]时,判断resultList数据每一项的services数组中是否包含”仅看有货”元素。若没有,则serviceFlag为false,立即退出循环
最终需要重新根据showList生成内容
1 | // 分类栏的过滤 |
4. 过滤的选择
- 用于typeFilters,serviceFilters数组的生成
1 | function clickChoose(event,filters) { |
- 分类栏点击
1 | var typeEl = operationEl.querySelector(".type"); |
- 服务优惠栏点击
1 | var services = operationEl.querySelector(".services"); |
5. 排序实现
5.1. 排序栏的数据准备
- data-key属性对应原始数据中的key值
- JavaScript中通过 element.dataset.key可以拿到
1 | <ul class="order"> |
5.2. 排序栏的点击事件
- 综合对应default,它并不用排序,只是对当前两个过滤数组进行再一次的过滤
- 其他的通过数组的sort函数进行排序
1 | // 排序栏 |
6. 图片轮播-透明度变化
6.1. 绝对定位
- 所有图都绝对定位叠放在同一个位置,只有第一张图透明度为1
- 设置的transition动画可使每个图片展示有透明度变化效果
1 | .banner-opacity .item { |
6.2. 移动实现
- prevoiusIndex 记录当前所在位置
- currentIndex 记录将要移动到的位置
- len 记录原始数据的数组长度
1 | var prevoiusIndex = 0; |
- 判断边界
- 当前是最后一张图(prevoiusIndex=len-1)时,后移下一张图应该是第一张(currentIndex=0)
- 当前是第一张图(prevoiusIndex=0)时,前移下一张图应该是最后一张(currentIndex=len-1)
- 改变索引组的激活项
- 当前项取消激活
- 目标项激活
- 改变图片透明度
- 当前图透明度改为0
- 目标项透明度改为1
1 | var bannerOpacity = document.querySelector(".banner-opacity"); |
6.3. 移动变化
6.3.1. 左右按钮的点击
- 按钮改变的就是 prevoiusIndex 和 currentIndex值
1 | var leftBtn = bannerOpacity.querySelector(".left"); |
6.3.2. 索引组的点击
- 索引组的点击函数放在了元素创建中,是为了放到每个项的对应索引值
li.index = i - 每个项点击改变的也是 prevoiusIndex 和 currentIndex值
1 | // 索引 |
6.4. 自动轮播
- 设置一个定时器,每3s运行一次
- 定时器内部跟右按钮的点击一样
1 | var timer = null; |
6.5. 鼠标与定时器
- 鼠标在整个 div.banner元素中时,定时器关闭
- 鼠标离开时,定时器重启
1 | bannerOpacity.onmouseenter = function() { |
6.6. 页面可见与定时器
- 当页面不可见时,定时器关闭
- 页面可见时,定时器重启
1 | document.onvisibilitychange = function() { |
7. 图片轮播-整个ul移动
7.1. flex布局
- 所有图片水平排布,通过 整个ul.list的 translateX 的改变来达到移动效果
1 | .banner-translatex .list{ |
7.2. 图片克隆
- 第一张图片左移时,为了实现移动的效果,复制最后一张图片放在其左边
- 最后一张图片右移时,为了实现移动的效果,复制第一张图片放在其右边
- 这样导致视口中实现的是最后一张图片,所以需要将 ul.list 向左移动 -100%,显示第一张图
1 | var bannerTranslateX = document.querySelector(".banner-translatex"); |
7.3. 移动实现
- length - 记录原始数据的数组长度
- preIndex 记录当前所在位置,理想中没有克隆的第一张,最后一张的位置
- curIndex 记录将要移动到的位置,同样是理想中的位置
1 | var length = banners.length; |
- 当达到理想中的最后一张时,因为其后面还有第一张图片副本,所以先进行动画左移,再进行边界判断,无动画的移动至第一张图片位置
- 当达到理想中的第一张时,因为其前面还有最后一张图片副本,所以先进行动画左移,再进行边界判断,无动画的移动至最一张图片位置
1 | function moveTranslateX() { |
7.4. 移动变化
7.4.1. 左右按钮的点击
1 | var leftTranslatexBtn = bannerTranslateX.querySelector(".left"); |
7.4.2. 索引组的点击
1 | // 索引 |
7.5. 自动轮播
1 | var timertranslatex = null; |
7.6. 鼠标与定时器
1 | startTimeTranslateX(); |