Blogger Information
Blog 40
fans 0
comment 1
visits 24659
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
第19章 0111 - 原生JS经典实战案例,学习心得、笔记
努力工作--周工--Robin
Original
543 people have browsed it

今天所学心得、笔记

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">

Correcting teacher:天蓬老师天蓬老师

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