<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Tab切換 &#8211; 小豬日常</title>
	<atom:link href="https://piglife.tw/tag/tab/feed/" rel="self" type="application/rss+xml" />
	<link>https://piglife.tw</link>
	<description>Hello World，一個紀錄生活與學習的地方</description>
	<lastBuildDate>Wed, 10 Dec 2025 10:22:38 +0000</lastBuildDate>
	<language>zh-TW</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9</generator>

<image>
	<url>https://piglife.tw/wp-content/uploads/2017/10/cropped-logo-1-32x32.png</url>
	<title>Tab切換 &#8211; 小豬日常</title>
	<link>https://piglife.tw</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>使用 JavaScript 實作動態切換 Tab 面板的按鈕控制</title>
		<link>https://piglife.tw/technical-notes/javascript-tab-panel-switch/</link>
					<comments>https://piglife.tw/technical-notes/javascript-tab-panel-switch/#respond</comments>
		
		<dc:creator><![CDATA[小豬]]></dc:creator>
		<pubDate>Wed, 10 Dec 2025 10:22:38 +0000</pubDate>
				<category><![CDATA[技術筆記]]></category>
		<category><![CDATA[DOM操作]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Tab切換]]></category>
		<guid isPermaLink="false">https://piglife.tw/technical-notes/javascript-tab-panel-switch/</guid>

					<description><![CDATA[介紹如何用純 JavaScript 實作按鈕控制的 Tab 面板切換功能，包含狀態管理與事件綁定，適...]]></description>
										<content:encoded><![CDATA[<h2 class="wp-block-heading">前言</h2>
<p>在許多網頁應用中，常見的 UI 元件之一是 Tab 切換功能，讓使用者能在同一區塊內切換不同內容面板。這段程式碼示範如何用純 JavaScript 實作按鈕控制多個 Tab 面板的顯示與隱藏，適合有基礎 DOM 操作經驗，想了解如何手動管理元素狀態的前端工程師或自學者。</p>
<h2 class="wp-block-heading">按鈕與面板元素的選取</h2>
<p>首先，程式碼透過 <code>document.querySelectorAll</code> 分別取得所有具有 <code>.action-btn</code> 與 <code>.tab-panel</code> 類別的元素。這兩組元素分別代表切換按鈕與對應的內容面板。若任一組元素不存在，則直接結束執行，避免後續錯誤。</p>
<pre><code class="lang-javascript language-javascript javascript">const buttons = document.querySelectorAll(&#039;.action-btn&#039;);
const panels  = document.querySelectorAll(&#039;.tab-panel&#039;);
if (!buttons.length || !panels.length) return;</code></pre>
<h2 class="wp-block-heading">activateButton 函式設計</h2>
<p><code>activateButton</code> 是核心函式，負責切換按鈕的「活躍」狀態與對應面板的顯示。它透過按鈕的 <code>data-target</code> 屬性取得目標面板的類別名稱，並依序執行：</p>
<ol>
<li>移除所有按鈕的 <code>is-active</code> 樣式，確保只有一個按鈕處於活躍狀態。</li>
<li>為當前按鈕加上 <code>is-active</code> 樣式。</li>
<li>隱藏所有面板（移除 <code>is-active</code> 樣式）。</li>
<li>顯示對應目標面板（可支援多個面板同時顯示），加上 <code>is-active</code> 樣式。</li>
</ol>
<p>這種設計讓按鈕與面板的關聯透過 CSS 類別靈活控制，方便樣式調整與擴充。</p>
<pre><code class="lang-javascript language-javascript javascript">function activateButton(btn) {
  const target = btn.dataset.target;
  if (!target) return;

  buttons.forEach(b =&gt; b.classList.remove(&#039;is-active&#039;));
  btn.classList.add(&#039;is-active&#039;);

  panels.forEach(p =&gt; p.classList.remove(&#039;is-active&#039;));

  const targetPanels = document.querySelectorAll(&#039;.&#039; + target);
  targetPanels.forEach(p =&gt; p.classList.add(&#039;is-active&#039;));
}</code></pre>
<h2 class="wp-block-heading">綁定事件與初始化</h2>
<p>接著，為每個按鈕綁定點擊事件，點擊時呼叫 <code>activateButton</code>，並阻止預設行為（例如連結跳轉）。</p>
<p>最後，為了讓頁面載入時即有預設顯示的面板，程式碼自動觸發第一個按鈕的點擊事件，確保初始化狀態與使用者互動完全一致，避免手動設定狀態可能導致的不同步問題。</p>
<pre><code class="lang-javascript language-javascript javascript">buttons.forEach(btn =&gt; {
  btn.addEventListener(&#039;click&#039;, e =&gt; {
    e.preventDefault();
    activateButton(btn);
  });
});

buttons[0].click();</code></pre>
<h2 class="wp-block-heading">實務應用與延伸</h2>
<p>這種純前端的 Tab 切換實作適合用於靜態頁面或不依賴框架的專案。若需要支援動態面板內容或更複雜的狀態管理，可考慮結合前端框架或狀態管理工具。</p>
<p>此外，為提升無障礙性，可在按鈕加入 ARIA 屬性，並確保鍵盤操作友好。</p>
<h2 class="wp-block-heading">常見問題與注意事項</h2>
<ul>
<li>確保每個按鈕的 <code>data-target</code> 對應的面板類別名稱正確，否則無法正確顯示。</li>
<li>若有多個面板共用同一類別，會同時顯示，這是設計上的彈性，但需注意樣式與結構。</li>
<li>自動觸發點擊事件的做法雖方便，但若未考慮瀏覽器支援或其他腳本，可能會有兼容性問題。</li>
</ul>
<h2 class="wp-block-heading">完整程式碼</h2>
<pre><code class="lang-javascript language-javascript javascript">document.addEventListener(&#039;DOMContentLoaded&#039;, function () {
  const buttons = document.querySelectorAll(&#039;.action-btn&#039;);
  const panels  = document.querySelectorAll(&#039;.tab-panel&#039;);

  if (!buttons.length || !panels.length) return;

  function activateButton(btn) {
    const target = btn.dataset.target;
    if (!target) return;

    buttons.forEach(function (b) {
      b.classList.remove(&#039;is-active&#039;);
    });

    btn.classList.add(&#039;is-active&#039;);

    panels.forEach(function (p) {
      p.classList.remove(&#039;is-active&#039;);
    });

    const targetPanels = document.querySelectorAll(&#039;.&#039; + target);
    targetPanels.forEach(function (p) {
      p.classList.add(&#039;is-active&#039;);
    });
  }

  buttons.forEach(function (btn) {
    btn.addEventListener(&#039;click&#039;, function (e) {
      e.preventDefault();
      activateButton(btn);
    });
  });

  buttons[0].click();
});</code></pre>]]></content:encoded>
					
					<wfw:commentRss>https://piglife.tw/technical-notes/javascript-tab-panel-switch/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
