# 按鈕元件 Button

按鈕主要用來執行各種操作，例如傳送電子郵件、分享文件或按讚留言等。

## 使用方法 {#usage}

按需引入元件：

```js
import 'mdui/components/button.js';
```

按需引入元件的 TypeScript 型別：

```ts
import type { Button } from 'mdui/components/button.js';
```

使用範例：

```html
<mdui-button>Button</mdui-button>
```

## 範例 {#examples}

### 形狀 {#example-variant}

使用 `variant` 屬性設定按鈕的形狀。

```html
<mdui-button variant="elevated">Elevated</mdui-button>
<mdui-button variant="filled">Filled</mdui-button>
<mdui-button variant="tonal">Tonal</mdui-button>
<mdui-button variant="outlined">Outlined</mdui-button>
<mdui-button variant="text">Text</mdui-button>
```

### 全寬 {#example-full-width}

加上 `full-width` 屬性可讓按鈕佔滿父元素的全部寬度。

```html
<mdui-button full-width>Button</mdui-button>
```

### 圖示 {#example-icon}

設定 `icon`、`end-icon` 屬性，可分別在按鈕左側、右側加上 Material Icons 圖示。也可以透過 `icon`、`end-icon` slot 在按鈕左側、右側加入元素。

```html
<mdui-button icon="search" end-icon="arrow_forward">Icon</mdui-button>
<mdui-button>
  Slot
  <mdui-icon slot="icon" name="downloading"></mdui-icon>
  <mdui-icon slot="end-icon" name="attach_file"></mdui-icon>
</mdui-button>
```

### 連結 {#example-link}

設定 `href` 屬性即可將按鈕轉為連結，並可使用以下連結相關的屬性：`download`、`target`、`rel`。

```html
<mdui-button href="https://www.mdui.org" target="_blank">Link</mdui-button>
```

### 禁用及載入中狀態 {#example-disabled}

加上 `disabled` 屬性可禁用按鈕；加上 `loading` 屬性可為按鈕加上載入中狀態。

```html
<mdui-button disabled>Disabled</mdui-button>
<mdui-button loading>Loading</mdui-button>
<mdui-button loading disabled>Loading & Disabled</mdui-button>
```

## mdui-button API

### 屬性

<table>
<thead>
  <tr>
    <th>HTML 屬性</th>
    <th>JavaScript 屬性</th>
    <th>Reflect</th>
    <th>型別</th>
    <th>預設值</th>
    <th>說明</th>
  </tr>
</thead>
<tbody>
  <tr>
    <td>variant</td>
    <td>variant</td>
    <td>true</td>
    <td>&#39;elevated&#39; | &#39;filled&#39; | &#39;tonal&#39; | &#39;outlined&#39; | &#39;text&#39;</td>
    <td>'filled'</td>
    <td><p>按鈕的形狀。可選值包括：</p>
<ul>
<li><code>elevated</code>：帶陰影的按鈕，適用於需要將按鈕與背景視覺分離的場景</li>
<li><code>filled</code>：視覺效果強烈，適用於重要流程的最終操作，如「儲存」、「確認」等</li>
<li><code>tonal</code>：視覺效果介於 <code>filled</code> 和 <code>outlined</code> 之間，適用於中高優先級的操作，如流程中的「下一步」</li>
<li><code>outlined</code>：帶邊框的按鈕，適用於中等優先級，且次要的操作，如「返回」</li>
<li><code>text</code>：文字按鈕，適用於最低優先級的操作</li>
</ul>
</td>
  </tr>
  <tr>
    <td>full-width</td>
    <td>fullWidth</td>
    <td>true</td>
    <td>boolean</td>
    <td>false</td>
    <td><p>是否填滿父元素寬度</p>
</td>
  </tr>
  <tr>
    <td>icon</td>
    <td>icon</td>
    <td>true</td>
    <td>string</td>
    <td></td>
    <td><p>左側的 Material Icons 圖示名。也可以透過 <code>slot=&quot;icon&quot;</code> 設定</p>
</td>
  </tr>
  <tr>
    <td>end-icon</td>
    <td>endIcon</td>
    <td>true</td>
    <td>string</td>
    <td></td>
    <td><p>右側的 Material Icons 圖示名。也可以透過 <code>slot=&quot;end-icon&quot;</code> 設定</p>
</td>
  </tr>
  <tr>
    <td>href</td>
    <td>href</td>
    <td>true</td>
    <td>string</td>
    <td></td>
    <td><p>連結的目標網址。</p>
<p>若設定此屬性，元件內部會渲染為 <code>&lt;a&gt;</code> 元素，並可使用連結相關的屬性。</p>
</td>
  </tr>
  <tr>
    <td>download</td>
    <td>download</td>
    <td>true</td>
    <td>string</td>
    <td></td>
    <td><p>下載目標。</p>
<p><strong>Note</strong>：僅在設定了 <code>href</code> 屬性時，此屬性才有效。</p>
</td>
  </tr>
  <tr>
    <td>target</td>
    <td>target</td>
    <td>true</td>
    <td>&#39;_blank&#39; | &#39;_parent&#39; | &#39;_self&#39; | &#39;_top&#39;</td>
    <td></td>
    <td><p>連結的開啟方式。可選值包括：</p>
<ul>
<li><code>_blank</code>：在新視窗中開啟連結</li>
<li><code>_parent</code>：在父框架中開啟連結</li>
<li><code>_self</code>：預設。在目前框架中開啟連結</li>
<li><code>_top</code>：在整個視窗中開啟連結</li>
</ul>
<p><strong>Note</strong>：僅在設定了 <code>href</code> 屬性時，此屬性才有效。</p>
</td>
  </tr>
  <tr>
    <td>rel</td>
    <td>rel</td>
    <td>true</td>
    <td>&#39;alternate&#39; | &#39;author&#39; | &#39;bookmark&#39; | &#39;external&#39; | &#39;help&#39; | &#39;license&#39; | &#39;me&#39; | &#39;next&#39; | &#39;nofollow&#39; | &#39;noreferrer&#39; | &#39;opener&#39; | &#39;prev&#39; | &#39;search&#39; | &#39;tag&#39;</td>
    <td></td>
    <td><p>目前文件與被連結文件之間的關係。可選值包括：</p>
<ul>
<li><code>alternate</code>：目前文件的替代版本</li>
<li><code>author</code>：目前文件或文章的作者</li>
<li><code>bookmark</code>：永久連結到最近的祖先章節</li>
<li><code>external</code>：引用的文件與目前文件不在同一站點</li>
<li><code>help</code>：連結到相關的說明文件</li>
<li><code>license</code>：目前文件的主要內容由被引用文件的版權許可覆蓋</li>
<li><code>me</code>：目前文件代表連結內容的所有者</li>
<li><code>next</code>：目前文件是系列中的一部分，被引用的文件是系列的下一個文件</li>
<li><code>nofollow</code>：目前文件的作者或發布者不認可被引用的文件</li>
<li><code>noreferrer</code>：不包含 <code>Referer</code> 標頭。類似於 <code>noopener</code> 的效果</li>
<li><code>opener</code>：如果超連結會建立一個頂級瀏覽上下文（即 <code>target</code> 屬性值為 <code>_blank</code>），則建立一個輔助瀏覽上下文</li>
<li><code>prev</code>：目前文件是系列的一部分，被引用的文件是系列的上一個文件</li>
<li><code>search</code>：提供一個資源連結，可用於搜尋目前檔案及其相關頁面</li>
<li><code>tag</code>：提供一個適用於目前文件的標籤（由給定位址識別）</li>
</ul>
<p><strong>Note</strong>：僅在指定了 <code>href</code> 屬性時可用。</p>
</td>
  </tr>
  <tr>
    <td>autofocus</td>
    <td>autofocus</td>
    <td>true</td>
    <td>boolean</td>
    <td>false</td>
    <td><p>是否在頁面載入完成後自動取得焦點</p>
</td>
  </tr>
  <tr>
    <td>tabindex</td>
    <td>tabIndex</td>
    <td>false</td>
    <td>number</td>
    <td></td>
    <td><p>元素在使用 Tab 鍵切換焦點時的順序</p>
</td>
  </tr>
  <tr>
    <td>disabled</td>
    <td>disabled</td>
    <td>true</td>
    <td>boolean</td>
    <td>false</td>
    <td><p>是否停用</p>
</td>
  </tr>
  <tr>
    <td>loading</td>
    <td>loading</td>
    <td>true</td>
    <td>boolean</td>
    <td>false</td>
    <td><p>是否處於載入中狀態</p>
</td>
  </tr>
  <tr>
    <td>name</td>
    <td>name</td>
    <td>true</td>
    <td>string</td>
    <td>''</td>
    <td><p>按鈕名稱，會與表單資料一起送出。</p>
<p><strong>Note</strong>：僅在未設定 <code>href</code> 屬性時，此屬性才有效。</p>
</td>
  </tr>
  <tr>
    <td>value</td>
    <td>value</td>
    <td>true</td>
    <td>string</td>
    <td>''</td>
    <td><p>按鈕初始值，會與表單資料一起送出。</p>
<p><strong>Note</strong>：僅在未設定 <code>href</code> 屬性時，此屬性才有效。</p>
</td>
  </tr>
  <tr>
    <td>type</td>
    <td>type</td>
    <td>true</td>
    <td>&#39;submit&#39; | &#39;reset&#39; | &#39;button&#39;</td>
    <td>'button'</td>
    <td><p>按鈕的類型。預設類型為 <code>button</code>。可選類型包括：</p>
<ul>
<li><code>submit</code>：點擊按鈕會送出表單資料到伺服器</li>
<li><code>reset</code>：點擊按鈕會將表單中的所有欄位重設為初始值</li>
<li><code>button</code>：此類型的按鈕沒有預設行為</li>
</ul>
<p><strong>Note</strong>：僅在未指定 <code>href</code> 屬性時，此屬性才有效。</p>
</td>
  </tr>
  <tr>
    <td>form</td>
    <td>form</td>
    <td>true</td>
    <td>string</td>
    <td></td>
    <td><p>關聯的 <code>&lt;form&gt;</code> 元素。此屬性值應為同一頁面中的一個 <code>&lt;form&gt;</code> 元素的 <code>id</code>。</p>
<p>若未指定此屬性，則該元素必須是 <code>&lt;form&gt;</code> 元素的子元素。透過此屬性，你可以將元素放置在頁面的任何位置，而不僅僅是 <code>&lt;form&gt;</code> 元素的子元素。</p>
<p><strong>Note</strong>：僅在未指定 <code>href</code> 屬性時，此屬性才有效。</p>
</td>
  </tr>
  <tr>
    <td>formaction</td>
    <td>formAction</td>
    <td>true</td>
    <td>string</td>
    <td></td>
    <td><p>指定送出表單的 URL。</p>
<p>若指定了此屬性，將覆蓋 <code>&lt;form&gt;</code> 元素的 <code>action</code> 屬性。</p>
<p><strong>Note</strong>：僅在未指定 <code>href</code> 屬性且 <code>type=&quot;submit&quot;</code> 時，此屬性才有效。</p>
</td>
  </tr>
  <tr>
    <td>formenctype</td>
    <td>formEnctype</td>
    <td>true</td>
    <td>&#39;application/x-www-form-urlencoded&#39; | &#39;multipart/form-data&#39; | &#39;text/plain&#39;</td>
    <td></td>
    <td><p>指定送出表單到伺服器的內容類型。可選值包括：</p>
<ul>
<li><code>application/x-www-form-urlencoded</code>：未指定該屬性時的預設值</li>
<li><code>multipart/form-data</code>：當表單包含 <code>&lt;input type=&quot;file&quot;&gt;</code> 元素時使用</li>
<li><code>text/plain</code>：HTML5 新增，用於除錯</li>
</ul>
<p>若指定了此屬性，將覆蓋 <code>&lt;form&gt;</code> 元素的 <code>enctype</code> 屬性。</p>
<p><strong>Note</strong>：僅在未指定 <code>href</code> 屬性且 <code>type=&quot;submit&quot;</code> 時，此屬性才有效。</p>
</td>
  </tr>
  <tr>
    <td>formmethod</td>
    <td>formMethod</td>
    <td>true</td>
    <td>&#39;post&#39; | &#39;get&#39;</td>
    <td></td>
    <td><p>指定送出表單時使用的 HTTP 方法。可選值包括：</p>
<ul>
<li><code>post</code>：表單資料包含在表單內容中，送出到伺服器</li>
<li><code>get</code>：表單資料以 <code>?</code> 作為分隔符附加到表單的 URI 屬性中，產生的 URI 送出到伺服器。當表單沒有副作用，並且僅包含 ASCII 字元時，使用此方法</li>
</ul>
<p>若設定了此屬性，將覆蓋 <code>&lt;form&gt;</code> 元素的 <code>method</code> 屬性。</p>
<p><strong>Note</strong>：僅在未設定 <code>href</code> 屬性且 <code>type=&quot;submit&quot;</code> 時，此屬性才有效。</p>
</td>
  </tr>
  <tr>
    <td>formnovalidate</td>
    <td>formNoValidate</td>
    <td>true</td>
    <td>boolean</td>
    <td>false</td>
    <td><p>若設定了此屬性，表單送出時將不執行表單驗證。</p>
<p>若設定了此屬性，將覆蓋 <code>&lt;form&gt;</code> 元素的 <code>novalidate</code> 屬性。</p>
<p><strong>Note</strong>：僅在未設定 <code>href</code> 屬性且 <code>type=&quot;submit&quot;</code> 時，此屬性才有效。</p>
</td>
  </tr>
  <tr>
    <td>formtarget</td>
    <td>formTarget</td>
    <td>true</td>
    <td>&#39;_self&#39; | &#39;_blank&#39; | &#39;_parent&#39; | &#39;_top&#39;</td>
    <td></td>
    <td><p>送出表單後接收到的回應應顯示在何處。可選值包括：</p>
<ul>
<li><code>_self</code>：預設，在目前框架中開啟</li>
<li><code>_blank</code>：在新視窗中開啟</li>
<li><code>_parent</code>：在父框架中開啟</li>
<li><code>_top</code>：在整個視窗中開啟</li>
</ul>
<p>若設定了此屬性，將覆蓋 <code>&lt;form&gt;</code> 元素的 <code>target</code> 屬性。</p>
<p><strong>Note</strong>：僅在未設定 <code>href</code> 屬性且 <code>type=&quot;submit&quot;</code> 時，此屬性才有效。</p>
</td>
  </tr>
  <tr>
    <td>undefined</td>
    <td>validity</td>
    <td>false</td>
    <td>ValidityState</td>
    <td></td>
    <td><p>表單驗證狀態物件，具體參見 <a href="https://developer.mozilla.org/zh-CN/docs/Web/API/ValidityState" target="_blank" rel="noopener nofollow"><code>ValidityState</code></a></p>
</td>
  </tr>
  <tr>
    <td>undefined</td>
    <td>validationMessage</td>
    <td>false</td>
    <td>string</td>
    <td></td>
    <td><p>如果表單驗證未通過，此屬性將包含提示資訊。如果驗證通過，此屬性將為空字串</p>
</td>
  </tr>
</tbody>
</table>

### 方法

<table>
<thead>
  <tr>
    <th>名稱</th>
    <th>說明</th>
  </tr>
</thead>
<tbody>
  <tr>
    <td>click(): void</td>
    <td><p>模擬滑鼠點擊元素</p>
</td>
  </tr>
  <tr>
    <td>focus(options?: FocusOptions): void</td>
    <td><p>將焦點設定到目前元素。</p>
<p>可以傳入一個物件作為引數，該物件的屬性包括：</p>
<ul>
<li><code>preventScroll</code>：預設情況下，元素取得焦點後，頁面會捲動以將該元素捲動到檢視中。如果不希望頁面捲動，可以將此屬性設定為 <code>true</code>。</li>
</ul>
</td>
  </tr>
  <tr>
    <td>blur(): void</td>
    <td><p>移除目前元素的焦點</p>
</td>
  </tr>
  <tr>
    <td>checkValidity(): boolean</td>
    <td><p>檢查表單欄位是否通過驗證。如果未通過，回傳 <code>false</code> 並觸發 <code>invalid</code> 事件；如果通過，回傳 <code>true</code></p>
</td>
  </tr>
  <tr>
    <td>reportValidity(): boolean</td>
    <td><p>檢查表單欄位是否通過驗證。如果未通過，回傳 <code>false</code> 並觸發 <code>invalid</code> 事件；如果通過，回傳 <code>true</code>。</p>
<p>如果驗證未通過，還會在元件上顯示驗證失敗的提示。</p>
</td>
  </tr>
  <tr>
    <td>setCustomValidity(message: string): void</td>
    <td><p>設定自訂的錯誤提示文字。只要這個文字不為空，就表示欄位未通過驗證</p>
</td>
  </tr>
</tbody>
</table>

### 事件

<table>
<thead>
  <tr>
    <th>名稱</th>
    <th>說明</th>
  </tr>
</thead>
<tbody>
  <tr>
    <td>focus</td>
    <td><p>取得焦點時觸發</p>
</td>
  </tr>
  <tr>
    <td>blur</td>
    <td><p>失去焦點時觸發</p>
</td>
  </tr>
  <tr>
    <td>invalid</td>
    <td><p>表單欄位驗證未通過時觸發</p>
</td>
  </tr>
</tbody>
</table>

### Slots

<table>
<thead>
  <tr>
    <th>名稱</th>
    <th>說明</th>
  </tr>
</thead>
<tbody>
  <tr>
    <td>預設</td>
    <td><p>按鈕的文字</p>
</td>
  </tr>
  <tr>
    <td>icon</td>
    <td><p>按鈕左側的元素</p>
</td>
  </tr>
  <tr>
    <td>end-icon</td>
    <td><p>按鈕右側的元素</p>
</td>
  </tr>
</tbody>
</table>

### CSS Parts

<table>
<thead>
  <tr>
    <th>名稱</th>
    <th>說明</th>
  </tr>
</thead>
<tbody>
  <tr>
    <td>button</td>
    <td><p>內部的 <code>&lt;button&gt;</code> 或 <code>&lt;a&gt;</code> 元素</p>
</td>
  </tr>
  <tr>
    <td>label</td>
    <td><p>按鈕的文字</p>
</td>
  </tr>
  <tr>
    <td>icon</td>
    <td><p>按鈕左側的圖示</p>
</td>
  </tr>
  <tr>
    <td>end-icon</td>
    <td><p>按鈕右側的圖示</p>
</td>
  </tr>
  <tr>
    <td>loading</td>
    <td><p>載入中狀態的 <code>&lt;mdui-circular-progress&gt;</code> 元素</p>
</td>
  </tr>
</tbody>
</table>

### CSS 自訂屬性

<table>
<thead>
  <tr>
    <th>名稱</th>
    <th>說明</th>
  </tr>
</thead>
<tbody>
  <tr>
    <td>--shape-corner</td>
    <td><p>元件的圓角大小。可以指定一個具體的像素值；但更推薦引用<a href="/zh-tw/docs/2/styles/design-tokens#shape-corner">設計令牌</a></p>
</td>
  </tr>
</tbody>
</table>

