虚拟滚动条实现大数据集预览

<html>
<head>
    <meta charset="UTF-8">
    <title>scroller</title>
    <style>
        .container {
            width: 500px;
            margin: 80px auto 0;
        }
        .wrapper {
            position:relative;
            width: 100%;
            height: 380px;
            overflow: hidden;
        }
        .view {
            position: absolute;
            width: 100%;
            height: 380px;
            border: 1px solid #678;
            overflow-y: scroll;
        }
        .buffer-view {
            position: absolute;
            top: 0;
            left: 0;
            width: 400px;
            background: #35a22e;
            overflow: hidden;
        }
        .actual-domain {
            height: auto;
        }

    </style>
</head>
<body>

    <div class="container">
        <div class="wrapper">
            <div class="buffer-view"></div>
            <div class="view">
                <div class="actual-domain"></div>
            </div>
        </div>
    </div>
    <script src="z.js"></script>
    <script>
        var count = 1000000; // 数据长度
        var data = (function() {
            var len = count,arr = [];while (len--) arr[len] = { _rn: len, val: len+1 }; return arr;
        })();

        var PREBUFFER = 5;     // 预缓存10条记录
        var ROW_HEIGHT = 21;    // 每行元素高度:根据实际取值
        var PREBUFFER_HEIGHT = PREBUFFER * ROW_HEIGHT; // 前后预缓存元素高度
        var PREBUFFER_HEIGHT_TWICE = PREBUFFER_HEIGHT * 2;    // 前后预缓存之和高度

        var VIEW_HEIGHT = $(‘.view‘).height();    // 可视区视图高度
        var bufferView = $(‘.buffer-view‘).height($.nearestModulo(VIEW_HEIGHT, ROW_HEIGHT) +  PREBUFFER_HEIGHT*2);

        var ACTUALDOMAIN_HEIGHT = data.length * ROW_HEIGHT;    // 实际计算区域高度
        var size = bufferView.height() / ROW_HEIGHT;
        $(‘.actual-domain‘).height(ACTUALDOMAIN_HEIGHT);
        $(‘.view‘).on(‘scroll‘, function(evt) {
            var offset = $(this).offset();
            var bottom = ACTUALDOMAIN_HEIGHT - offset.top - VIEW_HEIGHT;
            var top = 0;

            if (offset.top < PREBUFFER_HEIGHT) {
                top = -offset.top;
            } else if (bottom < PREBUFFER_HEIGHT) {
                top    = bottom - PREBUFFER_HEIGHT_TWICE;
            } else {
                top = -PREBUFFER_HEIGHT;
            }

            bufferView.css({ top: top });

            var domain = range(offset.top, offset.top + VIEW_HEIGHT+PREBUFFER_HEIGHT_TWICE);

            if (offset.top + PREBUFFER_HEIGHT_TWICE + VIEW_HEIGHT <= ACTUALDOMAIN_HEIGHT) {
                bufferView.setData(data.slice(domain[0], domain[1]));
            } else {
                bufferView.setData(data.slice(-size));
            }
        });

        function range(start, end) {
            return [
                $.nearestModulo(start, ROW_HEIGHT) /ROW_HEIGHT,
                $.nearestModulo(end, ROW_HEIGHT) /ROW_HEIGHT
            ];
        }

        bufferView.append(‘li‘, size);
        bufferView.setData(data.slice(0, size));

    </script>
</body>
</html>

需要引的js文件:z.js

function $(selector) {
    return {
        dom: dom(selector),
        on: on,
        offset: offset,
        height: height,
        text: text,
        css: css,
        append: append,
        setData: setData,
        value: value
    };
}
$.log = function() {
    console.log.apply(console, arguments);
};

$.nearestModulo = function(num, module) {
    var val = num % module;
    if (val === 0) {
        return num;
    }

    return val < module/2 ? num - val : num + (module - val);
}

function dom(selector) {
    return typeof selector === ‘object‘
    ? selector
    : document.querySelector(selector);
}

function on(evtName, handler, bobble) {
    addEventListener.call(this.dom, evtName, handler, !!bobble);
}

function offset() {
    return {
        left: this.dom.scrollLeft,
        top: this.dom.scrollTop
    };
}

function height(val) {
    if (isNaN(val)) {
        return this.dom.clientHeight;
    } else {
        this.dom.style.height = val;
        return this;
    }
}

function text(str) {
    this.dom.innerText = str;
    return this;
}

function css(attrs) {
    for (var attr in attrs) {
        if (attrs.hasOwnProperty(attr)) {
            this.dom.style[attr] = attrs[attr] + ‘px‘;
        }
    }
}

function append(tagName, size) {
    var docFrag = document.createDocumentFragment();
    while (size--) {
        docFrag.appendChild(document.createElement(tagName));
    }

    this.dom.appendChild(docFrag);
}

function setData(data) {
    var childs = this.dom.childNodes;

    childs.forEach(function(node, i) {
        node.innerText = data[i].val;
    });
}

function value() {
    return this.dom.value;
}
时间: 2024-11-05 10:49:02

虚拟滚动条实现大数据集预览的相关文章

Android 大图片预览ViewPager

项目gitHub地址:  https://github.com/bm-x/PhotoView 个人项目gitHub地址:  https://github.com/anan03/ananwork/tree/master/PhotoView PhotoView 图片浏览缩放控件 和普通的ImageView一样的使用方法 如使用过程中有任何bug,意见或建议,可邮件给我 [email protected] 效果图 注意 由于facebook的Fresco图片加载组件所加载出来的drawable图片并非

Office在线预览及PDF在线预览的实现方式大集合

一.服务器先转换为PDF,再转换为SWF,最后通过网页加载Flash预览 微软方:利用Office2007以上版本的一个PDF插件SaveAsPDFandXPS.exe可以导出PDF文件,然后再利用免费的swftools.exe工具生成swf格式的Flash文件,网页中加载flexpaper免费开源工具(有广告)实现Flash文件的预览.优点:1.有效的保护的源文件及文件的复制,不可复制也是缺点.2.源码是自己的,版权有保证.缺点:1.服务器上必须安装Office软件.2.导出PDF文件本身是个

Office在线预览及PDF在线预览的实现方式史上最全大集合

Office在线预览及PDF在线预览的实现方式大集合 一.服务器先转换为PDF,再转换为SWF,最后通过网页加载Flash预览 微软方:利用Office2007以上版本的一个PDF插件SaveAsPDFandXPS.exe可以导出PDF文件,然后再利用免费的swftools.exe工具生成swf格式的Flash文件,网页中加载flexpaper免费开源工具(有广告)实现Flash文件的预览.优点:1.有效的保护的源文件及文件的复制,不可复制也是缺点.2.源码是自己的,版权有保证.缺点:1.服务器

VMware发布Linux虚拟桌面技术预览版

VMware发布Linux虚拟桌面技术预览版 在众多客户的一片呼吁声中,VMware在3月中旬发布了Linux虚拟桌面的技术预览版.从此,用户可以通过VMware Horizon View来建立.发布并管理Linux虚拟桌面了.抢鲜尝试连接: http://www.surveymethods.com/EndUser.aspx?DFFB978FDE988B88D4 (注意:如果直接点击上面的连接出错,可将其拷贝到浏览器里再打开) 本篇博客将讨论以下三点: 一.    VMware Linux虚拟桌

Windows Server 2016技术预览

Windows Server 2016是微软将于2016年9月份发布的最新服务器操作系统.目前微软官方发布了许多Windows Server 2016新的功能和特性,下面我们来简单看下: 主要内容 预览版界面 系统需求及安装 服务器管理变化 新特性及变化 预览版界面 服务器界面,沉浸而不渲染 登录界面,色调变得活泼起来,用户图像由原先Windows2012的方块变成圆形 继续 进入系统,乍一看,以为是WIN10呢,注意右下角 如此做法,似乎在传递win10的最佳服务器系统就是他了 开始菜单,Al

[Asp.net]常见word,excel,ppt,pdf在线预览方案(转)

引言 之前项目需要,查找了office文档在线预览的解决方案,顺便记录一下,方便以后查询. 方案一 直接在浏览器中打开Office文档在页面上的链接.会弹出如下窗口: 优点:主流浏览器都支持. 缺点:Office文档链接在浏览器中打开,会有如上图的提示,需用户自己选择打开或者保存功能,如果客户电脑上安装迅雷下载软件,会启动迅雷下载,用户体验不好. 方案二 office文档转html,首先引入com组件中office库,然后在程序集扩展中引入word,excel,ppt的dll. 然后F6生成,会

Docker(一):Docker核心技术预览

开始学习docker了,想写一篇docker技术介绍的纯理论文章,发现以下网站的文档写的特别好,就直接引用了,文章转载自: http://www.infoq.com/cn/DockerDeep http://www.infoq.com/cn/articles/docker-core-technology-preview? utm_source=articles_about_DockerDeep&utm_medium=link&utm_campaign=DockerDeep [编者按]Doc

深入浅出Docker(一):Docker核心技术预览

1. 背景 1.1. 由PaaS到Container 2013年2月,前Gluster的CEO Ben Golub和dotCloud的CEO Solomon Hykes坐在一起聊天时,Solomon谈到想把dotCloud内部使用的Container容器技术单独拿出来开源,然后围绕这个技术开一家新公司提供技术支持.28岁的Solomon在使用python开发dotCloud的PaaS云时发现,使用 LXC(Linux Container) 技术可以打破产品发布过程中应用开发工程师和系统工程师两者

nokia 1320升级到win10预览版

4月11号,7点时,通过windows insider登录成功帐号,在这之前连不上. 它要求重启,重启后,也没反应. 后来打开更新,提示找到更新,问是否更新. 我这边是移动网,5Mb的并了4根adsl,下载更新包大约花费时间40分钟,更新大约30分钟. 把原来的程序都保留着. 更新完成以后,各种卡顿,手机发热严重.就把它复位,看情况是否能改善. 复位后,大约30分钟内,发热依旧严重,卡. 在之后,流畅,不再发热. 1.关于发热,卡顿 复位后,重新进入手机向导,微软有一句话: 向导完成以后,系统会