この関数の中では大きく分けて2つの処理を行っています。
getBoundingClientRect()
を使用してビューポートに対するタブボタンの位置と、ビューポートに対するラッパー要素の位置を計算して定数に格納しています。
const buttonRect = activeButton.getBoundingClientRect();const listRect = tabList.getBoundingClientRect();
// 背景の位置を計算const x = buttonRect.left - listRect.left;const y = buttonRect.top - listRect.top;
背景の要素tabBg
に対して、getBoundingClientRect()
で取得した幅と高さを設定しています。また上記で取得したビューポートに対する位置情報をtranslate
のxとyに代入することで、位置を設定しています。
// 背景のサイズと位置を設定tabBg.style.width = `${buttonRect.width}px`;tabBg.style.height = `${buttonRect.height}px`;tabBg.style.transform = `translate(${x}px, ${y}px)`;
背景色を動かすためのupdateTabBackground
関数を、初期表示時、ウィンドウリサイズ時、タブボタンクリック時に実行することで、動的に背景色のtranslate
の値が変化するようになります。
最後にCSSアニメーションを設定します。背景の要素が変化時にアニメーションするように、transition
プロパティを設定しています。
.c-tab__bg { display: block; position: absolute; top: 0; left: 0; background-color: #f0f0f0; z-index: -1; pointer-events: none; /* CSSアニメーションを設置 */ transition: background-color 0.3s ease;}
また親要素を基準にc-tab__bg
を移動させる必要があるため、ラッパーとなる要素にposition: relative;
を追加します。
.c-tab { position: relative;}
今回は親要素となるc-tab
に対して追加しましたが、この辺りはHTMLの構造によって変わってくるので適宜調整が必要です。
以上「マグネットのように背景色が移動するタブボタンの作り方」でした。今回は背景色をアニメーションさせましたが、下線(アンダーライン)だけでも同じように動かせそうです。