Javascript新闻滚动条

Javascript新闻滚动条,javascript,Javascript,查看此网站顶部的新闻滚动条 你知道这个网站使用什么库/函数来实现这样一个平滑的滚动条吗?爱好者雷米·夏普(Remy Sharp)有自己的字幕插件,你可以很容易地实现。您可以在上或通过访问来收集更详细的信息 对于Mootools用户来说,有 您还可以在线查看此示例的实际代码,搜索“uifundle”以查找目标脚本。他们有一个格式非常好的代码块,您可以学习。访问站点时打开您最喜欢的JS调试器,等待一切都开始移动,然后在调试器中按“全部中断”或等效键。您将看到如下内容: Dashboard.UI.E

查看此网站顶部的新闻滚动条

你知道这个网站使用什么库/函数来实现这样一个平滑的滚动条吗?

爱好者雷米·夏普(Remy Sharp)有自己的字幕插件,你可以很容易地实现。您可以在上或通过访问来收集更详细的信息

对于Mootools用户来说,有


您还可以在线查看此示例的实际代码,搜索“uifundle”以查找目标脚本。

他们有一个格式非常好的代码块,您可以学习。访问站点时打开您最喜欢的JS调试器,等待一切都开始移动,然后在调试器中按“全部中断”或等效键。您将看到如下内容:

Dashboard.UI.EndlessLine = function() {
    var me = this;
    me.jq = $(me);
    me.classNames = { CONTAINER: "uiEndless", VIEW: "uiEndlessView", CANVAS: "uiEndlessCanvas", TILE: "uiEndlessTile" };
    var canvas = null;
    var view = null;
    var tiles = null;
    var x = 0;
    var xx = 0;
    var canvasWidth = 0;
    var step = 1;
    var delay = 40;
    me.initialize = function(container, data, handler) {
        required(container, "container");
        required(data, "data");
        required(handler, "handler");
        container.addClass(me.classNames.CONTAINER);
        view = newDiv(me.classNames.VIEW);
        canvas = newDiv(me.classNames.CANVAS);
        view.append(canvas);
        container.append(view);
        x = 0;
        xx = 0;
        canvasWidth = 0;
        tiles = me.populateTiles(data, handler);
        container.click(function() {
            if (me.started()) me.stop(); else me.start();
        });
    };
    me._resize = function(size) {
    };
    var moveId = 0;
    me.start = function() {
        me.stop();
        me.tick();
    }
    me.stop = function() {
        if (moveId > 0) clearTimeout(moveId);
        moveId = 0;
    }
    me.started = function() {
        return moveId > 0;
    };
    me.tick = function() {
        var tile = tiles.current();
        var width = tile.calculatedWidth;
        if (x < width - step) {
            x += step;
        } else {
            x = 0;
            tile.css("left", canvasWidth + "px");
            if (tiles.advance()) {
                xx = 0;
                canvasWidth = 0;
                do {
                    current = tiles.current();
                    width = current.calculatedWidth;
                    current[0].style.left = canvasWidth + "px";
                    canvasWidth += width;
                } while (!tiles.advance());
            } else {
                canvasWidth += width;
            }
        }
        canvas[0].style.left = -(xx) + "px";
        xx += step;
        moveId = setTimeout(me.tick, delay);
    }
    me.populateTiles = function(data, handler) {
        var tiles = new Dashboard.Core.List();
        var viewWidth = view.contentWidth();
        var maxHeight = 0;
        each(data, function() {
            var tile = newDiv(me.classNames.TILE);
            handler.call(this, tile);
            tile.css({ left: canvasWidth + "px", top: 0 });
            canvas.append(tile);
            var width = tile.outerWidth();
            var height = tile.outerHeight();
            if (maxHeight < height) maxHeight = height;
            tile.calculatedWidth = width;
            canvasWidth += width; // getting width may only be done after the element is attached to DOM
            tiles.append(tile);
            view.height(height);
        });
        return tiles.createCycle();
    }
}
Dashboard.UI.EndlessLine=function(){
var me=这个;
me.jq=$(me);
me.classNames={CONTAINER:“uiEndlessView”,VIEW:“uiEndlessView”,CANVAS:“uiEndlessCanvas”,TILE:“uiEndlessTile”};
var=null;
var-view=null;
var=null;
var x=0;
var-xx=0;
var canvasWidth=0;
var阶跃=1;
无功延迟=40;
me.initialize=函数(容器、数据、处理程序){
所需(集装箱,“集装箱”);
要求(数据,简称“数据”);
必需(经办人,“经办人”);
addClass(me.classNames.container);
view=newDiv(me.classNames.view);
canvas=newDiv(me.classNames.canvas);
view.append(画布);
container.append(视图);
x=0;
xx=0;
画布宽度=0;
tiles=me.populatefiles(数据、处理程序);
容器。单击(函数(){
如果(我.开始())我.停止();否则我.开始();
});
};
me.\u resize=功能(大小){
};
var-moveId=0;
me.start=函数(){
我停下来;
我打勾();
}
me.stop=函数(){
如果(moveId>0)clearTimeout(moveId);
moveId=0;
}
me.started=函数(){
返回moveId>0;
};
me.tick=函数(){
var tile=tiles.current();
var width=tile.calculatedWidth;
如果(x<宽度-步长){
x+=阶跃;
}否则{
x=0;
css(“左”,画布宽度+“px”);
if(tiles.advance()){
xx=0;
画布宽度=0;
做{
当前=tiles.current();
宽度=当前。计算的宽度;
当前[0]。style.left=画布宽度+“px”;
画布宽度+=宽度;
}而(!tiles.advance());
}否则{
画布宽度+=宽度;
}
}
画布[0]。style.left=-(xx)+“px”;
xx+=步进;
moveId=设置超时(me.tick,延迟);
}
me.populateTiles=函数(数据、处理程序){
var tiles=new Dashboard.Core.List();
var viewWidth=view.contentWidth();
var maxHeight=0;
每个(数据,函数(){
var tile=newDiv(me.classNames.tile);
调用(this,tile);
css({左:画布宽度+“px”,顶部:0});
canvas.append(平铺);
var width=tile.outerWidth();
var height=tile.outerHeight();
如果(最大高度<高度)最大高度=高度;
tile.calculatedWidth=宽度;
canvasWidth+=width;//只有在元素附加到DOM之后才能获取宽度
瓷砖。附加(瓷砖);
视图。高度(高度);
});
返回tiles.createCycle();
}
}
给我留下了深刻的印象——所有的东西看起来都很专业,而且都有很好的名称空间


更新:如果您想了解其工作原理,请关注上面定义的
勾选
方法。忽略所有细节(因为我自己还没有真正研究过),它计算步长,将消息元素向左移动一定量,并将下一次勾号调用安排在未来40毫秒。

谢谢Jonathan。我看演示。没有那么顺利。但它比选框标记要好。@Vivek:平滑度将由您设置的选项决定。如果你让它变快,跳跃许多像素,它就会显得急促。如果你让它变慢,一个像素一个像素地移动,它就会变得平滑。让我试试一个真正快速的,看看嗨,乔纳森,我用了这个库,试了一个卷轴。没有那么顺利。谢谢你的链接。非常令人印象深刻。你能告诉我如何容易地得到这个代码吗。我正在使用firefox和firebug。我看不出有什么办法可以打破这一切。谢谢lot@Vivek实际上,我更喜欢IE8进行调试。在IE8和Chrome中,有一个内置调试器,具有我提到的break all函数。在Firefox中,您需要Firebug(您已经拥有)。打开Firebug并单击脚本选项卡。确保它已启用(您应该看到一堆源代码)。在track.dc.gov标题下选择“脚本”,在该标题下显示“控制台”(有一个下拉菜单,您可以选择正在查看的脚本)。然后单击“控制台”左侧的“||”(看起来像一个暂停按钮)。嗨,乔纳森,我无法理解这段代码。有没有你推荐的学习高级javascript的网站?谢谢-Vivek@Vivek这并不简单,我需要一段时间才能弄清楚发生的一切。我推荐你从两本书开始:David Flanagan的《JavaScript:权威指南》和Douglas Crockford的《JavaScript:The Good Parts》。我不知道有什么真正好的在线资源可以学习更高级的JS。