javascript--苹果系统底部菜单--详细分析(转)

源码下载:http://pan.baidu.com/s/1hqvJJA8

代码来源: 这个DEMO来自“妙味课堂”

昨天看到了“妙味课堂”的一个苹果菜单的DEMO。根据里面提到的“勾股定理”。我自己分析了一下代码。如下:

先来一效果图吧!

静止时:

鼠标滑动时:

一、要实现在的功能或效果:

  在鼠标滑动的靠近其中某一张图片时,这个图片会随着鼠标向它的靠近而慢慢放大。

  a.是“放大”不是“变大”。【放大】是等比例的,而【变大】:不一定是等比例。后面的公式中会体现。

  b.这里的【靠近】:是指靠近图片的【中心点】。离图片【中心点】越近,图片越大,远离中心点,就变小,当然这里的【变小】是指相对于放大之后的变小,不会变小到比原始值还要小。

  鼠标靠近红点即图片的【中心点】,图片变大,远离,变小

  靠  近 红 点         

    

  远    离  红 点

二、功能分析:

1.  【放大】效果

    原来的图片宽度乘以一个比例数,假设这个图片原大小是宽64PX 高64PX;那么我把这个宽64乘以一个比例数(这里先设为X),那么 64*X  就是它放大值;

    用这个放大值加上原先的宽度,就是【放大】效果的后值。

    即:放大后图片的宽度值 = 64*X + 64;

    (这里不考虑高度,因为在IMG标签中,不定义高度,只定义宽度的话,那么宽度值变化了,高度值也会一起变化。所以只需要改变宽度值,就行了。)

2.  如何判断鼠标距离图片【中心点】的远近?

    鼠标在web页面中间是一个点,而图片【中心点】也是一个点,通过这两点之间连线的长度值的大小,就可以判断鼠标距离图片【中心点】的远近了;

    即:这个长度值越大:说明鼠标距离图片【中心点】越远;、

      这个长度值越小:说明鼠标距离图片【中心点】越近;

    

      距离值大(白色:图片,红色:中心点,黄色:鼠标,蓝色:鼠标与中心点的距离,黑色:DIV)

    

    

      距离值小(白色:图片,红色:中心点,黄色:鼠标,蓝色:鼠标与中心点的距离,黑色:DIV)

    

    

3.  如何获得鼠标距离图片【中心点】的值?(即上图中蓝色线条的长度(这是重点))

    3.1 其实质就是要获得任意两点之间的距离值。

    3.2 获得方法:先构建一个直角三角形。再通过【勾肌定理】计算出两点之间的距离值;(因为我们可以通过JS的方法获得水平横向和纵向的值。正好要求斜线的值。于是可以求助【勾肌定理】了)

    3.3【勾肌定理】:直角三角形的两直角边的平方和等于斜边的平方这一特性(X2+Y2=Z2);

      x:一个直角边长度;

      y:另一个直角边长度;

      z:斜边长度(即两点之间的距离值);

      所以要获得Z的长度值,必需知道X和Y是多少;

    3.4 构建一个直角三角形

    3.5求出鼠标距离图片【中心点】的值,即上图中的蓝色线的长度,即 Z 的值

       3.5.1 先获得X的值:(obj:白的图片, oDiv:橙色的DIV, oEvent:鼠标, 黑色:web页面)

        (灰色+蓝紫色+绿色)的长度值 = obj.offsetLeft + oDiv.offsetLeft + obj.offsetWidth/2;

        (红色的长度值)= oEvent.clientX;

        X的长度值 = ( oimg.offsetLeft+oDiv.offsetLeft+obj.offsetWidth/2 )- (oEvent.clientX);

        

      3.5.2 再获得Y的值:(obj:白的图片, oDiv:橙色的DIV, oEvent:鼠标, 黑色:web页面)

        (灰色+蓝紫色+绿色)的长度值 = obj.offsetTop + oDiv.offsetTop + obj.offsetHeight/2;

        (红色的长度值)= oEvent.clientY;

        Y的长度值 = ( oimg.offsetTop+oDiv.offsetTop+obj.offsetHeight/2 )- (oEvent.clientY);

        

    3.5.3  【勾肌定理】:直角三角形的两直角边的平方和等于斜边的平方这一特性(X2+Y2=Z2);\

          (Math.pow(……,2)可以球出平方; Math.sqrt(……)可以求出平方根;)

          x= Math.pow(obj.offsetLeft+oDiv.offsetLeft-oEvent.clientX+obj.offsetWidth/2, 2) ;

          Y2=  Math.pow(obj.offsetTop+oDiv.offsetTop-oEvent.clientY+obj.offsetHeight/2, 2);

          z2 =  Math.pow(obj.offsetLeft+oDiv.offsetLeft-oEvent.clientX+obj.offsetWidth/2, 2) +

               Math.pow(obj.offsetTop+oDiv.offsetTop-oEvent.clientY+obj.offsetHeight/2, 2)

          z =  Math.sqrt(

              Math.pow(obj.offsetLeft+oDiv.offsetLeft-oEvent.clientX+obj.offsetWidth/2, 2) +

                   Math.pow(obj.offsetTop+oDiv.offsetTop-oEvent.clientY+obj.offsetHeight/2, 2)

             )

          终于获得到 Z 的值了(即鼠标距离图片【中心点】的值,上图中蓝色线条的长度)!!!

4 . 图片放大的范围

  4.1上面的Z的范围应该是

      最小0(鼠标和【中心点】重合,黄色和红色重合,之间没有连线。所以是0);

      最大不确定;这里我们规定一个200;

      所以z的范围 0 - 200;

      Math.min():返回两个数中较小的;

       z = Math.min(Z,200);

5.   图片放大缩小公式:

      当z越接近0,        即鼠标越靠近图片【中心点】,图片应该放大;

      当z越接近200,  即鼠标越远离图片【中心点】,图片应该缩小;

      结合第一点的公式:图片的宽度值 = X *64+ 64; 

      得出公式:X = (iMax-Z)/iMax

      aImg[i].width=((iMax-Z)/iMax)*64+64;

6.  完整代码

document.onmousemove=function (ev)
{
    var oEvent=ev||event;
    var oDiv=document.getElementById(‘div1‘);
    var aImg=oDiv.getElementsByTagName(‘img‘);
    var d=0;
    var iMax=200;
    var i=0;

    function getDistance(obj)
    {
        return Math.sqrt
        (
            Math.pow(obj.offsetLeft+oDiv.offsetLeft-oEvent.clientX+obj.offsetWidth/2, 2)+
            Math.pow(obj.offsetTop+oDiv.offsetTop-oEvent.clientY+obj.offsetHeight/2, 2)
        );

    }

    for(i=0;i<aImg.length;i++)
    {
        d=getDistance(aImg[i]);
       d=Math.min(d,iMax);

        aImg[i].width=((iMax-d)/iMax)*64+64;
   }
};

<divid="div1">
    <ahref="http://www.miaov.com/"><imgsrc="images/1.png" width="64" longdesc="妙味课堂" alt="妙味课堂" title="妙味课堂" /></a>
    <ahref="http://www.miaov.com/"><imgsrc="images/2.png" width="64" longdesc="妙味课堂" alt="妙味课堂" title="妙味课堂" /></a>
    <ahref="http://www.miaov.com/"><imgsrc="images/3.png" width="64" longdesc="妙味课堂" alt="妙味课堂" title="妙味课堂" /></a>
    <ahref="http://www.miaov.com/"><imgsrc="images/4.png" width="64" longdesc="妙味课堂" alt="妙味课堂" title="妙味课堂" /></a>
    <ahref="http://www.miaov.com/"><imgsrc="images/5.png" width="64" longdesc="妙味课堂" alt="妙味课堂" title="妙味课堂" /></a>
</div>
body {margin:0px;}
#div1 {text-align:center;bottom:0px; position:relative; width:500px; margin:0 auto; border:1px solid red;}
#div1 img {border:none;}

三、总结

  1.要获得任意两点之间的距离值,通过【勾肌定理】直角三角形的两直角边的平方和等于斜边的平方这一特性(X2+Y2=Z2);

  2. (iMax-Z)/iMax ,和比例有关的算法,结合加法或减法、除法、乘法;

    减法:一个数不变,另一个数变大,结果越小;反之越大;

    加法:一个数不变,另一个数变大,结果越大;反之越小;

  3. 有图片变化的效果,或都说是形状变化效果的时候,是不是应该先抽象成基本的形状,如点、线,面:三角形,正方形矩形,圆,平形四边形。然后找规律,多观察那些变化,那些没有变,熟悉或查找相关实例所涉及到的定理公式。慢慢的推导出效果。

      

时间: 2024-10-10 19:54:28

javascript--苹果系统底部菜单--详细分析(转)的相关文章

安卓开发复习笔记——Fragment+FragmentTabHost组件(实现新浪微博底部菜单)

记得之前写过2篇关于底部菜单的实现,由于使用的是过时的TabHost类,虽然一样可以实现我们想要的效果,但作为学习,还是需要来了解下这个新引入类FragmentTabHost 之前2篇文章的链接: 安卓开发复习笔记——TabHost组件(一)(实现底部菜单导航) 安卓开发复习笔记——TabHost组件(二)(实现底部菜单导航) 关于Fragment类在之前的安卓开发复习笔记——Fragment+ViewPager组件(高仿微信界面)也介绍过,这里就不再重复阐述了. 国际惯例,先来张效果图: 下面

转-Fragment+FragmentTabHost组件(实现新浪微博底部菜单)

http://www.cnblogs.com/lichenwei/p/3985121.html 记得之前写过2篇关于底部菜单的实现,由于使用的是过时的TabHost类,虽然一样可以实现我们想要的效果,但作为学习,还是需要来了解下这个新引入类FragmentTabHost 之前2篇文章的链接: 安卓开发复习笔记——TabHost组件(一)(实现底部菜单导航) 安卓开发复习笔记——TabHost组件(二)(实现底部菜单导航) 关于Fragment类在之前的安卓开发复习笔记——Fragment+Vie

普通pc电脑安装苹果系统mac_详细教程(精)附带所有工具下载

苹果操作系统只允许在苹果电脑上面安装和使用.和Windows不一样,要在PC上安装,需要一系列的模拟和破解.破解安装的过程很繁琐而具有挑战性,以下是安装10A432雪豹的PC安装指南,附带25张图片帮助说明,没有远景ID的朋友可以打开链接查看. 请准备必要的东西: 配备Windows操作系统而且能够上网的PC 雪豹安装光盘dmg镜像文件(10A432正式零售版MD5校验码是bcd4957b2f86216dddc8f1472c20f098) 23G的可用空间 你的勇气和耐性 这个指南可能最适合从来

JavaScript在苹果系统日期格式问题

苹果系统下不支持“yyyy-MM-dd”和“yyyy.MM.dd”的日期格式,如:new Date("2016-06-27");会提示Invalid Date; 支持"yyyy/MM/dd"日期格式: 时间不支持毫秒,如new Date("2016-06-27 10:11:22.0"):;会提示Invalid Date;

获取浏览器版本,已实现辨别是苹果系统还是安卓系统

<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title></title> </head> <body> </body

mysql中的事务隔离级别及可重复读读提交详细分析(mvcc多版本控制/undo log)

一.事物隔离级别 读未提交(read uncommitted)是指,一个事务还没提交时,它做的变更就能被别的事务看到.通俗理解,别人改数据的事务尚未提交,我在我的事务中也能读到. 读提交(read committed)是指,一个事务提交之后,它做的变更才会被其他事务看到.通俗理解,别人改数据的事务已经提交,我在我的事务中才能读到. 可重复读(repeatable read)是指,一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据 是一致的.当然在可重复读隔离级别下,未提交变更对其他事

实时计算,流数据处理系统简介与简单分析

转自:http://www.csdn.net/article/2014-06-12/2820196-Storm 摘要:实时计算一般都是针对海量数据进行的,一般要求为秒级.实时计算主要分为两块:数据的实时入库.数据的实时计算.今天这篇文章详细介绍了实时计算,流数据处理系统简介与简单分析. 编者按:互联网领域的实时计算一般都是针对海量数据进行的,除了像非实时计算的需求(如计算结果准确)以外,实时计算最重要的一个需求是能够实时响应计算结果,一般要求为秒级.实时计算的今天,业界都没有一个准确的定义,什么

系统监测和性能分析工具

作为一名linux运维工程师来说,对linux系统的日常管理,检测和系统性能的分析是必不可少的.也有一些针对系统监测和性能分析的工具.咱们现在就来了解一下. tcpdump命令: 网络抓包工具,过滤数据包或者定制输出格式: 常用选项: -n :  用IP地址表示主机,用数字表示端口号. -i  : 监听网卡接口, -i  any :   抓取所有网卡接口的数据包. -v  :  输出详细信息. -t :  不打印时间戳 -e :  显示以太网帧头部信息. -x  :  以十六进制数显示数据包的内

如何对网站进行详细分析

大部分人对于网站都不懂如何去分析:网站分析有什么好处的? 可以帮助我们看网站存在一个什么阶段,可以帮助我们看出网站有没有问题:分析网站是作为一名优化人员必备的技术,所以我们必须要懂得如何去分析网站:接下来由泡馆史明星来教大家如何对网站进行详细分析: A.站内分析 1.标题以及描述:分为".栏目页.导航页.内容页.产品页"这些都是需要我们关系的,如果标题和描述写不好会直接影响关键词排名以及网站得分,那么该如何写: ①=关键词+品牌词+公司名称.关键词+公司名称:标题字数不要超过30字内,