• 26 Strip Follow Along Nav 中文指南
    • 挑战任务
    • 实现效果
    • 编程思路
    • 过程指南
    • 延伸思考

    26 Strip Follow Along Nav 中文指南

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

    简介:JavaScript30 是 Wes 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. }