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