Inputタグを使わないrange slider
inputタグを使わないレンジスライダーを自作しました。
e.preventDefault();
で、touchイベントの際に、mouseイベントが発生しないようにしています。
thumbRate
で、スライダーが100%の時に、’ポチ’が右にはみ出さないようにしています。
<style>
.slider_wrapper {
width:100%;
height:30px;
background:rgba(246,246,255,1);
border-radius:15px;
position:relative;
box-shadow:2px 5px 3px gray;
}
.slider_subwrapper {
width:90%;
height:30px;
display:block;
position:relative;
margin:0 auto;
cursor:pointer;
background:inherit;
z-index:200;
}
.slider_baloon {
position: absolute;
display: none;
text-align:center;
padding: 0 2px;
background-color: rgba(82, 82, 82, 0.5);
color:#fff;
left : 5%;
bottom : 100%;
margin-bottom : 5px;
font-size:;
border-radius:7px;
}
.slider_wrapper:hover .slider_baloon {
display:block;
}
.slider_thumb {
position: absolute;
display: block;
text-align:center;
background: rgba(163,163,255,1);
width:12px;
height:12px;
left : 0%;
top : 10px;
border-radius:50%;
box-shadow: 0px 2px 4px 0px rgba(0, 0, 0, 0.2);
cursor:pointer;
z-index:100;
}
.slider {
width:100%;
height:4px;
background:#fff;
cursor:pointer;
position:absolute;
top:13px;
left:0%;
}
.slider_progress {
height:4px;
background: rgba(163,163,255,1);
cursor:pointer;
}
</style>
<body>
<div id="slider_wrapper" class="slider_wrapper">
<div id="slider_subwrapper" class="slider_subwrapper">
<span id="slider_baloon" class="slider_baloon"></span>
<div id="slider" class="slider" role="slider">
<div id="progress_slider"></div>
</div>
<span id="slider_thumb" class="slider_thumb"></span>
</div>
</div>
</body>
<script>
const progressSlider = document.getElementById("progress_slider"),
slider = document.getElementById("slider"),
sliderSubWrapper = document.getElementById("slider_subwrapper"),
sliderThumb = document.getElementById("slider_thumb"),
text = document.getElementById("slider_baloon");
let WidthX, rect, thumbRate;
let x = 0;
let mousedownFlag = false;
sliderSubWrapper.ontouchstart =
sliderSubWrapper.onmousedown = mousedownSlider;
sliderSubWrapper.ontouchend =
sliderSubWrapper.onmouseup =
sliderSubWrapper.onmouseleave =
sliderSubWrapper.ontouchcancel = mouseupSlider;
sliderSubWrapper.onmouseenter =
sliderSubWrapper.ontouchmove =
sliderSubWrapper.onmousemove = moveSlider;
function mouseX(e) {
rect = sliderSubWrapper.getBoundingClientRect();
if (e.touches && e.touches[0]) {
x = (e.touches[0].clientX - window.pageXOffset - rect.left)
} else if (e.clientX && e.clientY) {
x = (e.clientX - window.pageXOffset - rect.left)
// x = e.offsetX ではマウスがthumbの上にあるときにうまく行かない。
}
if ( x < 0 ){
WidthX = 0
} else if ( x > sliderSubWrapper.clientWidth){
WidthX = 100
} else {
WidthX = Math.round(x / sliderSubWrapper.clientWidth * 100);
}
return WidthX;
}
function setProgressSlider (WidthX) {
progressSlider.style.width = WidthX + '%';
progressSlider.classList.add("slider_progress");
sliderThumb.style.left = WidthX * thumbRate + "%";
}
function mousedownSlider(e){
e.preventDefault();
slider.style.background = `#fff`;
mousedownFlag = true;
WidthX = mouseX(e);
setProgressSlider(WidthX);
text.style.left = WidthX + "%";
text.innerText = WidthX + "%";
}
function mouseupSlider(e){
e.preventDefault();
if (mousedownFlag){
mousedownFlag = false;
setProgressSlider(WidthX);
}else{
slider.style.background = `#fff`;
mousedownFlag = false;
}
}
function moveSlider(e){
e.preventDefault();
WidthX = mouseX(e);
text.style.left = WidthX + "%";
text.innerText = WidthX + "%";
if(mousedownFlag){
setProgressSlider(WidthX);
} else {
slider.style.background = `linear-gradient(to right, rgba(163,163,255,0.4) 0%, rgba(163,163,255,0.4) ${WidthX}%, #fff ${WidthX}%, #fff 100%)`
}
}
thumbRate = sliderSubWrapper.clientWidth / ( sliderSubWrapper.clientWidth + sliderThumb.clientWidth);
</script>
参考記事
[JavaScript]タッチイベントからoffsetXとoffsetXを取得する
【JavaScript】click と touchend の両方のイベントリスナーのうち touchend だけを実行する
お薦め
(連載マンガ)成約のあの日へ – To The Completed Testament Age 「第6話・人生を変えた悟り」https://t.co/v3g0OFJS8R
— RAPT理論+α (@Rapt_plusalpha) January 21, 2023
【岡山県・備前市】「世帯全員がマイナンバーカードを作れば、給食費・学用品・保育料を無償とし、作らなければ有料とする」と市民に通知し批判殺到https://t.co/eKHUGHmtjB
— RAPT理論+α (@Rapt_plusalpha) January 21, 2023
滋賀県・三日月知事、オミクロン対応ワクチン1人1回接種促進強化期間を設け、全国から批判殺到「無茶苦茶すぎ!!ナチズムかよ」「在庫処分」「魂をいくらで売ったのか金額を聞いてみたい」https://t.co/38f5uIPFzN
— RAPT理論+α (@Rapt_plusalpha) January 21, 2023
【中国共産党のスパイ】三浦瑠麗の夫、太陽光発電をめぐる巨額詐欺で刑事告訴、東京地検特捜部から家宅捜索https://t.co/8aFvXaKZE1
— RAPT理論+α (@Rapt_plusalpha) January 21, 2023
【崩壊する中国】債務総額が官民合わせて約6660兆円に GDPの約3倍に相当 経済回復はほぼ不可能https://t.co/of9zjuQYUP
— RAPT理論+α (@Rapt_plusalpha) January 20, 2023
「発達障害」も捏造された病気!! RAPTブログで医療界の闇を知り、親しかった親子が救われた(十二弟子・ミナさんの証)https://t.co/EpO4HXi6x3
— RAPT理論+α (@Rapt_plusalpha) January 20, 2023
隠密に成される神様の壮大なご計画を一緒に成していけるように導いて下さったRAPTさんの偉大さ(十二弟子・NANAさんの証)https://t.co/MUiHdOXqMP
— RAPT理論+α (@Rapt_plusalpha) January 19, 2023