[转]JavaScript与元素间的抛物线轨迹运动
在张鑫旭的博客看到这个抛物线的小动画,觉得很感兴趣,转载一下方便研究~
原文地址:http://www.zhangxinxu.com/wordpress/?p=3855
在页面上添加元素的位移动画,除了视觉效果(这是次要的),还有个作用就是视觉引导(重点)。举个大家可能见过的例子,选择商品的时候,我们希望商品飞到边缘或角落的购物车里,作用是:一来告知放在购物车里成功了,二来让用户知道购物车在哪里。
要让页面元素抛物线运行,很简单。套用抛物线函数即可。公式如下:
- y = a*x*x + b*x + c
(x, y)
就是点坐标,在网页上可以理解为相对于页面左上角的偏移像素大小,然后,套用求参,即可得到当前位置的抛物线函数。
现在,我们的任务变成了求解:a
, b
, c
三个参数。
3
个参数需要3
个条件才能完全求解。
由于我们要实现元素A到元素B的抛物线运动,因此,我们可以指定两个点的坐标位置,也就是知道了2
个条件,那第3
个条件呢?
了解抛物线函数的同学应该知道,a可以近似理解为弧度,曲率。在我们实现效果的时候,这个是应该要可控的。——你总不可能把元素抛到天宫号上再掉下来吧。在网页上,一般都是起伏不大的抛物线(否则会出屏幕之外)。
因此,我们可以把a作为一个参数常量。
于是,我们任务就变成了,已知参数a
,以及两个点的坐标,求该抛物线函数。
- y = a*x*x + b*x + c
- ↓
- y1 = a * x1*x1 + b*x1 + c;
- y2 = a * x2*x2 + b*x2 + c;
- ↓
- a已知,求b, c
为了简化我们的计算求解,以及与我们高中时候的函数坐标匹配,我们可以以移动元素的初始位置作为坐标轴的中心(网页默认的坐标系左上角是中心,x
轴向右,y
轴向下,与高中的坐标轴不一样)。
我们限定了抛物线经过中心点(0, 0)
, 代入y1 = a * x1*x1 + b*x1 + c
可以得到c = 0
, 于是b = (y2+ a*x2*x2) / x2
, 带入指定的坐标,就可以计算出b
的大小,于是,抛物线函数就出来了。
演示地址:http://www.zhangxinxu.com/study/201312/js-parabola.html
该抛物线方法名为funParabola
,您可以根据自己的喜好修改,参数以及基本使用如下:
- var myParabola = funParabola(element, target, options);
关于myParabola:
直接执行funParabola
方法是不会产生运动的。因为,实际上funParabola
执行返回的是一个对象。包含如下四个方法:
mark
在目标元素以及移动元素上通过data-center
自定义属性标记当前的中心坐标,如-234, -345
. 此方法主要用在demo中,方便测试与预览用的。实际可能用途不大。position
重新获取元素的位置。在元素相对位置改变的时候,此方法很有用。否则会出现计算误差的情况。例如,页面布局是自适应或者响应式的,浏览器宽度变小了,两元素之间的距离变化了,此时需要执行下position
,存储新的坐标位置。move
触发抛物线运动。init
初始化方法。实际上就是连续调用position
,mark
,move
3个方法。
demo点击页面任意位置触发抛物线运动就是这么触发的:
- /* 元素 */
- var element = document.getElementById("element"),
- target = document.getElementById("target");
- // 抛物线元素的的位置标记
- var parabola = funParabola(element, target).mark();
- // 抛物线运动的触发
- document.body.onclick = function() {
- element.style.marginLeft = "0px";
- element.style.marginTop = "0px";
- parabola.init();
- };
参数说明:
element
表示移动的元素,例如demo中的小球球。原生DOM节点target
表示目标元素。例如demo中的椭圆形的大便池。原生DOM节点options
为可选参数。各个API名称以及含义如下:speed
表示每帧移动的像素大小,每帧(对于大部分显示屏)大约16~17毫秒。默认大小是166.67。也就是默认10px/ms
.curvature
可以近似理解为抛物线的开头大小,也就是曲率。正数表示开口向下。默认大小是0.001
. 数值越大,开头越小,弧度越高。因为web页面动辄大小几百像素,因此,曲率值较小。progress
表示抛物线运动过程中的回调,支持两个参数,x
,y
,表示当前的坐标,您可以根据这些坐标值做一些特殊的处理。complete
表示抛物线运动结束后的回调。
其他说明:
- 可选参数
speed
不是指x
轴的位移,也不是y
轴位移,而是抛物线特定坐标的切线距离。利用切线公式:y'=2ax+b
就可以计算出x
轴这一帧应该移动的距离。形成奔向目的地的运动效果。 funParabola
方法不依赖任何JS框架。您可以大胆使用。
[转]JavaScript与元素间的抛物线轨迹运动的更多相关文章
- JavaScript通过元素id和name直接获取元素的方法
概览: 偶然的机会,我在JavaScript中直接用HTML元素的id属性来获取该元素,并设置该元素的其他属性值,竟然能够正确解析不报错!于是我去查阅相关资料,也有其他同行这么用. 虽然说这种用法不是 ...
- 如何消除inline-block元素间间距问题(转)
一.现象描述 真正意义上的inline-block水平呈现的元素间,换行显示或空格分隔的情况下会有间距,很简单的个例子: <input /> <input type=" ...
- 去除inline-block元素间间距的N种方法
这篇文章发布于 2012年04月24日,星期二,22:38,归类于 css相关. 阅读 147771 次, 今日 52 次 by zhangxinxu from http://www.zhangxin ...
- javascript中元素的scrollLeft和scrollTop属性说明
再说意义之前,前说一下这两个属性的适用范围: 注意:这两个属性只能用于元素设置了overflow的css样式中.否者这两个属性没有任何意义.且overflow的值不能为visible,但可以为hidd ...
- [转]去除inline-block元素间间距的N种方法
来自张鑫旭-鑫空间-鑫生活[http://www.zhangxinxu.com] 一.现象描述 真正意义上的inline-block水平呈现的元素间,换行显示或空格分隔的情况下会有间距,很简单的个例子 ...
- 父元素onmouseover触发事件在父子元素间移动不停触发的问题
今天写了一个侧边栏动态展开收缩的效果 <!DOCTYPE html> <html lang="en"> <head> <meta char ...
- display:inline-block元素间空白间隙问题
display:inline-block元素间有空白间隙,可以在父元素上加font-size:0
- 如何消除inline-block产生的元素间空隙
前端初学者可能都会碰到这个问题:有时候排版需要,会把一些块状元素的display属性设置为inline-block,如 <!-- HTML代码 --> <div class=&quo ...
- Android 自定义控件 优雅实现元素间的分割线 (支持3.0以下)
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/42407923 ,本文出自:[张鸿洋的博客] 1.概述 话说,随着Android ...
随机推荐
- python中for循环的底层实现机制 迭代
在python中,存在2种循环方式:for循环和while循环. while循环的实现很简单, 其本质就是一个条件语句,自定义条件,当条件满足的时候,不断执行while代码块. 但是for循环,究竟是 ...
- 6月6 Smarty练习----设置题目及打印试卷
所需要的数据库表格:shiti, shititimu, timu, kemu, xuanxiang 考试试题的设置: 考试试题后台:ksset.php <?php include(" ...
- Hash应用例子
八.Hash应用例子搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节.假设目前有一千万个记录(这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复 ...
- call、apply、bind三者的区别
先构造函数let xiaowang={ name1:"小王", age:", sex:"男", say:function(){ console.log ...
- Oracle中事务处理控制用法
oracle 事物控制包括 COMMINT ROLLBACK SAVEPOINT avepoint是事务内部允许部分rollback的标志符.因为事务中对记录做了修改,我们可以在事务中创建savepo ...
- mysql5.6主从配置
在windows 7系统上安装mysql5.6, 主库: 安装目录为:D:\Program Files\MySQL\MySQL Server 5.6 从库: 对安装目录进行拷贝,重命名:D:\Prog ...
- TLS与SSL之间关系——SSL已经被IEFT组织废弃,你可以简单认为TLS是SSL的加强版
TLS与SSL之间关系 原文地址:SSL vs. TLS - What's the Difference? from:https://juejin.im/post/5b213a0ae51d4506d4 ...
- summary_22rd Nov 2018
一. 列表:记录同种属性的多个值 定义:在[]中用逗号分隔开多个任意的值 类型转换:L=list( ) 括号中的内容必须是可迭代类型,包括字符串,列表,字典等 常用操作和内置方法: 1.按照索引位置 ...
- flex入门----基础知识
传统的页面布局 在flex出现之前,双列布局,三列布局,动态盒居中,绝对居中布局等常见的布局均是采用dispaly+float+定位来布局的,一般包括以下几种布局策略: normal flow(文 ...
- spring boot 打包可以运行,但是执行main方法不能运行
报错信息如下 2017-10-23 15:16:09.750 ERROR 7664 --- [ restartedMain] o.s.b.d.LoggingFailureAnalysisReport ...