PHP8.1.21版本已发布
vue8.1.21版本已发布
jquery8.1.21版本已发布

博客列表 > 第19章 0111 - 原生JS经典实战案例,学习心得、笔记

第19章 0111 - 原生JS经典实战案例,学习心得、笔记

努力工作--周工--Robin
努力工作--周工--Robin 原创
2021年01月23日 03:07:59 521浏览

今天所学心得、笔记

1、选卡功能实现(只展示了script代码部分)

  1. <script>
  2. // 事件代理,获取tab导航栏点击的按钮
  3. const tab = document.querySelector(".tab");
  4. // 获取详细内容三个列表, 数组
  5. const items = document.querySelectorAll(".item");
  6. tab.onclick = ev => {
  7. // // 事件的绑定对象
  8. // console.log(ev.currentTarget);
  9. // // 事件触发对象
  10. // console.log(ev.target);
  11. // 1. 清空之前所有处于激活状态的选项卡,并将当前点击对象激活
  12. // console.log([...tab.children])
  13. [...tab.children].forEach(ev => ev.classList.remove("active"));
  14. ev.target.classList.add("active");
  15. // 2. 根据自定义属性data-index找到对应的列表并显示出来
  16. // items是NodeList对象, 内置了forEach接口
  17. items.forEach(ev => ev.classList.remove("active"));
  18. // 老师原版写法, 拿到与tab导航栏id 一致的ul元素,添加active样式
  19. // [...items].filter(item => item.dataset.index === ev.target.dataset.index)[0].classList.add("active");
  20. // 自己理解写法,拿到与tab导航栏id 一致的ul元素,添加active样式
  21. let item = [...items].filter(function (item) {
  22. return item.dataset.index === ev.target.dataset.index;
  23. });
  24. // 返回的item是一个新数组,要拿到ul列表元素要加上序号[0]
  25. // console.log(item);
  26. // console.log(item[0]);
  27. item[0].classList.add("active"); //添加active样式
  28. }
  29. </script>

代码演示截图

" class="reference-link">

2、点击图片,换肤,功能实现(只展示了script代码部分)

  1. <script>
  2. //事件代理,就不需要给每个图片的缩略图添加点击事件,只需要给它的父级加就可以了
  3. // 老师写法
  4. // document.querySelector(".container").onclick = ev =>
  5. // (document.body.style.backgroundImage = "url(" + ev.target.src + ")");
  6. // 写法1, 匿名函数, ev=>{}------------------------------------
  7. // document.querySelector(".container").onclick = ev => {
  8. // // 清空所有小图active样式
  9. // let items = document.querySelector(".container").children;
  10. // // console.log(items[0]);
  11. // for (let i=0; i<items.length; i++) {
  12. // items[i].classList.remove("active");
  13. // }
  14. // // 设置body背景图片
  15. // document.body.style.background = "url('" + ev.target.src + "')";
  16. // // 小图添加active样式
  17. // ev.target.classList.add("active");
  18. // }
  19. // 写法2, function()函数, function(ev)=>{}-------------------------
  20. // const items = document.querySelector(".container");
  21. // // console.log( items);
  22. // items.onclick = function (ev) {
  23. // // 清空所有小图active样式
  24. // for (let i=0; i<items.children.length; i++) {
  25. // items.children[i].classList.remove("active");
  26. // }
  27. // // 设置body背景图片
  28. // document.body.style.background = "url('" + ev.target.src + "')";
  29. // // 小图添加active样式
  30. // ev.target.classList.add("active");
  31. // }
  32. // 写法3, addEventListener方法添加事件--------------------------
  33. // 3.1写法
  34. // document.querySelector(".container").addEventListener('click', ev =>
  35. // (document.body.style.backgroundImage = "url(" + ev.target.src + ")")
  36. // );
  37. // 3.2写法
  38. document.querySelector(".container").addEventListener('click', ev =>{
  39. // 清空所有小图active样式
  40. let items = document.querySelector(".container").children;
  41. // console.log(items[0]);
  42. for (let i=0; i<items.length; i++) {
  43. items[i].classList.remove("active");
  44. }
  45. // 设置body背景图片
  46. document.body.style.background = "url('" + ev.target.src + "') no-repeat";
  47. // 小图添加active样式
  48. ev.target.classList.add("active");
  49. });
  50. // 课后再理解:
  51. // onclick与addEventListener区别
  52. // 1.onclick事件在同一时间只能指向唯一对象
  53. // 2.addEventListener给一个事件注册多个listener
  54. // 3.addEventListener对任何DOM都是有效的,而onclick仅限于HTML
  55. // 4.addEventListener可以控制listener的触发阶段(捕获/冒泡);
  56. // 第三个参数:true捕获阶段, false冒泡阶段,默认false;
  57. // 可以手动使用removeEventListener清除绑定
  58. </script>

代码演示截图

" class="reference-link">

2、图片懒加载,功能实现(只展示了script代码部分)

  1. <script>
  2. // 获取所有图片元素
  3. const imgs = document.querySelectorAll(".container img");
  4. // 获取视口高度
  5. const clientH = document.documentElement.clientHeight;
  6. console.log("视口高度" + clientH);
  7. //添加监听滚动事件
  8. window.addEventListener("scroll", lazyLoad);
  9. //启动加载lazyLoad()函数,防止空白页面
  10. window.addEventListener("load", lazyLoad);
  11. // lazyLoad(); //不能用此方法,用此方法,拿到的图片偏移量不正确
  12. function lazyLoad() {
  13. // 获取视口滚动高度
  14. let scrollTop = document.documentElement.scrollTop;
  15. console.log("滚动高度:" + scrollTop);
  16. // 循环判断图片离顶部高度(img.offsetTop),判断是否进入到了可视区, 是否小于(视口高度 + 滚动高度)
  17. imgs.forEach((img,index) => {
  18. console.log("图片"+ index +"偏移量:" + img.offsetTop + "=====" + (img.offsetTop < clientH + scrollTop));
  19. if (img.offsetTop < clientH + scrollTop) {
  20. // 设置显示延时
  21. setTimeout(() => (img.src = img.dataset.src), 800)
  22. }
  23. });
  24. }
  25. </script>

代码演示截图

" class="reference-link">

2、轮播图,点翻页按钮,点小圆点翻页,自动翻页鼠标移入停止,功能实现(只展示了script代码部分)

  1. <script>
  2. // 拿到所有的图片
  3. const imgs = document.querySelectorAll(".container img");
  4. // 拿到所有轮播图,指示器
  5. const btnGroup = document.querySelector(".btns");
  6. // 拿到翻页按钮
  7. const skips = document.querySelector(".skip");
  8. // 创建指示器函数,作用:创建一组与轮播图数量一致的指示器
  9. function autoCreateBtns(ele, imgLengh) {
  10. const frag = document.createDocumentFragment();
  11. for(let i=0; i<imgLengh; i++) {
  12. const a = document.createElement("a");
  13. a.href = "#";
  14. a.dataset.index = i + 1;
  15. if(i === 0) a.classList.add("active");
  16. frag.appendChild(a);
  17. }
  18. ele.appendChild(frag);
  19. }
  20. // 执行autoCreateBtns()函数,添加轮播图指示器组件
  21. autoCreateBtns(btnGroup, imgs.length);
  22. // 拿到添加的轮播图指示器
  23. const btns = document.querySelectorAll(".btns > *");
  24. // 为指示器添加响应事件
  25. btns.forEach(btn => btn.addEventListener("click", ev => setActiveEle(ev.target.dataset.index)));
  26. // btns.forEach(btn => btn.addEventListener("click", ev => console.log(ev.target.dataset.index) ));
  27. // 给翻页按钮添加响应事件
  28. skips.addEventListener("click", ev => {
  29. // console.log(ev.target.classList[0]);
  30. // 获取当前轮播图index
  31. const currentIndex = parseInt(getActiveEle(imgs).dataset.index);
  32. // console.log(typeof (currentIndex));
  33. //获取轮播图数量
  34. const imgsLengh = imgs.length;
  35. // 判断到1号图片后,index值置4,如果到4号图片,反之;
  36. // setActiveEle()函数里,判断条件用的(完全等于) ===,所以这里要用 //toString(),转字符串
  37. if(ev.target.classList[0] === "prev") {
  38. // console.log(currentIndex === "1" ? 4 : currentIndex-1);
  39. setActiveEle((currentIndex === 1 ? imgsLengh : currentIndex-1).toString());
  40. }else {
  41. // console.log((currentIndex === imgsLengh ? 1 : currentIndex+1).toString());
  42. setActiveEle((currentIndex === imgsLengh ? 1 : currentIndex+1).toString());
  43. }
  44. });
  45. // 自动播放函数,鼠标移入停止播放
  46. // 定义定时器
  47. let timer = null;
  48. // 页面加载,启动自动播放函数
  49. autoMove();
  50. // 获取轮播图总容器
  51. const container = document.querySelector(".container");
  52. container.addEventListener("mouseout", autoMove); //添加鼠标移出事件
  53. //添加鼠标移入事件,清除定时器;
  54. container.addEventListener("mouseover", () => clearInterval(timer));
  55. // 自动播放轮播图函数,模拟点击next按钮
  56. function autoMove() {
  57. timer = setInterval(() => document.querySelector(".next").click(), 800);
  58. }
  59. // 声明二个公共函数
  60. // 获取激活元素
  61. function getActiveEle(eles) {
  62. let activities = [...eles].filter(img => img.classList.contains("active")); //返回一个新的数组
  63. // let activities = [...eles].filter(img => img.dataset.index == 3);
  64. return activities.shift(); //从数组中取出元素,shift()从前面取,pop()从后面取;
  65. }
  66. // 2. 设置激活的元素,根据index索引更新正在显示的图片, 和指示器样式
  67. function setActiveEle(btnIndex) {
  68. [imgs, btns].forEach(arr => {
  69. // 老师原版写法,移除元素active样式
  70. // getActiveEle(arr).classList.remove("active");
  71. // 自己写法,移除元素active样式
  72. arr.forEach(item => {
  73. item.classList.remove("active");
  74. });
  75. arr.forEach(item => {
  76. if(item.dataset.index === btnIndex) {
  77. item.classList.add("active");
  78. }
  79. })
  80. })
  81. }
  82. </script>

代码演示截图

" class="reference-link">

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