我正在将数据库中的动态内容添加到我在网上找到的选框中。问题是 - 内容长度变化很大,脚本需要一组静态宽度才能正常工作。我需要找出一种方法来在我拉动内容时生成宽度,或者让脚本自动生成项目的宽度。这是我在这里找到的非常重要的脚本。这是一个JSFiddle,看看它是如何工作的。
对于那些不喜欢JSFiddle的人,这里有一些简单的html / css
<h1>This runs differently than the ticker for some reason. It's highly annoying in my personal opinion.</h1>
<div id="ticker">
<div class="event">test1</div>
<div class="event">This is Test 2</div>
<div class="event">test3</div>
<div class="event">This is test number 4</div>
</div>
CSS
.event{float: left;}
/* Add width and it will run, sorta fine
.event{width:100px;}
*/
Jquery的
(function($) {
$.fn.textWidth = function(){
return $(this).width();
};
$.fn.marquee = function(args) {
var that = $(this);
var $textWidth = that.textWidth(),
offset = that.width(),
width = offset,
css = {
'text-indent' : that.css('text-indent'),
'overflow' : that.css('overflow'),
'white-space' : that.css('white-space')
},
marqueeCss = {
'text-indent' : width,
'overflow' : 'hidden',
'white-space' : 'nowrap'
},
args = $.extend(true, { count: -1, speed: 1e1, leftToRight: false }, args),
i = 0,
stop = $textWidth*-1,
dfd = $.Deferred();
function go() {
if (that.data('isStopped') != 1)
{
if(!that.length) return dfd.reject();
if(width == stop) {
i++;
if(i == args.count) {
that.css(css);
return dfd.resolve();
}
if(args.leftToRight) {
width = $textWidth*-1;
} else {
width = offset;
}
}
that.css('text-indent', width + 'px');
if(args.leftToRight) {
width++;
} else {
width--;
}
}
setTimeout(go, 10);
};
if(args.leftToRight) {
width = $textWidth*-1;
width++;
stop = offset;
} else {
width--;
}
that.css(marqueeCss);
that.data('isStopped', 0);
that.bind('mouseover', function() { $(this).data('isStopped', 1); }).bind('mouseout', function() { $(this).data('isStopped', 0); });
go();
return dfd.promise();
};
})(jQuery);
$('h1').marquee();
$('#ticker').marquee();
我想到的第一件事是在生成选取框之前获取每个列表项的宽度,并将宽度放入内联。我无法弄清楚如何做到这一点,经过一段时间的玩弄,我放弃了。这是指向website的链接 - 内容通过ajax添加。选框位于顶部。稍后我会删除链接。关于我应该做什么的建议?
答案 0 :(得分:1)
只是一个想法,我没有看到你添加动态部分的代码,但它们是否必须在<div>
标签内?您可以使用.append()
吗?
类似的东西:
$('#ticker').append(response.data); //or whatever the variable would be
所以基本上它只是将文本添加到该div而不是单独的div。 您可能需要在添加所有数据之前不要开始滚动,以便使用选框插件来补偿新添加的文本。
OR
以下是一些可以解决初始问题的代码:
将此功能添加到您的代码中:
$.fn.textWidthTrue = function(){
var html_org = $(this).html();
var html_calc = '<span>' + html_org + '</span>';
$(this).html(html_calc);
var width = $(this).find('span:first').width();
$(this).html(html_org);
return width;
};
然后添加:
$('#ticker').find('.event').each(function(i){ // set the width correctly
$(this).width($(this).textWidthTrue());
});
JSFiddle:http://jsfiddle.net/NYQEL/12/