Markodwnによるタイトル配置による同期スクロールのアイデアの詳細な説明

Markodwnによるタイトル配置による同期スクロールのアイデアの詳細な説明

序文

私が作成中の Markodwn エディターに同期スクロール機能を追加する必要があります。Baidu で検索しましたが、良いアイデアが見つかりませんでした。自分でも書きました。

Github には完成したライブラリと、より直感的なデモが含まれています。

ギットハブ

この記事では主に実装のアイデアについて説明します。

導入

同期スクロールを実装する方法は多数あります。単純で大雑把な方法は、 HTMLElement.scrollTopを等しくし、スクロール バーを比例してスクロールさせ、タイトルをスクロールに合わせて揃えることです (これは、stackedit で見たものです)。

この記事の主な内容は、タイトルの配置と同期スクロールを実装する方法です。

個人的には、他の 2 つよりもユーザーフレンドリーなので、タイトルの配置を好みます。

原則として、タイトルの配置は実際には比例スクロールの改良版です。編集領域とプレビュー領域の高さの比率を計算してスクロール距離を決定するのが中心だからです。

デモ

以下はDEMOのGIF画像です

左側の # に注意してください。

スクロールバーが動くと、左側と右側のスクロール距離が異なることがわかります。

これはプロポーショナル スクロールに少し似ていますが、異なります。違いは、プロポーショナル スクロールでは両側のテキスト全体の高さに基づいてスクロール距離が決定されるのに対し、タイトル配置ではタイトルの下のコンテンツの高さに基づいてスクロール距離が決定されることです。

アイデア

上の図は概略図です。

# 見出しはタイトルを意味し、コンテンツはタイトルの下のコンテンツを意味します。私はタイトル + コンテンツをフラグメントと呼びます。

プロポーショナルスクロールは比較的簡単に理解できると思います。編集領域とプレビュー領域の高さの比率を計算し、その比率に基づいてスクロール距離を計算するというものです。

タイトルの配置がより正確になりました。編集領域とプレビュー領域の高さを、タイトルの高さ + タイトルの下のコンテンツの高さ、つまりフラグメントの高さに変更し、現在のフラグメントに対応する高さに基づいてスクロール距離を計算します。

上の図の md の高さと html の高さは、必要なフラグメントの高さです。

明らかに、これら 2 つの高さの比率を使用する限り、対応するスクロール距離を計算できます。

具体的なプロセス

まず、編集領域とプレビュー領域のタイトル情報が必要です。データ構造は次のようになります。代わりにeditFragmentsInfopreFragmentsInfoを使用してください

フラグメント情報: {
    pairId, // 編集領域/プレビュー領域に対応するタイトルを一致させるために使用されるID
    offsetTop, // 上部オフセットからの距離 height // タイトルとコンテンツの高さ}

次に、現在のページの上部にあるタイトル ブロックを取得するメソッドが必要です。ここでは代わりにgetCurrentFragment()を使用します。

次に、editArea/previewArea のスクロール イベントで、スクロールが開始されることを通知するメッセージが previewArea/editArea に送信されます。

別のエリアで受信した後、以下の操作を行ってください。 (アクティブなスクロール領域は編集領域、パッシブなスクロール領域は別の領域であるプレビュー領域であると仮定します)

  1. まず、上記のgetCurrentHeading()を使用して、上部の現在のタイトルを取得します。
  2. 次に、プレビュー領域で対応するタイトルを一致させます。
  3. 両側のheadingInfo.heightの比率に基づいて計算された値とheadingInfo.offsetTopの値を加えた値が、プレビュー領域のscrollTopになります。
  4. この時点で同期は完了です。このプロセスは要素のスクロール イベントにバインドされており、スクロールするたびにこのプロセスがトリガーされます。

同期の問題

1 つの要素をスクロールすると別の要素もスクロールされるため、必然的に無限ループが形成されます。したがって、無限ループを回避するには、スクロール イベントで判断を行う必要があります。

これは、2 つ以上のオブジェクトの排他性をサポートする単純な排他性メソッドです。

要約する

上記は、エディターが導入したMarkodwnタイトル配置の同期スクロールのアイデアの詳細な説明です。皆様のお役に立てれば幸いです。ご質問がある場合は、メッセージを残してください。エディターがすぐに返信します。

<<:  Reactコンポーネントのライフサイクルの詳細な説明

>>:  Docker に Elasticsearch 7.6.2 をインストールするチュートリアル

推薦する

Mac インストール mysqlclient プロセス分析

仮想環境で pip 経由でインストールしてみてください: pip で mysqlclient をイン...

Vue Element-ui テーブルはツリー構造テーブルを実現します

この記事では、ツリー構造テーブルを実現するためのElement-uiテーブルの具体的なコードを参考ま...

MySQLの文字セット設定を5分で理解しましょう

目次1. コンテンツの概要2. 文字セットと文字順序の概念と関係3. MySQL でサポートされてい...

CSS3 で @media を使用して Web ページの適応を実現するためのサンプル コード

現在、コンピュータモニターの画面解像度はますます高くなる傾向にありますが、携帯電話などのモバイルデバ...

MYSQL は、指定されたユーザーのランキングとクエリを実装します。ランキング関数 (並列ランキング関数) のサンプルコード

序文この記事は主に、MYSQL でランキングを実現し、指定ユーザーランキング関数 (並列ランキング関...

MySQL のクラスター化インデックスとクラスター化インデックスの成長の仕組みを理解する

このノートでは、 MySQL の B+Tree インデックスとは何ですか?クラスター化インデックスは...

MySQL データ ウェアハウスを保護するための 5 つのヒント

さまざまなソースからデータを集約することで、中央倉庫を作成できます。データ ウェアハウスは、ビジネス...

Linux whatisコマンドの使い方

01. コマンドの概要whatis コマンドは、システム コマンドの簡単な説明を含むいくつかの特別な...

モバイル開発におけるHTML5開発の現状を深く理解する

「私たちは次の一連のモバイル製品を HTML5 で作成しています。」 「ええ、最近は多くの人が Ap...

TypeScript名前空間の説明

目次1. 定義と使用1.1 定義1.2 使用2. 複数のファイルに分割する3. エイリアス序文: T...

Vueはショッピングカート決済機能をシミュレートします

この記事では、ショッピングカート決済機能を実現するためのVueの具体的なコードを例として紹介します。...

HTML テーブル タグ チュートリアル (31): セルの幅と高さの属性 WIDTH、HEIGHT

デフォルトでは、セルの幅と高さはコンテンツに応じて自動的に調整されますが、セルの幅と高さを手動で設定...

Linux に setup.py プログラムをインストールする方法

まず次のコマンドを実行します: [root@mini61 setuptools-8.2.1]# py...

ウェブサイトのカラースキーム ウェブサイトに適した色の選択

色はウェブサイト訪問者に影響を与えますか?数年前までは、ウェブサイトはまだ贅沢品でしたが、今ではほと...

MySQL json 形式のデータクエリ操作

デフォルトのテーブル名はbase_dataで、json列名はjson_valueです。 json_v...