原生JS 封装运动函数

在学原生JS之前,一直用jQuery 写运动,各种方便,但是不知其所以然,今天得空看了一个javascript 视频教程(这里不说了,以防广告的嫌疑),只能用一个词语形容之后的感觉-------醍醐灌顶。

/*
- obj 指的是DOM对象
- json 指的是 CSS样式
- 例 startMove(oDiv,{width:100,height:100},function(){})
*/

function startMove(obj,json,fnEnd){
	clearInterval(obj.timer);	//先清除之前的定时器
	obj.timer = setInterval(function(){
		var bStop = true;	// 假设所有的值都到了
		for( var attr in json ){	//遍历json属性
			var cur = (attr == 'opacity') ? Math.round(parseFloat(getStyle(obj,attr))*100) : parseInt(getStyle(obj,attr)); //对opacity 特殊处理
			var speed = (json[attr] - cur)/6;
			speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed); 	//speed 数字转化,防止不能到达目标的bug
			if( cur != json[attr]) bStop = false;	//如果没有达到目标值,则bStop设为false;
			if(attr == 'opacity'){
				obj.style.filter = 'alpha(opacity='+ (cur + speed) +')';
				obj.style.opacity = (cur + speed)/100;
			}else{
				obj.style[attr] = cur + speed + 'px';
			}
		}
		if(bStop){
			clearInterval(obj.timer);
			if(fnEnd) fnEnd();	 //执行回调函数
		}
	},30);
}

function getStyle(obj,name){
	return obj.currentStyle ? obj.currentStyle[name] : window.getComputedStyle(obj,null)[name];	//浏览器兼容性处理,注意getComputedStyle为只读属性
}

function getByClass(oParent,sClass){
	var aEle = oParent.getElementsByTagName('*');
	var aResult =[];
	var re = new RegExp('\\b' + sClass + '\\b','i');
	for(var i=0; i<aEle.length;i++ ){
		if(re.test(aEle[i].className)) aResult.push(aEle[i]);
	}
	return aResult;
}

此框架可以实现大部分的运动效果,下面是我写的仿百度首页幻灯片:

window.onload = function(){
	var oSlide = document.getElementById('slide');
	var asmallpicWrap = getByClass(oSlide,'smallpic')[0];
	var asmallUl = asmallpicWrap.getElementsByTagName('ul')[0];
	var abigpicWrap = getByClass(oSlide,'bigpic')[0];
	var asmallpic = asmallpicWrap.getElementsByTagName('li');
	var obigpic = abigpicWrap.getElementsByTagName('img');
	var oprev = getByClass(oSlide,'prev')[0];
	var onext = getByClass(oSlide,'next')[0];
	var nowIndex = 2;
	var now = 0;

	//大图切换
	for(var i=0; i<asmallpic.length;i++ ){
		asmallpic[i].index = i;
		asmallpic[i].onclick = function(){
			if(this.index == now) return ;
			now = this.index;
			tab();
		}
		asmallpic[i].onmouseover = function(){
			startMove(this,{'opacity':100});
		}
		asmallpic[i].onmouseout = function(){
			if(this.index!=now){
				startMove(this,{'opacity':60});
			}
			tab();
		}
	}

	function tab(){
		obigpic[now].style.zIndex = nowIndex++;
		for(var i=0; i<asmallpic.length;i++ ){
			startMove(asmallpic[i],{'opacity':60});
		}
		startMove(asmallpic[now],{'opacity':100});

		if(now <= 3){
			startMove(asmallUl,{'left':0});
		}else if(now == asmallpic.length-1){
			startMove(asmallUl,{'left':-(now-4)*asmallpic[0].offsetWidth});
		}else{
			startMove(asmallUl,{'left':-(now-3)*asmallpic[0].offsetWidth});
		}
	}

	//下一个
	oprev.onclick = function(){
		now--;
		if(now == -1 ){
			now = asmallpic.length-1
		}
		tab();
	}
	//上一个
	onext.onclick = function(){
		now++;
		if(now == asmallpic.length ){
			now = 0
		}
		tab();
	}

	var timer = setInterval(onext.onclick,3000);
	oSlide.onmouseover = function(){
		clearInterval(timer);
	}
	oSlide.onmouseout = function(){
		timer = setInterval(onext.onclick,3000);
	}

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2025-01-05 17:51:55

原生JS 封装运动函数的相关文章

原生JS封装运动框架

昨天我们说了一下原生JS中常用的兼容性写法,今天我们来说一下运动框架. 正常情况下我们要写一个运动的效果会用到tween.js这么一个插件,这个东西不是一般人写出来的,因为里面涉及的运动效果都是经过一堆数学的函数运算出来的,我们平常人是写不出来的,所有我们就自己封装一个运动框架,有什么问题改起来也方便,下面我们就开始封装. 首先,我们先写一个div,设置一些简单的样式,我们就拿这个div举例子,如下代码: #div{ width: 100px; height: 100px; background

原生JS封装_new函数,实现new关键字的功能

一.前言 众所周知:没有对象怎么办?那就new一个! 那么在JS中,当我们new一个对象的时候,这个new关键字内部都干了什么呢?现在我们就来剖析一下原生JS中new关键字内部的工作原理. 二.原始的new 首先,我们先new一个对象看看: 1 //创建Person构造函数,参数为name,age 2 function Person(name,age){ 3 this.name = name; 4 this.age = age; 5 } 6 //实例化对象小明 7 xm = new Person

原生JS封装ajax函数

1 function ajax(params) { 2 params.data = params.data || ""; 3 params.type = params.type || "get"; 4 if(!params.url) { 5 throw new Error("未指定连接"); 6 } 7 params.async = params.async || true; 8 var xhr; 9 //兼容IE 10 if(window.VB

原生JS封装创建多级菜单函数

手写一个使用原生JS封装的多级菜单的函数,满足以下几点需求. 子类层级不确定,可根据数据自动生成多级菜单. 操作便捷,只需传入一个HTML标签. 缺点: 需要满足特定的数据结构 废话不多说,展示代码.先展示数据代码,注意,使用此封装函数需要满足此数据结构. var data = [{ id: 1, address: "安徽", parent_id: 0 }, { id: 2, address: "江苏", parent_id: 0 }, { id: 3, addre

用原生js封装轮播图

原生js封装轮播图 对于初学js的同学来说,轮播图还是一个难点,尤其是原生js封装轮播图代码,下面是我之前做的一个轮播图项目中封装好的一些代码,有需要的同学可以看一下,有什么不懂的可以看注释,注释看不懂的可以直接私信我 slide.js /* * 轮播图 */ function Slide(elem, ms, d, ind){ this.el = elem; this.w = parseInt(getStyle(elem, "width")); this.h = parseInt(ge

用jQuery基于原生js封装的轮播

我发现轮播在很多网站里面都用到过,一个绚丽的轮播可以为网页增色不少,最近闲来无事,也用原生js封装了一个轮播,可能不像网上的插件那么炫,但是也有用心去做.主要用了闭包的思想.需要传递的参数有:图片地址的数组,图片宽度,上一页,下一页的id,图片列表即ul的id(这儿使用无序列表排列的图片),自动轮播间隔的时间.功能:实现了轮播的自动轮播,可以点击上一页,下一页进行切换. 下面是html中的代码,只需要把存放的容器写好,引入jquery即可: <!DOCTYPE html><html>

原生JS封装Ajax插件(同域&amp;&amp;jsonp跨域)

抛出一个问题,其实所谓的熟悉原生JS,怎样的程度才是熟悉呢? 最近都在做原生JS熟悉的练习... 用原生Js封装了一个Ajax插件,引入一般的项目,传传数据,感觉还是可行的...简单说说思路,如有不正确的地方,还望指正^_^ 一.Ajax核心,创建XHR对象 Ajax技术的核心是XMLHttpRequest对象(简称XHR),IE5是第一款引入XHR对象的浏览器,而IE5中的XHR对象是通过MSXML库中的一个ActiveX对象实现的,因此在IE中可能有3个版本,即MSXML2.XMLHttp.

原生JS封装AJAX

今天我们来说说利用原生JS封装AJAX. jquery框架的AJAX方法确实很好用,但有时候我们写的页面需要引入多个JS插件,不一定哪个插件就会和jquery发生冲突,导致jquery用不了了.或者页面比较简单,不需要加重浏览器的负担,这时我们自己封装一个AJAX就是一个很好的办法. //将数据转换成 a=1&b=2格式;function json2url(json){   var arr = [];   //加随机数防止缓存;   json.t = Math.random();   for(v

原生Js封装的弹出框

<!DOCTYPE HTML> <html lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>原生Js封装的弹出框-弹出窗口-页面居中-多状态可选</title> <style type="text/css"&