背景視覚化大画面プロジェクトで最もよく使用されるコンポーネントはデジタルコンポーネントです。データの変化を示すには、視覚効果を高めるために、数字にスクロール効果を追加して、ある数字から別の数字に徐々に増加するスクロールアニメーションを実現する必要があります。 まず、マインドマップ: コンテナを固定し、数字を上にスクロールすることで、スクロールホイールと同様の効果を実現します。 まず、すべての可能な値をリストして垂直リストを形成し、次にコンテナーを固定して、数値のオフセット値を一定の速度で変更します。 以下は、このソリューションの実装の紹介です。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に対する最終的な解決策
>>: ハイパーリンクの幅と高さを直接設定できない問題の解決策
例えば:コードをコピーコードは次のとおりです。 <html> <ヘッド> &...
body{font-size:12px; font-family:"宋体";}...
冒頭にこう書かれています:アブソリュートは言った。「親戚よ、私はあなたを私の人生で見たくない!」なぜ...
目次問題の説明原理分析問題分析拡大する総括する問題の説明ユーザーはプライマリ データベースに対して変...
背景あっという間に忙しい一年が終わり、毎年恒例のイベントの時期がやってきます。お祭り気分を演出するに...
1. MySQL 5.7 のアンインストール1.1查看yum是否安裝過mysql CD yum li...
Centos マシンで docker のインストールが完了したら、docker info コマンドを...
vue2と比較して、vue3にはアプリの概念が追加され、vue3プロジェクトの作成も // メイン....
1 システムのインストール手順OSバージョン:1804イメージのダウンロード: http://cd...
序文データベースの実際の使用では、データの書き込みや読み取りを同時に行わないことが必要な状況によく遭...
現在、アプリケーション開発は基本的にフロントエンドとバックエンドに分離されています。主流のフロントエ...
1. jmeterの基本イメージを構築するDockerfile は次のとおりです。 # Java 8...
ファイル内の文字列の数を数えることは、実際には砂の中の石を探すようなものです。ある人は、石を見た後に...
ここで nginx のリバース プロキシを試してみましょう。リバースプロキシ方式とは、インターネット...
序文MySQL は、2016 年もデータベースの人気において力強い成長傾向を維持し続けました。 My...