博客列表 >JS 实战案例-留言评论功能和轮播图

JS 实战案例-留言评论功能和轮播图

我是郭富城
我是郭富城原创
2020年06月07日 12:26:20907浏览

JS 实战案例-留言评论功能和轮播图

1.留言评论功能

演示地址:http://www.php520.vip/0526/toDolist.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>toDoList</title>
  7. <link rel="stylesheet" href="layui/css/layui.css" />
  8. <script src="layui/layui.js"></script>
  9. </head>
  10. <body>
  11. <hr class="layui-bg-orange" />
  12. <label class="layui-form-label">留言内容:</label>
  13. <div class="layui-input-inline">
  14. <input
  15. type="text"
  16. name="title"
  17. required
  18. lay-verify="required"
  19. placeholder="请输入留言内容"
  20. autocomplete="off"
  21. class="layui-input"
  22. />
  23. </div>
  24. <div class="layui-card">
  25. <div class="layui-card-header">留言记录</div>
  26. <div class="layui-card-body">
  27. <ol></ol>
  28. </div>
  29. </div>
  30. </body>
  31. </html>
  32. <script>
  33. layui.use("layer", function () {
  34. var layer = layui.layer;
  35. });
  36. var cl = console.log.bind(console);
  37. var input = document.querySelector("input");
  38. var ol = document.querySelector("ol");
  39. // keyDown: 按下
  40. // keyup: 抬起/释放
  41. // keypress: 获取单个字母,功能键无效
  42. input.addEventListener(
  43. "keyup",
  44. function (ev) {
  45. // cl(ev.key);
  46. // cl(ev.keyCode);
  47. if (ev.key === "Enter") {
  48. // 检查内容是否为空
  49. if (input.value.length === 0) layer.msg("内容不能为空");
  50. // 创建元素
  51. var li = document.createElement("li");
  52. // 填充内容
  53. li.innerHTML =
  54. input.value +
  55. '<button onclick="del(this)" class="layui-btn layui-btn-xs"">删除</button>';
  56. // 添加到页面中,挂载到父节点下面
  57. // 将最新留言始终显示在第一个
  58. if (ol.childElementCount === 0) ol.appendChild(li);
  59. else ol.insertBefore(li, ol.firstElementChild);
  60. // 清空留言区
  61. input.value = null;
  62. }
  63. },
  64. false
  65. );
  66. // 删除评论的函数
  67. function del(ele) {
  68. // cl(ele.parentNode);
  69. // cl(ele.parentNode.parentNode);
  70. return layer.confirm("是否删除?")
  71. ? ele.parentNode.parentNode.removeChild(ele.parentNode)
  72. : false;
  73. }
  74. </script>

2.轮播图

演示地址http://www.php520.vip/0526/banner.html

2.1 html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>轮播图</title>
  7. <link rel="stylesheet" href="css/banner.css" />
  8. </head>
  9. <body>
  10. <div class="banner">
  11. <ul>
  12. <li><img src="banner/banner1.jpg" alt="#" /></li>
  13. <li><img src="banner/banner2.jpg" alt="#" /></li>
  14. <li><img src="banner/banner3.jpg" alt="#" /></li>
  15. <li><img src="banner/banner4.jpg" alt="#" /></li>
  16. </ul>
  17. <ol></ol>
  18. <div class="dirBtn">
  19. <a name="left" href="JavaScript:;"
  20. ><span name="left" class="skip prev">&lt;</span></a
  21. >
  22. <a name="right" href="JavaScript:;"
  23. ><span name="right" class="skip next">&gt;</span></a
  24. >
  25. </div>
  26. </div>
  27. </body>
  28. </html>

2.2 css

  1. body,
  2. div,
  3. ul,
  4. li,
  5. ol,
  6. a {
  7. margin: 0;
  8. padding: 0;
  9. list-style: none;
  10. text-decoration: none;
  11. font-size: 0;
  12. }
  13. img {
  14. display: block;
  15. width: 100%;
  16. height: 100%;
  17. }
  18. .banner {
  19. width: 480px;
  20. height: 270px;
  21. position: relative;
  22. margin: 200px auto;
  23. border: solid 5px #7d777b;
  24. overflow: hidden;
  25. }
  26. .banner ul {
  27. width: 500%;
  28. height: 100%;
  29. overflow: hidden;
  30. position: absolute;
  31. left: 0;
  32. top: 0;
  33. z-index: 0;
  34. }
  35. .banner ul li {
  36. float: left;
  37. width: 480px;
  38. height: 100%;
  39. }
  40. .banner ol {
  41. width: 100%;
  42. height: 40px;
  43. position: absolute;
  44. left: 0;
  45. bottom: 0;
  46. z-index: 2;
  47. display: flex;
  48. justify-content: center;
  49. align-items: center;
  50. }
  51. .banner ol li {
  52. width: 20px;
  53. height: 20px;
  54. border: solid 2px #fff;
  55. border-radius: 50%;
  56. cursor: pointer;
  57. margin: 0 10px;
  58. }
  59. .banner ol li.active {
  60. background-color: #e0a8d7;
  61. }
  62. /* 上一页下一页样式 */
  63. .dirBtn .skip {
  64. position: absolute;
  65. top: 100px;
  66. display: inline-block;
  67. width: 40px;
  68. height: 80px;
  69. text-align: center;
  70. line-height: 80px;
  71. background-color: lightgray;
  72. color: white;
  73. opacity: 0.2;
  74. font-size: 36px;
  75. }
  76. .dirBtn .prev {
  77. left: 0;
  78. }
  79. .dirBtn .next {
  80. right: 0;
  81. }
  82. .dirBtn .skip:hover {
  83. cursor: pointer;
  84. opacity: 0.5;
  85. color: black;
  86. }

2.3 JS

  1. // 获取标签对象
  2. var oDiv = document.querySelector(".banner");
  3. var oUl = document.querySelector("ul");
  4. var ouLis = document.querySelectorAll("ul li");
  5. var oOl = document.querySelector("ol");
  6. var oDir = document.querySelector(".dirBtn");
  7. // 获取li的默认宽度
  8. var liWidth = parseInt(window.getComputedStyle(ouLis[0]).width);
  9. // 定义开关变量,防止点击过快
  10. // 在js函数中会有防止点击过快的程序
  11. var bool = true;
  12. // 存储轮播图执行次数的变量
  13. var oriVal = 1;
  14. // 存储自动轮播定时器变量
  15. var timer = 0;
  16. setLi();
  17. copyLi();
  18. autoplay();
  19. stopPlay();
  20. focusBtn();
  21. dirBtn();
  22. hidden();
  1. // 首先,设置运动函数,来实现各标签的动画效果
  2. // 参数1,标签对象
  3. // 参数2,运动属性
  4. // 参数3,运动终止函数
  5. function move(ele, obj, callback) {
  6. for (let type in obj) {
  7. // 获取原始定位数据
  8. let oriVal = parseInt(window.getComputedStyle(ele)[type]);
  9. // 定义定时器
  10. let timer = setInterval(function () {
  11. // 计算步长并取整,保证计时器能停下来
  12. let speed = (obj[type] - oriVal) / 5;
  13. if (speed > 0) {
  14. speed = Math.ceil(speed);
  15. } else {
  16. speed = Math.floor(speed);
  17. }
  18. oriVal += speed;
  19. // 执行定位
  20. ele.style[type] = oriVal + "px";
  21. // 到达目标位置,终止定时器
  22. if (oriVal === obj[type]) {
  23. clearInterval(timer);
  24. callback();
  25. }
  26. }, 100);
  27. }
  28. }
  29. // 根据ul中原始标签的数量动态生成ol中的li标签
  30. // 也就是轮播图中的焦点按钮
  31. function setLi() {
  32. let str = "";
  33. ouLis.forEach(function (item, key) {
  34. if (key === 0) {
  35. str += `<li index="${key + 1}" class="active"></li>`;
  36. } else {
  37. str += `<li index="${key + 1}"></li>`;
  38. }
  39. });
  40. oOl.innerHTML = str;
  41. }
  42. // 复制原始第一张轮播图到ul的最后
  43. // 复制原始最后一张轮播图到ul的起始
  44. // 并重新定义ul的宽度,将ul定位到原始5张图的第一张图的位置
  45. function copyLi() {
  46. let liF = ouLis[0];
  47. let liL = ouLis[ouLis.length - 1];
  48. let first = liF.cloneNode(true);
  49. let last = liL.cloneNode(true);
  50. oUl.appendChild(first);
  51. oUl.insertBefore(last, liF);
  52. oUl.style.width = (ouLis.length + 2) * liWidth + "px";
  53. oUl.style.left = -liWidth + "px";
  54. }
  55. // 自动轮序播放图片函数
  56. function autoplay() {
  57. timer = setInterval(function () {
  58. oriVal++;
  59. move(oUl, { left: -oriVal * liWidth }, moveEnd);
  60. }, 3000);
  61. }
  62. // 运动函数结束时执行的函数
  63. // 就是move函数中的callback
  64. function moveEnd() {
  65. // 给开关变量,赋值初始值
  66. bool = true;
  67. // 判断oriVal数值,并且给ul做定位
  68. // 如果是最后一个图片
  69. if (oriVal === ouLis.length + 1) {
  70. // 改变oriVal数值
  71. oriVal = 1;
  72. // 瞬间切换图片
  73. oUl.style.left = -oriVal * liWidth + "px";
  74. }
  75. // 如果是第一个图片
  76. else if (oriVal === 0) {
  77. // 改变oriVal数值
  78. oriVal = ouLis.length;
  79. // 瞬间切换图片
  80. oUl.style.left = -oriVal * liWidth + "px";
  81. }
  82. // 设定焦点按钮样式
  83. // 获取ol中的li,在生成焦点之后生成
  84. let ooLis = document.querySelectorAll("ol li");
  85. ooLis.forEach(function (item) {
  86. item.className = "";
  87. if (item.getAttribute("index") - 0 === oriVal) {
  88. item.className = "active";
  89. }
  90. });
  91. }
  92. // 鼠标移入移出事件
  93. // 移入终止轮播
  94. // 移出继续轮播
  95. function stopPlay() {
  96. // 给父级div添加事件
  97. // 移入清除定时器,终止函数
  98. oDiv.addEventListener("mouseover", function () {
  99. clearInterval(timer);
  100. });
  101. // 移出,再次执行函数
  102. oDiv.addEventListener("mouseout", function () {
  103. autoplay();
  104. });
  105. }
  106. // 焦点按钮切换
  107. function focusBtn() {
  108. // 给ol添加事件
  109. oOl.addEventListener("click", function (e) {
  110. // 兼容性处理
  111. e = e || event;
  112. let eTarget = e.target || e.srcElement;
  113. // 如果点击的是li标签
  114. if (eTarget.tagName === "LI") {
  115. // 防止点击过快处理
  116. if (bool !== true) {
  117. return;
  118. }
  119. bool = false;
  120. // 获取点击标签,index的属性,赋值给变量
  121. oriVal = eTarget.getAttribute("index") - 0;
  122. // 一定要用move()运动函数,这样才可以再次点击
  123. move(oUl, { left: -oriVal * liWidth }, moveEnd);
  124. }
  125. });
  126. }
  127. // 左右方向的焦点切换
  128. // 点左,上一张
  129. // 点右,下一张
  130. function dirBtn() {
  131. oDir.addEventListener("click", function (e) {
  132. // 兼容性处理
  133. e = e || event;
  134. let eTarget = e.target || e.srcElement;
  135. // 如果点击的是左切换
  136. if (eTarget.getAttribute("name") === "left") {
  137. if (bool !== true) {
  138. return;
  139. }
  140. bool = false;
  141. oriVal--;
  142. move(oUl, { left: -oriVal * liWidth }, moveEnd);
  143. console.log(eTarget.getAttribute("name"));
  144. }
  145. // 如果点击的是右切换
  146. else if (eTarget.getAttribute("name") === "right") {
  147. if (bool !== true) {
  148. return;
  149. }
  150. bool = false;
  151. oriVal++;
  152. move(oUl, { left: -oriVal * liWidth }, moveEnd);
  153. console.log(eTarget.getAttribute("name"));
  154. }
  155. });
  156. }
  157. // 页面隐藏函数
  158. // 比如切换页面时就停止轮播图,回到轮播图页面时继续执行轮播
  159. function hidden() {
  160. document.addEventListener("visibilitychange", function () {
  161. if (document.visibilityState === "hidden") {
  162. clearInterval(timer);
  163. } else if (document.visibilityState === "visible") {
  164. autoplay();
  165. }
  166. });
  167. }

2.4 效果图

3.总结

万变不离其宗,js学到目前为止,发现其不过也就是和php差不多,知道语法以后,想要实现什么功能,逻辑想好了,通过DOM获取页面中的元素,利用函数实现相关的功能就好了,不懂就百度,越来越觉得php和js搭配可以做很多事情。

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议