m.jd.com中的部分js效果

昨天把m.jd.com的首页布局写好了,今天写一下首页中部分js效果。头部背景色透明度的改变,焦点图轮播,京东快报的小轮播,以及秒杀倒计时。这里html,css样式就不在赘述,有需要的可以看一下我昨天写好的样式。

在这里,我就把三段js代码分开来写,方便阅读。

1.头部背景色透明度改变

 //找出头部对象
var jd_header = document.querySelector('.jd_header');
var scroll_news = document.querySelector('.scroll_news');
var scroll_list = scroll_news.querySelectorAll('li'); //注册window下的滚动事件,获取滚高度
window.addEventListener('scroll', function () {
var _scrollTop = document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop;
//头部背景色在一定条件下透明度改变
//当滚动高度大于600时,透明度设置为1
if(_scrollTop > 600){
jd_header.style.backgroundColor = 'rgba(209,56,68,1)';
}else{
//滚动条在600以下,透明度为滚动高度/条件高度,设置不同透明度
jd_header.style.backgroundColor = 'rgba(209,56,68,'+_scrollTop/600+')';
}
});

2.焦点图轮播

通常轮播图js中使用方法是使用ul包裹着li,并且让ul滚动。可是这种方法在移动端会出现一些问题,因此,在这里提供一种仅供参考的另一种方法。

首先确定了三个位置,分别为左,中,右。位置分别是负的一屏的宽度(左),0 0 的起始点(中,就是屏幕可视位置),正的一屏位置(右)。初始化定义为left,center,right.在位置中存放下标,只需要让下表产生轮转,当下标改变,图片被替换,再让left,center,right位置图片发生归位操作

 //获取焦点图轮播需要的对象
var course = document.querySelector('.course');
var course_wrap = course.querySelector('.course_wrap');
var course_list = course_wrap.querySelectorAll('li');
var screenWidth = document.documentElement.offsetWidth;
//将li的高度赋给ul,撑起盒子高度
course_wrap.style.height = course_list[0].offsetHeight+'px';
var points_wrap = course.querySelector('.points_wrap'); //首先自动生成轮播图中的小圆点
//根据li的数量自动生成小圆点,追加到points_wrap
for(var i=0;i < course_list.length;i++){
var li = document.createElement('li');
if(i == 0){
li.classList.add('active');
}
points_wrap.appendChild(li);
} //初始化轮播图需要的位置图
var left,right,center;
center = 0;
right = 1;
left = course_list.length-1; //首先让最开始的图片就位
ourse_list[center].style.webkitTransform = 'translateX(0px)';
course_list[left].style.webkitTransform = 'translateX('+-screenWidth+'px)';
course_list[right].style.webkitTransform = 'translateX('+screenWidth+'px)';
window.addEventListener('resize',function(){
screenWidth = document.documentElement.offsetWidth;
// 获取LI的高度赋值给ul
course_wrap.style.height = course_list[0].offsetHeight +'px';
}) var carourTimer = setInterval(function(){
// 看到下一张的逻辑
nextPic();
}, 1000); /*
滑动设置图片位置
(1)获得手指的滑动距离
(2)直接让获得的距离和默认的位置相加
(3)在滑动结束后去判断有没有滑动成功,如果滑动成功则看到下一张或者上一张,没有成功,返回当前原点
*/
course.addEventListener('touchstart',touchstartHandler);
course.addEventListener('touchmove',touchmoveHandler);
course.addEventListener('touchend',touchendHandler);
var startX = 0,startTime,dx = 0;
function touchstartHandler(e){
// 获取手指的X坐标
startX = e.touches[0].pageX;
// 获取手指滑动开始的时间
startTime = new Date();
// 停止定时器
clearInterval(carourTimer);
// 清除过渡
setTransition(false,false,false);
};
function touchmoveHandler(e){
// 获取滑动的距离
dx = e.touches[0].pageX - startX; // 重置去设置li的位置
setTranslateX(dx);
};
function touchendHandler(e){
var t = new Date() - startTime;
// 在结束的时候重新获取滑动的距离
var dx = e.changedTouches[0].pageX - startX
// 当dx为一个大于屏幕1/3的值的时候或者滑动的时间小于500毫秒滑动的区间大于30像素,则判定滑动成功,需要看到上一张
// 当dx为一个小于-屏幕1/3的值的时候或者滑动的时间小于500毫秒滑动的区间大于30像素,则判定滑动成功,需要看到下一张
if(dx < -(screenWidth/3) || (t < 500 && dx < -30)){
nextPic();
}else if(dx > screenWidth/3 || (t < 500 && dx > 30)){
prevPic();
}else{
// 添加过渡
setTransition(true,true,true);
// 回归原位
setTranslateX();
}
// 重新启动定时器
carourTimer = setInterval(function(){
// 看到下一张的逻辑
nextPic();
}, 1000);
}; //封装下一张图片的逻辑
function nextPic(){
//让图片轮转
left = center;
center = right;
right++; //极值判断
if(right > course_list.length-1){
right = 0;
}
//添加过渡
//而在图片的三个位置中,right属于替补图片,所以不需要添加过渡
setTransition(true,true,false);
//真正的轮转,让图片和下标对应起来
setTranslateX();
//设置小圆点
setPoints(); }
// 封装上一张图片的逻辑
function prevPic(){
// 轮转
right = center;
center = left;
left --;
// 极值判断
if(left < 0){
left = course_list.length - 1;
}
// 添加过渡
// 因为left是替补的图片,所以不需要添加过渡
setTransition(false,true,true);
// 真正的轮转
setTranslateX();
// 设置小圆点
setPoints();
} //封装小圆点
//注意事项,小圆点的获取一定要在创建的后面,否则获取不到
var points = points_wrap.querySelectorAll('li');
function setPoints(){
//排他思想
for(var i=0;i < course_list.length;i++){
points[i].classList.remove('active');
}
points[center].classList.add('active');
} //封装过渡的设置
function setTransition(a,b,c){
if(a){
course_list[left].classList.add('transitionAll');
}else{
course_list[left].classList.remove('transitionAll');
}
if(b){
course_list[center].classList.add('transitionAll');
}else{
course_list[center].classList.remove('transitionAll');
}
if(c){
course_list[right].classList.add('transitionAll');
}else{
course_list[right].classList.remove('transitionAll');
}
} // 封装移动
function setTranslateX(dx){
dx = dx || 0;
course_list[center].style.webkitTransform = 'translateX('+ (0 + dx) +'px)';
course_list[left].style.webkitTransform = 'translateX('+ (-screenWidth + dx)+'px)';
course_list[right].style.webkitTransform = 'translateX('+(screenWidth + dx) +'px)';
}

3.秒杀倒计时

 //其实倒计时是需要后台返回给你一个时间戳,因为前台的时间不安全,在这里,我就使用js来实现简单倒计时效果

 // 拿到当前时间
var nowTime = new Date();
// 拿到未来时间
var newTime = new Date('Nov 17 2016 18:20:36');
// 将获取到的时间转换成秒
var t = Math.floor((newTime - nowTime)/1000);
//获取元素
var span = document.querySelectorAll('.count_wrap span');
var countTime = setInterval(function(){
t--;
if(t < 0){
clearInterval(countTime);
}
// 将所有的描述转换成小时 分钟 秒的公式
var h = Math.floor(t%86400/3600);
var m = Math.floor(t%3600/60);
var s = Math.floor(t%60);
// 拿到对应位数上的值
span[0].innerHTML = Math.floor(h/10);
span[1].innerHTML = Math.floor(h%10);
span[3].innerHTML = Math.floor(m/10);
span[4].innerHTML = Math.floor(m%10);
span[6].innerHTML = Math.floor(s/10);
span[7].innerHTML = Math.floor(s%10); }, 1000);

好了,这就是三个简单的js效果。其实这部分的js代码可以在封装,有兴趣的可以尝试一下

m.jd.com首页中的js效果的更多相关文章

  1. Sticker.js – 帮助你在网站中加入贴纸效果

    Sticker.js 是一个很小的 JavaScript 库,它允许您在网页中创建漂亮的贴纸效果.没有依赖关系(不需要 jQuery),可以在大多数支持 CSS3 的主流浏览器工作.下面有简单的使用示 ...

  2. js实现淘宝首页图片轮播效果

    原文:http://ce.sysu.edu.cn/hope2008/Education/ShowArticle.asp?ArticleID=10585 <!DOCTYPE html> &l ...

  3. bootstrap中popover.js(弹出框)使用总结+案例

    bootstrap中popover.js(弹出框)使用总结+案例 *转载请注明出处: 作者:willingtolove: http://www.cnblogs.com/willingtolove/p/ ...

  4. html中使用js+table 实现分页

    本文在html中利用js+table实现分页.主要思想是先对table中的所有数据隐藏,然后通过当前页面(currPageNum)来计算当前页要显示的行,并显示出来,首页.下一页.上一页.尾页都依此来 ...

  5. JSF页面中使用js函数回调后台bean方法并获取返回值的方法

    由于primefaces在国内使用的并不是太多,因此,国内对jsf做系统.详细的介绍的资料很少,即使有一些资料,也仅仅是对国外资料的简单翻译或者是仅仅讲表面现象(皮毛而已),它们的语句甚至还是错误的, ...

  6. ThinkPHP中关于JS文件如何添加类似__PUBLIC__图片路径

    在对html样式进行优化的时候,经常会用到Js/jquery进行一些跳转切换的样式,而我们常做的就是在Js/jquery代码中嵌url图片链接代码,以实现动态交互的页面效果. 如下图所示:

  7. 一探前端开发中的JS调试技巧

    前言 调试技巧,在任何一项技术研发中都可谓是必不可少的技能.掌握各种调试技巧,必定能在工作中起到事半功倍的效果.譬如,快速定位问题.降低故障概率.帮助分析逻辑错误等等.而在互联网前端开发越来越重要的今 ...

  8. Tab选项卡切换卡JS效果

    <script type="text/javascript"> /* tab切换选项卡js效果 writed by *** 2010.08.13 1.currentid ...

  9. Yii2的相关学习记录,自定义gii模板和引用vendor中的js、css(四)

    上文中后台模板框架已经搭建起来了,但还是有些不协调,像是有两个User标题,或者我们想自己在gii生成时添加或删除些公用的东西.这就需要我们定义自己的gii模板. 我们以CRUD的模板为例,默认的gi ...

随机推荐

  1. SVN has atopping svn已停止工作 or windows资源管理器无限重启

    准备在空间时间用用linux,就在自己的win7系统上安装了属性系统,用easyBCD安装的,谁知安装好之后win7系统下的svn客户端不能使用了,点击报错“SVN已停止工作”,随后怀疑是linux引 ...

  2. MVC 访问IFrame页面Session过期后跳转到登录页面

    Web端开发时,用户登录后往往会通过Session来保存用户信息,Session存放在服务器,当用户长时间不操作的时候,我们会希望服务器保存的Session过期,这个时候,因为Session中的用户信 ...

  3. Java项目往数据库中插入数据,出现中文乱码

    项目环境: JSP+Servlet+Mysql数据库 需要检查的地方: 1. java项目整体的编码格式为utf-8.并且将数据传递给数据库之前,数据是否依旧是正常的(可以通过打断点的方式一步步跟踪查 ...

  4. SVN版本问题:svn: E155021: This client is too old to work with the working copy at

    最近Android Studio SVN老是提示: SVN版本问题:svn: E155021: This client is too old to work with the working copy ...

  5. Java File.renameTo方法的问题

    今天发现一个问题,renameTo执行失败. 程序是这样的:一个小程序在执行完成时会将A目录的文件renameTo到B目录,该程序一直运行正常.今天将B目录进行了mount挂载(Linux上),挂载后 ...

  6. C#创建DBF自由库 [转]

    先看段代码: string ole_connstring = @"Provider=VFPOLEDB.1;Data Source=D:\;";System.Data.OleDb.O ...

  7. [转]云计算研究必备——精典Google论文

    Google云计算技术奠定其在业界的领先地位,收集经典云计算技术公开文章供大家研究学习: 01)GFS-The Google File System 02) Bigtable - A Distribu ...

  8. C#正则表达式Regex类的用法

    C#正则表达式Regex类的用法 更多2014/2/18 来源:C#学习浏览量:36891 学习标签: 正则表达式 Regex 本文导读:正则表达式的本质是使用一系列特殊字符模式,来表示某一类字符串, ...

  9. Url路径重写的原理

    ASP.net的地址重写(URLRewriter)实现原理及代码示例 吴剑 2007-01-01 原创文章,转载必需注明出处:http://www.cnblogs.com/wu-jian/ 概述 访问 ...

  10. python平台跨平台开发

    有助于跨平台开发的 os 模块属性: linesep  用于在文件中分隔行的字符串 sep  用来分隔文件路径名的字符串 pathsep 用于分隔文件路径的字符串 curdir  当前工作目录的字符串 ...