overflow:scrollさせた要素を1番下にスクロール!位置座標を調整してチャットに使えるUIにしよう!

この記事からわかること

  • チャット機能で使えるスクロール調整
  • overflow:scrollした要素の表示位置
  • コピペで使えるjavascriptによるコード

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

チャット機能を作成中、チャット履歴部分をoverflow:scrollさせて一部分だけ表示しようとしました。ですが新しい発言が下に追加されるのに表示されるのは履歴の上部である問題が発生しました。

自作チャット機能の1番上のチャットログ

理想は画面を更新した時やチャットを送信した時に↓このような画面にしたい。

自作チャット機能の1番下のチャットログ

それでは私が試行錯誤のすえ解決できた方法をご紹介します。

overflow:scrollさせた要素のスクロールを1番下にする方法

window.addEventListener('DOMContentLoaded', function() {
  let chatArea = document.getElementById('chat-area'),
  chatAreaHeight = chatArea.scrollHeight;
  chatArea.scrollTop = chatAreaHeight;
})

解決方法は意外と簡単で「overflow:scrollさせている要素のスクロールトップ(表示する位置)にスクロールできる高さも含めた要素の高さを指定する」という方法で解決することができました!

自作チャット機能のチャットログの表示部分

要素のscrollTopプロパティに数値を指定することでスクロールできる要素の表示位置を変更できます。

適当にありえないほど大きい値を指定しても良いですが、チャットログが増えすぎた時に備えてチャットログ全体の高さ(非表示になっている部分も含めて)を取得し、その値を設定することで解決することができました!

細かい説明とそれぞれのコードのおさらいもしておきます。

scrollTopプロパティの挙動

Element.scrollTop

scrollTopプロパティ」は取得も設定も可能なプロパティで対象の要素がスクロールできる範囲の1番上からスクロールされて表示されている位置のピクセル数を返します。

つまりスクロールされた量も取得することができるということですね!

そして任意の値(ピクセル数)を指定することでそのピクセル数分スクロールされた状態に要素を変化させることができます。

指定したピクセル数が要素より大きい場合は自動で最大値にマイナス値の場合は0に変換されます。

scrollTopプロパティでできること

scrollHeightプロパティの挙動

Element.scrollHeight

scrollHeightプロパティ」は取得専用のプロパティで表示されていない要素の高さを取得することができます。

paddingは高さにカウントされ、marginやborderは含まれません。

逆に表示されている要素の高さを取得したい場合は「offsetHeightプロパティ」で取得することができます。いわゆるCSSで付与したheightの高さですね!

Element.offsetHeight

scrollHeight/offsetHeightプロパティでできること

発火のタイミングを変更する

私が作成したコードの発火のタイミングはページの読み込み時です。理由はPOSTの二重送信対策でチャット送信時にページをリロードするからです。

関連記事:【php】リロード対策!postを重複しないように自分自身にリダイレクトさせて解決しよう!

発火のタイミングを変えたい人向けに別のコードも載せておきます。

ボタンクリック時に発火

let hakka = document.getElementById('hakka');

hakka.addEventListener('click', function() {
  let chatArea = document.getElementById('chat-area'),
      chatAreaHeight = chatArea.scrollHeight;
      chatArea.scrollTop = chatAreaHeight;
})

これで例えば新しいチャットを送信するたびに画面を1番下にスクロールさせることができます。

おまけ:overflow:scrollさせた要素のスクロールバーを消す

ついでにCSSでoverflow:scrollさせた要素のスクロールバーの非表示方法を載せておきます。

  
  .chat-area {
    max-height: 60vh;
    padding: 30px 60px;
    overflow-y: scroll;
    /* Firefox */
    scrollbar-width: none;
    /* IE */
    -ms-overflow-style: none;
  }
  
  .chat-area::-webkit-scrollbar {
    /* Chrome */
    display: none;
  }

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index