jQueryで動くニュースティッカー(newsticker)の作り方【コピペで1分】
jQueryで動くニュースティッカーのDEMO
DEMOページ
jQueryで動くニュースティッカーの作り方解説
jQueryを使用してlistの中身を上部にスライドさせ、次のlistが流れてくるように実装。
※このサイトのトップで実際に動いている手作りニュースティッカーです。
- 1.HTMLは親要素とリスト(ul・li)要素で構成する。親要素に「overflow: hidden;」をかけて対象部分以外は非表示にする。
- 2.リストのcssの切り替えアニメーションを設定。「transform: translateY;」でY軸(縦軸)にアニメーションするように設定
- 3.jQueryで切り替え処理を作成し、リサイズした際は調整するように指定。
- 4.ニュースの文字数が多い場合は「…」に切り替わるようにする。
- 5.正しく動作していれば完成です。
HTML記述
HTMLをbody内の表示位置に記載します。
<div class="ticker"> <ul class="news"> <li>ニュース1<a href="">サンプルサンプルサンプルサンプルサンプル</a></li> <li>ニュース2<a href="">サンプルサンプルサンプルサンプルサンプル</a></li> <li>ニュース3<a href="">サンプルサンプルサンプルサンプルサンプル</a></li> <!-- 追加のニュース項目 --> </ul> </div>
css記述
cssを<style>~</style>または自作cssの中に記述します。
<style> .ticker { overflow: hidden; /* 必須 */ height: 50px; border: 1px solid #ccc; } .news { list-style-type: none; padding: 0; margin: 0; animation: newsticker infinite linear; /* アニメーション設定 */ } .news li { height: 50px; line-height: 50px; background-color: #fff; } @keyframes newsticker { /* 0%から25%までは初期状態(元の位置)から変化しない */ 0%, 25% { transform: translateY(0); } /* 50%ではニュースを上にスライドさせる */ 50% { transform: translateY(calc(-100% - 1px)); } /* 75%から100%まではニュースを上にスライドしたまま変化しない */ 75%, 100% { transform: translateY(calc(-100% - 1px)); } } </style>
jQuery記述
jQueryCDN 最新版などは公式サイトをご確認ください。
<script src="https://code.jquery.com/jquery-3.7.0.min.js"></script>
イージングを滑らかに動かすためのプラグインを使用します。
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-easing/1.4.1/jquery.easing.min.js"></script>
jQueryを<script>~</script>または自作jsの中に記述します。
<script> // ニュースティッカー $(document).ready(function() { let newsHeight = $('.news li').height(); let newsDisplayTime = 3000; // ニュースが表示される時間(ミリ秒)(最初のニュース1が切り替わるまでの時間) let switchDelay = 2000; // ニュースの切り替えまでの遅延時間(ミリ秒)(以降の各ニュースが切り替わるまでの時間) let switchDuration = 1000; // ニュースの切り替え速度(ミリ秒) // ティッカーアニメーションの開始 function startTickerAnimation() { tickerAnimation(); // 初回のアニメーションを実行 setInterval(tickerAnimation, newsDisplayTime + switchDelay); // アニメーションを繰り返し実行するタイマーを設定 } // ティッカーアニメーションの実行 function tickerAnimation() { let ticker = $('.news li:first'); // 現在表示中のニュースを取得 ticker.animate({marginTop: -newsHeight}, switchDuration, 'easeInOutCubic', function() { ticker.appendTo('.news').css('marginTop', 0); // ニュースを一番下に移動して表示位置をリセット }).delay(switchDelay); // 切り替え遅延時間を追加してアニメーションを停止 } setTimeout(startTickerAnimation, newsDisplayTime); // 初回のアニメーションを遅延実行 //はみ出した部分を3点リーダにする let maxLength = 10; // 上限文字数 let originalTexts = {}; // 元のテキストを保持するオブジェクト function applyTextLimit() { if ($(window).width() <= 767) { $('.news li').each(function() { let originalText = $(this).data('original-text'); if (!originalText) { originalText = $(this).html(); $(this).data('original-text', originalText); // 元のテキストをdata属性に保存 } let anchorTag = $(this).find('a'); if (anchorTag.length > 0) { let anchorText = anchorTag.html(); if (anchorText.length > maxLength) { let truncatedText = anchorText.substr(0, maxLength) + '...'; anchorTag.html(truncatedText); // aタグのテキストを上限文字数で切り詰めて三点リーダを追加 } } // ここで処理が終了し、次の要素へ移動 }); // 767px以下の場合の処理終了 } else { $('.news li').each(function() { let originalText = $(this).data('original-text'); if (originalText) { $(this).html(originalText); // 元のテキストに戻す } // ここで処理が終了し、次の要素へ移動 }); // 767px以上の場合の処理終了 } } // 初回実行 applyTextLimit(); // ウィンドウのリサイズ時に実行 $(window).on('resize', function() { applyTextLimit(); } ); }); </script>
関連アニメーション