博客列表 >JavaScript toDoList,延迟加载,幻灯片

JavaScript toDoList,延迟加载,幻灯片

萨龙龙
萨龙龙原创
2020年05月28日 10:38:04677浏览

简介

原生 JavaScript 代码实现 toDoList、延迟加载、幻灯片,课堂上的四个按钮,选项卡的功能感觉包括在幻灯片中,而幻灯片的逻辑相对复杂,用惯了框架调用,写 JS 代码有点吃力。

作业本来昨天下午就要提交,一直卡在幻灯片的自动播放上,不是很正常。

toDoList 功能代码演示

1、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. <link href="assets/images/logo.png" rel="shortcut icon" />
  7. <link rel="stylesheet" href="assets/css/style.css">
  8. <title>toDoList 实例</title>
  9. </head>
  10. <body>
  11. <div class="container">
  12. <h3>去旅行吧</h3>
  13. <div class="input">
  14. <label for="travel">目的地:</label>
  15. <input type="text" name="travel" id="travel" autofocus placeholder="输入目的地,按钮回车提交">
  16. </div>
  17. <ul class="travel-list">
  18. <li><span>西藏——拉萨</span><button onclick="delLi(this)"></button></li>
  19. <li><span>云南——大理</span><button onclick="delLi(this)"></button></li>
  20. </ul>
  21. <button class="button" onclick="letsGo()">Let's go</button>
  22. <div id="status"></div>
  23. </div>
  24. <script src="assets/js/todolist-min.js"></script>
  25. </body>
  26. </html>

2、todolist.js 代码

  1. /**
  2. * toDoList
  3. */
  4. // 定义控制台
  5. var cl = console.log.bind(console);
  6. // 获取输入框元素
  7. var input = document.querySelector("input");
  8. // 获取列表元素
  9. var ul = document.querySelector(".travel-list");
  10. // 提示
  11. var statusEle = document.getElementById("status");
  12. // 事件
  13. input.addEventListener(
  14. "keyup",
  15. function (ev) {
  16. // 检测键盘是不是按了回车
  17. if (ev.key === "Enter") {
  18. /**
  19. * 输入框为空提示
  20. */
  21. var lis = ul.querySelectorAll("li");
  22. //设置最多5个目的地
  23. // 为空
  24. if (input.value.length === 0) {
  25. statusEle.innerHTML = "请输入内容!";
  26. } else if (lis.length >= 5) {
  27. statusEle.innerHTML = "最多5个目的地,不要太贪玩了,哈哈";
  28. }
  29. if (input.value.length === 0 || lis.length >= 5) {
  30. statusEle.className = "active warning";
  31. /* 显示提交内容 */
  32. statusEle.style.display = "block";
  33. /* 2秒后隐藏提示 */
  34. setTimeout(() => {
  35. statusEle.style.display = "none";
  36. }, 2000);
  37. return false;
  38. }
  39. /**
  40. * 向列表中增加内容
  41. */
  42. // 创建 li
  43. var li = document.createElement("li");
  44. // 添加内容到 li 中
  45. li.innerHTML =
  46. "<span>" +
  47. input.value +
  48. "</span>" +
  49. '<button onclick="delLi(this)"></button>';
  50. // 将 li 添加到列表中
  51. if (ul.childNodes === 0) ul.appendChild("li");
  52. else ul.insertBefore(li, ul.firstElementChild);
  53. // 清空 input 内容
  54. input.value = null;
  55. }
  56. },
  57. false
  58. );
  59. // 删除
  60. function delLi(ele) {
  61. // cl(ele.parentNode);
  62. return confirm("确定删除当前目的地?") ? ele.parentNode.remove() : false;
  63. }
  64. // 提交按钮
  65. function letsGo() {
  66. var lis = ul.querySelectorAll("li");
  67. if (lis.length === 0) {
  68. statusEle.innerHTML = "请输入旅行目的地!";
  69. statusEle.className = "active warning";
  70. } else {
  71. statusEle.innerHTML = "好吧,你一个人去吧,我得继续做作业,哈哈";
  72. statusEle.className = "active success";
  73. }
  74. /* 显示提交内容 */
  75. statusEle.style.display = "block";
  76. /* 3秒后隐藏提示 */
  77. setTimeout(() => {
  78. statusEle.style.display = "none";
  79. }, 3000);
  80. }

3、toDoList 演示地址

演示地址

图片延迟加载功能代码演示

1、lazyload.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. <link href="assets/images/logo.png" rel="shortcut icon" />
  7. <link rel="stylesheet" href="assets/css/style.css">
  8. <title>图片延迟加载实例</title>
  9. </head>
  10. <body>
  11. <div class="container">
  12. <h3>图片延迟加载</h3>
  13. <div class="img-list">
  14. <img src="默认图片地址" alt="图片延迟加载" data-src="真实图片地址">
  15. 100张图片略过……
  16. </div>
  17. </div>
  18. <script src="assets/js/lazyload-min.js"></script>
  19. </body>
  20. </html>

2、lazyload.js 代码

  1. var cl = console.log.bind(console);
  2. // 获取图片元素
  3. var imgs = document.querySelectorAll('.img-list img');
  4. // 获取文档可视区域高度
  5. var clientHeight = document.documentElement.clientHeight;
  6. // 增加浏览器滚动监听事件
  7. window.addEventListener("scroll", function() {
  8. lazyload(imgs, clientHeight);
  9. }, false);
  10. /*延迟加载函数 */
  11. function lazyload(imgs, clientHeight) {
  12. /*获取内容区域滚动离顶部的大小*/
  13. var scrollTop = document.documentElement.scrollTop;
  14. /*遍历图片,判断图片是否进入的可视区域*/
  15. imgs.forEach(function(img) {
  16. if (img.offsetTop <= clientHeight + scrollTop) {
  17. img.src = img.dataset.src;
  18. img.style.top = "0";
  19. }
  20. });
  21. }

3、图片延迟加载演示地址

演示地址

幻灯片功能代码演示

1、slide.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. <link href="assets/images/logo.png" rel="shortcut icon" />
  7. <link rel="stylesheet" href="assets/css/style.css">
  8. <title>幻灯片实例</title>
  9. </head>
  10. <body>
  11. <div class="container">
  12. <h3>幻灯片实例</h3>
  13. <div class="slides">
  14. <!-- 幻灯片图片列表 -->
  15. <div class="slide-list">
  16. <img src="https://demo.salongweb.com/slearn/slider/01.jpg" class="slider active" data-index="1"
  17. alt="幻灯片">
  18. <img src="https://demo.salongweb.com/slearn/slider/02.jpg" class="slider" data-index="2" alt="幻灯片">
  19. <img src="https://demo.salongweb.com/slearn/slider/03.jpg" class="slider" data-index="3" alt="幻灯片">
  20. <img src="https://demo.salongweb.com/slearn/slider/04.jpg" class="slider" data-index="4" alt="幻灯片">
  21. </div>
  22. <!-- 导航点 -->
  23. <div class="slide-dots"></div>
  24. <!-- 上下按钮 -->
  25. <button class="slide-button slide-prev"><</button>
  26. <button class="slide-button slide-next">></button>
  27. </div>
  28. </div>
  29. <script src="assets/js/slide-min.js"></script>
  30. </body>
  31. </html>

2、slide.js 代码

  1. var cl = console.log.bind(console);
  2. // 获取所有图片
  3. var imgs = document.querySelectorAll(".slide-list img");
  4. /*获取导航点元素*/
  5. var dotsList = document.querySelector(".slide-dots");
  6. /*获取按钮*/
  7. var buttons = document.querySelectorAll(".slide-button");
  8. /*生成导航点*/
  9. imgs.forEach(function (img, index) {
  10. /*创建点元素*/
  11. var span = document.createElement("span");
  12. /*添加 class*/
  13. span.classList.add("point");
  14. /*如果是第一个增加 active*/
  15. if (index === 0) span.classList.add("active");
  16. /*将图片上的 index 值添加到点元素上*/
  17. span.dataset.index = img.dataset.index;
  18. /*添加点元素到导航元素中*/
  19. dotsList.appendChild(span);
  20. }, false);
  21. /*获取所有导航点,为之后的当前状态做准备*/
  22. var pointAll = dotsList.querySelectorAll("span");
  23. /*监听点击导航点*/
  24. dotsList.addEventListener(
  25. "click",
  26. function (ev) {
  27. /*点的 index 值*/
  28. var pointIndex = ev.target.dataset.index;
  29. /*遍历图片,添加 active*/
  30. imgs.forEach(function (img, index) {
  31. /*增加和当前点元素对应的图片 active*/
  32. if (img.dataset.index === pointIndex) {
  33. /*遍历图片,删除已有的 active*/
  34. imgs.forEach(function (img) {
  35. img.classList.remove("active");
  36. });
  37. /*增加 active*/
  38. img.classList.add("active");
  39. /*导航点元素的增加和删除 active*/
  40. dotsActive(img.dataset.index);
  41. }
  42. }, false);
  43. },
  44. false
  45. );
  46. /*导航点的增加或删除 active*/
  47. function dotsActive(imgIndex) {
  48. /*先删除 active*/
  49. pointAll.forEach(function (point) {
  50. point.classList.remove("active");
  51. }, false);
  52. /*再增加与图片对应点的 active*/
  53. pointAll.forEach(function (point) {
  54. if (point.dataset.index === imgIndex) {
  55. point.classList.add("active");
  56. }
  57. }, false);
  58. }
  59. /* 当前图片 */
  60. function slideCurrentImg() {
  61. var currentImg = null;
  62. /*找到正在显示的图片*/
  63. imgs.forEach(function (img) {
  64. if (img.classList.contains("active")) currentImg = img;
  65. }, false);
  66. return currentImg;
  67. }
  68. /*为按钮添加点击事件*/
  69. buttons.item(0).addEventListener("click", buttonClick, false);
  70. buttons.item(1).addEventListener("click", buttonClick, false);
  71. /*按钮点击事件*/
  72. function buttonClick(ev) {
  73. /*找到正在显示的图片*/
  74. var currentImg = slideCurrentImg();
  75. /*点击上一个*/
  76. if (ev.target.classList.contains("slide-prev")) {
  77. singleButton(
  78. currentImg,
  79. imgs[imgs.length - 1],
  80. currentImg.previousElementSibling
  81. );
  82. }
  83. /*点击下一个*/
  84. if (ev.target.classList.contains("slide-next")) {
  85. singleButton(currentImg, imgs[0], currentImg.nextElementSibling);
  86. }
  87. /* 点击左右按钮,清除定时器 */
  88. clearTimer();
  89. }
  90. /*单个按钮事件函数*/
  91. function singleButton(currentImg, index, ele) {
  92. /*删除当前图片的 active*/
  93. currentImg.classList.remove("active");
  94. /*获取上一节点*/
  95. currentImg = ele;
  96. /*如果没有上一节点,则为获取最后的节点并增加 active*/
  97. if (currentImg === null) {
  98. currentImg = index;
  99. }
  100. currentImg.classList.add("active");
  101. /*导航点元素的增加和删除 active*/
  102. dotsActive(currentImg.dataset.index);
  103. }
  104. /**
  105. * 为图片增加自动播放,暂停
  106. */
  107. var slides = document.querySelector(".slides");
  108. var timer = null;
  109. // 1. 当鼠标移出轮播图区域时, 启动定时器,每2秒自动切换图片
  110. slides.addEventListener("mouseout", startTimer, false);
  111. // 2. 当鼠标移入轮播图区域时,清除定时器,由用户点击操作
  112. slides.addEventListener("mouseover", clearTimer, false);
  113. // 启动定时器
  114. function startTimer() {
  115. var click = new Event("click");
  116. setInterval(function () {
  117. buttons.item(1).dispatchEvent(click);
  118. }, 2000);
  119. }
  120. // 清除定时器
  121. function clearTimer() {
  122. clearInterval(timer);
  123. }

3、幻灯片演示地址

演示地址

总结

代码需多写,方能见本领。虽然能听懂老师讲的是什么,但是自己操作时还是遇到很多问题,这些问题也将成为经验吧。

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