博客列表 >双色球抽奖、选项卡、购物车(实现动态勾选商品计算价格)

双色球抽奖、选项卡、购物车(实现动态勾选商品计算价格)

李玉峰
李玉峰原创
2022年04月12日 01:08:58452浏览

1、双色球

  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  7. <title>双色球抽奖</title>
  8. <style>
  9. .box {
  10. display: grid;
  11. grid-template-columns: repeat(auto-fill, 30px);
  12. grid-auto-rows: 30px;
  13. gap: 5px;
  14. }
  15. .box > div {
  16. border-radius: 50%;
  17. display: grid;
  18. place-items: center;
  19. background-color: red;
  20. color: white;
  21. box-shadow: 2px 2px 2px #666;
  22. }
  23. .box > div:last-of-type {
  24. background-color: blue;
  25. }
  26. </style>
  27. </head>
  28. <body>
  29. <div class="box"></div>
  30. <button onclick="refresh()" style="margin-top: 10px">抽奖</button>
  31. <script>
  32. function refresh() {
  33. // 红球: 1-33=>6,不重复,排序
  34. // 蓝球: 1-16=>1, 可以和红球重复
  35. // 思路:
  36. // 1. 先取红球, 放在一个中奖号数组中, 排序
  37. // 2. 然后把蓝球追加到中奖数组中
  38. // 3. 最后还要马中奖数组渲染到页面: dom
  39. // 临时数组: 放红球
  40. let arr = [];
  41. // 全部中奖数组,最后应该有7个数,6个红球,1个蓝球
  42. let res = [];
  43. // 1. 生成1-33个红球
  44. for (let i = 1; i <= 33; i++) {
  45. arr.push(i);
  46. }
  47. console.log(arr);
  48. // 2. 从33个红球中取出6个
  49. for (let i = 0; i < 6; i++) {
  50. // arr的下标取值范围: [0-32]
  51. // 问题: 如何生成0-32这样的整数索引,用它来获取数组中的数据
  52. // Math.random(): 0-1之间的随机小数
  53. // console.log(Math.random());
  54. // 0-33之间的小数,但永远不会到33这个数
  55. // 0.0123, 32.999999, 向下取整
  56. // 0.0123 => 0
  57. // 32.9999999 => 32
  58. // console.log(Math.random() * 33);
  59. // console.log(Math.random() * arr.length);
  60. // console.log(Math.floor(Math.random() * arr.length));
  61. // 索引是唯一的,为什么重复了
  62. // 索引不会重复,但是对应的值会重复
  63. // [1,2,3,2]
  64. // 0=>1,1=>2, 2=>3, 3=>2
  65. // 应该每取一个就从原始数组中删除一个
  66. let index = Math.floor(Math.random() * arr.length);
  67. // console.log(Math.ceil(1.000001));
  68. res.push(arr[index]);
  69. arr.splice(index, 1);
  70. }
  71. // 排序
  72. res.sort((a, b) => a - b);
  73. console.log(res);
  74. // 3. 生成一个蓝球, 并追加到中奖数组中
  75. // 必须是: 1-16之间,并包括 1, 16
  76. let blue = Math.floor(Math.random() * 16) + 1;
  77. console.log(blue);
  78. res.push(blue);
  79. console.log(res);
  80. // 4. 将中奖号码显示到页面中
  81. const box = document.querySelector(".box");
  82. let box_content = box.children.length;
  83. console.log(box_content);
  84. console.log("不太明白这里的判断作用");
  85. if (box_content !== 0) {
  86. box.innerHTML = "";
  87. }
  88. res.forEach((item) => {
  89. const ball = document.createElement("div");
  90. ball.textContent = item;
  91. box.append(ball);
  92. });
  93. }
  94. window.onload = refresh;
  95. </script>
  96. </body>
  97. </html>

2、选项卡

  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  7. <title>选项卡</title>
  8. <style>
  9. .box {
  10. width: 28em;
  11. display: grid;
  12. grid-template-columns: 3em 1fr;
  13. }
  14. .box ul {
  15. margin: 0;
  16. padding: 0;
  17. }
  18. .box li {
  19. list-style: none;
  20. /* height: 2em; */
  21. }
  22. .box li a {
  23. text-decoration: none;
  24. }
  25. .box li:hover {
  26. cursor: pointer;
  27. }
  28. .box .content {
  29. background-color: lightgreen;
  30. display: none;
  31. place-self: center start;
  32. }
  33. .box .content.active {
  34. display: block;
  35. }
  36. .box .menu li.active {
  37. background-color: lightgreen;
  38. }
  39. </style>
  40. </head>
  41. <body>
  42. <div class="box">
  43. <!-- 标签 -->
  44. <!-- 子元素(li点击)上的点击事件会冒泡到父元素(ul),利用这个特点,只需要给父元素添加点击事件即可 -->
  45. <ul class="menu" onclick="show()">
  46. <!-- 默认显示的标签和内容添加:class="active" -->
  47. <!-- 使用自定义属性data-index使标签和内容进行绑定 -->
  48. <li data-index="1" class="active">本市</li>
  49. <li data-index="2">本省</li>
  50. <li data-index="3">全国</li>
  51. </ul>
  52. <!-- 内容 -->
  53. <ul class="content active" data-index="1">
  54. <li><a href="">本市新闻本市新闻本市新闻本市新闻本市新闻</a></li>
  55. <li><a href="">本市新闻本市新闻本市新闻本市新闻本市新闻</a></li>
  56. <li><a href="">本市新闻本市新闻本市新闻本市新闻本市新闻</a></li>
  57. <li><a href="">本市新闻本市新闻本市新闻本市新闻本市新闻</a></li>
  58. <li><a href="">本市新闻本市新闻本市新闻本市新闻本市新闻</a></li>
  59. </ul>
  60. <ul class="content" data-index="2">
  61. <li><a href="">本省新闻本省新闻本省新闻</a></li>
  62. <li><a href="">本省新闻本省新闻本省新闻</a></li>
  63. <li><a href="">本省新闻本省新闻本省新闻</a></li>
  64. <li><a href="">本省新闻本省新闻本省新闻</a></li>
  65. <li><a href="">本省新闻本省新闻本省新闻</a></li>
  66. </ul>
  67. <ul class="content" data-index="3">
  68. <li><a href="">全国新闻全国新闻全国新闻全国新闻全国</a></li>
  69. <li><a href="">全国新闻全国新闻全国新闻</a></li>
  70. <li><a href="">全国新闻全国新闻全国新闻</a></li>
  71. <li><a href="">全国新闻全国新闻全国新闻</a></li>
  72. <li><a href="">全国新闻全国新闻全国新闻</a></li>
  73. </ul>
  74. </div>
  75. <script>
  76. function show() {
  77. // console.log("hello");
  78. // 事件绑定者ul
  79. // console.log(event.currentTarget);
  80. // 事件触发者:事件主体li
  81. // console.log(event.target);
  82. const ul = event.currentTarget;
  83. const li = event.target;
  84. // 标签的切换
  85. // 1.将原来的高亮标签"active"去掉
  86. [...ul.children].forEach((li) => li.classList.remove("active"));
  87. // 2.新点击的ul下的li添加属性:class="active"
  88. li.classList.add("active");
  89. // 内容区处理
  90. // 根据标签的data-index进行查询,获取与标签对应的内容切换
  91. const content = document.querySelectorAll(".content");
  92. // document.querySelectorAll()返回的是NodeList对象,上面已定义了forEach
  93. // console.log(content);
  94. // 1.将原来的高亮标签"active"去掉
  95. content.forEach((li) => li.classList.remove("active"));
  96. // 2.把当前点击的标签对应的content显示出来
  97. // 获取到data-index对应的值的内容
  98. // console.log([...content].find((ul) => ul.dataset.index === li.dataset.index));
  99. // 添加属性:class="active"
  100. [...content].find((ul) => ul.dataset.index === li.dataset.index).classList.add("active");
  101. }
  102. </script>
  103. </body>
  104. </html>

3、购物车(实现动态勾选商品计算价格)

  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  7. <title>购物车</title>
  8. <style>
  9. .box {
  10. width: 22em;
  11. height: 2em;
  12. }
  13. .list > li {
  14. height: 1.6em;
  15. background-color: #efefef;
  16. display: grid;
  17. grid-template-columns: repeat(5, 3em);
  18. gap: 1em;
  19. place-items: center right;
  20. border-bottom: 1px solid #ccc;
  21. }
  22. .list > li:first-of-type {
  23. background-color: lightseagreen;
  24. color: white;
  25. }
  26. .list > li:hover:not(:first-of-type) {
  27. cursor: pointer;
  28. background-color: lightcyan;
  29. }
  30. .list > li input[type="number"] {
  31. width: 3em;
  32. border: none;
  33. outline: none;
  34. text-align: center;
  35. font-size: 1em;
  36. background-color: transparent;
  37. }
  38. .list > li:last-of-type span.total-num,
  39. .list > li:last-of-type span.total-amount {
  40. grid-column: span 2;
  41. place-self: center right;
  42. color: lightseagreen;
  43. }
  44. .account {
  45. float: right;
  46. background-color: lightseagreen;
  47. color: white;
  48. border: none;
  49. outline: none;
  50. width: 4.5em;
  51. height: 1.8em;
  52. }
  53. .account:hover {
  54. background-color: coral;
  55. cursor: pointer;
  56. }
  57. </style>
  58. </head>
  59. <body>
  60. <div class="box">
  61. <div class="selectAll">
  62. <!-- checkAll(): 当全选按钮的状态发生变化化,触发该事件 change -->
  63. <input type="checkbox" class="check-all" name="check-all" onchange="checkAll()" checked />
  64. <label for="check-all">全选</label>
  65. </div>
  66. <ul class="list">
  67. <li>
  68. <span>选择</span><span>品名</span><span>数量</span><span>单价</span><span>金额</span>
  69. </li>
  70. <li>
  71. <input type="checkbox" onchange="checkItems()" checked />
  72. <span class="content">手机</span>
  73. <input type="number" value="1" min="1" max="5" class="num" />
  74. <span class="price">100</span>
  75. <span class="amount">0</span>
  76. </li>
  77. <li>
  78. <input type="checkbox" onchange="checkItems()" checked />
  79. <span class="content">电脑</span>
  80. <input type="number" value="2" min="1" class="num" />
  81. <span class="price">200</span><span class="amount">0</span>
  82. </li>
  83. <li>
  84. <input type="checkbox" onchange="checkItems()" checked />
  85. <span class="content">相机</span>
  86. <input type="number" value="3" min="1" class="num" />
  87. <span class="price">300</span>
  88. <span class="amount">0</span>
  89. </li>
  90. <li>
  91. <span>总计:</span>
  92. <span class="total-num">0</span>
  93. <span class="total-amount">0</span>
  94. </li>
  95. </ul>
  96. <button class="account">结算</button>
  97. </div>
  98. <script>
  99. // 1.全选功能
  100. function checkAll() {
  101. // 1.全选按钮状态
  102. // let status = document.querySelector(".check-all").checked;
  103. // 事件主体引用
  104. let status = event.target.checked;
  105. // console.log(status);
  106. // 2.动态设置所有商品的状态
  107. // document.querySelectorAll('.list li input[type="checkbox"]');
  108. let items = document.querySelectorAll('.list li input[type="checkbox"]');
  109. // 遍历商品input,修改状态 checked
  110. items.forEach((item) => (item.checked = status));
  111. }
  112. // 2.根据用户选择动态设置:取消其中一个时,全选取消,反之也是
  113. function checkItems() {
  114. // alert(1);
  115. // 1.拿到全部商品
  116. let items = document.querySelectorAll(".list li input[type='checkbox']");
  117. // 2.判断状态,只有全部选,才设置全选true,Array.every
  118. let status = [...items].every((item) => item.checked === true);
  119. // 状态变化
  120. document.querySelector(".check-all").checked = status;
  121. // 更新
  122. autoCalculate();
  123. console.log(status);
  124. // 3.将这个新状态设置到全选按钮上
  125. document.querySelector(".check-all").checked = status;
  126. }
  127. // 商品的自动计算
  128. // 所有的计算时基于商品数量的变化
  129. // 计算选中的商品总数量
  130. const nums = document.querySelectorAll(".num");
  131. // 商品是否被选中
  132. function selectedItem(numArr) {
  133. let items = document.querySelectorAll(".list li input[type='checkbox']");
  134. return numArr.map((num, index) => {
  135. if (items[index].checked === false) {
  136. return (num = 0);
  137. } else {
  138. return num;
  139. }
  140. });
  141. }
  142. // 计算商品总数量
  143. // console.log(nums);
  144. // 查看商品数量
  145. // nums.forEach((item) => console.log(item.value));
  146. // 1.求和计算商品总数量
  147. function getTotalNum(numArr) {
  148. numArr = selectedItem(numArr);
  149. return numArr.reduce((acc, cur) => acc + cur);
  150. }
  151. // console.log(getTotalNum([1, 2, 3]));
  152. // 2.计算每个商品的金额
  153. function getAmount(numArr, priceArr) {
  154. // 金额 = 商品单价 * 数量
  155. return numArr.map((num, index) => num * priceArr[index]);
  156. }
  157. // 3.计算总金额
  158. function getTotalAmount(amountArr) {
  159. amountArr = selectedItem(amountArr);
  160. return amountArr.reduce((acc, cur) => acc + cur);
  161. }
  162. // 4.自动计算
  163. function autoCalculate() {
  164. // 商品数量数组
  165. // parseInt()和Number():字符串转换为数字
  166. const numArr = [...nums].map((num) => parseInt(num.value));
  167. console.log(numArr);
  168. //商品单价数组
  169. const prices = document.querySelectorAll(".price");
  170. const priceArr = [...prices].map((price) => parseInt(price.textContent));
  171. console.log(priceArr);
  172. // 金额数组
  173. const amountArr = getAmount(numArr, priceArr);
  174. console.log(amountArr);
  175. // 计算商品总数量
  176. console.log(getTotalNum(numArr));
  177. // 渲染到显示页面
  178. document.querySelector(".total-num").textContent = getTotalNum(numArr);
  179. // 渲染总金额到页面中显示
  180. document.querySelector(".total-amount").textContent = getTotalAmount(amountArr);
  181. // 渲染每个商品的计算金额到页面中显示
  182. document
  183. .querySelectorAll(".amount")
  184. .forEach((amount, index) => (amount.textContent = amountArr[index]));
  185. }
  186. // console.log(getAmount([12, 2, 3], [100, 200, 300]));
  187. // autoCalculate();
  188. // 当页面加载的时候自动计算
  189. // window.onload = function () {
  190. // autoCalculate();
  191. // };
  192. // 简化
  193. window.onload = autoCalculate();
  194. // 当数量更新时,自动计算其他数据
  195. [...nums].forEach((num) => (num.onchange = autoCalculate));
  196. </script>
  197. </body>
  198. </html>
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议