热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

移动前端--下拉刷新

今天想说的是如何自己操刀做一个js的下拉刷新(js+h5+css3)。既然是下拉,那么应用场景当然就是在手持设备上。在JavaScript的世界里,总是跟很多实用又华丽丽的效果接轨,这是一

  今天想说的是如何自己操刀做一个js的下拉刷新(js + h5 + css3)。既然是下拉,那么应用场景当然就是在手持设备上。在Javascript的世界里,总是跟很多实用又华丽丽的效果接轨,这是一门很有色彩的编程语言。目前网络上也有很多非常优秀的js滑动插件,比如iscroll(最开始我们就是用这款插件,真心很好用,而且解决了很多html的问题)。当然,我要讲的完全没办法和iscroll媲美,仅仅是简简单单的一角而已,主要目的在于对这点小知识的总结和分享。

  之前也有讲过,移动设备上对CSS3和Html5的支持相当的不错,而且使用Css3我们可以轻松的实现滑动效果,不仅不用担心性能问题,而且效果上也是无可挑剔的。那么究竟需要做成什么样的效果呢?

效果?嘿嘿,当然是类似淘宝那样的。

 

(这里是用chrome模拟iphone5上的效果,关于如何模拟 这里 有讲过的,不再赘述。)

 当往下拖动页面的时候出现红色箭头所指向的灰色区域,随着往下拖动的节奏,橘黄色的圈不断的被填满,然后停顿几秒页面刷新(不太明白的话就自己试试吧)。 额额,可是楼上的图片貌似不是很适合做分析。下面以一个极为粗糙的页面做整个思路分析。

 

布局很重要!

整个过程中,布局是决定编码难度及js代码量的重要因素,科学的布局可以带来飞一般的感觉(当然,不同的效果布局上有所不同也是正常的)

查看粗制滥造的在线Demo 请戳这里

         

 

   图1 所展示的是整个需要滑动的页面的布局结构。整个布局使用的是一个div(蓝色框部分)里包含 加载数据的提示部分(简称“提示部分”)(红色框部分) 和需要刷新的内容部分(简称“内容部分”)(文字部分)两个div的结构。如果外层div向下移动,那么里面的提示部分和内容部分自然就跟着向下移动了(这样是不是比同时使用js去控制两个元素上下移动简单多了?)

   图2 所展示的是正常的内容页面(滑动完成之后,也是滑动之前的效果),布局上主要是利用css3的transform属性控制提示部分的隐藏和显示。当translateY为负时,整个div向上移动(图2的效果),为0时,整个提示部分就完全展示出来(图1的效果)

 

   对于上面的描述如果没看懂也别再看了(正在努力突破自我表达极限)。直接上代码:

 

<html>
<head>
<meta name="viewport" content=">
<title>testtitle>
head>
<body style="background-color: beige;">
<div id="container" style="width:100%;border:solid 1px blue; transform:translate(0px,-61px)">
<div style="height:50px; line-height:50px; text-align:center; width:100%; border:solid 1px red;">
努力加载中...
div>
<div style="width:100%; line-height:30px;background-color:#F2F2F2; font-size:17px; font-family:'Adobe Garamond Pro'">
        Javascript一种直译式脚本语言,是一种动态类型、弱类型、基于原型的语言,内置支持类型。它的解释器被称为Javascript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在HTML(标准通用标记语言下的一个应用)网页上使用,用来给HTML网页增加动态功能。
在1995年时,由Netscape公司的Brendan Eich,在网景导航者浏览器上首次设计实现而成。因为Netscape与Sun合作,Netscape管理层希望它外观看起来像Java,因此取名为Javascript。但实际上它的语法风格与Self及Scheme较为接近。[1]
为了取得技术优势,微软推出了JScript,CEnvi推出ScriptEase,与Javascript同样可在浏览器上运行。为了统一规格,因为Javascript兼容于ECMA标准,因此也称为ECMAScript。

Javascript是一种属于网络的脚本语言,已经被广泛用于Web应用开发,常用来为网页添加各式各样的动态功能,为用户提供更流畅美观的浏览效果。通常Javascript脚本是通过嵌入在HTML中来实现自身的功能的。[3]
是一种解释性脚本语言(代码不进行预编译)。[4]
主要用来向HTML(标准通用标记语言下的一个应用)页面添加交互行为。[4]
可以直接嵌入HTML页面,但写成单独的js文件有利于结构和行为的分离。[4]
跨平台特性,在绝大多数浏览器的支持下,可以在多种平台下运行(如Windows、Linux、Mac、Android、iOS等)。
Javascript脚本语言同其他语言一样,有它自身的基本数据类型,表达式和算术运算符及程序的基本程序框架。Javascript提供了四种基本的数据类型和两种特殊数据类型用来处理数据和文字。而变量提供存放信息的地方,表达式则可以完成较复杂的信息处理。[5]
div>

div>

body>
html>

<script type="text/Javascript" src="http://libs.baidu.com/jquery/1.11.1/jquery.min.js">script>
Html相关代码

 

    布局上大致就是这样的结构,那么~

    Javascript该做什么呢?  

    1、根据滑动轨迹动态调整滑块位置(transfrom=>translate);

    2、根据滑动的距离判断是否执行刷新(或数据加载)。

    当然,如果滑动结束后使用ajax重新加载页面数据,还将涉及到一个页面向上滑动并隐藏提示部分的效果。

    

    大致思路:

    (前提条件:当前元素已滑动至顶部) 

    1、当鼠标左键按下(移动设备上的touchstart事件)的时候记录下当前鼠标位置的 Y轴坐标;

    2、当鼠标移动的时候(touchmove事件),记录下鼠标的Y 轴坐标判断滑动轨迹并进行相应的滑块移动;

    3、当鼠标左键松开(touchend事件)的时候,通过对比鼠标开始和结束的Y轴坐标的距离判断是否应该刷新页面(或重新加载数据)。

 亮代码,秀画风:

/*
*obj--滑动对象
*offset--滑动距离(当滑动距离大于等于offset时将调用callback)
*callback--滑动完成后的回调函数
*/
var slide = function (obj, offset, callback) {
var start,
end,
isLock
= false,//是否锁定整个操作
isCanDo = false,//是否移动滑块
isTouchPad = (/hp-tablet/gi).test(navigator.appVersion),
hasTouch
= 'ontouchstart' in window && !isTouchPad;

//将对象转换为jquery的对象
obj = $(obj);

var objparent = obj.parent();

/*操作方法*/
var fn =
{
//移动容器
translate: function (diff) {
obj.css({
"-webkit-transform": "translate(0," + diff + "px)",
"transform": "translate(0," + diff + "px)"
});
},
//设置效果时间
setTranslition: function (time) {
obj.css({
"-webkit-transition": "all " + time + "s",
"transition": "all " + time + "s"
});
},
//返回到初始位置
back: function () {
fn.translate(
0 - offset);
//标识操作完成
isLock = false;
}
};

//滑动开始
obj.bind("touchstart", function (e) {

if (objparent.scrollTop() <= 0 && !isLock) {
var even = typeof event == "undefined" ? e : event;
//标识操作进行中
isLock = true;
isCanDo
= true;
//保存当前鼠标Y坐标
start = hasTouch ? even.touches[0].pageY : even.pageY;
//消除滑块动画时间
fn.setTranslition(0);
}
});

//滑动中
obj.bind("touchmove", function (e) {

if (objparent.scrollTop() <= 0 && isCanDo) {

var even = typeof event == "undefined" ? e : event;

//保存当前鼠标Y坐标
end = hasTouch ? even.touches[0].pageY : even.pageY;

if (start < end) {
even.preventDefault();
//消除滑块动画时间
fn.setTranslition(0);
//移动滑块
fn.translate(end - start - offset);
}

}
});


//滑动结束
obj.bind("touchend", function (e) {
if (isCanDo) {
isCanDo
= false;
//判断滑动距离是否大于等于指定值
if (end - start >= offset) {
//设置滑块回弹时间
fn.setTranslition(1);
//保留提示部分
fn.translate(0);

//执行回调函数
if (typeof callback == "function") {
callback.call(fn, e);
}
}
else {
//返回初始状态
fn.back();
}
}
});
}
Javascript相关代码

 

 代码分析:

 1、参数:obj,要滑动的对象;offset,提示部分的transform的值(代码中是 transform:translate(0px,-61px) ,那么这里就是61);callback,回调函数,在下拉完成后调用的函数(页面刷新或数据加载)。

 

 2、为什么是transform不是margin? 

  因为transform不会引起重绘,相比margin更流畅,性能更好。但是transfrom有个比较好玩的地方,如果translateY的值为负数(当前元素上移xx像素)下方元素不会跟着上移(margin会上移),在这点上它和margin是有区别的。 注意,这里的-webkit-transform的存在是有必要的,因为有些浏览器识别不了transform,比如微信内置浏览(我的手机上是这样的)。为了兼容性,多扣几个字母是值得的。

 

 3、关于transition设置为0s。

  为什么要在touchstart的时候把transition的值设置为0秒呢?transition的作用是为元素属性的变化添加过渡效果,例如一个框变大,我们设置为transition为1s,那么这个框就是在1s内变大到指定大小。第一个参数表示设置过渡效果的 CSS 属性的名称(如:margin,transform;all表示所有),第二个参数表示过渡的时间。 代码中设置transition的目的是在于滑动结束后(手指离开屏幕)为滑块回弹添加过渡效果,这样看上去就不会那么突兀。当然,这个过渡效果同样会应用到数据加载完成后提示部分的隐藏上。设置为0是为了取消在滑动过程中的滑块过渡效果,我们手指往下滑动的时候,滑块会跟这向下移动,这样就有了滑动滑块的效果。如果这个时候不取消transition就会出现滑块抖动的效果(嘿嘿,有兴趣的话可以试试这种感觉。)。整个过程中transition是相当重要的。

 

 4、关于isLock和isCanDo.

   这两个变量的作用在于防止二次滑动,在第一次滑动后数据加载完成之前不允许有第二次的滑动。当滑动开始的时候讲isLock和isCanDo都设置为True,表示允许后面两个事件里的代码可以正常运行,当滑动结束后isCanDo设置为false表示在isLock被设置为True之前(整个操作完成之前)所有的事件代码均不可用(不执行下拉数据加载等相关动作)

 

5、如何使用?

这个比较就简单,但也比较重要。

    $(function () {

slide(
"#container", 61, function (e) {
var that = this;

setTimeout(
function () {
that.back.call();
},
2000);

});
});
View Code

  代码中的setTimeout是用于模拟ajax加载数据的效果,加载数据这部分就没有再单独写过了。Javascript的回调函数是用着最顺手的特性之一。这里在数据加载完成后需要调用一个back方法,这个方法目的就是重置slide里的各种状态。关于这种传来传去的方式给人的感觉有点像做地下工作,不太容易被发现,可暂时也没有想到更好的解决方案。

 

  最后:

如果各位有什么好的方法或想法,欢迎大家在楼下@我

 

  


推荐阅读
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 如何在HTML中获取鼠标的当前位置
    本文介绍了在HTML中获取鼠标当前位置的三种方法,分别是相对于屏幕的位置、相对于窗口的位置以及考虑了页面滚动因素的位置。通过这些方法可以准确获取鼠标的坐标信息。 ... [详细]
  • 本文介绍了响应式页面的概念和实现方式,包括针对不同终端制作特定页面和制作一个页面适应不同终端的显示。分析了两种实现方式的优缺点,提出了选择方案的建议。同时,对于响应式页面的需求和背景进行了讨论,解释了为什么需要响应式页面。 ... [详细]
  • 本文详细解析了JavaScript中相称性推断的知识点,包括严厉相称和宽松相称的区别,以及范例转换的规则。针对不同类型的范例值,如差别范例值、统一类的原始范例值和统一类的复合范例值,都给出了具体的比较方法。对于宽松相称的情况,也解释了原始范例值和对象之间的比较规则。通过本文的学习,读者可以更好地理解JavaScript中相称性推断的概念和应用。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • 本文介绍了django中视图函数的使用方法,包括如何接收Web请求并返回Web响应,以及如何处理GET请求和POST请求。同时还介绍了urls.py和views.py文件的配置方式。 ... [详细]
  • 本文介绍了腾讯最近开源的BERT推理模型TurboTransformers,该模型在推理速度上比PyTorch快1~4倍。TurboTransformers采用了分层设计的思想,通过简化问题和加速开发,实现了快速推理能力。同时,文章还探讨了PyTorch在中间层延迟和深度神经网络中存在的问题,并提出了合并计算的解决方案。 ... [详细]
  • 突破MIUI14限制,自定义胶囊图标、大图标样式,支持任意APP
    本文介绍了如何突破MIUI14的限制,实现自定义胶囊图标和大图标样式,并支持任意APP。需要一定的动手能力和主题设计师账号权限或者会主题pojie。详细步骤包括应用包名获取、素材制作和封包获取等。 ... [详细]
  • 本文由编程笔记小编整理,主要介绍了使用Junit和黄瓜进行自动化测试中步骤缺失的问题。文章首先介绍了使用cucumber和Junit创建Runner类的代码,然后详细说明了黄瓜功能中的步骤和Steps类的实现。本文对于需要使用Junit和黄瓜进行自动化测试的开发者具有一定的参考价值。摘要长度:187字。 ... [详细]
author-avatar
旺仔牛奶糖2702938317
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有