JavaScriptでタイムラインのステップを制御するボタンを作成する方法

シュロード

HTMLとCSSでタイムラインを作成しました。JavaScriptでタイムラインステップを制御するためのボタンを作成したいと思います。

タイムラインはいくつかのステップで構成されています。各ステップには3つの状態があります。

1)通常 .timeline__step

2)合格 .timeline__step--passed

3)アクティブ .timeline__step--active

「前へ」と「次へ」の2つのボタンを実行したい。セレクターでノードを見つけることができます。でも、ステップを無限に切り替えることができるコードの書き方がわかりません。

HTML:

<div class="timeline" id="timeline1">
      <div class="timeline__step timeline__step--passed">
        <span class="timeline__label">Step 1</span>
      </div>
      <div class="timeline__step timeline__step--passed">
        <span class="timeline__label">Step 2</span>
      </div>
      <div class="timeline__step timeline__step--active">
        <span class="timeline__label">Step 3</span>
      </div>
      <div class="timeline__step">
        <span class="timeline__label">Step 4</span>
      </div>
</div>

codepenのタイムラインフルバージョン:https://codepen.io/vlad3k-the-sasster/pen/rNNpBMb

アンドラス・サイモン

Nextボタンを実装するには、ボタンをクリックするたびに実行する必要があります。

  1. 現在アクティブなtimeline__step--active要素を見つけて、その要素からクラスを削除しますclassList
  2. アクティブな要素の次の兄弟要素を見つけて、クラスを追加します timeline__step--active
  3. エラーを回避するために、最初/最後のステップに到達しているかどうかを常に確認してください

Prevボタンは似ていますが、他の方法で回避しています。

簡単な例(私もサンプルコーデックを作成しました):

const timeline = document.getElementById('timeline1');
const btnChangeStyle = document.getElementById('toggle-style');
const btnChangeLabelPos = document.getElementById('toggle-label-pos');
const steps = timeline.querySelectorAll('.timeline__step');

function changeStyle() {
  timeline.classList.toggle('timeline--points');
}

function changeLabelsPosition() {
  timeline.classList.toggle('timeline--labels-underline');
}

btnChangeStyle.addEventListener('click', changeStyle);
btnChangeLabelPos.addEventListener('click', changeLabelsPosition);


document.querySelector('#next').addEventListener('click', () => {
  let steps = document.querySelectorAll("#timeline1 > .timeline__step");
  let passedSteps = document.querySelectorAll("#timeline1 > .timeline__step--passed");
  let firstStep = document.querySelector("#timeline1 > .timeline__step:first-child");
  let activeStep = document.querySelector("#timeline1 > .timeline__step--active");
  let nextStep;
  if(steps.length == passedSteps.length) {
    return;
  }
  if(activeStep) {
    activeStep.classList.remove('timeline__step--active');
    activeStep.classList.add('timeline__step--passed');
    nextStep = activeStep.nextElementSibling
  }
  if(nextStep) {
    nextStep.classList.add('timeline__step--active'); 
  } else if(passedSteps.length === 0) {
    firstStep.classList.add('timeline__step--active'); 
  }
});


document.querySelector('#prev').addEventListener('click', () => {
  let passedSteps = document.querySelectorAll("#timeline1 > .timeline__step--passed");
  let lastStep = document.querySelector("#timeline1 > .timeline__step:last-child");
  let activeStep = document.querySelector("#timeline1 > .timeline__step--active");
  let prevStep;
  if(passedSteps.length === 0) {
    return;
  }
  if(activeStep) {
    activeStep.classList.remove('timeline__step--active');
    activeStep.classList.remove('timeline__step--passed');
    prevStep = activeStep.previousElementSibling;
  }
  if(prevStep) {
    prevStep.classList.add('timeline__step--active'); 
  } else if(passedSteps.length === steps.length) {
    lastStep.classList.remove('timeline__step--passed');
    lastStep.classList.add('timeline__step--active');
  }
});
body {
  margin-top: 50px;
}

/* Timeline */

.timeline {
  position: relative;
  display: flex;
  justify-content: space-between;
  align-items: center;
  width: 100%;
  height: 30px;
  margin-bottom: 50px; /* optional property */
}

.timeline__step {
  position: relative;
  text-align: center;
  flex-grow: 1;
  height: 2px;
  background-color: lightgrey;
}

.timeline__step::before,
.timeline__step:last-child::after {
  content: "";
  position: absolute;
  top: 50%;
  left: 0;
  display: block;
  height: 11px;
  width: 11px;
  background-color: #ffffff;
  border: 2px solid lightgray;
  border-radius: 50%;
  box-sizing: border-box;
  box-shadow: 0 0 0 2px #fff;
  transform: translate(-50%, -50%);
}

.timeline__step:first-child::before {
  transform: translate(0%, -50%);
}

.timeline__step:last-child::after {
  left: auto;
  right: 0;
  transform: translate(0%, -50%);
}

.timeline__label {
  position: absolute;
  left: 50%;
  bottom: 10px;
  transform: translateX(-50%);
}

.timeline__step--passed,
.timeline__step--passed::before,
.timeline__step--passed:last-child::after {
  background-color: green;
  border-color: green;
}

.timeline__step--active,
.timeline__step--active::before {
  background-color: orange;
  border-color: orange;
}

/* Timeline points style (SASS Syntax) */

.timeline--points {
  
  .timeline__step:first-child {
   
    .timeline__label {
      transform: translateX(0);
    }
  }
  
  .timeline__step:last-child {
    position: absolute;
    right: 0;
    width: 100%;
    background: none;
    
    &::before {
      left: auto;
      right: 0;
      transform: translate(0, -50%);
    }
    
    &::after {
      display: none;
    }
    
    .timeline__label {
      left: auto;
      right: 0;
      transform: translateX(0);
    }
  }
  
  .timeline__label {
    position: absolute;
    left: 0;
    transform: translateX(-50%);
  }
  
  .timeline__step--active {
    background: lightgray;
  }
  
}

/* Timeline label position (SASS Syntax) */

.timeline--labels-underline {
   
  .timeline__label {
    bottom: auto;
    top: 10px;
  }
}
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.1.3/css/bootstrap.min.css" rel="stylesheet"/>
  <title>Document</title>
</head>
<body>
  <div class="container">
    
    <div class="timeline" id="timeline1">
      <div class="timeline__step timeline__step--passed">
        <span class="timeline__label">Step 1</span>
      </div>
      <div class="timeline__step timeline__step--passed">
        <span class="timeline__label">Step 2</span>
      </div>
      <div class="timeline__step timeline__step--active">
        <span class="timeline__label">Step 3</span>
      </div>
      <div class="timeline__step">
        <span class="timeline__label">Step 4</span>
      </div>
      <div class="timeline__step">
        <span class="timeline__label">Step 5</span>
      </div>
    </div>
    
    <button id="toggle-style" type="button" class="btn btn-outline-primary">Toggle style</button>
    <button id="toggle-label-pos" type="button" class="btn btn-outline-primary">Toggle label position</button>
    
    <button id="prev" class="btn btn-primary">&lt Prev</button>
    <button id="next" class="btn btn-primary">Next &gt</button>
    
  </div>
  
  
</body>
</html>

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

ブラウザの戻るボタンでJQueryマルチステップフォームを制御する

分類Dev

スタートボタンとストップボタンで制御されるCSVファイルを作成する方法

分類Dev

RxSwiftボタンがタップを発するタイミングを条件付きで制御する方法は?

分類Dev

各プログラムのインターネットアクセスを制御する方法は?

分類Dev

クイック作成フォームで保存ボタンの上書きカスタムJavaScriptを作成する方法

分類Dev

ラジオボタンでボタンを制御する方法

分類Dev

three.jsl-インタラクティブなマウス制御の360画像を作成する方法は?

分類Dev

Chromiumインスタンスをプログラムで制御するための最も信頼できる方法は何ですか?

分類Dev

プログラムで制御するためのイベントトリガーを作成する方法

分類Dev

Summernoteでカスタムボタンプラグインを作成する

分類Dev

Elasticsearchカスタムプラグインのテストを作成する方法

分類Dev

インタラクティブなRMarkdownでプロットの高さ/サイズを制御する方法(Shinyを使用)

分類Dev

javafxでこのタイプのボタンを作成する方法

分類Dev

ボタンクリックでアダプタクラスのリストアイテムの位置をタップする方法

分類Dev

JavaScriptでタイプボタンの入力を作成する

分類Dev

ブートストラップウィザードのモーダルファイナルボタンを制御する方法

分類Dev

ステータスバーのアラームアイコンを制御するためのLollipopAPI

分類Dev

仮想スティックを介してdjimavicエンタープライズを制御する

分類Dev

2つのスレッドで同じブラウザインスタンスを制御するWATIRRUBY

分類Dev

プロットグラフでカスタムモードバーボタンアイコンを作成する

分類Dev

Microsoft Cランタイムライブラリで使用されるCPU命令を制御する方法は?

分類Dev

フラッターでボタンのスタイリングを作成する方法は?

分類Dev

ミューテックスを使用してwhileループのタイミングを制御する

分類Dev

WPFでプログラム的に制御するEventCommadExecuterイベントを作成する方法

分類Dev

入力アラートダイアログからの空のテキストを処理し、アラートボタンを制御する方法

分類Dev

QToolBarでQActionボタンの間隔を制御する方法は?

分類Dev

Jqueryで入力タイプのドロップダウンメニューを制御する方法

分類Dev

カスタムボタンでSharepointクイック編集ボタン機能を再作成する方法

分類Dev

あるタイプのサブタイプのインスタンスをパラメトリックに作成できるScala関数を作成する方法

Related 関連記事

  1. 1

    ブラウザの戻るボタンでJQueryマルチステップフォームを制御する

  2. 2

    スタートボタンとストップボタンで制御されるCSVファイルを作成する方法

  3. 3

    RxSwiftボタンがタップを発するタイミングを条件付きで制御する方法は?

  4. 4

    各プログラムのインターネットアクセスを制御する方法は?

  5. 5

    クイック作成フォームで保存ボタンの上書きカスタムJavaScriptを作成する方法

  6. 6

    ラジオボタンでボタンを制御する方法

  7. 7

    three.jsl-インタラクティブなマウス制御の360画像を作成する方法は?

  8. 8

    Chromiumインスタンスをプログラムで制御するための最も信頼できる方法は何ですか?

  9. 9

    プログラムで制御するためのイベントトリガーを作成する方法

  10. 10

    Summernoteでカスタムボタンプラグインを作成する

  11. 11

    Elasticsearchカスタムプラグインのテストを作成する方法

  12. 12

    インタラクティブなRMarkdownでプロットの高さ/サイズを制御する方法(Shinyを使用)

  13. 13

    javafxでこのタイプのボタンを作成する方法

  14. 14

    ボタンクリックでアダプタクラスのリストアイテムの位置をタップする方法

  15. 15

    JavaScriptでタイプボタンの入力を作成する

  16. 16

    ブートストラップウィザードのモーダルファイナルボタンを制御する方法

  17. 17

    ステータスバーのアラームアイコンを制御するためのLollipopAPI

  18. 18

    仮想スティックを介してdjimavicエンタープライズを制御する

  19. 19

    2つのスレッドで同じブラウザインスタンスを制御するWATIRRUBY

  20. 20

    プロットグラフでカスタムモードバーボタンアイコンを作成する

  21. 21

    Microsoft Cランタイムライブラリで使用されるCPU命令を制御する方法は?

  22. 22

    フラッターでボタンのスタイリングを作成する方法は?

  23. 23

    ミューテックスを使用してwhileループのタイミングを制御する

  24. 24

    WPFでプログラム的に制御するEventCommadExecuterイベントを作成する方法

  25. 25

    入力アラートダイアログからの空のテキストを処理し、アラートボタンを制御する方法

  26. 26

    QToolBarでQActionボタンの間隔を制御する方法は?

  27. 27

    Jqueryで入力タイプのドロップダウンメニューを制御する方法

  28. 28

    カスタムボタンでSharepointクイック編集ボタン機能を再作成する方法

  29. 29

    あるタイプのサブタイプのインスタンスをパラメトリックに作成できるScala関数を作成する方法

ホットタグ

アーカイブ