テーブルコントロールの初回表示時にチラつくバグを修正

basecamp/lexxy

<lexxy-table-tools> 要素が表示される前に位置を確定させることで、テーブル挿入直後にコントロールが誤った位置に一瞬描画される問題を解消しました。

背景

<lexxy-table-tools> はテーブル操作用のカスタム要素で、行・列の追加削除などを行うコントロールUIを提供します。このコントロールは、テーブルが挿入されたタイミングで #show() メソッドを通じて表示されますが、特にハードリフレッシュ後の初回挿入時に、コントロールが一瞬だけ誤った位置に表示されるチラつき(フラッシュ)が発生していました。

原因はレンダリングのタイミングの問題でした。#show()display: flex を設定した後に位置計算を行っていたため、ブラウザがCSSのデフォルト位置でコントロールを描画してから、JavaScriptが正しい位置に移動させるという1フレームのズレが生じていました。

技術的な変更

#show() メソッド内の処理順序を変更し、位置計算を display: flex の設定よりも前に移動しました。

変更前:

#show() {
  this.style.display = "flex"
  this.#update()
}

変更後:

#show() {
  this.#updateButtonsPosition()
  this.style.display = "flex"
  this.#updateRowColumnCount()
  this.#closeMoreMenu()
  this.#handleCommandButtonHover()
}

変更前は this.#update() という単一メソッドがすべての初期化処理を担っていました。変更後は #update() が担っていた処理を4つのメソッドに分解し、そのうち位置計算を担う #updateButtonsPosition() だけを display: flex の前に移動しています。残りの #updateRowColumnCount()#closeMoreMenu()#handleCommandButtonHover() は表示後に実行されます。

この修正により、コントロールが表示される時点では既に top/left が確定しているため、ブラウザはチラつきなしに正しい位置で初回描画を行います。

設計判断

「表示前に位置を確定させる」という原則を明示的にコードで表現する方向が採用されました。

単純な順序の入れ替えだけでなく、#update() を責務ごとに分割したことが重要です。位置計算(#updateButtonsPosition)とその他の初期化処理(行列数の更新、メニューの状態リセット、ホバーハンドラの設定)を分離することで、「表示前に実行すべき処理」と「表示後でよい処理」の意図がコードから直接読み取れるようになっています。モノリシックな #update() を維持したままでは、この順序の制御は困難でした。

まとめ

この修正は、ブラウザのレンダリングサイクルとJavaScriptの実行順序に起因するUIのチラつきを、メソッドの実行順序の整理と責務の分割という最小限のコード変更で解決しています。「表示を制御するメソッドは、表示前に完了すべき処理を明示的に先行させる」という設計原則を、コード構造そのもので表現した好例です。

記事メタデータ

Generated by:
Claude Sonnet 4.6 for DiffDaily
LLM Trace:
00cdcb21

この記事はAIによって自動生成されています。内容の正確性については、必ずソースコードやPRを確認してください。

品質レビュー結果

Review Status:
承認済み
Review Count:
1回
Reviewed by:
Gemini 2.5 Pro for DiffDaily

Review Criteria:

記事構成 ✓ PASS

Title, Context, Technical Detailの存在と明確さ

リード文(総論)、背景・技術的変更・設計判断(各論)、まとめ(結論)という3部構成が明確に守られており、非常に分かりやすい構成です。

カスタムMarkdown構文 ⚠ WARNING

シンタックスハイライト・GitHubリンク記法の正確性

PR番号のリンク記法がガイドラインの形式([#854](URL))と異なり、[PR #854](URL) となっています。ただし、リンク自体は正しく機能しており、内容の理解を妨げるものではありません。

対象読者への適合性 ✓ PASS

エンジニア向けの適切な技術レベルと表現

「レンダリングタイミング」「1フレームのズレ」「モノリシックなメソッド」といった用語を適切に使用し、専門知識を持つエンジニアを対象とした適切な技術レベルで記述されています。

パラグラフ・ライティング ✓ PASS

トピックセンテンス・1段落1トピック・段落長

各セクションが総論→各論の構成で書かれ、各段落もトピックセンテンスで始まるなど、パラグラフ・ライティングの原則が遵守されています。これにより、記事の論理構造が明快になっています。

Diff内容との照合 ✓ PASS

コードブロックとDiff内容の一致

記事内で引用されている変更前後のコードは、提供されたDiff情報と正確に一致しています。特に変更前のコードをDiffから正しく再構成して示している点は優れています。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

PR情報に含まれる`<lexxy-table-tools>`、`display: flex`、`#show()`などの技術用語を正確に使用しており、誤用は見られません。

説明の技術的正確性 ✓ PASS

技術的主張の正確性と論理性

「表示より先に位置計算を行うことでチラつきを解消する」という説明は、PR DescriptionおよびDiffの内容と完全に一致しており、技術的に正確です。

事実の突合 ✓ PASS

PR情報による主張の裏付け(ハルシネーション検出)

記事内のすべての主張は、PR DescriptionまたはDiffのコード変更から直接裏付けられています。「設計判断」セクションの解説も、コードの変更という事実に基づいた論理的な考察であり、ハルシネーションは見られません。

数値・固有名詞の確認 ✓ PASS

PR番号・コミットID・バージョン等の正確性

PR番号(#854)やメソッド名(#show, #updateButtonsPositionなど)が正確に記載されています。

タイトル・説明との一致 ✓ PASS

記事タイトル・説明とPR内容の一致

記事のタイトル「テーブルコントロールの初回表示時にチラつくバグを修正」は、PRのタイトル「Fix table controls flashing at wrong position on first insert」の内容を的確に和訳し、表現しています。

外部知識の正確性 ✓ PASS

PRに記載のない外部知識(LTS、サポート状況など)の不使用

記事にはPR情報に記載のないバージョンサポート状況やリリース日程などの外部知識は含まれておらず、提供された情報源に忠実です。

時間表現の正確性 ✓ PASS

時間表現がPR情報と一致しているか

記事内に時間表現の歪曲は見られず、事実を客観的に記述しています。