原生js实现弹性菜单功能

news/2024/7/19 14:36:35 标签: js, 弹性运动

弹性菜单,主要运用到的是弹性运动。只要知道了弹性运动是怎样实现的,弹性菜单就很好实现了,下面我首先总结一下,我是怎样一步一步实现弹性运动的,然后再写弹性菜单的代码。

弹性运动用到的知识:js基础、dom、定时器

弹性运动实现步骤:

  • 声明和获取要运用到的变量
  • 清空定时器
  • 开启定时器,在定时器内求出速度:速度 +=(目标点 - 当前值)/系数(系数一般取6、7、8),因为需要最终让运动停止,所以还要有摩擦力。所以还有:速度 *=摩擦系数(一般可取0.7、0.75)
  • 判断如果目标值减去当前值的绝对值小与1并且速度小与1的时候,清空定时器,并且让速度为0,让运动对象的当前值等于目标值。否则,让运动对象的left的值等于当前值+速度+‘px’。

知道了弹性运动的实现步骤,现在我们直接上代码

HTML代码

<ul id="ul1">
    <li id="mark">
        <ul>
            <li>首页</li>
            <li>论坛</li>
            <li>视频</li>
            <li>留言</li>
        </ul>
    </li>
    <li class="box">首页</li>
    <li class="box">论坛</li>
    <li class="box">视频</li>
    <li class="box">留言</li>
</ul>

CSS代码

    <style>
        *{ margin:0; padding:0;}
        #ul1{ width:428px; height:30px; margin:20px auto; position:relative;}
        #ul1 li{ width:100px; height:30px; background:red; border:1px #000 solid; margin-right:5px; float:left; list-style:none; line-height:30px; text-align:center;}
        #ul1 #mark{ position:absolute; left:0; top:0; overflow:hidden;}
        #ul1 #mark ul{ width:428px; position:absolute; left:-1px; top:-1px; color:white;}
    </style>

JS代码

<script>
    var oMark = document.getElementById('mark');
    var aBox = document.querySelectorAll('.box');
    var ChildUl = oMark.getElementsByTagName('ul')[0];
    var iTimer = null;
    var timer = null;
    var iSpeed = 0;
    for(var i=0; i<aBox.length; i++){
        aBox[i].onmouseover = function(){
            clearTimeout(timer);
            startMove(this.offsetLeft);
        }
        aBox[i].onmouseout = function(){
            timer = setTimeout(function(){//当鼠标移出时延迟让mark回到首页,防止如果鼠标一直停在此处,而遮罩挡住了下面的li,浏览器以为已经移出了下面的li,而出现不断闪烁的现象。而在这里添加延迟时间,在延迟时间内我们就可以做很多事
                startMove(0);
            },100);
        }
    }
    oMark.onmouseover = function(){
        clearTimeout(timer);//清空定时器,则不让其运动到首页上面,就解决了一直闪烁的现象
    }
    oMark.onmouseout = function(){
        timer = setTimeout(function(){startMove(0);},100);//移出的时候,再次开启定时器,让其回到首页上面
    }
    function startMove(iTarget){
        clearInterval(iTimer);
        iTimer = setInterval(function(){
            iSpeed +=(iTarget - oMark.offsetLeft)/6;//求出速度
            iSpeed *=0.75;//速度损失
            if(Math.abs(iSpeed)<1&&Math.abs(iTarget - oMark.offsetLeft)<1){
                clearInterval(iTimer);
                    iSpeed = 0;
                oMark.style.left = iTarget + 'px';
                ChildUl.style.left = -iTarget + 'px';//让li下面的ul向与目标值相反的方向移动,移动的距离与目标距离相等
            }else{
                oMark.style.left = oMark.offsetLeft + iSpeed + 'px';
                ChildUl.style.left = -oMark.offsetLeft + 'px';
            }
        },30);

    }
</script>
上面就是我的总结,有兴趣的可以看看,有疑问或异议也欢迎提出,大家一起探讨

http://www.niftyadmin.cn/n/952217.html

相关文章

数字的格式化(简单几个,不过觉得很有用)

12345.ToString("n"); //生成 12,345.00 12345.ToString("C"); //生成 &#xffe5;12,345.00 12345.ToString("e"); //生成 1.234500e004 12345.ToString("f4"); //生成 12345.0000 12345.ToString("x"); //生成 3039 (16进…

原生js实现拖动图片左右弹性切换(模仿iPhone弹性拖拽的功能)

因为弹性运动我在弹性菜单实例中已经列过详细的步骤了&#xff0c;所以此处不再赘述&#xff0c;有不懂的或有兴趣的请点击原生js实现弹性菜单 这个例子里面我们主要解决的问题有 1、弹性运动的实现&#xff08;不再详细讲解&#xff09; 2、怎样判断鼠标是向左拖动还是向右拖动…

报文加解密原理_通讯安全 - TLS基本原理

㈠ TLS 的成长史TLS 全称为Transport Layer Security&#xff0c;意指传输层安全&#xff0c;是解决网络安全的重量级武器。传输层安全最早由网景公司所开发&#xff0c;那时的名字还不叫TLS&#xff0c;而是SSL Secure Sockets Layer&#xff0c;即安全套接字层。 TCP/IP 的四…

转:ASP.Net下两种全局变量的设置和读取方法

本文介绍两种ASP.Net项目中全局变量使用的方式。web.config文件 和 Gloab文件。以下分别说明&#xff1a;方法一&#xff1a;web.config文件——设置&#xff1a;在web.config文件里添加关键字key是通过<appSettings>标记来实现的&#xff0c;但是appSettings标记通常放在…

原生js实现分页的效果

想必大家都用过百度查找过我们想要的信息&#xff0c;每次我们查找东西的时候&#xff0c;百度都会返给我们很多很多相似和有关的结果&#xff0c;而这些结果是不可能一页就显示完全的&#xff0c;一般都会分很多很多页&#xff0c;效果图如下。所以我们今天就是要分享一下&…

控制台接收信息转发_一张图告诉你组播报文转发和RPF检查原理

组播转发区别于单播转发&#xff0c;单播转发是基于报文目标IP地址查表转发的过程&#xff0c;而组播转发是根据报文源IP地址查表转发的过程&#xff0c;报文沿远离源的方向转发&#xff0c;可避免环路。PIM协议使用RPF机制确定转发路径。看这张图前&#xff0c;先了解一下RPF的…

深入理解js基本类型和引用类型的区别

1、基本类型&#xff1a;我们知道基本的数据类型有&#xff1a;undefined&#xff0c;boolean&#xff0c;number&#xff0c;string&#xff0c;null.按值访问&#xff0c;可操作保存在变量中的实际的值。基本类型值指的是简单的数据段。基本类型的值是不可变的&#xff1a;在…

终于可以回家了!

今天是春节前工作的最后一天&#xff0c;离下班也没有几个小时了&#xff0c;真块&#xff0c;一年就这样过去了&#xff0c;马上就可以回家了。 转载于:https://www.cnblogs.com/zhangzheny/archive/2007/02/14/650495.html