百度经验-左串珠模拟

原生模拟

by john Chat

HTML

<body>
    <ul class="article">
        <li class="post">
            <div class="icon">1</div>
            <p>
                光盘安装准备:
                win7 64位纯净版安装盘
                如果您使用的苹果电脑有光驱,请优先使用自带光驱安装;
                如果电脑没有光驱,可以是用外接USB光驱安装。
                光盘安装准备:
                win7 64位纯净版安装盘
                如果您使用的苹果电脑有光驱,请优先使用自带光驱安装;
                如果电脑没有光驱,可以是用外接USB光驱安装。
            </p>
        </li>
        <li class="post">
            <div class="icon">2</div>
            <p>光盘安装准备:
                win7 64位纯净版安装盘
                如果您使用的苹果电脑有光驱,请优先使用自带光驱安装;
                如果电脑没有光驱,可以是用外接USB光驱安装。
                光盘安装准备:
                win7 64位纯净版安装盘
                如果您使用的苹果电脑有光驱,请优先使用自带光驱安装;
                如果电脑没有光驱,可以是用外接USB光驱安装。
            </p>
        </li>
        <li class="post">
            <div class="icon">3</div>
            <p>光盘安装准备:
                win7 64位纯净版安装盘
                如果您使用的苹果电脑有光驱,请优先使用自带光驱安装;
                如果电脑没有光驱,可以是用外接USB光驱安装。
                光盘安装准备:
                win7 64位纯净版安装盘
                如果您使用的苹果电脑有光驱,请优先使用自带光驱安装;
                如果电脑没有光驱,可以是用外接USB光驱安装。
            </p>
        </li>
        <li class="post">
            <div class="icon">4</div>
            <p>光盘安装准备:
                win7 64位纯净版安装盘
                如果您使用的苹果电脑有光驱,请优先使用自带光驱安装;
                如果电脑没有光驱,可以是用外接USB光驱安装。
                光盘安装准备:
                win7 64位纯净版安装盘
                如果您使用的苹果电脑有光驱,请优先使用自带光驱安装;
                如果电脑没有光驱,可以是用外接USB光驱安装。
            </p>
        </li>
        <div class="clearfix"></div>
    </ul>
    <div class="clearfix"></div>
    <div id="fake-icon-group">
        <a class="fake-icon fake-current" href="" title="第一个念珠">1</a>
        <a class="fake-icon" href="" title="第二个念珠">2</a>
        <a class="fake-icon" href="" title="第三个念珠">3</a>
        <a class="fake-icon" href="" title="第四个念珠">4</a>
    </div>
    <div class="long">
        <p>一堆用来显示超过隐藏的文字
            一堆用来显示超过隐藏的文字
            一堆用来显示超过隐藏的文字
     ...

CSS

body{
    margin:0;
    padding:0;
}
ul{
    list-style:none;
    float:left;
    width: 560px;
    margin-top:30px;
    padding:0;
}
.icon {
    width: 20px;
    padding:10px;
    height: 20px;;
    background:#9ce290;
    border-radius:20px;
    color:#fff;
    margin-right:20px;
    text-align: center;
    float:left;
}
li{
    margin-bottom:40px;
    float:left;
}
p{
    font-size: 28px;
    width: 500px;
    float:left;
    margin:0;
    line-height: 35px;
}
#fake-icon-group{
    position: fixed;
    left:0px;
    top:0px;
}
.fake-icon{
    width: 20px;
    padding:10px;
    height: 20px;;
    background:grey;
    color:#fff;
    border-radius: 20px;
    text-align: center;
    display: block;
    text-decoration: none;
}
.long{
    width: 560px;
    height:600px;
    margin-left:40px;
    margin-top:50px;
}

.clearfix{
    content:".";display:block;height:0;clear:both;visibility:hidden
}

JavaScript

/**
 * Created by john on 15/6/27.
 */
window.onload = function(){
    var fake_icons = document.getElementsByClassName("fake-icon");
    var icon_arr = document.getElementsByClassName("icon");
    var fake_group = document.getElementById("fake-icon-group");
    var base_line = 0;
    var block_height = 40;
    var ul_height = document.getElementsByClassName("article")[0].offsetHeight * 0.8;
    var i,fake_ln, icon_ln;
    var index = 0;

    // 上滑,下滑及到底部的状态
    var goTop;
    var goDown;
    var isBottom;

    var finishCheck = false;
    // 初始化检查当前位置
    for(i = 0, fake_ln =fake_icons.length;i < fake_ln ;i++){
        fake_icons[i].style.display = "none";
        if(!finishCheck && icon_arr[i].getBoundingClientRect().top > 0 ){
            index = i;
            finishCheck = true;
        } else if(!finishCheck){
            icon_arr[i].style.visibility = "hidden";
            fake_icons[i].style.display = "block";
        }
    }

    base_line = index * block_height;

    var scrollAction = function() {

        goTop = index <= fake_ln-1 && icon_arr[index].getBoundingClientRect().top < base_line;
        goDown = index > 0 &&  icon_arr[(index-1)].getBoundingClientRect().top + block_height > base_line;
        isBottom = -1 * (icon_arr[0].getBoundingClientRect().top) > ul_height;

        if(!isBottom){
            fake_group.style.display = "block";
            if(goTop){
                icon_arr[index].style.visibility = "hidden";
                fake_icons[index].style.display = "block";
                if(index <= fake_ln-1){
                    index++;
                    base_line += block_height;
                }
            }else if(goDown){
                if(index > 0){
                    index--;
                    base_line -= block_height;
                }
                icon_arr[index].style.visibility = "visible";
                fake_icons[index].style.display = "none";
            }
        }else{
            fake_group.style.display =...