Webアプリで手軽に目盛りつきSliderを実装する(jRangeを使用)


今回はWebアプリにこのような目盛りつきスライダーを実装する方法を検証してみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227613/9aa7c942-dc78-25d9-e06e-22710a012b5d.png)

条件としては、
- 目盛り(最小値が-180 最大値が180, メモリの値は15ずつ)があること
- スライダーがスムーズに動くこと
- 実装が楽なこと
- Firefox, Chromeで動くこと


の4つになります。

# HTMLタグを使ってみる
スライダー自体は input type="range"と指定することで実装できるらしいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227613/3fc6f6af-a208-3e88-39e9-e6cb1e2409b4.png)
[HTML5タグリファレンス](http://www.htmq.com/html5/input_type_range.shtml)

````html
<div>
　　<input type="range" min="-180" max="180"> 
<div>
````

## スライダーに目盛りを表示させる
input list="tlist"と指定し、目盛りを表示させたい数値にoptionを配置することで表示することができました。

````html
<div>
　　<input type="range" min="-180" max="180" list="tlist">
　　　　<datalist id="tlist">
　　　　　　<option value="-150"></option>
　　　　　　<option value="-120"></option>
　　　　　　<option value="-90"></option>
　　　　　　<option value="-60"></option>
　　　　　　<option value="-30"></option>
　　　　　　<option value="0"></option>
          <option value="30"></option>
　　　　　　<option value="60"></option>
　　　　　　<option value="90"></option>
　　　　　　<option value="120"></option>
　　　　　　<option value="150"></option>
　　　　</datalist>
<div>
````
optionのところはもっといい書き方がありそうですが、今回は一旦これで。
[こちら](https://programmercollege.jp/column/2415/)のサイトにも目盛りのところのコードが載っていました。

Chromeではこのように表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227613/251a914f-3d33-4973-92df-d8ec901c5f71.png)

Firefoxだと対応してない様子・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227613/3fc6f6af-a208-3e88-39e9-e6cb1e2409b4.png)

ブラウザはChromeのみ、目盛りをつけるだけであればこのやり方で良さそうですね。

## 目盛りに数値をつけたい
先ほどのスライダーの目盛りがふってある位置に数値を表示させたい。
HTMLとCSSで頑張ればできそうですが、画面サイズが変わった時なども考慮して実装するのは結構大変そう。

jQuery UIとかでも実現できそうと思いましたが、いまいち手順を記しているサイトを見つけることができませんでした。

# ライブラリを使ってスライダーを実装する
HTMLでゴリゴリ書く方法は諦めて使えそうなライブラリがないか検証した結果、
[jRange](https://nitinhayaran.github.io/jRange/demo/)というライブラリが一番手軽に使えそうだったので採用しました。
その使い方をメモしておきたいと思います。

## 導入手順
[jRange公式](https://nitinhayaran.github.io/jRange/demo/)の方にも書いてありますが、英語なので、一応日本語でおさらい。
1. [github](https://github.com/nitinhayaran/jRange)からコードをダウンロード。
2. jquery.range.js, jquery.range.cssの2つのファイルを自分のhtmlファイルの中に含める。
3. htmlファイルのライブラリ読み込みの箇所で以下のように書き、追加した2つのファイルを読み込む。

````html
<link rel="stylesheet" href="jquery.range.css">
<script src="jquery.range.js"></script>
````

4.htmlにスライダーを配置したい場所に以下のように書く。

````html
<input type="hidden" class="single-slider" value="0" />
````

あとは使いたいoptionをjQueryのファイルに書く、以上。
とっても簡単に使うことができました。optionの書き方は次で説明します。


## スライダーの見た目を変更

[jRange公式](https://nitinhayaran.github.io/jRange/demo/)の"See it in Action"の箇所にも書いてあるように、jQueryでスライダーの設定をしておく必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227613/e751e02d-021a-bcc9-92c2-30272a4aad1d.png)

このようなスライダーを表示するためには以下のコードを.jsファイルに書きます。

````js
$('.single-slider').jRange({
  from: -180,
  to: 180,
  step: 15,
  scale: [-180,-150, -120, -90, -60, -30, 0, 30, 60, 90, 120, 150, 180],
  format: '%s',
  width: '100%',
  theme: "theme-blue",
  showLabels: false,
});
````

scale: 目盛りをふりたい位置をリストで指定
theme: "theme-blue"と"theme-green"を選ぶことが可能
showLabels: trueにすると現在値が表示される

スライダーを動かした際のイベントを取得したい場合は、
onstatechangeという関数をオプションとして指定しておき、
そのチェンジイベントの時の処理を書いておけばOKです。


````js
$('.single-slider').jRange({
  from: -180,
  to: 180,
  step: 15,
  scale: [-180,-150, -120, -90, -60, -30, 0, 30, 60, 90, 120, 150, 180],
  format: '%s',
  width: '100%',
  theme: "theme-blue",
  showLabels: false,
  onstatechange: function(){
    $(".single-slider").trigger('change');
  }
});

$('.single-slider').change(function(e){
    console.log("スライダーが動かされました");
   });
````

# その他
ここまで書いてこんな[サイト](http://bseth99.github.io/projects/jquery-ui/7-jquery-ui-labeled-slider.html)を発見。
jQuery UIでも簡単に目盛り付きのものを実現できそうですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227613/cb1ea52a-7101-9c9c-c485-b51155428f47.png)

CSSで色々カスタマイズしないと見た目はシンプルなままそうですが。今度試してみたいと思います！