パンくず

ウェブサイト内でのページの位置をツリー構造を持ったリンクの一覧として示すもの。

August 18, 2019

コード

HTML

CSS

使い方

コードをコピペして使う

コードをコピペし、使用してください。必要に応じて内容を修正してください。

CDN経由でカスタム要素として使う

使用したいページの <head>内に次のタグを貼り付けます。

<markup-breadcrumbs>タグで要素を使います。詳細な使い方は解説を参照してください。

インストールしてカスタム要素として使う

npm installコマンドを使ってコンポーネントをインストールします。

JavaScriptに読み込んで使用します。

<markup-breadcrumbs>タグで要素を使います。詳細な使い方は解説を参照してください。

マークアップの解説

マークアップ

パンくずは、そのページがサイト階層内のどこに位置するかを示します。

  <nav class="breadcrumbs" aria-label="パンくず">

パンくずはナビゲーションになりますから、<nav>で囲みます。そのnav要素のaria-label属性値にパンくずと指定し、このナビゲーションがパンくずであることを伝えます。

  <nav class="breadcrumbs" aria-label="パンくず">
    <ol class="breadcrumbs__list" itemscope itemtype="http://schema.org/BreadcrumbList">
      <li class="breadcrumbs__item" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem">
        <a class="breadcrumbs__link" itemprop="item" href="/ja">
          <span class="breadcrumbs__label" itemprop="name">
            Home
          </span>
        </a>
        <meta itemprop="position" content="1">
      </li>

各ページへのリンクは順を付けて並ぶので、順番を表す<ol><li>を使います。microdataを使用して構造化データマークアップをしています。

<a class="breadcrumbs__link" itemprop="item" aria-current="page" href="/ja/markups/like-button">
  <span class="breadcrumbs__label" itemprop="name">
    いいねボタン
  </span>
</a>
<meta itemprop="position" content="2">

現在地のリンクには、aria-current="page"が付与されます。 CSSで見た目を調整する場合は、.breadcrumbs__link[aria-current="page"] { ... }というセレクタで見た目を調整してください。

microdataを使用した構造化データマークアップ

パンくずの階層構造を示すためにmicrodataを使用します。

microdataという方式でマークアップすることで、Googleなどのクローラーがページの内容を解析しやすくなります。そうすることで、検索エンジンにリッチスニペットを表示することができます。

パンくずリストのmicrodataを使用した記述方法については、パンくずリスト | 検索 | Google Developersで解説されていますので参考にしてください。

microdataを使用したマークアップでは、itemscope itemtype itempropの属性と値を適切に付与する必要があります。さらに、各リンクの、パンくずにおける位置を示すためにmeta要素を使います。meta要素は、itemprop属性がある場合はフローコンテンツおよび記述コンテンツになるため、head要素内でなくても問題ありません。

正しく構造化されているかは構造化データテストツールで確認することができます。

NuxtでWeb Componentsを使う方法

このコンポーネントはWeb Componentsとして作られています。NuxtでWeb Componentsを使用するには少し工夫が必要です。

nuxt.config.jsに追記する

まずnuxt.config.jsで、head内にCDNからJSを読み込む必要があります。

  head: {
    script: [
      { src: "https://unpkg.com/@markupcodes/[email protected]/src/markup-breadcrumbs.js?module", type: "module" }
    ]
  }

plugins/webcomponents.jsを作成する

次に、plugins/webcomponents.jsを作成し、次の内容を記述します。これを記述するとmarkup-から始まるタグが、Nuxt(Vue)のコンポーネントからは除外されるようになります。

// this works in `!process.browser` exclusively,
// since LitElement use window and DOM interface.

import Vue from 'vue'
Vue.config.ignoredElements = [/^markup-/]

これらを準備した状態で、各.vue<markup-breadcrumbs>の要素を使うことができます。

Nuxtでの使用例

このサイトでもこのコンポーネントを利用しています。<markup-breadcrumbs>要素を扱いやすくするために、Breadcrumbコンポーネントを作っています。 下記の、実装例を参考にして、自陣のプロジェクトに組み込んでみてください。

<!-- components/Breadcrumb.vue -->
<template>
  <markup-breadcrumbs class="mc-Breadcrumb" label="パンくず" :breadcrumbs="breadcrumbsString" />
</template>
<script>
export default {
  name: 'Breadcrumb',
  props: {
    breadcrumbs: {
      type: Array,
      default() {
        return []
      }
    }
  },
  computed: {
    breadcrumbsString() {
      return JSON.stringify(this.breadcrumbs)
    }
  }
}
</script>
<!-- pages/about/index.vue -->
<template>
  <Breadcrumb
    :breadcrumbs="[
      {
        label: 'Home',
        url: localePath('index')
      },
      {
        label: $t('about.title'),
        url: $route.path,
        current: true
      }
    ]"
  />
</template>

<script>
import Breadcrumb from '~/components/Breadcrumb.vue'

export default {
  components: { Breadcrumb },

  head() {
    return {
      title: this.$i18n.t('about.title')
    }
  }
}
</script>