博客列表 >轮播图自动播放、购物车选择时自动计算功能

轮播图自动播放、购物车选择时自动计算功能

Leo的博客
Leo的博客原创
2021年10月18日 13:15:17494浏览

轮播图自动播放

  1. <div class="container">
  2. <div class="img-group"></div>
  3. <!-- 2. 和图片数量对应的小按钮 -->
  4. <div class="btn-group"></div>
  5. <!-- 3. 向前和向后的翻页按钮 -->
  6. <div class="skip">
  7. <a class="prev" href="" onclick="prevImg(event)">&lt;</a>
  8. <a class="next" href="" onclick="nextImg(event)">&gt;</a>
  9. </div>
  10. </div>
  11. <ul class="list"></ul>

加入入css效果

  1. /* 初始化 */
  2. * {
  3. margin: 0;
  4. padding: 0;
  5. box-sizing: border-box;
  6. }
  7. a {
  8. text-decoration: none;
  9. }
  10. /* 轮播图的容器 */
  11. .container {
  12. width: 62.5em;
  13. height: 22em;
  14. margin: 1em auto;
  15. /* 转为定位元素/定位父级 */
  16. position: relative;
  17. }
  18. .container:hover {
  19. cursor: pointer;
  20. }
  21. /* 图片组 */
  22. .container > .img-group img {
  23. width: 100%;
  24. height: 100%;
  25. border-radius: 0.6em;
  26. /* 默认全部隐藏 */
  27. display: none;
  28. /* 将所有的图片进行绝对定位,确保每一次只看到一张,所有图片共享这个容器 */
  29. position: absolute;
  30. left: 0;
  31. top: 0;
  32. }
  33. /* 设置默认显示的图片(第一张) */
  34. .container > .img-group img.active {
  35. display: block;
  36. }
  37. /* 按钮组(独立按钮) */
  38. .container > .btn-group {
  39. position: absolute;
  40. left: 0;
  41. right: 0;
  42. bottom: 0;
  43. /* 水平居中 */
  44. text-align: center;
  45. }
  46. .container > .btn-group span {
  47. /* 转成行内块元素: 即能水平排列,双支持宽度设置 */
  48. display: inline-block;
  49. padding: 0.5em;
  50. margin: 0 0.2em;
  51. background-color: #fff;
  52. border-radius: 50%;
  53. }
  54. .container > .btn-group span:hover {
  55. cursor: pointer;
  56. }
  57. .container > .btn-group .active {
  58. background-color: #000;
  59. }
  60. /* 翻页按钮 */
  61. .container .skip a {
  62. position: absolute;
  63. width: 2.5rem;
  64. height: 5rem;
  65. line-height: 5rem;
  66. text-align: center;
  67. opacity: 0.3;
  68. top: 9rem;
  69. font-weight: lighter;
  70. font-size: 2rem;
  71. background-color: #ccc;
  72. }
  73. .container .skip .prev {
  74. left: 0;
  75. }
  76. .container .skip .next {
  77. right: 0;
  78. }
  79. .container .skip *:hover {
  80. opacity: 0.6;
  81. color: #666;
  82. }
  1. <script>
  2. // 文档片断
  3. // const ul = document.querySelector(".list");
  4. // // 文档片断 ,就是临时的父节点
  5. // const frag = document.createDocumentFragment();
  6. // for (let i = 0; i < 100; i++) {
  7. // const li = document.createElement("li");
  8. // li.textContent = "item" + (i + 1);
  9. // // 这个添加操作,是在内存中进行,与页面无关
  10. // frag.append(li);
  11. // }
  12. // ul.append(frag);
  13. const banners = [
  14. "imges2/1banner.jpg",
  15. "imges2/2banner.jpg",
  16. "imges2/3banner.jpg",
  17. "imges2/4banner.jpg",
  18. ];
  19. // 图片组元素
  20. const imgGroup = document.querySelector(".container > .img-group");
  21. // 按钮组
  22. const btnGroup = document.querySelector(".container > .btn-group");
  23. // 当页面加载成功,将所有图片和与图片对应的小按钮全部渲染出来
  24. window.onload = () => {
  25. // 1. 生成所有图片
  26. createImgs(imgGroup, banners.length);
  27. // 2. 生成与图片对应的小按钮
  28. createBtns(btnGroup, banners.length);
  29. };

生成图片

  1. // 生成图片
  2. function createImgs(parent, length) {
  3. const frag = document.createDocumentFragment();
  4. for (let i = 0; i < length; i++) {
  5. const img = document.createElement("img");
  6. img.src = banners[i];
  7. // 为每一张图片添加一个索引: data-index,它与对应的小按钮一一对应
  8. img.dataset.index = `${i + 1}`;
  9. if (i === 0) img.classList.add("active");
  10. // 使用文档片断,在内存中添加
  11. frag.append(img);
  12. }
  13. parent.append(frag);
  14. }
  15. // 生成按钮
  16. function createBtns(parent, length) {
  17. const frag = document.createDocumentFragment();
  18. for (let i = 0; i < length; i++) {
  19. const span = document.createElement("span");
  20. // 为每一张图片添加一个索引: data-index,它与对应的小按钮一一对应
  21. span.dataset.index = `${i + 1}`;
  22. if (i === 0) span.classList.add("active");
  23. // 为新生成按钮添加点击事件
  24. span.onclick = showImgs;
  25. // 使用文档片断,在内存中添加
  26. frag.append(span);
  27. }
  28. parent.append(frag);
  29. }
  30. // parent.append(frag);
  31. // 为这个按钮的showImgs创建函数
  32. function showImgs(ev) {
  33. // 1. 获取所有图片和按钮
  34. const imgArr = imgGroup.querySelectorAll("img");
  35. const btnArr = btnGroup.querySelectorAll("span");
  36. console.log(imgArr, btnArr);
  37. // 2. 根据按钮激活状态设置对应的图片显示
  38. btnArr.forEach((btn) => btn.classList.remove("active"));
  39. ev.target.classList.add("active");
  40. imgArr.forEach((img) => img.classList.remove("active"));
  41. // 3. 根据按钮与图片的data-index属性的值,匹配上再激活
  42. imgArr.forEach((img) => {
  43. if (ev.target.dataset.index === img.dataset.index)
  44. img.classList.add("active");
  45. });
  46. }
  47. // 翻页
  48. // 向前
  49. function prevImg(ev) {
  50. // 禁用<a>标签默认跳转行为,当按钮用
  51. ev.preventDefault();
  52. // 1. 当前图片和当前的按钮
  53. const currentImg = imgGroup.querySelector("img.active");
  54. const currentBtn = btnGroup.querySelector("span.active");
  55. console.log(currentImg, currentBtn);
  56. // 2. 取消当前图片和当前的按钮激活状态
  57. currentImg.classList.remove("active");
  58. currentBtn.classList.remove("active");
  59. // 3. 取到当前图片和按钮的前一个兄弟节点
  60. const prevImg = currentImg.previousElementSibling;
  61. const prevBtn = currentBtn.previousElementSibling;
  62. // 4. 如果存在前一个兄弟,就设置它为激活并显示出来
  63. if (prevImg !== null && prevBtn !== null) {
  64. prevBtn.classList.add("active");
  65. prevImg.classList.add("active");
  66. } else {
  67. imgGroup.lastElementChild.classList.add("active");
  68. btnGroup.lastElementChild.classList.add("active");
  69. }
  70. }
  71. // 向后
  72. function nextImg(ev) {
  73. // 禁用<a>标签默认跳转行为,当按钮用
  74. ev.preventDefault();
  75. // 1. 当前图片和当前的按钮
  76. const currentImg = imgGroup.querySelector("img.active");
  77. const currentBtn = btnGroup.querySelector("span.active");
  78. console.log(currentImg, currentBtn);
  79. // 2. 取消当前图片和当前的按钮激活状态
  80. currentImg.classList.remove("active");
  81. currentBtn.classList.remove("active");
  82. // 3. 取到当前图片和按钮的前一个兄弟节点
  83. const nextImg = currentImg.nextElementSibling;
  84. const nextBtn = currentBtn.nextElementSibling;
  85. // 4. 如果存在前一个兄弟,就设置它为激活并显示出来
  86. if (nextImg !== null && nextBtn !== null) {
  87. nextBtn.classList.add("active");
  88. nextImg.classList.add("active");
  89. } else {
  90. imgGroup.firstElementChild.classList.add("active");
  91. btnGroup.firstElementChild.classList.add("active");
  92. }
  93. }

作业:每2s自送切换到下一个,使用setInterval 执行间歇事件

  1. setInterval(() => {
  2. //1、当前图片和当前按钮
  3. const currentImg = imgGroup.querySelector("img.active");
  4. const currentBtn = btnGroup.querySelector("span.active");
  5. //2、取消当前图片和当前按钮的激活状态
  6. currentImg.classList.remove("active");
  7. currentBtn.classList.remove("active");
  8. //3、取得当前图片和按钮的前一个兄弟节点
  9. const nextImg = currentImg.nextElementSibling;
  10. const nextBtn = currentBtn.nextElementSibling;
  11. //
  12. //4、如果存在前一个兄弟,就设置它为激活状态
  13. if (nextImg !== null && nextBtn !== null) {
  14. nextBtn.classList.add("active");
  15. nextImg.classList.add("active");
  16. } else {
  17. imgGroup.firstElementChild.classList.add("active");
  18. btnGroup.firstElementChild.classList.add("active");
  19. }
  20. }, 2000);

购物车选择自动计算功能

全选复选框

  1. const checkAll = document.querySelector("#check-all");
  2. const checkItems = document.getElementsByName("item");
  3. // change: 当控件中的值发生变化时触发
  4. // 将全选按钮的状态,赋值给下面所有的商品的checkbox
  5. checkAll.onchange = function (ev) {
  6. checkItems.forEach(function (item) {
  7. item.checked = ev.target.checked;
  8. });
  9. };
  10. checkItems.forEach(function (item) {
  11. // onchange监测它的状态
  12. item.onchange = function () {
  13. //只有全部选中才更新全选按钮的状态
  14. checkAll.checked = [...checkItems].every(function (item) {
  15. return item.checked;
  16. });
  17. };
  18. });
  19. // 一个点掉就会取消全选,全部点上全选就会自动选上

自动计算
所有的计算,都是基于数量的变化

  1. const numInput = document.querySelectorAll('input[type="number"]');
  2. numInput.forEach(function (input) {
  3. input.onchange = autoCalculate;
  4. });
  5. function autoCalculate() {
  6. // 1. 获取每个商品的金额: 数量 * 单价
  7. const numbers = document.querySelectorAll('input[type="number"]');
  8. const numArr = [...numbers].map(function (num) {
  9. return num.value * 1;
  10. });
  11. const prices = document.querySelectorAll("tbody .price");
  12. const priceArr = [...prices].map(function (num) {
  13. return num.textContent * 1;
  14. });
  15. // 2. 计算出每个商品的金额(数组)
  16. const amountArr = [priceArr, numArr].reduce(function (prev, curr) {
  17. return prev.map(function (item, key) {
  18. return item * curr[key];
  19. });
  20. });
  21. console.log(amountArr);

总金额

  1. let total = amountArr.reduce(function (prev, curr) {
  2. return prev + curr;
  3. });

总数量

  1. let sum = numArr.reduce(function (prev, curr) {
  2. return prev + curr;
  3. });
  4. let total = amountArr.reduce(function (prev, curr, index) {
  5. if (index == 1) {
  6. if (!checkItems[0].checked) prev = 0;
  7. }
  8. if (checkItems[index].checked) {
  9. return prev + curr;
  10. } else {
  11. return prev;
  12. }
  13. });

选择去掉商品自动计算
第一和第二句checkAll.onchange里加上一个autoCalculate()即7和13行。

最后一句在计算的函数里,添加一条判断语句,判断前面的check如果没勾上,就不纳入计算(下列代码的24行)

  1. // change: 当控件中的值发生变化时触发
  2. // 将全选按钮的状态,赋值给下面所有的商品的checkbox
  3. checkAll.onchange = function (ev) {
  4. checkItems.forEach(function (item) {
  5. item.checked = ev.target.checked;
  6. });
  7. // autoCalculate();
  8. };
  9. checkItems.forEach(function (item) {
  10. // onchange监测它的状态
  11. item.onchange = function (ev) {
  12. //autoCalculate();
  13. //只有全部选中才更新全选按钮的状态
  14. checkAll.checked = [...checkItems].every(function (item) {
  15. return item.checked;
  16. });
  17. };
  18. });
  19. // 1. 获取每个商品的金额: 数量 * 单价
  20. const numbers = document.querySelectorAll('input[type="number"]');
  21. const numArr = [...numbers].map(function (num) {
  22. //if (!num.parentNode.parentNode.getElementsByClassName("item")[0].checked)
  23. return 0;
  24. return num.value * 1;
  25. });

将所有数据渲染到页面中

  1. document.querySelectorAll(".amount").forEach(function (item, index) {
  2. item.textContent = amountArr[index];
  3. });
  4. document.querySelector("#total-amount").textContent = total;
  5. document.querySelector("#sum").textContent = sum;
  6. }
  7. window.onload = autoCalculate;
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议