LoginSignup
1
1

More than 3 years have passed since last update.

JavaScriptでScroll機能をざっくりと作ってみる

Last updated at Posted at 2019-06-22

はじめに

HTMLの表などをスクロールする機能が必要になりました。
そこでとりあえずざっくりと作ってみました。
所々詰めが甘いところがありますが、記事にしてみます。

HTML および CSS

サンプルとして簡単ですが以下のようなHTMLとCSSを想定します。

HTML

HTML
<ul id="ul">
  <li id="0">item 0</li>
  <li id="1">item 1</li>
  <li id="2">item 2</li>
  <li id="3">item 3</li>
  <li id="4">item 4</li>
  <li id="5">item 5</li>
  <li id="6">item 6</li>
  <li id="7">item 7</li>
  <li id="8">item 8</li>
  <li id="9">item 9</li>
</ul>

CSS

CSS
ul {
  list-style: none;
  height: 64px;
  overflow-x: hidden;
  overflow-y: scroll;
}

li {
    height: 30px;
    border: black 1px solid;
}

ソース

現状?では、以下の両者に違いはないようです。

  • scroll
  • scrollTo

相対位置に移動する以下は、今回の実装では使えませんでした。

  • scrollBy

また、要素の高さを表すプロパティとして以下がありますが

  • clientHeight
  • scrollHeight
  • offsetHeight

これらは、CSSやHTMLとの構造によって使い分けが必要そうです。
とりあえず以下のようにしてみました。
https://jsfiddle.net で検証してみたところ問題なさそうです。
と書きましたが初稿では問題があったようです。(´・ω・`)

javascript
function getProperty(element, type) {
  return element[type]
}

function sumArrayToN(array, n) {
  let result = 0
  for (i = 0; i < n; ++i) {
    result += array[i]
  }
  return result
}

function getChildrenHeights(element) {
  const heights = []
  for (const child of element.children) {
    heights.push(child.offsetHeight)
    /*
    let result = {
      "clientHeight": getProperty(child, "clientHeight"),
      "scrollHeight": getProperty(child, "scrollHeight"),
      "offsetHeight": getProperty(child, "offsetHeight"), 
    }
    // console.log(result)
    heights.push(result)
    //*/    
  }
  return heights
}

function scrollUlTo(id, n) {
  const element = document.getElementById(id)
  const heights = getChildrenHeights(element)
  const scroll = sumArrayToN(heights, n)

  // element.scroll(0, scroll)
  element.scrollTo(0, scroll)
  // element.scrollBy(0, scroll) 駄目
}

scrollUlTo("ul", 8)
scrollUlTo("ul", 2)

最後に

あとは、実際に使ってみてより良いものにしていきたいと思います。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1