あなたがまだ使っていないかもしれないHTML5の便利機能10選

こんにちは、たかとーです🧑‍🎤
こちらは、[10 useful HTML5 features, you may not be using](https://dev.to/atapas/10-useful-html5-features-you-may-not-be-using-2bk0)の翻訳記事になります。
*当記事は、[Tapas](https://twitter.com/tapasadhikary)さんの許可を得て翻訳しています。[Tweet](https://twitter.com/ProductHance/status/1308166995351801856)*

---

![10 useful HTML5 features, you may not be using](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18699/40229b39-c6f2-2f9e-fba6-df6bc65e9d46.jpeg)

# 10 useful HTML5 features, you may not be using

`HTML5`は新しいものではありません。最初のリリース（2008年1月）以来いくつかの機能を使用してきました。`100DaysOfCode`の取り組みの一環として、HTML5の機能リストをもう一度よく見てみました。何か見つけたかな？私は今のところあまり使っていません。

この記事では、過去にあまり使ったことがなかったが、今では便利になった`HTML5`の機能を10個挙げています。また、`Netlify`でホストされている、実際に動作する例を作成しました。参考になることを願っています。

> [https://html5-tips.netlify.app/](https://html5-tips.netlify.app/)

## Detailsタグ

`<details>`タグは、ユーザーに必要なときだけ詳細を提供します。ユーザーにオンデマンドでコンテンツを表示する必要がある場合は、このタグを使用します。デフォルトでは、ウィジェットは閉じています。開くと、ウィジェットは展開され、コンテンツが表示されます。

`<summary>`タグは、`<details>`と一緒に使われ、見出しを指定します。

### コード

```html
<details>
  <summary>Click Here to get the user details</summary>
  <table>
    <tr>
      <th>#</th>
      <th>Name</th>
      <th>Location</th>
      <th>Job</th>
    </tr>
    <tr>
      <td>1</td>
      <td>Adam</td>
      <td>Huston</td>
      <td>UI/UX</td>
    </tr>
  </table>
</details>
```

### 動作例

![detailsタグ動作例](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18699/ddeecbfc-8208-0f97-20ba-aeb40ef21732.gif)

ここで実際に触ることができます: [https://html5-tips.netlify.app/details/index.html](https://html5-tips.netlify.app/details/index.html)

### Tips

GitHubのReadmeで、必要に応じて詳細情報をで表示するために使ってみましょう。[これ](https://github.com/atapas/notifyme#properties)は、Reactコンポーネントの膨大な量のプロパティリストを隠して、クリックされたら表示する例です。

## Content Editable属性

`contenteditable`は、コンテンツを編集可能にするために要素に設定できる属性です。`<div>`、`<p>`、`<ul>`などで動作します。`<element contenteditable="true|false">`のように指定する必要があります。

> 注意: contenteditable属性がその要素に指定されていないとき、親要素から値を受け継ぎます。

### コード

```html
<h2>Shoppping List(Content Editable)</h2>
<ul class="content-editable" contenteditable="true">
  <li>1. Milk</li>
  <li>2. Bread</li>
  <li>3. Honey</li>
</ul>
```

### 動作例

![Content Editable属性動作例](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18699/2617e3ab-b6c5-88e9-40b3-75813615ab6a.gif)

ここで実際に触ることができます: [https://html5-tips.netlify.app/content-editable/index.html](https://html5-tips.netlify.app/content-editable/index.html)

### Tips

この属性を使うことで、`<span>`や`<div>`を編集可能にし、CSSを使ってリッチなコンテンツを追加できます。これはinputフィールドを使用するよりもずっと良いでしょう。ぜひお試しください！

## Mapタグ

`<map>`タグはイメージマップの定義に役立ちます。イメージマップとは、1つ以上のクリック可能な領域を持つ画像のことです。`<area>`タグでクリック可能な領域を決定します。クリック可能な領域は、矩形、円、多角形の領域のいずれかになります。形状を指定しない場合は、領域を画像全体として考慮します。

### コード

```html
<div>
  <img
    src="circus.jpg"
    width="500"
    height="500"
    alt="Circus"
    usemap="#circusmap"
  />

  <map name="circusmap">
    <area shape="rect" coords="67,114,207,254" href="elephant.htm" />
    <area shape="rect" coords="222,141,318, 256" href="lion.htm" />
    <area shape="rect" coords="343,111,455, 267" href="horse.htm" />
    <area shape="rect" coords="35,328,143,500" href="clown.htm" />
    <area shape="circle" coords="426,409,100" href="clown.htm" />
  </map>
</div>
```

### 動作例

![Mapタグ動作例](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18699/c12fbd22-fd0f-7509-20e0-e2ce5cf16c27.gif)

ここで実際に触ることができます: [https://html5-tips.netlify.app/map/index.html](https://html5-tips.netlify.app/map/index.html)

## Markタグ
`<mark>`タグでテキストをハイライトしてみましょう。

### コード
```html
<p>
  Did you know, you can <mark>"Highlight something interesting"</mark> just with
  an HTML tag?
</p>
```
### 動作例

![Markタグ動作例](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18699/a99fc5a6-f128-8323-f597-a551f62295e1.png)

ここで実際に触ることができます: [https://html5-tips.netlify.app/mark/index.html](https://html5-tips.netlify.app/mark/index.html)

## data-* 属性
`data-*`属性は、ページやアプリケーションにプライベートなカスタムデータを保存するために使用されます。保存されたデータはJavaScriptで使用して、さらなるユーザー体験を生み出すことができます。

> `data-*`属性は2つの部分から構成されますThe data-* attributes consist of two parts:
> * 属性名に大文字を含めるべきではなく、また`data-`プレフィックスの後は1文字以上が必要です
> * 属性値は任意の文字列になります

### コード
```html
<h2>Know data attribute</h2>
<div
  class="data-attribute"
  id="data-attr"
  data-custom-attr="You are just Awesome!"
>
  I have a hidden secret!
</div>

<button onclick="reveal()">Reveal</button>
```
JavaScriptで以下のように操作します。

```javascript
function reveal() {
  let dataDiv = document.getElementById('data-attr');
  let value = dataDiv.dataset['customAttr'];
  document.getElementById('msg').innerHTML = `<mark>${value}</mark>`;
}
```

注意: JavaScriptでこれらの属性値を読み取るには、完全なHTML名(data-custom-attr)で`getAttribute()`を使用できますが、標準ではもっと簡単な方法を定義しています: `dataset`プロパティを使用です。

### 動作例

![data-* 属性動作例](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18699/27d24c0f-6425-821b-e7e4-794b0076707c.gif)

ここで実際に触ることができます: [https://html5-tips.netlify.app/data-attribute/index.html](https://html5-tips.netlify.app/data-attribute/index.html)

## Outputタグ
`<output>`タグは計算結果を表します。通常、この要素は計算結果のテキスト出力を表示するための領域を定義します。

### コード
```html
<form oninput="x.value=parseInt(a.value) * parseInt(b.value)">
  <input type="number" id="a" value="0" />
  * <input type="number" id="b" value="0" /> =
  <output name="x" for="a b"></output>
</form>
```

### 動作例

![Outputタグ動作例](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18699/b1877d3c-b28f-7127-f9e0-44d6f15df9ee.gif)

ここで実際に触ることができます: [https://html5-tips.netlify.app/output/index.html](https://html5-tips.netlify.app/output/index.html)

## Datalistタグ

`<datalist>`タグは、あらかじめ定義されたオプションのリストを指定し、ユーザーはそのリストにさらにオプションを追加することができます。これは`autocomplete`機能を提供しており、タイプアヘッドで目的のオプションを取得することができます。

### コード
```html
<form action="" method="get">
  <label for="fruit">Choose your fruit from the list:</label>
  <input list="fruits" name="fruit" id="fruit" />
  <datalist id="fruits">
    <option value="Apple"></option>
    <option value="Orange"></option>
    <option value="Banana"></option>
    <option value="Mango"></option>
    <option value="Avacado"></option>
  </datalist>

  <input type="submit" />
</form>
```

### 動作例

![Datalistタグ動作例](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18699/d29d3e89-c3bf-e455-ef22-a81eda3f3cae.gif)

ここで実際に触ることができます: [https://html5-tips.netlify.app/datalist/index.html](https://html5-tips.netlify.app/datalist/index.html)

## Range(Slider)値
`range`はinputタグのtype属性値で、スライダーのようなセレクタを実現します。

### コード
```html
<form method="post">
  <input
    type="range"
    name="range"
    min="0"
    max="100"
    step="1"
    value=""
    onchange="changeValue(event)"
    onchange="changeValue(event)"
  />
</form>
<div class="range">
  <output id="output" name="result"> </output>
</div>
```

### 動作例

![Range(Slider)値動作例](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18699/8b747014-3f04-5623-1a18-59db0ae3007e.gif)

ここで実際に触ることができます: [https://html5-tips.netlify.app/range/index.html](https://html5-tips.netlify.app/range/index.html)

## Meterタグ
`<meter>`タグを使って、与えられた範囲でデータを測ってみましょう。
### コード
```html
<label for="home">/home/atapas</label>
<meter id="home" value="4" min="0" max="10">2 out of 10</meter><br />

<label for="root">/root</label>
<meter id="root" value="0.6">60%</meter><br />
```

### 動作例

![Meterタグ動作例g](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18699/2863385c-6418-60c3-ad77-208584a14c4c.png)

ここで実際に触ることができます: [https://html5-tips.netlify.app/meter/index.html](https://html5-tips.netlify.app/meter/index.html)

### Tips
プログレスバーのようなものを表示する際には`<progress>`タグを使用してください。

```html
<label for="file">Downloading progress:</label>
<progress id="file" value="32" max="100">32%</progress>
```

![progress](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18699/04195495-1ad6-7b47-0dcb-23de8f971d32.png)

## Inputタグ
inputタイプにはいくつか特別な使い方があります。
### コード
#### required
inputフィールドを必須アイテムにします。

```html
<input type="text" id="username1" name="username" required />
```

![required](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18699/2a2856d8-2d0c-b7f6-d3bc-26b29bf459c3.png)

#### autofocus
~~input要素にカーソルを置くと自動でフォーカスします。~~
ページのローディングが完了し次第、autofocus属性を持つinput要素に自動でフォーカスされます。
（*@otiextさんの[コメント](https://qiita.com/kanye__east/items/9b419aac982c5323c429#comment-d12bfff2c8780d84664a)により修正しました！ありがとうございました！）

```html
<input type="text" id="username2" name="username" required autofocus />
```
#### validation with regex
正規表現をつかって入力値をバリデーションできます。

```html
<input
  type="password"
  name="password"
  id="password"
  placeholder="6-20 chars, at least 1 digit, 1 uppercase and one lowercase letter"
  pattern="^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{6,20}$"
  autofocus
  required
/>
```
#### Color picker
シンプルなカラーピッカーです。

```html
<input type="color" onchange="showColor(event)" />
<p id="colorMe">Color Me!</p>
```

![Color picker](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18699/c242cc20-0647-e7de-64c4-7de17050c0f5.gif)

# 訳者感想
Reactなど、JavaScript関連の新しい情報はキャッチアップするようにしているのですが、HTMLに関しては全くできておらず、目からウロコな記事でした。

いままでJavaScriptを使って実現していたようなものをHTMLのみで表現できるのは、開発者にとっても楽で最高ですよね！

素晴らしい記事をありがとうございました [Tapas](https://twitter.com/tapasadhikary)✨

## 訳者について

2019年5月よりバンクーバーを拠点に移し、現在スタートアップの開始に向けて試行錯誤しているソフトウェアでデベロッパーです。

近頃は、VCの方と話しながらアイディアのブラッシュアップなどを行いながらMVPの検証を進めています。

フリーランス案件も募集し始めました！React、NodeJs、TypeScript等フロント、バックエンド問わず行えます。是非宜しくお願い致します。

もしよろしければ、以下SNSもよろしく願いします！

**Twitter: [@taishikat0_Ja](https://twitter.com/taishikat0_Ja)**
**Note: [日本人でも英語圏で戦えることを証明したい。28歳が会社を辞め、個人開発者としてカナダでひたすらもがき続けた一年間とこれから](https://note.com/taishikato/n/n57159df89908)**
**Linkedin: [Taishi Kato](https://www.linkedin.com/in/takato0903/)**