1. ホーム
  2. Web制作
  3. CSS

[CSSチュートリアル】タイトルを上部に配置するスティッキーレイアウトを実現するためのCSS

2022-01-12 18:51:21

アプリケーションのシナリオです。

新しい要件は、必ずしも多くの質問だけでなく、複数の人を獲得する必要性の下でトピックを含むアンケートを行うためのプロジェクトは、スライドのモバイル側は、この現象が起こるだろう、アップタイトルを忘れてしまうスクラッチ。だから、質問の頭の位置決めのための必要性の後に一定の距離を計算します。領域への質問の相対的な頭部にスライドを作ることは、採点を容易にするために上部に固定されています。

解決案です。

1. 固定レイアウトは、画面上部に固定するとタイトルヘッドが一定の距離になります。  (実現は可能ですが、あまりシルキーな処理ではありません)。
2.スティッキーレイアウト

stickyが良いが、互換性を考慮する必要がある(IEの互換性)

stickyでは、次のようなアイデアを実装しています。

1.最初にスライダーの位置を記録する必要があり、スクロールイベントをリッスンする必要があります。

'cflags_cc!': [ '-fno-rtti' ] 

2. 各質問の画面上部からの質問ヘッダーの高さを計算し、配列を形成する。

// Remember to set ref for each question, my ref is the id of each question

-- vue abbreviation ---
<div
  :ref="question.id"
  v-for="(question, index) of formData.questions"
  :key="index"
>


// I also did a sort to prevent jumbling problems
---- js -----
 this.topPositionArr = [];
  for (let key in this.$refs) {
      for (let idx in this.$refs[key]) {
        this.topPositionArr.push(this.$refs[key][idx].offsetTop);
      }
    }
    this.topPositionArr = [. .new Set(this.topPositionArr)];
    this.topPositionArrtopPositionArr = this.topPositionArr.sort(
      (a, b) => {
        return a - b;
      }
    );        


3. 聞き取った距離と取得したヘッダーをスライドさせて比較し、配置したヘッダーを選択します。

// Compatible with different viewers The offsetTop is taken differently for different viewers

handleScroll() {
    this.scrollTop = document.documentElement.scrollTop
  scrollTop? document.documentElement.scrollTop
  : document.body.scrollTop;
  
let scrollTop = this.scrollTop;
// the scrollTop of the first question remains unchanged, from the second question the scrollTop changes
this.topPositionArr.forEach((item, idx) => {
  if (idx > 1) {
    this.scrollTop = scrollTop + 220;
  }
  // Why do we do this? Because iE doesn't support sticky layouts, and we need a plugin to help with that
  if (this.scrollTop > item) {
    let elements = document.getElementById(`sticky${idx}`);
    stickyfill.add(elements);
  }
});
}


4. IEとの互換性の問題

IEはスティッキーレイアウトをサポートしていないため、ホイールスティッキーフィルが必要です。

npm install stickyfill 
yarn add stickyfill

--- vue--
ヘッダーのdivタグに一意性を示す動的なidを付与する必要がある

<div
  :id="`sticky${question.index}`"
  class="isSticky"
>

シングルファイル紹介

Introduce in the page you need.
<script src="path/to/stickyfill.min.js"></script>
var Stickyfill = require("stickyfill");
var stickyfill = Stickyfill();

jsファイルです。

See 3 above for details on how to do this
let elements = document.getElementById(`sticky${idx}`);
stickyfill.add(elements);

上記は完璧に動作しますよ~~~~。