`
ljqian
  • 浏览: 6821 次
  • 性别: Icon_minigender_1
  • 来自: 常熟
社区版块
存档分类
最新评论

js与jquery实现页面滑动效果

阅读更多

 

前言:

两个月前开始正式工作,之前对js只是听过,没有真正使用过,JQuery也只是听说过有这种东西(大学里太懒散了)由于工作需要,公司安排笔者做一个前端web页面仿iphone滑动效果,经过1个多月的努力,笔者总算是小有所成吧。

首先,笔者实现的是web页面跳转时以左右滑动效果取代直接跳转,其中包括对浏览器前进后退键的支持(即前进后退也支持左右滑动)。当前,目前有几款jquery插件已经实现了该效果,jquery-mobile,jqtouch,jquery-ui,这些插件肯定会比笔者自己写的代码更加可靠些。

 

实现该效果有四个文件需要引入,分别为:

1.  index.php(笔者自己写的首页,是实现滑动效果的基础页面)

2.  slide.js(笔者自己写的滑动效果js文件,里面是实现滑动效果的js代码,不过由于笔者还没怎么学js封装,可能在js大神们看来就像是小孩子捏的泥巴一样)

3.  jquery.js(jquery框架文件,可从http://docs.jquery.com/Downloading_jQuery下载最新版本)

4.  historyFrame.js(js文件是笔者从http://www.cnblogs.com/meteoric_cry/archive/2011/01/11/1933164.html上拷贝来的,功能是实现对浏览器hash值的监听以用来监控浏览器前进后退键)

 

使用方法:

引入4个文件后

1.  index.php页面, var isslide=false;时为打开滑动效果;设置当滑动效果关闭时,window.location.assign("");所要跳转到的页面,该页面为不采用滑动效果时项目的首页

 

2.  slide.js文件中设置var FIRSTPAGEOFSLIDE="";

3.  在需要实现滑动效果的a标签的class中添加一个slide,只有class中有slide类的a标签才会执行滑动效果。笔者设置为当开启滑动效果且被点击的a标签的class中没有slide,则在新窗口中打开连接。

 

遗留问题:

笔者写的滑动效果还是有问题的

1.  笔者的外部文件通过ajax引入到index.php页面中的div,且不将其删除。由于进行了空判断,所以当同一个div中已经有值时,就不再调用ajax方法。该方法的好处是使已经加载过的页面不需要再一次进行ajax方法加载,缺点在于如果页面更新后不能及时的进行用户端的更新。

2.  关于浏览器前进后退键监控的原理是对urlhash值的监控完成的,而不是真正的对浏览器前进后退的监控,也就是说不能判断用户按得是前进键还是后退键,所以笔者把浏览器按键事件一律绑定为向右滑。

3.  笔者试过几款手机浏览器,虽然同为webkit内核的浏览器,各个浏览器之间对滑动方法的支持各异,所以兼容性问题还是蛮大的。

 

 

总结:

写这篇文章的主要目的是为了巩固上个月的学习成果,笔者之前也说了,两个月前才接触的js,同时接触的还有phpajax。觉得js入门还是蛮简单的,现在一般人写的js文件都能看懂。不过看懂归看懂,感觉让笔者自己写一份封装的很好的js文件还是很有压力的。

 

附上源码:

index.php文件

 

 

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <script type="text/javascript" src="jquery-1.7.2.js"></script>
        <script type="text/javascript">
/*在ready事件中判断当前浏览器是否调用滑动效果,若否,则replace到home.php,(home.php为访
问该网址原先要跳转到的首页)若是,则加载滑动效果的js文件,slide.js以及historyFrame.js*/
             var isslide=false; //只需改动isslide的值就能控制要不要使用slide效果
			if(isslide==true){
				window.location.assign("home.php");
			}else{
				funload();
			}
/*加载两段关于滑动效果的js代码*/
			function funload(){

				var js_history=document.createElement("script");
				js_history.setAttribute("type","text/javascript");
				js_history.setAttribute("src","historyFrame.js");
				document.getElementsByTagName("head")[0].appendChild(js_history);

				var js_slide=document.createElement("script");
				js_slide.setAttribute("type","text/javascript");
				js_slide.setAttribute("src","slide.js");
				document.getElementsByTagName("head")[0].appendChild(js_slide);
			}
        </script>
    </head>
    <body>
		<div id="slideonindex" class="divbasestyle divbasestyle_bg"></div>
    </body>
</html>
 

 slide.js文件

 var FIRSTPAGEOFSLIDE="";//FIRSTPAGEOFSLIDE常量用于定义首页默认情况下要载入的页面名,如你的index页面要引进home.php页面,该值则写为var FIRSTPAGEOFSLIDE="home"

//由于笔者对jquery的ajax()方法还没有研究,所以先用原始的ajax方法
var xmlhttp;
//ajax判断浏览器
function S_xmlhttprequest(){
if (window.XMLHttpRequest)
  {// code for IE7+, Firefox, Chrome, Opera, Safari
  xmlhttp=new XMLHttpRequest();
  }
else
  {// code for IE6, IE5
  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
}
/*ajax方法,mypage参数为引入的文件,形式为XXX.XXX,如home.php*/
function testInfo(mypage){
         var divid=mypage.split(".")[0];//去掉.php,只留下home
         S_xmlhttprequest();
         xmlhttp.open("GET",mypage,false);
//ajax请求设为同步请求,这个很重要,可以让其他动作在该页面被引进成功后执行
         xmlhttp.onreadystatechange=function(){
         	if(xmlhttp.readyState==4 && xmlhttp.status==200)
                {
                	divid="div#"+divid;
                	var newpage=xmlhttp.responseText;
                 	var mytest=$(divid);
                	mytest.append(newpage);
			testcheck(divid);
                }else if(xmlhttp.readyState==2 && xmlhttp.status!=200){//如果访问页面不存在,则跳转到首页
                        alert("您所访问的地址不存在");
                        window.location.hash="";//把hash值设为空
                        window.location.replace("index.php");
                }
         }
         xmlhttp.send();
}
/*-----------------------以上为ajax的方法-----------------------------------------------------------*/

$(document).ready(function(){
         /*刷新页面时判断当前hash值,根据当前hash值显示div*/
         var onloadhash=getHash();
         onloadhash=isHashNull(onloadhash);
         showpage(onloadhash);//根据当前url中的hash值显示对应页面
});

/*--------------为a标签绑定事件-----------------------------------------------*/
//重新创建变量nowhash用来存放当前url中的hash值
var nowhash=getHash();
//该方法用于绑定a标签的onclick事件,当a标签触发onclick事件时会把a标签的id号传到方法中,方法根据当前div与目标div进行slideleft方法的滑动
function slideonclick(a_slide){
	var firstpage=nowhash;
	firstpage=isHashNull(firstpage);
	var nextpage=getNextPageid(a_slide);
	slideleft(firstpage,nextpage);
}
/*---------------向左滑动向右滑动的效果实现方法------------------------------------------------------*/
/*滑动方法,thispage为当前页面,latterpage为目标页面,animate方法为滑动方法主体*/
function slideleft(firstpage,nextpage){
	var thispage="div#"+firstpage;
	var latterpage="div#"+nextpage;

/*该if语句用于判断是否在当前页点击了当前页的a标签,如果是则不执行任何操作*/

/*判断目标页面,根据目标页面加载相关信息*/
	createdivforajax(nextpage);//下一张页面加载中(同步加载)
                     //滑动效果开始执行
	$(thispage).animate({left:"-100%"},500);

	$(latterpage).animate({left:"0%"},500,function(){
/*当滑动动画结束后,改变thispage的left样式,原为-100%,改变成100%*/
		$(thispage).css("left","100%");
//隐藏之前的div,之前用的清空,换成隐藏可以避免每次点击都需重新调用ajax方法加载页面
		$(thispage).hide();
	});
                     //改变nowhash的值,使其一直为当前的hash值
	nowhash=nextpage;
}

/*该方法是右滑方法,当浏览器前进后退被点击时触发,共三个参数,第一个是当前页,第二个是下一页,第三个判断是否为加载进来的第一页*/
function slideright(firsthash,nexthash,isFirstPage){
	if(isFirstPage){//判断是否为第一页,若否则执行页面滑动效果切换,若是则重置hash值
		location.replace("#");
	}else{
		var thispage="div#"+firsthash;
		var formerpage="div#"+isHashNull(nexthash);
		$(formerpage).css("left","-100%");
		createdivforajax(isHashNull(nexthash));//该算法有什么用作者也忘了。。只记得没有这个判断会出错
		$(thispage).animate({left:"100%"},500);
		$(formerpage).animate({left:"0%"},500,function(){
			$(thispage).hide();
		});
                                  //改变nowhash的值,使其一直为当前的hash值
		nowhash=nexthash;
	}
}
/*--------------------hash值变化的事件监听器------------------------------------------------------------*/

/*实例化历史管理*/
var historyManager = new HistoryManager();

/*添加监听器,当事件触发时调用该方法,(hash值的改变)*/
historyManager.addListener(function() {
	var previoushash = arguments[0];//上一步的hash值
	var isFirstPage=false;//设置变量isFirstPage,用于判断是否为第一页的boolean值,默认值为false;

	var presenthash=nowhash;//当前的hash值
	if(presenthash==""){//当前页的hash值为空时,设置变量isFirstPage的值为true
		isFirstPage=true;
	}
	slideright(presenthash,previoushash,isFirstPage);
});
         /*通过window所有onclick事件的触发监控,来使historyManager的触发*/
document.onclick = function(ev) {
         ev = ev || window.event;
         var elem = ev.srcElement || ev.target;

         if (elem.tagName && elem.tagName.toLowerCase() == "a") {
		if (ev.preventDefault) {
			ev.preventDefault();
		} else {
			ev.returnValue = false;
		}
		var href = elem.getAttribute("href", 2);
		historyManager.add(href);
	}
}
/*-------------------简化代码所写的方法---------------------------------------------------------*/
/*获取当前页面的hash值,根据hash值判断用户当前在哪个页面*/
function getHash(){
	var myhash=document.location.hash.slice(1);
	return myhash;
}
/*判断所获取的hash值是否为空,为空则赋值FIRSTPAGEOFSLIDE该常量*/
function isHashNull(hash){
	if(hash==""||hash=="null"){
		hash=FIRSTPAGEOFSLIDE;
	}
	return hash;
}
/*根据当前hash值跳转到url指定页面*/
function showpage(nowhash){
	var nowshowpage="div#"+nowhash;
	createdivforajax(nowhash);
	$(nowshowpage).css("left","0%");//把要显示的页面的left样式改为0%,即在当前页显示
}
/*
该方法用于控制调用创建新的用于存放ajax引入页面的div,调用ajax方法以及控制div的显示
通过判断div中的值是否为空判断是否加载ajax
*/
function createdivforajax(mydivid){
	var mydiv="div#"+mydivid;
	var mypage=mydivid+".php";
	if($(mydiv).text()=="")//这一步是有缺陷的,如果后台信息更新,用户不能及时获取最新的信息
	{
		createDIV(mydivid);
		testInfo(mypage);
		$(mydiv).show();
	}else{
		$(mydiv).show();
	}
}
/*根据页面a标签方法返回的id值来确定目标页面的名称
具体工作原理是根据返回的a标签的id找到a标签的href属性,形式为#XXX,返回XXX
*/
function getNextPageid(a_slide){
	var nextpage="";
	nextpage=a_slide.getAttribute("href").split("#")[1];
	return nextpage;
}
/*创建该方法用于改写 在开启slide滑动模式后 的ul标签内代码*/
function testcheck(divid){
	if($(divid+" p:first").attr("checked")==="true") return;//这部是
	setSlide();
	deletehash();
	$(divid+" p:first").attr("checked","true");
}
/*获取class为slide的a标签,改变a标签的属性值,href,onclick*/
function setSlide(){
	var a_slide=$("a.slide");
	for(i=0;i<a_slide.length;i++){//循环改变每个class值为slide的a标签的href属性以及onclick属性
		var hrefvalue=a_slide.eq(i).attr("href");
		if(hrefvalue.indexOf("#")>=0){//如果href的值本身就有"#"符号,即已经被调用该方法,则去除"#"符号
			hrefvalue=hrefvalue.split("#")[1];
		}
		hrefvalue="#"+hrefvalue.split(".")[0];//本身取出的href值为xxx.php,现只取xxx部分
		a_slide.eq(i).attr("href",hrefvalue);//把改变的href值重新付给href属性
		a_slide.eq(i).attr("onclick","slideonclick(this)");//为该a标签绑定onclick事件,调用slideonclick(this.id)事件实现左滑动效果
	}
}
/*如果a标签的class没有slide属性,则不实现滑动效果,直接跳转*/
function deletehash(){
	var a_not_slide=$("a:not(a.slide)");
	for(i=0;i<a_not_slide.length;i++){
		var not_slide="";
		var not_slide=a_not_slide.eq(i);
		not_slide.click(function(){
			var hrefvalue=this.getAttribute("href");
			window.open(hrefvalue);
		});
	}
}
/*生成存放ajax方法引入的php页面的div*/
function createDIV(divid){
	var newdiv='<div id="'+divid+'" style="position:absolute;left:100%"><p checked="false"></p></div>';
	$("div#slideonindex").append(newdiv);
}
 
  更新:
1.testcheck(divid);已从157行该写到27行。

分享到:
评论

相关推荐

    jQuery制作单页面滑动效果仿猎豹浏览器

    总结来说,实现jQuery制作的单页面滑动效果仿猎豹浏览器,需要对HTML、CSS和JavaScript有深入理解,特别是jQuery的API使用。通过以上步骤和提供的资源,开发者可以创建出一个流畅、响应式的单页面滑动网站,提供类似...

    jQuery实现按钮滑动切换

    在本文中,我们将深入探讨如何使用jQuery库来实现按钮的滑动切换效果。jQuery是一个强大的JavaScript库,它简化了HTML文档遍历、事件处理、动画和Ajax交互等任务,使得开发者能够更高效地创建交互式的网页应用。 ...

    jQuery实现标题滑动框效果

    3. **动画方法**:jQuery提供了`.slideToggle()`, `.slideUp()`, 和 `.slideDown()`等方法来实现滑动效果。这些方法可以改变元素的高度、宽度或者可见性,从而实现滑入、滑出的效果。例如,我们可以使用`.slideDown...

    jquery实现滑动效果

    jQuery 的滑动效果可以与动画队列、淡入淡出效果等结合,实现更复杂的交互。例如,我们可以让元素在滑动显示的同时淡入: ```javascript $('#slideElement').stop().hide().fadeIn(500).slideDown(1000); ``` 六、...

    Jquery实现关键字滑动效果和层气泡提示特效实例源码

    3. **js**:这个文件夹可能包含了一个或多个.js文件,其中包含实现滑动效果和气泡提示特效的jQuery代码。 4. **css**:这里是CSS样式表,定义了元素的布局、颜色、动画效果等。 在`demo.html`中,需要引入jQuery库...

    CSS+jQuery实现的超酷滑动效果

    在实现滑动效果中,jQuery可以监听用户的交互事件,如点击按钮或链接,然后执行相应的JavaScript函数来改变CSS样式。例如,`slideToggle()`函数是一个常见的jQuery方法,它能够实现元素的展开和折叠,同时提供平滑的...

    jquery坐标标尺滑动效果.rar

    《jQuery坐标标尺滑动效果实现详解》 在网页开发中,为了提升用户体验,我们经常需要引入各种交互式特效,其中坐标标尺滑动效果是一种常见的动态展示数据的方式。本篇将详细介绍如何利用jQuery库来实现这一效果,...

    jQuery图片左右滚动效果代码.zip

    在本文中,我们将深入探讨如何实现一个基于jQuery的图片左右滚动效果,这通常用于网站的轮播图或幻灯片展示。这个效果包含了左右箭头,可以手动切换,同时具备自动轮播的功能,大大增强了用户体验。 首先,我们需要...

    jQuery左右分页滑动.zip

    3. **CSS样式与动画**:为了实现滑动效果,可能需要使用CSS来设置元素的初始位置和过渡效果。jQuery的`.animate()`方法可以创建平滑的动画效果,例如左右移动内容区域来模拟翻页。 4. **DOM操作**:在分页过程中,...

    Discuz导航实现JQUERY滑动效果 v1.0

    3. "jquery-1.4.2.min.js" - 这是jQuery库的一个较旧版本,jQuery是一个流行的JavaScript库,简化了DOM操作、事件处理和动画效果等功能,这里的滑动效果就是通过jQuery实现的。 4. "jquery.plugins.js" - 这个文件...

    jquery页面加载效果

    "jQuery页面加载效果"是指利用JavaScript库jQuery实现的动态加载动画,它能够以吸引人的视觉方式展示网页内容正在加载的过程,使用户在等待期间不会感到乏味。这种效果在现代网页设计中被广泛应用,尤其在内容分块...

    jquery实现屏单页面滑动

    jQuery库简化了JavaScript编程,提供了一系列易于使用的API,使得开发人员可以快速地实现各种复杂的动态效果,包括单页面滚动。下面我们将详细探讨如何使用jQuery来实现这一功能。 首先,我们需要引入jQuery库。这...

    6种jQuery导航栏滑动动画效果

    而`js`文件则是JavaScript代码,包含使用jQuery编写的动画效果逻辑。 例如,为了实现滑动展开效果,JS代码可能如下: ```javascript $(document).ready(function(){ $('.nav-item').hover(function(){ $(this)....

    jquery 多图片左右滑动效果

    本教程将深入探讨如何利用jQuery实现多图片的左右滑动效果,同时确保该功能在多种浏览器上具有良好的兼容性。 一、jQuery 基础 1. jQuery对象与DOM元素:jQuery 使用 $ 符号创建jQuery对象,它可以包裹DOM元素,...

    JavaScript+jQuery网页特效设计实例源码

    JavaScript 和 jQuery 是网页开发中两种非常重要的技术,它们在创建动态、交互式的网页效果方面扮演着关键角色。在这个"JavaScript+jQuery网页特效设计实例源码"的压缩包中,我们很可能会找到一系列实用的代码示例,...

    jquery scrollpane 图片滑动效果代码

    《jQuery ScrollPane 图片滑动效果实现详解》 在网页设计中,动态的图片滑动效果可以提升用户体验,增加页面的吸引力。jQuery ScrollPane 是一个强大的插件,它提供了丰富的定制选项,使得创建图片滑动效果变得...

    jquery实现的图片滑动并带有放大镜效果代码

    这个项目“jquery实现的图片滑动并带有放大镜效果代码”显然是利用 jQuery 实现了一个功能丰富的图片展示功能,包括图片轮播和放大镜效果。下面我们将详细探讨这些知识点。 首先,图片轮播(Slider)是一种常见的...

    jQuery图片自动滑动门效果.zip_jQuery图片自动滑动门效果_图片jquery滑动

    在图片滑动效果中,我们可以使用`.animate()`来实现图片的淡入淡出或左右滑动。 3. **事件监听**:jQuery提供了`.on()`方法来绑定各种事件,如点击事件`click`、定时事件`setInterval`等。通过监听用户的行为或设定...

Global site tag (gtag.js) - Google Analytics