Blogger Information
Blog 16
fans 0
comment 0
visits 16150
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
轮播图自动播放、购物车选择时自动计算功能
Leo的博客
Original
490 people have browsed it

轮播图自动播放

  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;
Correcting teacher:PHPzPHPz

Correction status:qualified

Teacher's comments:
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post