0

データベースからオンラインで見つけたマーキーに動的コンテンツを追加しています。問題は、コンテンツの長さが大きく異なり、スクリプトが適切に機能するために一定の静的な幅が必要なことです。コンテンツをプルしている間に幅を生成する方法を見つけるか、スクリプトでアイテムの幅を自動生成する必要があります。これは、実際にここで見つけた非常に重要なスクリプトです。これがどのように機能するかを確認するための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;}
*/

</p>

Jクエリ

(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();​

最初に考えたのは、マーキーを生成する前に各リスト項目の幅を取得し、幅をインラインに配置することでした。私はそれを行う方法を理解できませんでしたが、しばらく遊んだ後、あきらめました。これは、コンテンツが ajax を介して追加されているWeb サイトへのリンクです。マーキーは上部にあります。少ししたらリンクを外します。何をすべきかについての提案はありますか?

4

1 に答える 1

1

アイデアですが、動的部分を追加しているコードが表示されませんが、<div>タグ内にある必要がありますか? 代わりに使え.append()ますか?

何かのようなもの:

$('#ticker').append(response.data); //or whatever the variable would be

したがって、基本的には、個別のdivではなく、そのdivにテキストを追加するだけです。マーキー プラグインが新しく追加されたテキストを補正するために、すべてのデータが追加されるまでスクロールを開始しない必要がある場合があります。

また

最初の問題を解決するために使用できるコードを次に示します。

この関数をコードに追加します。

$.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/

于 2012-05-15T03:24:20.303 に答える