前端基本功:JS(十一)动画封装(CSS样式获取、JSON遍历)

前端基本功:JS(十一)动画封装(CSS样式获取、JSON遍历),第1张

盒子 原来的位置 0 + 10 盒子现在的offsetLeft 10

|-5| = 5

这三个函数都是 数学函数

Math

比如说 consolelog(Mathceil(101)) 结果 是 2

consolelog(Mathceil(19)) 结果 2

consolelog(Mathceil(-13)) 结果 是 -1

比如说 consolelog(Mathfloor(101)) 结果 是 1

consolelog(Mathfloor(19)) 结果 1

consolelog(Mathfloor(-13)) 结果 是 -2

consolelog(Mathround(101)) 结果 是 1

consolelog(Mathround(19)) 结果 是 2

匀速动画的原理: 盒子本身的位置 + 步长

缓动动画的原理: 盒子本身的位置 + 步长 (不断变化的)

( 缺陷:只能水平方向!随后的“封装运动框架单个属性会进一步改进” )

我们访问得到css 属性,比较常用的有两种:

点语法可以得到 width 属性 和 top属性 带有单位的 。 100px

但是这个语法有非常大的 缺陷, 不变的。

后面的width 和 top 没有办法传递参数的。

var w = width;

boxstylew

最大的优点 : 可以给属性传递参数

我们想要获得css 的样式, boxstyleleft 和 boxstylebackgorundColor

但是它只能得到 行内的样式。

但是我们工作最多用的是 内嵌式 或者 外链式 。

怎么办?

核心: 我们怎么才能得到内嵌或者外链的样式呢?

外部(使用<link>)和内嵌(使用<style>)样式表中的样式(ie和opera)

两个选项是必须的, 没有伪类 用 null 替代

我们这个元素里面的属性很多, left top width ===

我们想要某个属性, 就应该 返回该属性,所有继续封装 返回当前样式的 函数。

千万要记得 每个 的意思 : 那是相当重要

flag在js中一般作为开关,进行判断。

等动画执行完毕再去执行的函数 回调函数

我们怎么知道动画就执行完毕了呢?

很简单 当定时器停止了。 动画就结束了

案例源码:

in运算符也是一个二元运算符,但是对运算符左右两个 *** 作数的要求比较严格。in运算符要求第1个(左边的) *** 作数必须是字符串类型或可以转换为字符串类型的其他类型,而第2个(右边的) *** 作数必须是数组或对象。只有第1个 *** 作数的值是第2个 *** 作数的属性名,才会返回true,否则返回false

案例源码:

链接: > 密码:7fv8

JS中的数据类型分为三大类:

数据类型检测四种方式

语法: typeof [value]

基于 typeof检测结果

@优势

使用方便,所以在真实项目中,我们也会大量应用它来检测,尤其是在检测基本类型值(除null之外)和函数类型值的时候,它还是很方便的

@局限性

1、 typeof null => “object” , 但是null 并不是对象,是空指针对象;

2、无法细分当前值是普通对象还是数组对象等, 如: 是正则 还是数组

因为只要是对象数据类型,返回的结果都是"object";

语法: [实例] instanceof [类]

@局限性:

1、不能处理基本数据类型值

2、只要在当前实例的原型链( proto )中出现过的类,检测结果都是true(用户可能会手动修改原型链的指向:exampleproto 或者 在类的继承中 等情况)

@原理

在类的原型上一般都会带有CONSTRUCTOR属性,存储当前类本身,我们也是利用这一点,获取某实例的CONSTRUCTOR属性值,验证是否为所属的类,从而进行数据类型检测

@局限性

可以去随意修改对应的constructor值或者是手动给ary增加一个私有的constructor属性等;

"[object 所属类]" ,例如:"[object Array]"

所有的数据类型上都有toString方法,只有Object原型上的toString是检测当前实例所属类的详细信息的,其它原型的方法仅仅是转换为字符串;

@原理

1首先基于原型链查找机制,找到ObjectprototypetoString

2把找到的方法执行,方法中的this -> obj

3方法内部把this(obj)的所属类信息输出

=>方法执行,方法中的this是谁,就是检测谁的所属类信息

@优势

所有数据类型隶属的类信息检测的一清二楚

String/Boolean/Null/Undefined/Symbol/Object/Array/RegExp/Date/Math/Function

结合每个方法,属性的优缺点,我们来封装一个简单的检测数据类型库:

<script type="text/javascript">

windowonload=function(){

obj={},

objbts=documentgetElementsByTagName("dt"),

objcontent=documentgetElementsByTagName("dd");

var menu=new MenuBts(obj);

}

function MenuBts(obj){

thisbts=objbts,

thiscontent=objcontent,

thisindex=0,

thisinitiate();

}

MenuBtsprototype={

initiate:function(){

var _this=this;

for(var i=0;i<thisbtslength;i++){

thisbts[i]index=i;

thisbts[i]onmouseover=function(){

_thishide(_thiscontent[_thisindex]);

_thisdisplay(_thiscontent[thisindex]);

_thishoverCss(this);

_thisoutCss(_thisbts(_thisindex));

_thisindex=thisindex;

}

}

},

hide:function(obj){

objstyledisplay="none";

},

display:function(obj){

objstyledisplay="block";

},

hoverCss:function(obj){

objclassName="dthover";

},

outCss:function(obj){

objclassName="";

}

}

</script>

1 定义js类 js并不是一种面向对向的语言, 没有提供对类的支持, 因此我们不能像在传统的语言里那样 用class来定义类, 但我们可以利用js的闭包封装机制来实现js类, 我们来封装一个简的Shape类

代码如下:

function ShapeBase() { thisshow = function(){ alert("ShapeBase show"); }; thisinit = function(){ alert("ShapeBase init"); }; }这个类里定义了两个方法:show和init, 需要注意的是这里用到了this来声明, 而不是var, 因为用var是用来定义私有方法的 另外, 我们还可以用prototype属性来定义Shape的方法

代码如下:

ShapeBaseprototypeshow=function() { alert("ShapeBase show"); } ShapeBaseprototypeinit=function() { alert("ShapeBase init"); }上面这种写法看起来不太直观,我们可以将所有的方法写在一起

代码如下:

ShapeBaseprototype={ show:function(){ alert("ShapeBase show"); }, init:function() { alert("ShapeBase init"); } };现在, 类是写好了, 让我们写个js来测试下, 看看结果是不是跟我们想象的一样呢

代码如下:

function test(src){ var s=new ShapeBase(); sinit(); sshow(); }看到了吧, 其调用方式和C#一模一样, 而结果也如我们所料 到目前为止, 我们学会了如何创建js的类了, 但还只是实例方法,要是实现跟C#中的静态方法要怎么做呢? 其实, 实现js的静态方法很简单, 看下面如何实现:

代码如下:

//静态方法 ShapeBaseStaticDraw = function() { alert("method draw is static"); }2 实现JS类抽象和继承 同样, js中也不支持类继承机制,但我们可以通过将父类prototype中的成员方法复制到子类的prototype中来实现 和类的继承一样,JavaScript也没有任何机制用于支持抽象类但利用JavaScript语言本身的性质可以实现自己的抽象类 首先来看看js中的虚方法, 在传统语言中虚方法是要先定义的, 而包含虚方法的类就是抽象类,不能被实例化,而在JavaScript中,虚方法就可以看作该类中没有定义的方法,但已经通过this指针使用了 和传统面向对象不同的是,这里虚方法不需经过声明,而直接使用了, 并且类也可以被实例化 先定义object的extend方法, 一个为静态方法,一个为实例方法, 这两个方法用于实现继承的prototype复制

代码如下:

Objectextend = function(destination, source) { for (property in source) { destination[property] = source[property]; } return destination; } Objectprototypeextend = function(object) { return Objectextendapply(this, [this, object]); }接下来我们实现一个继承类Rect, 这里先用一种简单的方法来实现。

代码如下:

function Rect() { } Rectprototype = ShapeBaseprototype; //只这一句就行了 //扩充新的方法 Rectprototypeadd=function() { alert("Rect add"); }这种方法不能用于重写,如果改变了show方法, ShapeBase的show也会指向同一函数可能是由于prototype赋值只是简单的改变指向地址 如果上面也定义了:

Rectprototypeshow=function() { alert("Rect show"); }那么执行结果如下:

function test(){ var s=new ShapeBase(); sshow(); //结果:Rect show var r=new Rect(); rshow(); //结果:Rect show radd(); }我们再使用objectextend实现继承, 并实现一个oninit虚方法, 修改ShapeBase如下:

代码如下:

ShapeBaseprototype={ show:function() { alert("ShapeBase show"); }, initialize:function () { thisoninit(); } };实现Rect类继承

代码如下:

Rectprototype=(new ShapeBase)extend({ //添加新的方法 add:function() { alert("Rect add"); }, //使用这种方法可以重写show方法 show:function() { alert("Rect show"); }, //实现虚方法 oninit:function() { alert("Rect oninit"); } })

以上就是关于前端基本功:JS(十一)动画封装(CSS样式获取、JSON遍历)全部的内容,包括:前端基本功:JS(十一)动画封装(CSS样式获取、JSON遍历)、2. JS数据类型检测_封装一个数据类型检测的方法库、滑动门、target标签的JS如何封装成函数,多次调用。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/web/10131235.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存