スライダとzoom

2016年11月20日 11:13

・zoomはposition:relativeをつけないと、配下に反映されない


<!DOCTYPE html>

<meta http-equiv="x-ua-compatible" content="IE=7">

<html lang="ja">

<head>

<meta charset="utf-8">

<style type="text/css">

html {

height:90%;

width:90%;

}

body {

height:800px;

width:800px;

zoom:2;

position:relative; /* これをつけないと、zoom値が反映されない */

}

#left_block {

width: 48%;

border:1px inset #aaa;

/*display: block;*/

float: left;

 

}

#right_block {

zoom:2;

width: 48%;

border:1px inset #aaa;

/*float: right;*/

position:relative; /* これをつけないと、zoom値が反映されない */

}

.js-slider-form{

/*position:relative;*/

}

/* つまみと、スライダバーの親 */

.js-slider{

 /*position:relative;*/

 width:300px;

 height:20px;

 border:1px inset red;

}

/* スライダーバー */

.js-slider div{

 background:#ddd;

 height:3px;

 border:1px inset #aaa;

 position:relative;

 top:12px;

 font-size:0px;

}

/* つまみ */

.js-slider input{

 position:absolute;

 width:15px;

 height:20px;

 display:block;

}


    </style>

    

<title>ページのタイトル</title>

</head>

<body>

<div>左</div>

<div>右

<form onsubmit="return false;">

 <input type="text" value="0">

   <input type="text" value="0">

 <input type="text" value="0">

 <input type="text" value="0">


 <div>

   <div></div>

   <input type="button" value="">

 </div>

</form>

</div>

<script language="javascript">

(function(){

var slider = document.getElementById('slider1'); //スライダーバー

var output = document.getElementById('slider1o'); //スライダーバーの値を表示するテキストボックス

var output2 = document.getElementById('slider2o');

var output3 = document.getElementById('slider3o');

var output4 = document.getElementById('slider4o');

//スライダーバー

var zoomvalue = 4;

var input = slider.getElementsByTagName('input')[0]; //つまみ取得

var root = document.documentElement;

var dragging = false;

var value = output.value;// 初期位置

var width = input.clientWidth / 2; //つまみの幅の半分の幅を取得

alert(input.clientWidth); //11になる理由は? clientWidth は element 内のピクセル単位の幅を返します。 paddingを含み、垂直スクロールバー(存在するならば)、border、marginを含みません。

var set_value = function (){

 //@@つまみの座標の調整

 //(input.style.left)は、指定px+zoom値が繁栄される。

 //value:zoom値が反映されている

 //input.clientWidth:zoom値が反映されていない

 //input.style.left:設定した値に対して、zoomがかかるため、zoom値でわっておく必要がある

 //そのため、zoom値でわっておく必要あり。

 //input.style.left = (value - input.clientWidth/2) + 'px';

 input.style.left = ((value - (input.clientWidth*zoomvalue)/2)/zoomvalue) + 'px';

 output.value = value/zoomvalue; //@@zoom値でわる

 //output.value = value;

};

set_value();


// 目盛り部分をクリックしたとき

slider.onclick = function(evt){

 dragging = true;

 document.onmousemove(evt);

 document.onmouseup();

};

// ドラッグ開始

input.onmousedown = function(evt){

 dragging = true;

 return false;

};

// ドラッグ終了

document.onmouseup = function(evt){

 if (dragging) {

   dragging = false;

   output.value = value;

 }

};

document.onmousemove = function(evt){

 if(dragging){

   // ドラッグ途中

   if(!evt){

     evt = window.event;

   }

   var left = evt.clientX; //zoom値が反映された座標

   var rect = slider.getBoundingClientRect(); //zoom値が反映された座標

   

   output2.value = left;

   output3.value = rect.left;

   

   // マウス座標とスライダーの位置関係で値を決める(zoom値が反映された座標)

   value = Math.round(left - rect.left - width); //タッチX座標 - スライダーバーの左端 - つまみの中心

   output4.value = width;

   // スライダーからはみ出したとき

   if (value < 0) {

     value = 0;

   } else if (value > slider.clientWidth*zoomvalue) { //@@スライダーバーは、zoom値が反映されない

   /*} else if (value > slider.clientWidth) {*/

     value = slider.clientWidth*zoomvalue; //zoom分2倍する

   }

   set_value();

   return false;

 }

};

})();

</script>

</body>

</html>