扒皮下腾讯网站地图页面页卡的滚动特效

今天要扒的是腾讯网站地图页面(http://www.qq.com/map/)页卡滚动效果,见下图

有兴趣的童鞋可以去那页面试一试,其动画效果见下图:

那么先理下思路:上方的按钮对应下方的某个栏目,点击某按钮时,其对应的栏目(暂且称为A吧)滚到最上方,原本在A前方的栏目则在滚动结束后自动跳到最后面(这里要注意顺序,比如在A前面有2个栏目B和C,那么B滚完便跳到最后,然后C开始滚,C滚完跳到最后面)。

咱这里说的“跳”可以用append实现,即把前面的元素有序地移到最后。至于滚动,可以在全部栏目外围包一个overflow:hidden的父元素,再让所有栏目一起向上滚动,每次只滚动一个要滚动的栏目高度,且该栏目滚动完再append到父元素后面,次序的问题可以通过数组+animate的callback实现。

先写原型:

<head>
<style>
.mapWrap{margin:10px auto 0px auto; padding:20px; width:940px; background-color:white;}
.map_listWrap{width:940px; overflow:hidden;}
.map_titleWrap span{ display:inline-block; width:193px; padding:20px; background-color:yellow; border:solid 1px white;  text-align:center;}
.map_listWrap div{ position:relative; margin-top:10px; width:908px; padding: 0 15px 15px 15px; border:solid 1px black;}
.map_listWrap div h3{display:block; padding:6px 0 6px 21px;font-size:15px; color:red;}
</style>
<script src="jq.js"></script>
<meta charset="utf-8">
<title>网站地图</title>
</head>

<body>
<div class="mapWrap">
  <div class="map_titleWrap " id="map_titleWrap">
      <span>业务中心</span><span>账户中心</span><span>介绍中心</span><span>帮助中心</span>
  </div><!--map_titleWrap结束-->
  <div class="map_listWrap" id="map_listWrap">
      <div id="map_item0">
      <h3>业务中心</h3>
      <p>
          内容<br/>内容123123<br/><br/><br/>内容<br/><br/>1111内容<br/>
      </p>
    </div>

    <div id="map_item1">
      <h3>账户中心</h3>
      <p>
          内容22222<br/>占位符占位符占位符占位符占位符<br/>内容
      </p>
    </div>

    <div id="map_item2">
      <h3>介绍中心</h3>
      <p>
          内容<br/>内容<br/>内容<br/>内容<br/>内容<br/><br/>占位符占位符占位符占位符占位符<br/>占位符占位符占位符占位符占位符<br/>占位符占位符占位符占位符占位符<br/>
      </p>
    </div>

    <div id="map_item3">
      <h3>帮助中心</h3>
      <p>
          11111<br/><br/>内容<br/>内容<br/>内容<br/>内容<br/>内容<br/>
      </p>
    </div>
  </div><!--map_listWrap结束-->

</div><!--mapWrap结束-->

</body>

接着是脚本。为了方便日后扩展更多栏目,我们得动态地获取、挪动元素,而不是把代码写死。

感觉这里比较难处理的是获取需要滚动的栏目元素,如果单纯地获取被选中栏目元素A的索引i,再把所有栏目索引小于i的元素依次append到后面,这种做法行不通,因为每滚动-append一次之后,所有元素都是打乱重排了,你无法确定你后续再重排出来的顺序能保持如下规则:
0-1-2-3、1-2-3-0、2-3-0-1、3-0-1-2

所以我们可以抛弃对栏目索引的依赖,转而从不变的、固定的元素id入手。我们可以建立一个[0,1,2,3]的数组元素,其数值跟每个栏目的id名(map_item0,map_item1,....,map_item3)后缀对应起来,每次点击上方按钮时,获取按钮的索引i(按钮的索引是固定不变的,可以放心用),然后截取数组第i个元素前面的元素,将其push到数组后面,形成新的栏目队列排序,接着要求栏目按照这个顺序来做重排。

初步脚本如下:

$(document).ready(function() {
    var $wrap = $("#map_listWrap");
    var $listItems = $("#map_listWrap div");   //全部列表栏目
    var wrap_h = $wrap.height();$wrap.css({"height":wrap_h}); //固定Wrap的高,以便overflow生效
    var def_t = $listItems.eq(0).offset().top;  //第一个div的偏移
    var items_l = $listItems.length;
    var arr = new Array(); j = 0; //定义并初始化数组
    while(j<items_l){ arr[j]=j++; }

    $("span","#map_titleWrap").click(function(){
        var i= $(this).index("#map_titleWrap span");
        for(var k=0;k<arr.length;k++){
            if(arr[k]==i){
                var index = k;   //获取被选中的栏目A的索引
                continue;
            }
        }
        var arr_front = arr.slice(0,index);  //获取要滚动的元素(即栏目A前面的元素)的id名后缀
        arr.splice(0,index);
        arr = arr.concat(arr_front);

        for(var k=0;k<arr_front.length;k++){    //按顺序遍历来获得要滚动的元素
                var $item_k = $("#map_item"+arr_front[k]);    //第k个要滚动的元素
                var item_k_h = $item_k.height();
                $listItems.animate({"top":-item_k_h},300,function(){   //栏目整体滚动后才执行下方代码
                    $("#map_item"+arr_front[k]).appendTo($wrap);$listItems.css("top","0");})  //滚动后append到最后,同时重置栏目整体top值
        }
    })
});

但该代码在运行时并没有按预期效果实现。在点多几次后会出现顺序错乱。
这是因为animate是异步执行的,在animate执行的300毫秒里,可能for循环已早早就执行完结束了,而最后一句代码存在动态对象arr_front[k],其索引k经过for循环已改变了它的值,从而导致我们要append的元素不再是一开始确定好的元素。

解决方法是在外面写个带参函数来代入索引,防止元素被更改:

$(document).ready(function() {
    var $wrap = $("#map_listWrap");
    var $listItems = $("#map_listWrap div");
    var wrap_h = $wrap.height();$wrap.css({"height":wrap_h});
    var def_t = $listItems.eq(0).offset().top;
    var items_l = $listItems.length;
    var arr = new Array(); j = 0;
    while(j<items_l){ arr[j]=j++; }

    $("span","#map_titleWrap").click(function(){
        var i= $(this).index("#map_titleWrap span");
        for(var k=0;k<arr.length;k++){
            if(arr[k]==i){
                var index = k;
                continue;
            }
        }
        var arr_front = arr.slice(0,index);
        arr.splice(0,index);
        arr = arr.concat(arr_front);

        var callFun = function(i){    //在for外部定义要执行的函数
                $listItems.animate({"top":-item_k_h},300,function(){
                    $("#map_item"+arr_front[i]).appendTo($wrap);$listItems.css("top","0");
                });
        }

        for(var k=0;k<arr_front.length;k++){
                var $item_k = $("#map_item"+arr_front[k]);
                var item_k_h = $item_k.height();
                callFun(k);  //调用函数
        }
    })
});

OK,问题解决。 共勉~

扒皮下腾讯网站地图页面页卡的滚动特效,布布扣,bubuko.com

时间: 2024-08-07 21:20:24

扒皮下腾讯网站地图页面页卡的滚动特效的相关文章

织梦DedeCMS网站地图模板

亲和百度蜘蛛,分页多层次特色,织梦系统最好用的网站地图! 用 DedeCMS(织梦) 系统搭建的网站多数都是以优化为主要目标的网站类型,既然是优化站 SEO 手段就离不开为网站设置网站地图.可是 DedeCMS 自带的模板没有网站地图,而且 DedeCMS 提供的自带模板未必能满足你的需要.所以能为自己的 DedeCMS 网站选择一个好的织梦网站地图模板就成为一个很重要的问题. WonderCSS.com 本次制作并分享的 DedeCMS 织梦网站地图(html格式)模板是基于自由列表 free

【二毛SEO教程】第六课:SEO概念-404页面、网站地图、301重定向的作用与注意事项

robots.txt文件的概念.特点和写法 1. 概念:robots.txt是一个最简单的.txt文件,用以告诉搜索引擎哪些网页/文件夹可以收录,哪些不允许收录(可以爬行). 提示:/admin/ 拒绝推荐 搜索引擎第一步看的就是网站的robots.txt 文件放在哪里:FTP服务器-网站根目录 穿插小疑问:网站收录特别差,为什么差?原因不明! 推荐解决方法:网站地图+robots.txt结合使用. 推荐阅读:http://blog.csdn.net/yzdzhouxiong/article/d

利用循环栏目导航标签及自定义页面制作帝国CMS网站地图

网站地图,又称站点地图,它就是一个页面,上面放置了网站上所有页面的链接.也简洁地表现了网站栏目关系,一般就包含顶级栏目和二级栏目.搜索引擎蜘蛛非常喜欢网站地图.在帝国CMS中没有生成网站地图的功能,所以嗨分享今天就给大家介绍一种方法生成它的网站地图. 主要用到帝国CMS中的两个重要知识点: 一.循环栏目导航标签(listshowclass) 二.自定义页面 第一步:增加标签模板 帝国CMS网站后台--[模板]-左侧[标签模板]-[管理标签模板] 可以增加一个标签模板,也可以直接使用 ID为1,模

网站建设必不可少的SEO优化工具之网站地图的制作

邵连虎在2010年的时候就开始做网站了,在那个时候经常有人说网站地图有利于搜索引擎收录.可是那个时候我不会制作网站地图.这么多年过来了.这几天又接触到网站地图这个词.好吧,既然有时候我也得好好研究这个网站地图到底是啥东东,下面就与大家来学习一下. 第一,什么是网站地图 网站地图,又称站点地图,它就是一个页面,上面放置了网站上所有页面的链接.大多数人在网站上找不到自己所需要的信息时,可能会将网站地图作为一种补救措施.搜索引擎蜘蛛非常喜欢网站地图. 第二,网站地图的作用是什么 1.为搜索引擎蜘蛛提供

新手如何掌握制作和提交网站地图?

新手如何掌握制作和提交网站地图? 网站地图作为根据网站的结构,框架,内容生成的导航网页文件. 大多数人都知道网站地图对于提高用户体验有好处:它们为网站访问者指明方向,并帮助迷失的访问者找到他们想看的页面. 那么什么是网站地图呢? 在开始介绍网站地图的制作与提交之前,我们有必要先了解一下什么是网站地图. 网站地图也就是sitemap,是一个网站所有链接的容器.很多网站的链接层次比较深,蜘蛛是很难抓取到的,网站地图可以方便搜索引擎蜘蛛抓取网站页面,通过抓取网站页面,可以清晰的了解网站的架构.网站地图

如何提高网站的页面收录量?

1.域名PR.权重 Matt Cutts也曾经说过,网站的收录量和蜘蛛的爬行次数与PR成正比,笼统的说PR值越高,收录越好,蜘蛛爬行次数越多.百度权重也类似,权重越高,排名越好. 2.反向链接 PR值的高低是基于外链的数量,外链是影响收录的主要原因.一个新站内容更新频率高,但外链增加缓慢,也不能算是一个优秀网站.最好的方法是同步更近. 3.内页反向链接 内页反向链接就是指向内容页面的外链,这些外链能让你的内页有很好的排名,也能带动内页的其他页面的收录,有外链的内页会带来不错的收录量. 4.站点导

DEDE5.7如何制作网站地图?

DEDE用的人很多,可能大家在使用的过程中会碰到一些问 题,这很正常的,今天我们来讲讲DEDE5.7如何制作网站地图,其实网站地图分两种,一种做给网友看的,方便网友可以方便地找到自己想浏览的内容,另外 一种是做给搜索引擎蜘蛛看,方便蜘蛛在你网站上面抓取内容.    当然,我们这里讲的主要是针对蜘蛛的,因为DEDE默认的就有针对用户的网站地图,主要是以栏目的形式展现,这个可以在DEDE后台自行生成.其实大家印象当中的网站地图是XML格式的,一般命名成sitemap.xml,接下来进入正题.    

扒皮下京东首页楼层图标的动画效果实现方式

京东首页的楼层图标默认是灰色的,但拉动滚动条,让该图标从下方挪动到屏幕正中的时候,该图标会显示出从上到下由灰变绿的动画效果,如下图 这种效果很有Lazyload的范,也是挺吸引眼球的交互方式,下面用JQ来仿造下这种效果的实现方式,其实挺简单. 首先我是做了2个gif分别作为图标的默认状态和动画状态(注意第二个gif的动画效果只显示一次,不循环的,而且是从下往上<做的着急了点,跟京东的动画方向相反了哈哈>,错过效果的朋友请刷新吧):        P.S. 京东的动画效果并非用动态gif实现的,

织梦dedecms中html和xml格式的网站地图sitemap制作方法

sitemap是网站上各网页的列表.创建并提交sitemap有助于百度(Google)发现并了解您网站上的所有网页,包括百度通过传统抓取方式可能找不到的网页.还可以使用sitemap提供有关你网站的其他信息,如上次更新日期.sitemap文件的更新频率等,供百度 (Google)spider参考. 百度(Google)对已提交的数据,不保证一定会抓取及索引所有网址.但是,百度(Google)会使用sitemap中的数据来了解网站的结构等信息,这样可以帮助百度改进抓取策略,并在日后能更好地对网站进