
盒子 原来的位置 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如何封装成函数,多次调用。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)