轮播图

用户登录到首页之后, 第一个看到的内容,就是轮播图。 (见前面的原型图)

所以,我们接下来,要为首页增加它。

1. 增加路由

路由文件(src/router/index.js),对应位置,增加:

  1. import Index from '@/views/shops/index'
  2. Vue.use(Router)
  3. export default new Router({
  4. routes: [
  5. {
  6. path: '/',
  7. name: 'Home',
  8. component: Index
  9. }
  10. ]

2. 增加对应页面

src/views/shops/index.vue

  1. <template>
  2. <div class="background">
  3. <div class="home">
  4. <div class="m_layout">
  5. <!-- 轮播图-->
  6. <HomeBannerView></HomeBannerView>
  7. <!--导航-->
  8. <HomeNavView></HomeNavView>
  9. <span class="divider" style="height: 4px;"></span>
  10. <div class="product_top">
  11. <div class="product_left">
  12. <div>商品列表</div>
  13. </div>
  14. </div>
  15. <span class="divider" style="height: 2px;"></span>
  16. <!-- 特产商品 -->
  17. <SpecialMarket :id="good.id" :name="good.name" :description="good.description" :image_url="good.image_url" v-for="good in goods"></SpecialMarket>
  18. </div>
  19. </div>
  20. <NavBottomView :is_shops_index="is_shops_index"></NavBottomView>
  21. </div>
  22. </template>
  23. <script>
  24. // 轮播图需要的js文件
  25. import {bindEvent,scrollPic} from '../../libs/index.js'
  26. // 轮播图需要的前台文件
  27. import HomeBannerView from '../../components/HomeBanner.vue';
  28. // 商品分类
  29. import HomeNavView from '../../components/HomeNav.vue';
  30. // 特产,商品的列表
  31. import SpecialMarket from '../../components/SpecialMarket.vue';
  32. // 底部4个TAB, 下一节会讲到
  33. import NavBottomView from '../../components/NavBottom.vue';
  34. export default{
  35. data () {
  36. return {
  37. goods: [],
  38. is_shops_index: true,
  39. }
  40. },
  41. components:{
  42. HomeHeaderView,
  43. HomeBannerView,
  44. HomeNavView,
  45. HomeMainView,
  46. SpecialMarket,
  47. NavBottomView
  48. },
  49. mounted () {
  50. //bindEvent();
  51. scrollPic();
  52. this.loadPage ();
  53. },
  54. computed: {
  55. },
  56. methods: {
  57. loadPage () {
  58. this.$http.get(this.$configs.api + 'goods/get_goods').then((response)=>{
  59. console.info(response.body)
  60. this.goods= response.body.goods
  61. },(error) => {
  62. console.error(error)
  63. });
  64. },
  65. }
  66. }
  67. </script>

上面的代码中,

  • 先是读取了一个API
  • 渲染数据
  • 实现首页的轮播图

3. 增加轮播图

我们做开发的核心方法论: 不要造轮子。

一定要造轮子的话, 先搜索一下是否已经有了现成的轮子。

轮播图是最最常见的组件, 所以一定会有别人写好的第三方包, 我们拿过来用就好。

经过一番考察, 我们发现这个项目不错:

所以, 直接拿过来用。

3.1 轮播图的组件

我们需要在src/views/shops/index.vue中,增加:

  1. import {bindEvent,scrollPic} from '../../libs/index.js'

然后, 增加对应的文件(libs/index.js)

  1. function $id(id) {
  2. return document.getElementById(id);
  3. }
  4. function bindEvent() {
  5. var sea = $id("my_search");
  6. /*banner对象*/
  7. var banner = $id("my_banner");
  8. /*高度*/
  9. var height = banner.offsetHeight;
  10. window.onscroll = function() {
  11. var top = document.body.scrollTop;
  12. /*当滚动高度大于banner的高度时候颜色不变*/
  13. if (top > height) {
  14. sea.style.background = "rgba(201,21,35,0.85)";
  15. } else {
  16. var op = top / height * 0.85;
  17. sea.style.background = "rgba(201,21,35," + op + ")";
  18. }
  19. };
  20. }
  21. function scrollPic() {
  22. var imgBox = document.getElementsByClassName("banner_box")[0];
  23. var width = $id("my_banner").offsetWidth;
  24. var pointBox = document.getElementsByClassName("point_box")[0];
  25. var ols = pointBox.children;
  26. var indexx = 1;
  27. var timer = null;
  28. var moveX = 0;
  29. var endX = 0;
  30. var startX = 0;
  31. var square = 0;
  32. function addTransition() {
  33. imgBox.style.transition = "all .3s ease 0s";
  34. imgBox.style.webkitTransition = "all .3s ease 0s";
  35. }
  36. function removeTransition() {
  37. imgBox.style.transition = "none";
  38. imgBox.style.webkitTransition = "none";
  39. }
  40. function setTransfrom(t) {
  41. imgBox.style.transform = 'translateX(' + t + 'px)';
  42. imgBox.style.webkitTransform = 'translateX(' + t + 'px)';
  43. }
  44. // 开始动画部分
  45. pointBox.children[0].className = "now";
  46. for (var i = 0; i < ols.length; i++) {
  47. ols[i].index = i; // 获得当前第几个小li 的索引号
  48. ols[i].onmouseover = function() {
  49. // 所有的都要清空
  50. for (var j = 0; j < ols.length; j++) {
  51. ols[j].className = "";
  52. }
  53. this.className = "now";
  54. setTransfrom(-indexx * width);
  55. square = indexx;
  56. }
  57. }
  58. timer = setInterval(function() {
  59. indexx++;
  60. addTransition();
  61. setTransfrom(-indexx * width);
  62. // 小方块
  63. square++;
  64. if (square > ols.length - 1) {
  65. square = 0;
  66. }
  67. // 先清除所有的
  68. for (var i = 0; i < ols.length; i++)
  69. {
  70. ols[i].className = "";
  71. }
  72. // 留下当前的
  73. ols[square].className = "now";
  74. }, 3000);
  75. imgBox.addEventListener('transitionEnd', function() {
  76. if (indexx >= 9) {
  77. indexx = 1;
  78. } else if (indexx <= 0) {
  79. indexx = 8;
  80. }
  81. removeTransition();
  82. setTransfrom(-indexx * width);
  83. }, false);
  84. imgBox.addEventListener('webkitTransitionEnd', function() {
  85. if (indexx >= 9) {
  86. indexx = 1;
  87. } else if (indexx <= 0) {
  88. indexx = 8;
  89. }
  90. removeTransition();
  91. setTransfrom(-indexx * width);
  92. }, false);
  93. /**
  94. * 触摸事件开始
  95. */
  96. imgBox.addEventListener("touchstart", function(e) {
  97. console.log("开始");
  98. var event = e || window.event;
  99. //记录开始滑动的位置
  100. startX = event.touches[0].clientX;
  101. }, false);
  102. /**
  103. * 触摸滑动事件
  104. */
  105. imgBox.addEventListener("touchmove", function(e) {
  106. console.log("move");
  107. var event = e || window.event;
  108. event.preventDefault();
  109. //清除定时器
  110. clearInterval(timer);
  111. //记录结束位置
  112. endX = event.touches[0].clientX;
  113. //记录移动的位置
  114. moveX = startX - endX;
  115. removeTransition();
  116. setTransfrom(-indexx * width - moveX);
  117. }, false);
  118. /**
  119. * 触摸结束事件
  120. */
  121. imgBox.addEventListener("touchend", function() {
  122. console.log("end");
  123. //如果移动的位置大于三分之一,并且是移动过的
  124. if (Math.abs(moveX) > (1 / 3 * width) && endX != 0) {
  125. //向左
  126. if (moveX > 0) {
  127. indexx++;
  128. } else {
  129. indexx--;
  130. }
  131. //改变位置
  132. setTransfrom(-indexx * width);
  133. }
  134. //回到原来的位置
  135. addTransition();
  136. setTransfrom(-indexx * width);
  137. //初始化
  138. startX = 0;
  139. endX = 0;
  140. clearInterval(timer);
  141. timer = setInterval(function() {
  142. indexx++;
  143. square++;
  144. if (square > ols.length - 1) {
  145. square = 0;
  146. }
  147. // 先清除所有的
  148. for (var i = 0; i < ols.length; i++)
  149. {
  150. ols[i].className = "";
  151. }
  152. // 留下当前的
  153. ols[square].className = "now";
  154. addTransition();
  155. setTransfrom(-indexx * width);
  156. // 每3秒钟轮播图变化一次。
  157. }, 3000);
  158. }, false);
  159. };
  160. module.exports = {
  161. bindEvent,
  162. scrollPic
  163. }

3.2 轮播图的视图层

  1. <!-- 轮播图-->
  2. <HomeBannerView></HomeBannerView>

上面的代码, 会直接生成一个轮播图。

我们创建这个component, 增加: src/components/HomeBanner.vue,

  1. <template>
  2. <div class="home_ban">
  3. <div class="m_banner clearfix" id="my_banner">
  4. <ul class="banner_box">
  5. <!-- 更改这里就可以替换轮播图的图片了 -->
  6. <li><img src="http://siweitech.b0.upaiyun.com/image/silulegou/2FgHsjCz7qfpSQr0.jpeg" alt="" /></li>
  7. <li><img src="http://siweitech.b0.upaiyun.com/image/silulegou/uJawxX6H3PBRcfMO.jpeg" alt="" /></li>
  8. </ul>
  9. <ul class="point_box" >
  10. <li></li>
  11. <li></li>
  12. </ul>
  13. </div>
  14. </div>
  15. </template>

这个component的内容非常简单。 它只是一个轮播图组件的View. 我们只需要更换上面代码中的两个图片文件就好了。

4. 增加物品分类

  1. <!--商品分类-->
  2. <HomeNavView></HomeNavView>

上面的代码, 会直接生成一个物品分类区域

我们创建这个component: 增加: src/components/HomeNav.vue

  1. <template>
  2. <div class="home_n">
  3. <nav class="m_nav">
  4. <ul>
  5. <li class="nav_item">
  6. <a href="#" class="nav_item_link">
  7. <img src="../assets/images/nav0.png" alt="">
  8. <span>草原特色肉</span>
  9. </a>
  10. </li>
  11. <li class="nav_item">
  12. <a href="#" class="nav_item_link">
  13. <img src="../assets/images/nav1.png" alt="">
  14. <span>特色干果</span>
  15. </a>
  16. </li>
  17. <li class="nav_item">
  18. <a href="#" class="nav_item_link">
  19. <img src="../assets/images/nav9.png" alt="">
  20. <span>特色瓜子</span>
  21. </a>
  22. </li>
  23. <li class="nav_item">
  24. <a href="#" class="nav_item_link">
  25. <img src="../assets/images/nav8.png" alt="">
  26. <span>特色大米</span>
  27. </a>
  28. </li>
  29. </ul>
  30. </nav>
  31. </div>
  32. </template>

之所以这样写, 是考虑到前期的商品分类不多。 在下一个版本会改成读取后台的接口。

看效果

默认页面效果如下:

图1

三秒钟之后, 轮播图发生了滚动:

图2

总结

我们使用了 现成的轮播图组件。 可以看到, 非常简单。 步骤是:

  1. 复制对应组件的js 文件到src/lib下。
  2. 复制对应组件的vue文件到src/components下
  3. 在对应的vue文件中使用它们。