详解基于javascript实现的苹果系统底部菜单


Posted in Javascript onDecember 02, 2016

(不好意,先前发布的是有误的分析。现在的这个没问提了!!!)

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

先来一效果图吧!

静止时:

详解基于javascript实现的苹果系统底部菜单

鼠标滑动时:

详解基于javascript实现的苹果系统底部菜单

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

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

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

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

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

 靠近红点 

详解基于javascript实现的苹果系统底部菜单

   远离红点

详解基于javascript实现的苹果系统底部菜单

 二、功能分析:

1.【放大】效果:

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

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

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

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

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

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

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

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

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

详解基于javascript实现的苹果系统底部菜单

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

详解基于javascript实现的苹果系统底部菜单

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

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

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

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

 x:一个直角边长度;

 y:另一个直角边长度;

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

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

 3.4 构建一个直角三角形

详解基于javascript实现的苹果系统底部菜单

 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); 

详解基于javascript实现的苹果系统底部菜单

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);

详解基于javascript实现的苹果系统底部菜单

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

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

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

以上就是本文的全部内容,希望对大家有所帮助,谢谢对三水点靠木的支持!

Javascript 相关文章推荐
javascript showModalDialog,open取得父窗口的方法
Mar 10 Javascript
热点新闻滚动特效的js代码
Aug 17 Javascript
js中call与apply的用法小结
Dec 28 Javascript
JQuery中DOM事件冒泡实例分析
Jun 13 Javascript
jquery ztree实现模糊搜索功能
Feb 25 Javascript
Javascript之面向对象--封装
Dec 02 Javascript
Vue.js:使用Vue-Router 2实现路由功能介绍
Feb 22 Javascript
js实现楼层导航功能
Feb 23 Javascript
vue excel上传预览和table内容下载到excel文件中
Dec 10 Javascript
不刷新网页就能链接新的js文件方法总结
Mar 01 Javascript
解决echarts中横坐标值显示不全(自动隐藏)问题
Jul 20 Javascript
利用PHP实现递归删除链表元素的方法示例
Oct 23 Javascript
Vue.js组件tree实现省市多级联动
Dec 02 #Javascript
Vue2实现组件props双向绑定
Dec 02 #Javascript
关于Vue.js一些问题和思考学习笔记(2)
Dec 02 #Javascript
基于jQuery实现表格的排序
Dec 02 #Javascript
利用jQuery插件imgAreaSelect实现图片上传裁剪(放大缩小)
Dec 02 #Javascript
关于Vue.js一些问题和思考学习笔记(1)
Dec 02 #Javascript
利用jQuery来动态为属性添加或者删除属性的简单方法
Dec 02 #Javascript
You might like
360通用php防护代码(使用操作详解)
2013/06/18 PHP
PHP+Memcache实现wordpress访问总数统计(非插件)
2014/07/04 PHP
Zend Framework前端控制器用法示例
2016/12/11 PHP
PHP实现微信小程序人脸识别刷脸登录功能
2018/05/24 PHP
JavaScript 提升运行速度之循环篇 译文
2009/08/15 Javascript
JQuery 图片的展开和伸缩实例讲解
2013/04/18 Javascript
javascript获取函数名称、函数参数、对象属性名称的代码实例
2014/04/12 Javascript
一个JavaScript函数把URL参数解析成Json对象
2014/09/24 Javascript
使用AOP改善javascript代码
2015/05/01 Javascript
深入浅析JavaScript中对事件的三种监听方式
2015/09/29 Javascript
跟我学习javascript的循环
2015/11/18 Javascript
javascript实现网页中涉及的简易运动(改变宽高、透明度、位置)
2015/11/29 Javascript
jQuery事件绑定用法详解(附bind和live的区别)
2016/01/19 Javascript
AngularJS实现一次监听多个值发生的变化
2016/08/31 Javascript
JavaScript中的 attribute 和 jQuery中的 attr 方法浅析
2017/01/04 Javascript
Vue 实现树形视图数据功能
2018/05/07 Javascript
ES6 Generator函数的应用实例分析
2019/06/26 Javascript
vue中如何添加百度统计代码
2020/12/19 Vue.js
vue穿梭框实现上下移动
2021/01/29 Vue.js
[04:28]2014DOTA2国际邀请赛 采访小兔子LGD挺进钥匙体育馆
2014/07/14 DOTA
Python json模块使用实例
2015/04/11 Python
python读取xlsx的方法
2018/12/25 Python
Python接口测试文件上传实例解析
2020/05/22 Python
Python使用itcaht库实现微信自动收发消息功能
2020/07/13 Python
ProBikeKit澳大利亚:自行车套件,跑步和铁人三项装备
2016/11/30 全球购物
具有防紫外线功能的高性能钓鱼服装:Hook&Tackle
2018/08/16 全球购物
Hush Puppies澳大利亚官网:舒适的男女休闲和正装鞋
2019/08/24 全球购物
.NET remoting的两种通道是什么
2016/05/31 面试题
化工机械应届生求职信
2013/11/04 职场文书
大学生工作推荐信范文
2013/12/02 职场文书
初三家长会邀请函
2014/01/18 职场文书
给老婆大人的检讨书
2014/02/24 职场文书
2014乡镇党政班子四风问题思想汇报
2014/09/14 职场文书
长江七号观后感
2015/06/11 职场文书
2016年大学生暑假爱心支教活动策划书
2015/11/26 职场文书
pd.DataFrame中的几种索引变换的实现
2022/06/16 Python