LINE처럼 요소를 추가하면 자동으로 아래로 스크롤

13979 단어 JavaScriptrabeetech

개요


하고 싶은 일

  • LINE처럼 최신 항목이 맨 아래 채팅에 추가된 UI에서 추가 항목이 추가되면 자동으로 아래로 스크롤
  • 그리고 과거 채팅(아래로 굴러가지 않음)을 본 상태에서 자동으로 굴러가지 않음
  • 메모


    실제로 썼을 때는 리오였어요.js,Pug로 썼기 때문에 조금 간결하지만 대체적으로 하는 일은 똑같아서 참고할 수 있습니다

    실제로 해봤어요.


    https://runstant.com/supermuscles/projects/e808e8b2

    코드


    index.html
    index.html
        <form id="form" action="" method="get" accept-charset="utf-8">
          <input type="text" name="input" id="input" value="" />
          <button id="button" type="submit">追加</button>    
        </form>
        <div id="container" class='container'>
        </div>
    
    main.css
    main.css
      .container {
        height: 300px;
        background-color: gray;
        overflow: scroll;
        padding: 2px 4px;
      }
    
      .child {
        height: 55px;
        width: 90%;
        background-color: white;
        border: 1px black solid;
        border-radius: 8px;
        margin-bottom: 4px;
      }
    
    main.js
    main.js
      window.onload = function() {
        var form = document.getElementById('form');
        var input = document.getElementById('input');
        var container = document.getElementById('container');
        
        // チャットを追加する
        var addChat = () => {
          var text = input.value;
          var div = document.createElement("div");
          div.innerText = text;
          div.classList.add('child');
          container.appendChild(div);
          input.value = '';
        };
        
        // 下までスクロールする
        var scrollToBottom = () => {
          container.scrollTop = container.scrollHeight;
        };
        
        // 一番下までスクロールしているかどうか
        var isScrollBottom = () => {
          return container.scrollHeight === container.scrollTop + container.offsetHeight;
        };
        
        form.addEventListener('submit', (e) => {
          e.preventDefault();
          e.stopPropagation();
          // 一番下までスクロールされていれば追加後も一番下までスクロールする
          if (isScrollBottom()) {
            addChat();
            scrollToBottom();
          }
          // 一番下までスクロールされていなければスクロールしない
          else {
            addChat();
          }
        });
      };
    
    

    해설


    overflow: scroll;

  • 채팅 추가 영역에 스타일 추가overflow: scroll;
  • 이로써 채팅 구역을 스크롤할 수 있다
  • Element.scrollTop

  • 모두가 좋아하는 MDN의 Element.scrollTop를 보면 > 要素の内容が垂直にスクロールするピクセル数を取得または設定します라고 쓰여 있다. > 任意の整数値で設定することができます
  • 임의의 수치로 > 指定された値が、コンテンツがスクロールできる最大値を超えていたら、 scrollTop は最大値に設定されます이기 때문에 채팅 영역의 스크롤 범위의 높이scrollHeight를 입력하여 맨 아래로 스크롤
  • 끝까지 스크롤 여부

  • 이는 전체 채팅 구역의 높이에 비해 1이다.현재 수직 스크롤 값과 2를 볼 수 있습니다.보이는 채팅 구역 자체의 크기를 더해 이 값과 일치하는지 확인하면 판정
  • 총결산

  • 여느 때와 마찬가지로 예에서 만들어진 것이기 때문에 촌스러워 보이지만 기능적으로 만족해서 당분간 이렇게
  • 그리고 스크롤 바를 애니메이션으로 만들거나 아래로 스크롤하지 않은 상태에서 새 항목을 추가한 후 화살표 아이콘을 꺼내면 채팅이 좋아진다
  • 좋은 웹페이지 즐겨찾기