どのような製品について言及したいですか?最近、ユーザーがマーケティングの変化をよりよく観察できるように、ヘッダーの概要(下の図のようなもの)を追加するという要件、より正確には反復的な要件がありました。このようにして、物語の始まりが静かに予告されていました。 これまで、このページはレビューのリスト(プルアップして読み込む)のみでした。データを読みやすくするために、リスト ヘッダーは固定レイアウトを採用しました。ただし、この概要を追加したときに、製品側ではそのことが言及されていなかったため、列ヘッダーを単純に大まかに相対レイアウトに変更して、テスト用に提出しました。 しかし翌日、表示してみると、読み込むデータが多すぎることに気付きました。リストのヘッダーが押し上げられた後、再度フィルタリングしたい場合は、リストをもう一度上にスワイプして表示する必要がありました。この経験は非常に悪かったです。そこで同僚は、製品について質問するか、概要と概要を固定するかのどちらかにすることを提案しました。 私の最初の反応は、この質問をした後、製品はおそらくフィルター リスト ヘッダーを固定する その後、次のような会話が行われました。 予想通り、あなたが恐れていることは何でも現実になります。しかし、同僚が言ったように、たとえ泣くことになったとしても、私はその要求を受け入れなければなりません。 コメントと提案を受け取った後、最適なソリューションであるスティッキーソリューションが追加されました。 部分天井次のコードはページの <div id="demo" className={style.demo}> <h3 id="title" className="title">これは概要ヘッダーです</h3> <div id="コンテンツ" className="コンテンツ"> <div className="フィルターバー"> <h3>これはリストのヘッダーです</h3> <h3>フィルタ可能</h3> <h3>以下はスクロールリストです</h3> </div> <ul className="リスト"> {arr.map(({ key, label }) => <li key={key}>{label}</li>)} </ul> </div> </div> JS実装ページ自体にスクロールイベントリスナーがあるので、最初はJSで完結させようと思ったのですが、すでに仕事が終わっていたし金曜日だったので5分では終わらないと感じて逃げました。 では、まずアイデアを整理して、JS で実装してみましょう。
JSコード 使用効果(() => { デモ = document.querySelector('#demo'); 定数コンテンツ = document.querySelector('#content'); 定数 titleHeight = document.querySelector('#title').clientHeight; 固定 = false とします。 デモ.addEventListener('スクロール', (e) => { // 天井を追加 if (!fixed && e.target.scrollTop >= titleHeight) { 固定 = true; content.classList.add('with-fixed'); } //天井をキャンセルif (fixed && e.target.scrollTop < titleHeight - 5) { content.classList.remove('with-fixed'); 固定 = false; } }); }, []); 難しくないように見えますが、実際には、コードをオンラインにする前に最適化する余地がまだたくさんあり、後で分析して補足する予定です。 CSS ビューポートの実装JS は単純に見えますが、有名な文章のようなものです: まず、考えを整理し、製品のニーズを深く掘り下げます。
上記のアイデアを整理すると、リストが非常に長い場合、概要ヘッダーが非表示になることがわかります。これは、疑似コードで簡単に表現できます (vh はビューポートの単位、100vh は画面全体の視覚的な高さを表します)。 if (タイトル高さ + フィルターバー高さ + リスト高さ > 100vh) { タイトルを非表示にする(); } では、フィルター ヘッダーとリストをビューポートから除外したまま、概要ヘッダーを非表示にするにはどうすればよいでしょうか。 フィルターバーの高さ + リストの高さ = 100vh ユーザーが上にスワイプし、コンテンツ (フィルター ヘッダーとリスト) のみがちょうど 1 つのビューポートの高さ (100vh) になる必要がある場合、概要ヘッダーは非表示になり、フィルター ヘッダーは上部と同じ高さになります。これは、次のような CSS を使用して実現されます。 // 完全なコードではありません。詳細についてはデモを参照してください: .デモ{ :グローバル{ 。タイトル { 高さ: 15vh; 行の高さ: 15vh; テキスト配置: 中央; 下境界線: 1px 実線 #eee; 背景色: #fff; } .フィルターバー{ 高さ:15vw; 背景色: #888; ディスプレイ: フレックス; アイテムの位置を中央揃えにします。 } .リスト{ max-height: calc(100vh - 15vw);; // ここでの設定は非常に重要です overflow: scroll; 背景色: rgba(127, 255, 212, .8); } CSS Stickyのベスト実装CSS にはあまり使用されない MDN 公式ドキュメントからの抜粋: 要素は通常のドキュメント フローに従って配置され、上、右、下、左の値に基づいて、最も近いスクロール祖先と最も近いブロック レベルの祖先 (テーブル関連要素を含む) に対してオフセットされます。スティッキーポジショニングは、相対ポジショニングと固定ポジショニングのハイブリッドと考えることができます。要素は、特定のしきい値を超えるまでは相対的に配置され、その後は固定されます。 ここでは、JS ソリューションに基づいていくつかの変更を行います。JS への依存を排除するには、filter-bar の配置プロパティを固定配置に変更するだけです。 .デモ{ 最大高さ: 100%; オーバーフロー: スクロール; .フィルターバー{ 位置: 固定; 上: 0; } } デモ クラスは、最も外側の DOM ( 対比CSS はとてもシンプルで、少し設定するだけでできると感じますか? ただし、コンテンツの高さが正確に
もちろん、ビューポート ソリューションには iOS フォンとの互換性の問題もあります。Safari のヘッダーと下部の可視性はスライド時に変化するため、バーが表示されているときは、実際の 100vh が画面の表示可能な高さよりも高くなり、天井のヘッダーがブロックされることになります。今のところ、 上記の分析の後、IOS Safari での 100vh の致命的な問題により、100vh のような純粋な CSS ソリューションは消え去るでしょう。しかし、PC ページの場合、またはあなたや私のように、書きたいページが APP で実行されている場合 (つまり、バーがない場合)、このソリューションは実行可能です。すべての計画には特定のシナリオと分析が必要です。完璧な人間など生まれつきいません。これは単にあなたの考え方を改善し、視野を広げるためです。 スティッキーソリューションは 100vh に依存せず、100% で記述できるため、そのような心配はありません。したがって、比較すると、最適なソリューションは 伸縮性のある底部分的な弾性天井吸収について説明した後、一般的な選択的底部吸収について説明します。ページ コンテンツが 100vh 未満の場合は、 自分のウェブサイトのコンテンツが不足することは絶対にないと固く信じているため、最初の画像のような配置を使用しない人がまだ多くいますが、以前は下部に固定配置を使用するのがより一般的でした。 弾性ボトムは 体{ 位置: 相対的; 最小高さ: 100vh; } フッター { 幅: 100%; 位置: 絶対; 下部: 0; } 原則としては、コンテンツ領域の最小の高さは 1 画面であり、下部は画面に対して絶対的に配置されます。コンテンツが増えると、高さは 100vh を超え、 このシナリオでは、 これで、H5 レイアウトの天井と底部の吸引の問題に対する純粋な CSS ソリューションを実装する手順に関するこの記事は終了です。CSS 天井と底部の吸引に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM を応援していただければ幸いです。 |
>>: Docker-compose インストール yml ファイルの設定方法
1. 使用法: (1)EXISTSの使用 ucsc_project_batch a から、存在する場...
通常は <ul><li> タグを使用しますが、dd タグと dt タグも便利...
序文最近、仮想マシンを使用して Ubuntu 18.04 をインストールしました。クローン作成後、I...
メタ タグは、ファイル情報を定義し、検索エンジンによる検索を容易にするために Web ページ ファイ...
タスク マネージャーで仮想化を確認し、有効になっている場合は仮想化を、無効になっている場合はコンピュ...
イベントでは、SQL コードを 1 回または一定の間隔で実行することを指定できます。通常、複雑な S...
最近、私はデザインには階層感覚が必要だと言っています。この階層感覚には、色の重ね合わせや要素の重ね合...
目次FormDataとは何ですか? vueとaxiosの協力による実践的な体験追加()セット()消去...
私が初めて Web 開発を独学で学んだ頃は、いわゆる DIV/CSS レイアウトはなく、テーブル レ...
目次1. トリガーとは何ですか? 2. トリガーを作成するトリガーを作成するための構文は次のとおりで...
1. <body> タグ: Web ページの本体をマークするために使用されます。body...
Vue でフォーム フィールドを記述および検証する方法は多数あります。このブログでは、より一般的に使...
目次vモデル.sync微妙な違い機能シナリオを要約します。 vモデル <!--親コンポーネント...
この記事では、Docker コマンドの使用とインストールについては説明しません。Docker を基礎...
序文データ型変換とは何ですか?フォームまたはプロンプトを使用して取得されるデフォルトのデータ型は文字...