26 Strip Follow Along Nav 中文指南

本篇作者:©大史快跑Dashrun——Chinasoft Frontend Developer

简介:JavaScript30Wes Bos 推出的一个 30 天挑战。项目免费提供了 30 个视频教程、30 个挑战的起始文档和 30 个挑战解决方案源代码。目的是帮助人们用纯 JavaScript 来写东西,不借助框架和库,也不使用编译器和引用。现在你看到的是这系列指南的第 26 篇。完整指南在 GitHub,喜欢请 Star 哦♪(^∇^*)

创建时间:2017-10-16
最后更新:2017-10-17

挑战任务

初始文档index-start.html中提供了一组导航按钮,本次的编程任务需要实现的效果是当鼠标悬停于导航按钮时,显示对应下拉菜单的内容。(说明:下拉菜单内容及白色背景已写好,只需要根据需要改变其CSS属性使元素显示出来或改变其位置即可)。

实现效果

结果展示

编程思路

监听每一个导航栏按钮绑定鼠标移入和移出的事件,在对应的回调函数中为相应的元素增加已经编写好的类名即可。

过程指南

1.监听每一个导航栏按钮的鼠标移入移出事件

  1. var mainUl = document.querySelectorAll('.cool > li >a');
  2. var navArr = Array.from(mainUl);
  3. var bg = document.querySelector('.dropdownBackground');
  4. navArr.map(function(item,index){
  5. item.onmouseover = function (){
  6. item.parentNode.classList.add('trigger-enter');
  7. item.parentNode.classList.add('trigger-enter-active');
  8. toggleBackground(index+1);
  9. }
  10. item.onmouseout = function (){
  11. item.parentNode.classList.remove('trigger-enter');
  12. item.parentNode.classList.remove('trigger-enter-active');
  13. toggleBackground();
  14. }
  15. });

2.toggleBackground()函数为自定义函数,当传入整数参数时,根据对应的下拉菜单序号获取下拉菜单的尺寸,将绝对定位的白色背景衬底改编为对应大小,并移动至相应位置;当不传入任何参数时,表示鼠标没有悬停于任何按钮上,此时需要将下拉菜单的背景置为透明。

  1. function toggleBackground(item){
  2. var itemPos;
  3. if(item === 1 || item === 2 || item ===3){
  4. //计算位置
  5. itemPos = document.querySelector('.dropdown'+item).getBoundingClientRect();
  6. bg.style.left = `${itemPos.left}px`;
  7. bg.style.top = `${itemPos.top-60}px`;
  8. bg.classList.add('open');
  9. bg.style.width = `${itemPos.width}px`;
  10. bg.style.height = `${itemPos.height}px`;
  11. }else{
  12. bg.style.height = 0;
  13. bg.style.width = 0;
  14. bg.classList.remove('open');
  15. }
  16. }

延伸思考

1.本例中将相应的样式编写在一个css类中,通过添加和移出类来实现需要的效果,js编程实践中非常推荐这种将DOM操作集中化的做法。
2.除了使用js脚本来实现交互效果外,也可以使用下面的css来实现鼠标悬浮在按钮上时显示下拉菜单的效果(代码中~表示同级的元素,由于index-start.html中给定的结构中下拉菜单的白色沉底为独立元素,需要动态获取其对应尺寸,故使用js脚本更容易实现)

  1. .cool>li>a:hover ~.dropdown{
  2. display:block;
  3. opacity:1;
  4. }