背景視覚化大画面プロジェクトで最もよく使用されるコンポーネントはデジタルコンポーネントです。データの変化を示すには、視覚効果を高めるために、数字にスクロール効果を追加して、ある数字から別の数字に徐々に増加するスクロールアニメーションを実現する必要があります。 まず、マインドマップ: コンテナを固定し、数字を上にスクロールすることで、スクロールホイールと同様の効果を実現します。 まず、すべての可能な値をリストして垂直リストを形成し、次にコンテナーを固定して、数値のオフセット値を一定の速度で変更します。 以下は、このソリューションの実装の紹介です。0から9までの10個の要素値があり、各数字は垂直リストの10%を占めるため、垂直オフセット値は0%—> -90%です。 成し遂げる: <ul> <li> 0123456789 </li> </ul> ul{ 上マージン: 200px; } ul li{ マージン:0 自動; 幅: 20px; 高さ: 30px; テキスト配置: 中央; 境界線:2px実線rgba(221,221,221,1); 境界線の半径:4px; } ul li span{ 位置: 絶対; 色: #fff; 上位: 30% 左: 50%; 変換: translate(-50%,0); 遷移: transform 500ms イーズインアウト; 書き込みモード: 垂直方向; テキストの向き: 直立; 文字間隔: 17px; } spanDom = document.querySelector('span') とします。 開始 = 0 にする 間隔を設定する(() => { 開始++ if(開始>9){ 開始 = 0 } spanDom.style.transform = `translate(-50%,-${start*10}%)` }, 1000) 上記のコードには問題があります。9 から 0 に移行すると、コンテナのオフセットは -90% から 0% に直接移行します。 ただし、遷移アニメーションの時間が固定されているため、逆方向にスクロールする状況が発生します。この問題を解決するには、シームレススクロールのアイデアを参考にすることができます。
<ul> <li> 01234567890 </li> </ul> spanDom = document.querySelector('span') とします。 開始 = 0 にする var タイマー = setInterval(fn, 1000); 関数fn() { 開始++ クリアインターバル(タイマー) タイマー = setInterval(fn,start >10 ? 0 : 1000); if(開始>10){ spanDom.style.transition = `なし` 開始 = 0 }それ以外{ spanDom.style.transition = `transform 500ms イーズインアウト` } spanDom.style.transform = `translate(-50%,-${start/11*100}%)` } 2つの要素を使用してスクロールを実現するアニメーションの効果をよく見てください。実際、ビューポートには 2 つの要素しかありません。1 つは前の値で、もう 1 つは現在の値です。スクロール オフセット値は translateY(-100%) に設定するだけで済みます。 具体的なアイデア:
調整されたコード構造は次のとおりです。 <div className={styles.slider}> {[前, 現在].map((項目, インデックス) => ( <span key={index} className={`${styles['slider-text']} ${playing && styles['slider-ani']} ${(prev === 0 && cur === 0 && index ===0) && styles['slider-hide']}`}> {アイテム} </span> ))} </div> const { 値 } = プロパティ 定数[前へ、前へ設定] = useState(0) 定数[cur, setCur] = useState(0) const [再生中、setPlaying] = useState(false) const 再生 = (pre, current) => { 前を設定する(前) setCur(現在値) 再生設定(false) タイムアウトを設定する(() => { 再生設定(true) }, 20) } 使用効果(() => { if (!Number.isNaN(値)) { 再生(現在値、値) } それ以外 { setPrev(値) setCur(値) } }、 [価値]) .スライダー{ ディスプレイ: フレックス; flex-direction: 列; 高さ: 36px; 上マージン: 24%; オーバーフロー: 非表示; テキスト配置: 左; } .スライダーテキスト{ 表示: ブロック; 高さ: 100%; 変換: translateY(0%); } .スライダーアニ { 変換: translateY(-100%); 遷移: 1 秒のイージー変換; } .スライダー非表示{ 不透明度: 0; } 複数のスクロールホイールの上方向スクロールを実装するデジタルコンポーネント H5のrequestAnimationFrame() APIを使用して、徐々に増加するアニメーション効果を実現します。徐々に増加し、指定された時間内に完了する必要がある数字のスクロール アニメーションを実装します。スムーズなアニメーション効果を表示するには、要素の状態を一定の頻度で更新する必要があります。JS アニメーションは、非常に短い時間で要素を継続的にレンダリング/描画することで実現されるため、タイマーは常に Javascript アニメーションのコア技術となっています。鍵となるのは更新間隔です。アニメーション効果がよりスムーズになり、停止しないようにするには、更新時間をできるだけ短くする必要があります。同時に、ブラウザがアニメーションをレンダリングできることを保証するために、更新間隔が短すぎることはできません。 タイマーの比較
RequestAnimationFrameはスクロールアニメーションを実装しますアニメーションが開始され、アニメーションの開始時刻が記録されます。startTimeRef.current 定数 startTimeRef = useRef(Date.now()); 定数[t, setT] = useState(Date.now()); アニメーションの各フレームごとに、アニメーションの開始から経過した時間を記録し、現在のフレームで到達すべき数値、つまりcurrentValueを計算します。 使用効果(() => { const rafFunc = () => { 定数now = Date.now(); const t = now - startTimeRef.current; (t >= 期間)の場合{ setT(期間) } それ以外 { T(t) を設定します。 rafFunc をリクエストします。 } }; ラフをしましょう 自動スクロールの場合 raf = requestAnimationFrame(rafFunc); startTimeRef.current = Date.now(); } それ以外 { raf && cancelAnimationFrame(raf); } return () => raf && cancelAnimationFrame(raf); }, [ピリオド、自動スクロール]); const currentValue = useMemo(() => ((to - from) / period) * t + from, [t, period, from, to]); 現在の位置の各桁の数字を比較します。変化がある場合は、オフセットを変更します。オフセットは、現在の桁の数字と次の桁の数字の差です。この変化は各フレームで連結され、スクロール アニメーションを形成します。 実績js を使用して徐々に増加するデジタルアニメーションを実装する方法についての記事はこれで終わりです。より関連性の高い js 徐々に増加するデジタルアニメーションのコンテンツについては、123WORDPRESS.COM で以前の記事を検索するか、次の関連記事を引き続き参照してください。今後も 123WORDPRESS.COM を応援していただければ幸いです。 以下もご興味があるかもしれません:
|
<<: Chromeの最小フォントサイズ制限12pxに対する最終的な解決策
>>: ハイパーリンクの幅と高さを直接設定できない問題の解決策
水平スクロールはあらゆる状況に適しているわけではありませんが、適切に行えば、Web サイトを他のサイ...
この記事では、ブロック崩しピンボールゲームを実装するためのJSの具体的なコードを参考までに紹介します...
MySQLで重複データを削除する詳細な例重複レコードには 2 つの意味があります。1 つは完全に重複...
適切に機能するテーブル プロパティ設定:コードをコピーコードは次のとおりです。 <テーブル セ...
公式ドキュメント:したがって、mysql は次のように起動する必要があります。 docker run...
厳密に言えば、nginx には負荷分散バックエンド ノードのヘルス チェック機能はありませんが、デフ...
MySQL 5.7.9 のインストールチュートリアルを録画してみんなと共有しましょう環境の紹介:オペ...
ウェブページでEnterキーを押すと、フォームは自動的に送信され、他のページに移動します。クエリフォ...
目次1. はじめに2. バックアップとリカバリの簡単な定義3. 復旧計画で考慮すべきいくつかの要素4...
ここに <input type="image"> がある場合、この画...
以前、フロントエンド技術グループに所属していたとき、グループのメンバーが面接中に問題に遭遇したと言っ...
目次1. props/$emit導入コードサンプル2.Vスロット導入コードサンプル3.$refs/ ...
目次1. 透かしのJsファイルを作成する2. 導入操作2.1 App.vueや他のページでの参照2....
LAN 内のマシンは外部ネットワークにアクセスできますが、外部ネットワークは内部ネットワークにアクセ...
目次Kubernetesについて基本的な環境の準備VirtualBoxをインストールするUbuntu...