Home
>
Product
>
Template Top
>
詳細ページ

HubSpot CMS: イベント概要や会社情報に最適!レスポンシブ対応「定義リスト」モジュール

Webサイト制作において、「開催日時:〇月〇日」「場所:〇〇ホール」のような「項目名」と「内容」が対になったリストを作成するシーンは頻繁にあります。

リッチテキストエディタでこれらを作ろうとすると、インデントがズレたり、スマホ表示で崩れたりと苦労しがちです。また、HTMLの <table> タグはレスポンシブ対応が難しく、スマホで見づらくなる原因になります。

今回紹介するのは、こうした情報を美しく、かつSEOに強い構造で表示できる「定義リスト(Definition List)」モジュールです。

Demo Video

Detail

このモジュールの目的とメリット

このモジュールの目的は、**「情報のペア(項目と内容)を整理して見やすく表示すること」**です。

主なメリット:

  • レスポンシブ完全対応: PCでは横並び、スマホでは縦並びに自動で切り替わります。
  • デザイン調整が簡単: 文字色、背景色、線の太さなどをコードを書かずにページエディタから変更できます。
  • セマンティックなHTML: <dl>, <dt>, <dd> タグを使用しているため、検索エンジンに文書構造を正しく伝えられます。

主なユースケース

このデザインは、以下のような場面で特に効果を発揮します。

  • イベント・セミナー概要
    • 日時、会場、定員、参加費、主催者など
  • 会社概要・プロフィール
    • 会社名、代表者、設立日、所在地、資本金など
  • 製品スペック・仕様表
    • サイズ、重量、素材、カラーバリエーション、価格など
  • 求人募集要項
    • 勤務地、給与、勤務時間、応募資格など

HubSpot CMSでの使い方

このコードをDesign Managerでカスタムモジュールとして実装した後の、ページエディタ(編集画面)での操作方法です。

1. コンテンツの編集

モジュールの設定パネルには以下の項目が表示されます。

  • Title:セクション全体のタイトルを入力します(例:「イベント概要」)。不要な場合は空欄にすると非表示になります。
  • Items (グループ):ここにリストの行を追加していきます。「Add」ボタンでいくらでも増やせます。
    • Row Title: 左側の項目名を入力します(例:「開催日時」)。
    • Content: 右側の内容を入力します。リッチテキスト形式なので、太字にしたりリンクを貼ったりすることが可能です。

2. スタイルの調整 (Styles)

「Styles」タブ(またはグループ)を開くと、以下のデザインを直感的に変更できます。

  • Title Color / Size: 大見出しの色とサイズ。
  • Label Color: 左側(項目名)の文字色。
  • Text Color / Size: 右側(内容)の文字色と全体の文字サイズ。
  • Bg Color: リスト全体の背景色。
  • Border Color / Size: 区切り線の色と太さ。

モジュールのソースコード

HubSpotのDesign Managerで「新規モジュール」を作成し、以下のコードをそれぞれの箇所に貼り付けてください。

1. fields.json

フィールド定義です。繰り返しフィールド(Items)と、スタイル設定用フィールド(Styles)で構成されています。

[
 {
  "allow_new_line": false,
  "display_width": null,
  "id": "6ef51c75-6d87-4d6f-bc68-1beedff13aac",
  "label": "title",
  "locked": false,
  "name": "title",
  "required": false,
  "type": "text"
 },
 {
  "children": [
   {
    "allow_new_line": false,
    "display_width": null,
    "id": "440c75fa-45a0-401b-b719-4fed4bf08a97",
    "label": "row_title",
    "locked": false,
    "name": "row_title",
    "required": false,
    "type": "text"
   },
   {
    "display_width": null,
    "id": "1e3b082c-a362-5dbc-a2b2-6f5b4dde9f52",
    "label": "content",
    "locked": false,
    "name": "content",
    "required": false,
    "type": "richtext"
   }
  ],
  "default": [],
  "display_width": null,
  "expanded": false,
  "group_occurrence_meta": null,
  "id": "0fec1fe5-d3c2-131e-595b-989d357cf578",
  "label": "items",
  "locked": false,
  "name": "items",
  "occurrence": {},
  "required": false,
  "tab": "CONTENT",
  "type": "group"
 },
 {
  "children": [
   {
    "default": {
     "color": null,
     "opacity": null
    },
    "display_width": null,
    "id": "764c03b3-19ad-3234-2a17-9521b1d8b7a3",
    "label": "title_color",
    "locked": false,
    "name": "title_color",
    "required": false,
    "type": "color"
   },
   {
    "display": "text",
    "display_width": null,
    "id": "360fd10e-2290-cf85-3c03-fc4797ff6b22",
    "label": "title_size",
    "locked": false,
    "name": "title_size",
    "required": false,
    "step": 1,
    "type": "number"
   },
   {
    "default": {
     "color": null,
     "opacity": null
    },
    "display_width": null,
    "id": "affa2a09-3769-cf50-8255-910426c8a58e",
    "label": "label_color",
    "locked": false,
    "name": "label_color",
    "required": false,
    "type": "color"
   },
   {
    "default": {
     "color": null,
     "opacity": null
    },
    "display_width": null,
    "id": "55c972d5-db0a-1b5d-5d09-f06365a575c8",
    "label": "text_color",
    "locked": false,
    "name": "text_color",
    "required": false,
    "type": "color"
   },
   {
    "display": "text",
    "display_width": null,
    "id": "42368473-da19-6609-db94-dbf157f38a84",
    "label": "text_size",
    "locked": false,
    "name": "text_size",
    "required": false,
    "step": 1,
    "type": "number"
   },
   {
    "default": {
     "color": null,
     "opacity": null
    },
    "display_width": null,
    "id": "35e4dc65-e6ad-4a9a-c491-bddf2339ff38",
    "label": "bg_color",
    "locked": false,
    "name": "bg_color",
    "required": false,
    "type": "color"
   },
   {
    "default": {
     "color": null,
     "opacity": null
    },
    "display_width": null,
    "id": "f4b21074-995c-6aee-f577-04dc5055b2cc",
    "label": "border_color",
    "locked": false,
    "name": "border_color",
    "required": false,
    "type": "color"
   },
   {
    "display": "text",
    "display_width": null,
    "id": "107200a3-53b1-539c-ead1-5e6efa863794",
    "label": "border_size",
    "locked": false,
    "name": "border_size",
    "required": false,
    "step": 1,
    "type": "number"
   }
  ],
  "default": {
   "title_color": {
    "color": null,
    "opacity": null
   },
   "label_color": {
    "color": null,
    "opacity": null
   },
   "text_color": {
    "color": null,
    "opacity": null
   },
   "bg_color": {
    "color": null,
    "opacity": null
   },
   "border_color": {
    "color": null,
    "opacity": null
   }
  },
  "display_width": null,
  "expanded": false,
  "group_occurrence_meta": null,
  "id": "04d537c8-1df0-59fe-bb36-052c050d4360",
  "label": "styles",
  "locked": false,
  "name": "styles",
  "required": false,
  "tab": "CONTENT",
  "type": "group"
 }
]

Source Code

HTML
{# モジュール固有のIDをクラスとして付与 #}
<div id="seminar-{{ module.id }}" class="seminar-module">
  
  {# タイトルエリア #}
  {% if module.title %}
    <h2 class="seminar-module__title">{{ module.title }}</h2>
  {% endif %}

  {# リストエリア #}
  <div class="seminar-module__container">
    {% for item in module.items %}
      <dl class="seminar-module__row">
        <dt class="seminar-module__label">{{ item.row_title }}</dt>
        <dd class="seminar-module__content">{{ item.content }}</dd>
      </dl>
    {% endfor %}
  </div>

</div>

{# スタイル変数の定義 #}
{% require_css %}
<style>
  #seminar-{{ module.id }} {
    --title-color: {{ module.styles.title_color.css || '#003366' }};
    --label-color: {{ module.styles.label_color.css || '#003366' }};
    --text-color: {{ module.styles.text_color.css || '#333333' }};
    --bg-color: {{ module.styles.bg_color.css || '#f8f8f8' }};
    --border-color: {{ module.styles.border_color.css || '#cccccc' }};
    --border-size: {{ module.styles.border_size || 1 }}px;
    --title-size: {{ module.styles.title_size || 28 }}px;
    --text-size: {{ module.styles.text_size || 16 }}px;
  }
</style>
{% end_require_css %}

CSS
.seminar-module {
  width: 100%;
  max-width: 960px;
  margin: 0 auto;
  padding: 20px 0;
  box-sizing: border-box;
}

/* タイトル */
.seminar-module__title {
  color: var(--title-color);
  font-size: var(--title-size);
  font-weight: bold;
  margin-bottom: 20px;
  line-height: 1.4;
}

/* リスト全体枠 */
.seminar-module__container {
  background-color: var(--bg-color);
  padding: 30px;
  border-radius: 4px;
  box-sizing: border-box; /* パディングを幅に含める */
}

/* 各行の設定 */
.seminar-module__row {
  display: flex;
  flex-wrap: nowrap; /* デスクトップでは折り返さない */
  align-items: baseline; /* テキストのベースラインで揃える */
  border-bottom: var(--border-size) solid var(--border-color);
  padding: 20px 0;
  margin: 0;
  box-sizing: border-box;
}

/* 最後の行だけ線を消す */
.seminar-module__row:last-child {
  border-bottom: none;
  padding-bottom: 0;
}
.seminar-module__row:first-child {
  padding-top: 0;
}

/* 左側:項目名 */
.seminar-module__label {
  /* 幅の設定 */
  width: 20%; 
  min-width: 120px; /* 最低限の幅を確保 */
  
  /* スタイル */
  color: var(--label-color);
  font-weight: bold;
  font-size: var(--text-size);
  
  /* リセットと配置 */
  margin: 0; /* デフォルトの余白を消す */
  padding-right: 20px;
  box-sizing: border-box; /* paddingを含めて20%にする */
  flex-shrink: 0; /* 幅が縮まないようにする */
}

/* 右側:内容 */
.seminar-module__content {
  /* 幅の設定 */
  width: 80%;
  flex-grow: 1; /* 余ったスペースを埋める */

  /* スタイル */
  color: var(--text-color);
  font-size: var(--text-size);
  line-height: 1.8;
  
  /* リセット */
  margin: 0; /* デフォルトの余白(特にddタグの左余白)を消す */
  box-sizing: border-box;
}

/* リッチテキスト内のリンク色調整 */
.seminar-module__content a {
  color: #0000EE;
  text-decoration: underline;
}

/* --- モバイル対応(スマホのみ縦並びにする) --- */
@media (max-width: 767px) {
  .seminar-module__container {
    padding: 20px;
  }
  
  .seminar-module__row {
    display: block; /* フレックスを解除して縦積みに */
  }
  
  .seminar-module__label {
    width: 100%;
    margin-bottom: 8px;
    padding-right: 0;
  }
  
  .seminar-module__content {
    width: 100%;
  }
}

Javascript

FAQ

このモジュールの文字色や背景色を変更するのに、CSSの知識は必要ですか?

いいえ、必要ありません。記事の「スタイルの調整 (Styles)」セクションにある通り、このモジュールにはスタイル設定機能が組み込まれています。HubSpotのページエディタ上で、カラーピッカーや数値入力を使って、文字色、背景色、フォントサイズ、枠線の色などを直感的に変更できます。

スマートフォンで表示した際、横並びのレイアウトはどうなりますか?

自動的に「縦並び」に切り替わります。このモジュールはレスポンシブ対応しており、PCのような広い画面では「項目名」と「内容」が横並びになりますが、スマートフォンのような狭い画面では読みやすさを優先して、縦に積み重なるレイアウトに変化します。

リストの項目(行)はいくつまで追加できますか?

特に制限はありません。「Items」フィールドは繰り返しグループ(リピーター)として設定されているため、ページエディタの「Add」ボタンを押すことで、必要な数だけ行を追加・削除・並べ替えすることができます。