スライダー間隔コンポーネントのネイティブ js 実装

スライダー間隔コンポーネントのネイティブ js 実装

この記事の例では、スライダー間隔コンポーネントを実装するためのjsの具体的なコードを参考までに共有しています。具体的な内容は次のとおりです。

機能要件:

1. 最小値は 0 で、指定された最大値に応じて間隔範囲が生成されます。
2. スライダーをドラッグすると、対応する範囲が表示され、スライダーバーに対応するステータスが表示されます。
3. クリックすると、最も近いスライダーがマウスをクリックした位置に移動します。

デフォルトの効果:

スライダーをドラッグすると、次のように表示されます。

分析:

  • まず、レイアウトを記述する必要があります。要素は全部で 4 つあり、スライダーが 2 つ、スライダー バーが 2 つあります。レイアウトするときは、後でスライダーとスライダー バーのイベントを監視し、イベントのバブリングを最小限に抑えることを考慮する必要があります。
  • スライダーをドラッグするときは、それが左のスライダーか右のスライダーかを区別します。
  • マウスのクリック イベントと mousedown イベントは互換性がある必要があります。ここでは mousedown イベントが統一的に使用されます。
  • 左スライダーと右スライダーの最大値と最小値を決定します。
  • スライダーバーの表示は非常にシンプルです。幅は左右のスライダーの位置差、左の値は左のスライダーの左の値です。
  • イベント委任メカニズムが使用されているため、mousemove イベントと mouseup イベントでは、現在どのスライダーが操作されているかを判別できないため、マウスが押されると、現在操作されているオブジェクトが mousemove イベントに渡されます。

コードは以下に添付されています:

HTML 構造、スライダーをインスタンス化し、現在のスライダーの範囲を設定します。

<!DOCTYPE html>
<html lang="ja">
<ヘッド>
 <メタ文字セット="UTF-8">
 <meta name="viewport" content="width=デバイス幅、初期スケール=1.0">
 <title>スライド</title>
</head>
<本文>
 <スクリプトタイプ="モジュール">
 「./js/Slide.js」からスライドをインポートします。

 初期化();
 関数init(){
  //パラメータは最大範囲です。渡されない場合は、デフォルトは4000です
  slide = new Slide(4200); とします。
  slide.appendTo("本文");
 }

 </スクリプト>
</本文>
</html>

Slide.js ファイル: スライダーの作成、スライダーのドラッグ、スライダーのクリックの機能を実行します。

「./Utils.js」からUtilsをインポートします。
デフォルトクラススライドをエクスポートする{
 静的スタイルCss=false;
 //最小範囲 minNum=0;
 //最大範囲 maxNum;
 //左ボタンの左の値 leftBtnLeft=0;
 //右ボタンの左の値 rightBtnLeft=238;
 コンストラクター(_max=4000){
 //デフォルトの最大値は4000です
 this.maxNum=_max;
 this.elem = this.createElem();
 }
 要素を作成します(){
 if(this.elem) は this.elem を返します。
 // 最も外側のコンテナを作成します。let div=Utils.createE("div");
 div.className="スライドコンテナ";
 div.innerHTML=`<p class="priceTxt">価格<span id="rangeText">¥${this.minNum}-${this.maxNum}</span></p>
 <div class="rangeContainer" id="rangeContainer">
  <div class="bgRange" id="bgRange"></div>
  <div class="価格範囲" id="価格範囲"></div>
  <span id="leftBtn" class="leftBtn"></span>
  <span id="rightBtn" class="rightBtn"></span>
 </div>`;
 Utils.getIdElem(div,this);
 //スタイルを設定する Slide.setStyles();
 //親要素の mousedown イベントをリッスンします this.rangeContainer.addEventListener("mousedown",e=>this.mouseHandler(e))
 div を返します。
 }
 親に追加{
 Utils.appendTo(this.elem,parent);
 }
 マウスハンドラ(e){
 //注: getBoundingClientRect() によって返される結果では、幅と高さの両方に境界線が含まれます。let rect=this.rangeContainer.getBoundingClientRect();
 スイッチ (e.type) {
  ケース「マウスダウン」:
  //マウスの高速ドラッグのデフォルト イベントをキャンセルします。e.preventDefault();
  this.x = e.offsetX;
  this.btnType=e.target.id;
  //背景バーがクリックされた場合、rangeClick関数を実行します。if(/Range/.test(this.btnType)){
   e.stopPropagation();
   //クリック関数 this.rangeClick(e);
   戻る;
  }
  //ボタンがクリックされた場合、ドキュメントのマウス移動イベントをリッスンします。this.mouseHandlers=e=>this.mouseHandler(e);
  document.addEventListener("mousemove", this.mouseHandlers);
  document.addEventListener("mouseup", this.mouseHandlers);
  壊す;
  ケース「マウス移動」:
  x = e.clientX - rect.x - this.x とします。
  //左ボタンと右ボタンの左の値を取得します。this.leftBtnLeft=parseInt(getComputedStyle(this.leftBtn).left);
  this.rightBtnLeft = parseInt(getComputedStyle(this.rightBtn).left);
  if (this.btnType === "leftBtn") {
   //左ボタンの値の範囲を決定します if (x < 0) x = 0;
   x が this.rightBtnLeft の場合、x は this.rightBtnLeft になります。
   this.leftBtn.style.left = x + "px";
  } そうでない場合 (this.btnType === "rightBtn") {
   // 右ボタンの値の範囲を、1px の境界線を引いて決定します。if (x < this.leftBtnLeft) x = this.leftBtnLeft;
   x が this.bgRange.offsetWidth - 2 より大きい場合、x は this.bgRange.offsetWidth - 2 になります。
   this.rightBtn.style.left = x + "px";
  }
  //テキスト範囲表示 this.changeRangeText();
  壊す;
  ケース「マウスアップ」:
  // 移動イベント リスナー document.removeEventListener("mousemove", this.mouseHandlers);
  document.removeEventListener("mouseup"、this.mouseHandlers);
  壊す;
 }
 }
 範囲クリック(e){
 //マウスのクリック位置の値を計算します。let click_X=e.clientX-this.rangeContainer.getBoundingClientRect().x-this.leftBtn.offsetWidth/2;
 //現在のクリック位置が左ボタンの左側にあるか、左ボタンと右ボタンが重なっている場合はクリック位置がボタンの左側にあるかを判断し、マウスがクリックされた位置に左ボタンを移動しますif(Math.abs(click_X-th​​is.leftBtnLeft)<Math.abs(click_X-th​​is.rightBtnLeft) || 
 (this.leftBtnLeft===this.rightBtnLeft && click_X<this.leftBtnLeft)) this.leftBtn.style.left=click_X+"px";
 // それ以外の場合は、マウスがクリックされた位置に右ボタンを移動します。else this.rightBtn.style.left=click_X+"px";
 // 移動後の左ボタンと右ボタンの左の値を取得します。this.leftBtnLeft=parseInt(getComputedStyle(this.leftBtn).left);
 this.rightBtnLeft = parseInt(getComputedStyle(this.rightBtn).left);
 //テキスト範囲表示 this.changeRangeText();
 }
 範囲テキストを変更する(){
 // 範囲の最小値と最大値を計算し、切り上げます。let minTxt=Math.round(this.leftBtnLeft/(this.bgRange.clientWidth-2)*this.maxNum);
 maxTxt=Math.round(this.rightBtnLeft/(this.bgRange.clientWidth-2)*this.maxNum); とします。
 this.rangeText.innerText=`¥${minTxt}-${maxTxt}`;
 //スライダーの色を変更します this.changeRangeSlide();
 }
 スライド範囲の変更(){
 //スライダーの幅は、左ボタンと右ボタンの間の距離に等しくなります。this.priceRange.style.width=this.rightBtnLeft-this.leftBtnLeft+"px";
 //スライダーの左の値は左ボタンの左の値と同じです。this.priceRange.style.left=this.leftBtnLeft+"px";
 }
 静的setStyles(){
 Slide.styleCss を返します。
 Slide.styleCss=true;
 Utils.insertCss(".slideContainer",{
  幅:"260px",
  高さ:"70px",
  マージン:"50px"
 })
 Utils.insertCss(".priceTxt",{
  フォントサイズ:"14px",
  色:"#666",
  マージン下:"20px"
 })
 Utils.insertCss(".priceTxt span",{
  フロート:"右"
 })
 Utils.insertCss(".rangeContainer",{
  幅:"260px",
  高さ:"20px",
  位置:"相対",
 })
 Utils.insertCss(".bgRange",{
  幅:"240px",
  高さ:"3px",
  背景色:"#dedede",
  位置:"絶対",
  左:"10px",
  上:"9px"
 })
 Utils.insertCss(".priceRange",{
  幅:"240px",
  高さ:"3px",
  背景:"#ffa800",
  位置:"絶対",
  左:"10px",
  上:"9px"
 })
 Utils.insertCss(".rangeContainer span",{
  幅: "20px",
  高さ: "20px",
  境界半径:"50%",
  境界線:"1px 実線 #ccc",
  背景:"#fff",
  位置:"絶対",
  上:"0px",
  ボックスシャドウ:"2px 2px 2px #333"
 })
 Utils.insertCss(".leftBtn",{
  左:"0px"
 })
 Utils.insertCss(".rightBtn",{
  左:"238px"
 })
 }
}

Utils.js ファイル: ツール パッケージ ファイルです。

デフォルトクラス Utils をエクスポートする{
 静的createE(要素、スタイル、準備){
 要素 = document.createElement(要素);
 if(style) for(let prop in style) elem.style[prop]=style[prop];
 if(prep) for(let prop in prep) elem[prop]=prep[prop];
 要素を返します。
 }
 静的appendTo(要素、親){
 parent.constructor === String の場合、parent = document.querySelector(parent);
 親要素に子要素を追加します。
 }
 静的ランダム数(最小値,最大値){
 Math.floor(Math.random*(max-min)+min) を返します。
 }
 静的ランダムカラー(アルファ){
 アルファ=アルファ||Math.random().toFixed(1);
 isNaN(alpha)の場合、alpha=1;
 アルファ>1の場合、アルファ=1;
 アルファ<0の場合、アルファ=0;
 col="rgba("; とします。
 (i=0;i<3;i++) の場合{
  col+=Utils.randomNum(0,256)+",";
 }
 col+=alpha+")";
 列を返します。
 }
 静的挿入Css(選択、スタイル){
 document.styleSheets.length===0の場合{
  styleS = Utils.createE("style"); とします。
  Utils.appendTo(styleS,document.head);
 }
 styleSheet を document.styleSheets[document.styleSheets.length-1] とします。
 str=select+"{"とします。
 for(var prop in スタイル){
  str+=prop.replace(/[AZ]/g,function(item){
  "-"+item.toLocaleLowerCase() を返します。
  })+":"+styles[prop]+";";
 }
 str+="}"
 styleSheet.insertRule(str、styleSheet.cssRules.length);
 }
 静的 getIdElem(要素,obj){
 if(elem.id) obj[elem.id]=elem;
 if(elem.children.length===0) の場合、obj を返します。
 for(let i=0;i<elem.children.length;i++){
  Utils.getIdElem(elem.children[i],obj);
 }
 }
}

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Vue はドラッグ スライダー検証機能を実装します (バックグラウンド検証手順のない CSS + JS のみ)
  • JSコンポーネントによるドラッグスライダー検証機能の実装(コード共有)
  • JavaScript ベースのドラッグスライダー効果の実装
  • Javascriptはスライダーをスライドさせて値を変更する実装コードを実装します
  • jsはPCとモバイル端末に対応したスライダードラッグ選択デジタルエフェクトを実現します
  • JSはマウスクリックに反応して2つのスライダー間のドラッグ効果を実現します
  • スライダーをドラッグして画像サイズを制御するjsメソッド
  • Vue.js をベースにタブスライダー効果を実現する
  • Javascript: マウスを上に動かすと、小さな三角形のスライダーがゆっくりと効果を追従します
  • JSはマウスクリックに応じてウェブゲーム内のスライダー移動効果を実装します

<<:  Mac に mysql5.7 をインストールするための完全な手順 (画像とテキスト付き)

>>:  Linux における SUID、SGID、SBIT の素晴らしい使い方の詳細な説明

推薦する

iOS スタイルの選択ボックスの開閉機能を実装するための純粋な CSS

1 効果デモアドレス: https://www.albertyy.com/2020/7/check...

ウィンドウの中央にブロック要素の位置を設定する方法

ウィンドウの中央にブロック要素の位置を設定する方法ブロック要素をウィンドウの中央に配置する上記の方法...

CSS インライン スタイル、埋め込みスタイル、外部参照スタイルを使用する 3 つの方法

3 つの方法を使用する簡単な例は次のとおりです。インラインスタイル: <!doctypehtm...

Linux での MySQL 5.7.16 無料インストール バージョンのグラフィック チュートリアル

この記事では、参考までにMySQL 5.7.16の無料インストール版のチュートリアルを紹介します。具...

Node.js で簡単なクローラーケースを作成するチュートリアル

準備まず、nodejs をダウンロードする必要がありますが、これは問題ないはずです。原文はwebst...

一般的な Linux ツール vi/vim の完全版

なぜvimを学ぶのかLinuxには多数の設定ファイルがあるため、Linuxには多くのテキスト処理ツー...

JavaScript ES6 分割演算子の理解と応用

目次序文脱構築記号の役割使い方分割割り当ての適用アプリケーションの簡単な紹介JSONデータを抽出する...

mysql replace into の使用法の詳細な説明

replace ステートメントは、一般的に insert ステートメントに似ています。ただし、テーブ...

JavaScript での AOP プログラミングの基本実装

AOP の紹介AOP (アスペクト指向プログラミング) の主な機能は、コアビジネスロジックモジュール...

VueはOpenLayersを使用してTiandi MapとAmapを読み込み

目次1. 世界地図1. VueにOpenLayersをインストールする2. アマップ1. 世界地図1...

HTMLでマスクレイヤーを実装する方法 HTMLでマスクレイヤーを使用する方法

Web ページでマスク レイヤーを使用すると、繰り返しの操作を防ぎ、読み込みを促進できます。また、ポ...

LeetCode の SQL 実装 (197. 気温上昇)

[LeetCode] 197.気温上昇Weather テーブルが指定されている場合、前の日付 (昨...

MySQLデータベースのトランザクション分離レベルの詳細な説明

データベーストランザクション分離レベルデータベース トランザクションには、低から高まで 4 つの分離...

レスポンシブなカードホバー効果を実現するための HTML+CSS

目次成し遂げる:要約:言うことはあまりありませんが、まずは効果を見てみましょう。 カードホバー、レス...

Windows で MySQL のルート パスワードを忘れた場合にリセットする方法

私のマシン環境: Windows 2008 R2 MySQL 5.6 Baidu で「Windows...