LoginSignup
3
3

htmxでタブ切り替え

Last updated at Posted at 2024-02-18

今流行りと聞いたhtmxでタブ切り替えしてみた

先日とある交流会でhtmxのことを教えてもらいました!
なんか、便利そう!!

非同期処理(get,post)ができることについての記事はたくさんありましたが、私は直感的に
Web制作でJqueryで実装している箇所を置き換えできるのでは??
と思いました。

正直ドキュメントはあまり充実していませんでした。

タブ切り替え実装!

<script src="https://unpkg.com/htmx.org@1.9.10/dist/htmx.js"></script> // これが重要!htmxを使用する際に必須な読み込みです。

<div class="tab_wrap">
  <button hx-on:click="htmx.takeClass('#tab-contents1', 'selected'), htmx.takeClass(this, 'selected')"  class="tab selected">Tab 1</button>
  <button hx-on:click="htmx.takeClass('#tab-contents2', 'selected'), htmx.takeClass(this, 'selected')" class="tab">Tab 2</button>
  <button hx-on:click="htmx.takeClass('#tab-contents3', 'selected'), htmx.takeClass(this, 'selected')" class="tab">Tab 3</button>
</div>
<div class="contents_wrap">
  <div id="tab-contents1" class="contents selected">タブ1の内容<br>テキストテキストテキストテキスト</div>
  <div id="tab-contents2" class="contents">タブ2の内容<br>テキストテキストテキストテキスト 
  <div id="tab-contents3" class="contents">タブ3の内容<br>テキストテキストテキストテキスト</div>
</div>


ポイントは

<button hx-on:click="htmx.takeClass('#tab-contents2', 'selected'), htmx.takeClass(this, 'selected')"  class="tab">Tab 1</button>

ボタンタグのclickイベントの記述です。
htmxのclickイベントの記述は以下です。

hx-on:click=

これでイベントを記述できます。

htmx.takeClass

今回はhtmx.takeClass()を使用しました。
こちらは同じ兄弟要素の一つにクラスを付与してくれ、該当要素以外(その他の兄弟要素)にクラスがついていたら勝手に削除してくれます。便利!!

他にもjqueryでもおなじみなtoggleとかaddClassとかもあります。

htmx.toggleClass()
htmx.removeClass()
htmx.addClass()

いろいろあるので、試してみて下さい!

htmx.takeClass('#tab-contents2', 'selected')

上記の意味としては、tab-contents2というidにselectedという名前のclassを付与する&その他兄弟要素にselectedというクラスがついている要素があったら削除する。

というような意味になると思います。
ここでタブのテキスト(コンテンツ)の表示の切り替えをしています。

更に、

htmx.takeClass(this, 'selected')

ここでの、thisは自分自信(=buttonタグ)のことです。
クリックしたbuttonタグのクラスにもselectedというクラスを付与する&その他兄弟要素(その他のbuttonタグ)からはselectedを削除する。
という意味です。

ここではタブのボタン自身のスタイルの変更をしています。

クリックイベントで複数処理をしたい場合、どうしたら良いのかドキュメント見てもなかったので、

hx-on:click="htmx.takeClass('#tab-contents2', 'selected'), htmx.takeClass(this, 'selected')"

とカンマで続けたら動いたので、これで良い??
(もし正式があって間違っていたら教えて下さい〜)

これで複数処理でもきちんと実装できました!

やってみて

これ、物凄く軽量らしいので、重いJqeuryより断然良いのでは?
更にそんなに難しくないので、Web制作でコーディングしている人にもオススメ!!
と思って記事にしてみました。

是非コーディングに取り入れてみて下さい!

参考

css


.tab{
   border: 2px solid lightblue;
   border-bottom:none;
   cursor: pointer;
   outline: none;
   padding: 8px;
   appearance: none;
   font-weight:bold;  
   color:lightblue;
   background-color:white;
}
.tab.selected{
  background-color: lightblue;
  color:white;
}

.contents_wrap{
  padding:16px;
  border:2px solid lightblue;
}

.contents{
  display:none;
  
}

.contents.selected {
  display:block
}

実際操作感見てみて良い!と思ったら是非チャレンジしてみて下さい!

See the Pen Untitled by takako okunishi (@niyu1103) on CodePen.

参考サイト:

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3