【JS- 工具类】导航移动变化特效(两种特效)-构造函数

本文介绍了一种使用构造函数创建导航栏特效的方法,包括普通浮动效果和伸长拉伸效果。通过调整阴影块的位置,实现了导航项在鼠标悬停时的动态变化。涉及到的技术点包括HTMLDOM的offset系列API、事件监听以及CSS样式操作。
摘要由CSDN通过智能技术生成

利用构造函数 写的 导航特效

导航移动变化特效(两种特效)-构造函数–codepen.io

一个构造函数 NavSlide

普通效果

请添加图片描述


伸长拉伸效果

请添加图片描述

  • 原理:
    • 利用 offset系列API(注意要配合定位使用,详情见HTML DOM offsetLeft 属性-菜鸟教程 注意其注意: offsetParent 元素是一个指向最近的(指包含层级上的最近)包含该元素的定位元素或者最近的元素。
    • html结构div#navContainer > nav > ul > li > a 另外 div.moveShadow 作为阴影块
    • div#navContainer 相对定位 ,div.moveShadow绝对定位
    • 根据鼠标移入的目标元素的offsetLeft,与当前阴影的offsetLeft的差值(可为正负)判断左右移动方向

JS源码(html-css在下方codepen链接中)

/**
 * @param {String} _contianName 导航容器名称
*/
function NavSlide(_contianName) {
  // 获取导航容器盒子
  this.NavSlide = document.querySelector(_contianName)
  // 获取阴影
  this.moveShadow = document.querySelector(`${_contianName} .moveShadow`)
  // 获取导航项目
  this.navUl = document.querySelector(`${_contianName} nav>ul`)
  this.navItemList = document.querySelectorAll(`${_contianName} nav>ul>li`)

  // 下面 元素的 绑定函数 this 指向改变了,预存
  const _navThis =  this

  // effect 效果 函数

  // 普通的浮动效果 //hover
  this.hoverEffect = function(){
    for(let i=0;i<_navThis.navItemList.length;i++){
      this.navItemList[i].addEventListener('mouseenter',function(){
        _navThis.navItemList[i].classList.add('liActive')
        _navThis.navItemList[i].firstChild.classList.add('currentItem')
      })
      this.navItemList[i].addEventListener('mouseleave',function(){
        _navThis.navItemList[i].classList.remove('liActive')
        _navThis.navItemList[i].firstChild.classList.remove('currentItem')
      })
    }
  }

  // 伸缩效果 // stretch 伸长
  this.stretchEffect = function(){
    console.log('hi');

    // 初始 阴影
    const moveShadow = _navThis.moveShadow
    moveShadow.style.width = _navThis.navItemList[0].offsetWidth + 'px'
    moveShadow.style.left = _navThis.navItemList[0].offsetLeft + 'px'

    for(let i=0;i<_navThis.navItemList.length;i++){
      const item = _navThis.navItemList[i]
      // 给每一个 li 上 事件
      item.addEventListener('mouseenter',function(e){
        // 清除 以往 li>a 的字体高亮
        for(let i=0;i<_navThis.navItemList.length;i++){
          // 找到 li 内嵌套的 a 元素
          _navThis.navItemList[i].childNodes[0].classList.remove("currentItem")
        }

        // 初始化 事件对象 元素标签本身(li)
        let overItem = e.target

        // 处理滑动 ==== // 判断左右	
        // 利用 鼠标浮动目标元素的overItem.offsetLeft - 阴影moveShadow.offsetLeft 正负判断
        // 正 往左移动
        // 负 往右移动
        // console.log(overItem.offsetLeft - moveShadow.offsetLeft)
        if(overItem.offsetLeft - moveShadow.offsetLeft >0 ){
          // 赋予 阴影 菜单选项的 宽度
          // 伸长
          moveShadow.style.width = (overItem.offsetLeft+overItem.offsetWidth-moveShadow.offsetLeft) + 'px'

          setTimeout(()=>{
            // 缩进
            moveShadow.style.width = overItem.offsetWidth + 'px'
            moveShadow.style.left = overItem.offsetLeft + 'px'
          },200)
        }else{
          // 赋予 阴影 菜单选项的 宽度
          // 伸长
          moveShadow.style.left = overItem.offsetLeft + 'px'
          moveShadow.style.width = (moveShadow.offsetLeft+moveShadow.offsetWidth-overItem.offsetLeft) + 'px'

          setTimeout(()=>{
            // 缩进
            moveShadow.style.width = overItem.offsetWidth + 'px'
          },200)
        }
      })
      // li>a 字体高亮,不处理移除是想保持常亮状态,之下一次移动目标元素,所有在上面li绑定的事件处理
      item.firstElementChild.addEventListener('mouseenter',function(e){
        // 初始化 事件对象 元素标签本身(li) // 找到 li 内嵌套的 a 元素
        e.target.classList.add('currentItem')
      })
    }
  }
}

		
let newNav = new NavSlide('#navContain1')
// 普通鼠标触发效果
// newNav.hoverEffect()  
// 伸长拉伸效果
newNav.stretchEffect()

导航移动变化特效(两种特效)-构造函数–codepen.io

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值