Webサイトを作成していると、専門用語や補足説明が必要な箇所にツールチップを設置したくなりますよね。マウスを乗せるだけで追加情報が表示される便利な機能ですが、改行に関するトラブルに悩まされている方も多いのではないでしょうか。
「コピペしたコードなのに、なぜか改行されない…」
このような疑問を抱えているあなたのために、今回はHTMLツールチップの改行問題について徹底解説します。

HTMLツールチップの改行の注意点|title属性の落とし穴

なぜtitle属性ツールチップでは改行できないのか?その仕様を解説
結論から言うと、HTML標準のtitle属性を使ったツールチップでは、意図的に改行を入れることができません。これはHTML仕様によるものです。
title属性は最もシンプルなツールチップを実装できる方法として広く使われています:
<span title="これはツールチップです">マウスを乗せてみてください</span>
しかし、この便利なtitle属性には大きな制限があります。title属性の内容はブラウザによって自動的にレンダリングされ、その表示方法はHTML側でコントロールできないのです。改行を含め、表示のスタイリングはブラウザに委ねられています。
なぜこのような仕様なのでしょうか?それには2つの理由があります:
- セキュリティ上の配慮: title属性内でHTMLタグが解釈されると、悪意のあるスクリプトが実行される可能性があります
- 互換性の維持: 古いブラウザとの互換性を保つため、シンプルな実装が保持されています
実際、HTML仕様(W3C)では、title属性の内容は「プレーンテキスト」と定義されており、HTMLタグを解釈しないことが明記されています。そのため、<br>
タグを入れても単なるテキストとして表示されてしまうのです。
このような制限は、Webアクセシビリティの観点からも理解できます。スクリーンリーダーなどの支援技術は、title属性の内容をテキストとして読み上げるため、複雑なフォーマットよりもシンプルなテキスト形式の方が適しているからです。
実は不可能?title属性ツールチップで無理やり改行を試す方法(非推奨)
「どうしてもtitle属性で改行したい!」という方のために、いくつかの”裏技”をご紹介します。ただし、これらの方法は非推奨であり、ブラウザの互換性や将来的な仕様変更によって動作しなくなる可能性があることをご了承ください。
1. Unicode改行文字を使用する方法
最もよく試される方法は、Unicode改行文字(
や
)を使うことです:
<span title="1行目 2行目 3行目">マウスを乗せてみてください</span>
この方法は一部のブラウザ(主にFirefoxやSafari)では機能することがありますが、Chromeなど他のブラウザでは効果がない場合が多いです。また、ブラウザのバージョンアップによって挙動が変わる可能性もあります。
2. JavaScript経由でtitle属性を設定する方法
JavaScript経由でtitle属性に改行コードを含める方法もあります:
document.getElementById('tooltip-text').title = "1行目\\n2行目\\n3行目";
<span id="tooltip-text">マウスを乗せてみてください</span>
こちらも一部のブラウザでは機能するかもしれませんが、信頼性は高くありません。
これらの方法を使うべきではない理由
上記の方法を本番環境で使用することはお勧めできません。理由は以下の通りです:
- ブラウザの互換性問題: ブラウザごとに表示が異なるため、ユーザー体験にばらつきが生じます
- 将来的な不安定性: ブラウザのアップデートで動作しなくなる可能性があります
- アクセシビリティの問題: スクリーンリーダーでの読み上げ時に不自然になる可能性があります
- コードの可読性: 特殊文字を使ったコードは可読性が低く、保守が難しくなります
実務では、次のセクションで紹介するCSS・JavaScriptを使ったカスタムツールチップの実装が、より信頼性の高い選択肢となります。title属性は単一行のシンプルな説明に留め、複数行の情報表示にはカスタム実装を検討しましょう。
先進的なWebサイトの多くは、アクセシビリティとユーザー体験を両立させるため、title属性に頼らないカスタムツールチップを採用しています。実際、GoogleやAmazonなどの大手サイトでも、複雑なツールチップはCSSとJavaScriptを組み合わせて実装されているのです。

CSS・JavaScriptで作る!改行可能なカスタムツールチップの基本
前セクションでは、HTML標準のtitle属性ではツールチップ内のテキストを思い通りに改行できないことをお伝えしました。でも安心してください!CSSとJavaScriptを使えば、思い通りにカスタマイズできる素敵なツールチップを作れます。
では、さっそく具体的な実装方法を見ていきましょう。
CSSとdata-tooltip属性を使ったシンプルな実装例
CSSのみで実装するツールチップは、JavaScriptを必要としないため軽量で高速です。以下に、data-*
属性を使った基本的な実装例をご紹介します。
<style>
.tooltip-container {
position: relative;
display: inline-block;
border-bottom: 1px dotted #666;
cursor: help;
}
.tooltip-container::after {
content: attr(data-tooltip);
position: absolute;
width: 200px;
left: 50%;
transform: translateX(-50%);
bottom: 125%;
background-color: #333;
color: #fff;
text-align: center;
border-radius: 6px;
padding: 8px;
z-index: 1;
opacity: 0;
transition: opacity 0.3s;
pointer-events: none;
/* ここで改行を有効にする */
white-space: pre-wrap;
word-wrap: break-word;
}
.tooltip-container:hover::after {
opacity: 1;
}
</style>
<span class="tooltip-container" data-tooltip="1行目 2行目 3行目">用語の説明</span>
この実装のポイントは以下の通りです:
data-tooltip
属性: ツールチップに表示するテキストを保持します::after
疑似要素: CSSでツールチップの内容を表示しますcontent: attr(data-tooltip)
: data-tooltip属性の値を取得しますwhite-space: pre-wrap
: 改行を維持しながらテキストを折り返しますword-wrap: break-word
: 長い単語も自動的に折り返します
このアプローチの最大の利点は、JavaScriptを一切使わずにツールチップを実現できることです。ページの読み込み速度を優先する場合に特におすすめです。
実務での使用例として、FAQ項目や用語集など、比較的静的なコンテンツに対するツールチップ実装に適しています。
JavaScriptで表示内容を制御するツールチップの作り方
CSSのみの実装では足りない場合、JavaScriptを活用するとより柔軟なツールチップが実現できます。特に、動的なコンテンツやHTMLタグを含むリッチなツールチップには最適です。
<style>
.js-tooltip-container {
position: relative;
display: inline-block;
border-bottom: 1px dotted #666;
cursor: help;
}
.tooltip-box {
position: absolute;
width: 250px;
left: 50%;
transform: translateX(-50%);
bottom: 125%;
background-color: #333;
color: #fff;
border-radius: 6px;
padding: 10px;
z-index: 100;
opacity: 0;
visibility: hidden;
transition: opacity 0.3s, visibility 0.3s;
text-align: left;
box-shadow: 0 2px 5px rgba(0,0,0,0.2);
}
.tooltip-box.active {
opacity: 1;
visibility: visible;
}
</style>
<span class="js-tooltip-container" data-tooltip-id="tooltip1">詳細を見る</span>
<div id="tooltip1" class="tooltip-box">
<p>これは<strong>複数行</strong>のツールチップです。</p>
<p>HTML要素を含めることができます。</p>
<ul>
<li>リスト形式も可能</li>
<li>画像も表示できます</li>
</ul>
</div>
<script>
document.addEventListener('DOMContentLoaded', function() {
const tooltipTriggers = document.querySelectorAll('.js-tooltip-container');
tooltipTriggers.forEach(trigger => {
const tooltipId = trigger.getAttribute('data-tooltip-id');
const tooltip = document.getElementById(tooltipId);
trigger.addEventListener('mouseenter', () => {
tooltip.classList.add('active');
});
trigger.addEventListener('mouseleave', () => {
tooltip.classList.remove('active');
});
});
});
</script>
この実装の主なメリットは:
- 複雑なHTMLの挿入: リスト、画像、強調テキストなど、リッチなコンテンツが使えます
- 動的なコンテンツ: APIからのデータ取得や条件に応じた表示変更が可能です
- ユーザーインタラクション: クリックやタップなど、多様なトリガーを設定できます
- アニメーション: 表示・非表示の動きをカスタマイズできます
実務では、商品詳細ページやダッシュボードなど、複雑な情報を伝える必要がある場面で効果を発揮します。
スマホやタブレット対応のレスポンシブ設計のコツ
モバイルデバイスでの使いやすさは現代のWeb開発では必須です。スマートフォンやタブレットでも快適に使えるツールチップを設計するためのコツをご紹介します。
<style>
.responsive-tooltip {
position: relative;
display: inline-block;
border-bottom: 1px dotted #666;
cursor: help;
}
.responsive-tooltip .tooltip-content {
position: absolute;
width: 200px;
left: 50%;
transform: translateX(-50%);
bottom: 125%;
background-color: #333;
color: #fff;
text-align: center;
border-radius: 6px;
padding: 8px;
z-index: 1;
opacity: 0;
transition: opacity 0.3s;
pointer-events: none;
white-space: pre-wrap;
word-wrap: break-word;
}
/* デスクトップではホバー表示 */
@media (min-width: 769px) {
.responsive-tooltip:hover .tooltip-content {
opacity: 1;
}
}
/* モバイルではタップで表示・非表示を切り替え */
@media (max-width: 768px) {
.responsive-tooltip .tooltip-content {
/* モバイルでは上下の配置を変更して指が隠れないように */
bottom: auto;
top: 125%;
width: 150px; /* モバイルでは幅を狭くする */
}
.responsive-tooltip .tooltip-content.active {
opacity: 1;
pointer-events: auto; /* タップ可能にする */
}
}
</style>
<span class="responsive-tooltip">
用語の説明
<span class="tooltip-content">これは複数行の ツールチップです。 モバイルでも使えます。</span>
</span>
<script>
document.addEventListener('DOMContentLoaded', function() {
// モバイルデバイスの判定
const isMobile = window.matchMedia('(max-width: 768px)').matches;
if (isMobile) {
const tooltips = document.querySelectorAll('.responsive-tooltip');
tooltips.forEach(tooltip => {
const content = tooltip.querySelector('.tooltip-content');
tooltip.addEventListener('click', (e) => {
e.preventDefault();
content.classList.toggle('active');
// 他のツールチップを非表示にする
document.querySelectorAll('.tooltip-content.active').forEach(activeTooltip => {
if (activeTooltip !== content) {
activeTooltip.classList.remove('active');
}
});
});
// ツールチップの外をクリックしたら閉じる
document.addEventListener('click', (e) => {
if (!tooltip.contains(e.target)) {
content.classList.remove('active');
}
});
});
}
});
</script>
レスポンシブ対応のポイントは以下の通りです:
- デバイス検出: メディアクエリを使って、デスクトップとモバイルで異なる動作を実装
- インタラクションの変更: デスクトップではホバー、モバイルではタップという使い分け
- 表示位置の最適化: モバイルでは指が隠れないよう位置を調整
- サイズの調整: 画面サイズに合わせて幅や余白を最適化
- タップ領域の確保: モバイルでは十分なタップ領域を確保して操作性を向上
実際のプロジェクトでは、ユーザーテストを行って使いやすさを検証することをお勧めします。特にツールチップは、指で隠れてしまったり、表示位置が不適切だったりすると、ユーザー体験を大きく損ねる可能性があります。
レスポンシブ対応のツールチップは、実装の手間は増えますが、モバイルユーザーも含めたすべてのユーザーに快適な体験を提供できるため、投資する価値は十分にあります。最近では、モバイルでのアクセスが50%を超えるサイトも珍しくありませんので、モバイルファーストの考え方でツールチップを設計することをお勧めします。

主要ライブラリ・フレームワークでの改行対応ツールチップ実装法
ここまでは基本的なHTML、CSS、JavaScriptを使ったツールチップの実装方法を見てきました。しかし実務では、すでに導入されているフレームワークやライブラリを活用するケースが多いでしょう。このセクションでは、主要なライブラリやフレームワークでの改行対応ツールチップの実装方法について解説します。
「どうせならフレームワークのパワーを借りたい」 「すでに使っているライブラリでシンプルに実装したい」
という方のために、実践的なコード例とともに解説していきます。
【Bootstrap 5対応】data-bs-toggle=”tooltip”で改行する方法と設定例
Bootstrap 5は、最も人気のあるCSSフレームワークの一つです。Bootstrapでは、ツールチップも標準で用意されていますが、改行を入れるには少し工夫が必要です。
基本的なBootstrap 5のツールチップは以下のように実装します:
<!-- Bootstrap 5のCSSとJSを読み込む -->
<link href="<https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css>" rel="stylesheet">
<script src="<https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js>"></script>
<!-- 基本的なツールチップ -->
<button type="button" class="btn btn-secondary"
data-bs-toggle="tooltip"
data-bs-placement="top"
title="シンプルなツールチップ">
ホバーしてください
</button>
<script>
// ツールチップを初期化
const tooltipTriggerList = document.querySelectorAll('[data-bs-toggle="tooltip"]');
const tooltipList = [...tooltipTriggerList].map(tooltipTriggerEl => new bootstrap.Tooltip(tooltipTriggerEl));
</script>
しかし、このままでは改行が機能しません。Bootstrapでツールチップ内に改行を入れるには、HTMLオプションを有効にする必要があります:
<button type="button" class="btn btn-primary"
data-bs-toggle="tooltip"
data-bs-html="true"
data-bs-placement="right"
title="1行目<br>2行目<br>3行目">
改行付きツールチップ
</button>
<script>
// HTMLを有効にしたツールチップを初期化
const tooltipTriggerList = document.querySelectorAll('[data-bs-toggle="tooltip"]');
const tooltipList = [...tooltipTriggerList].map(tooltipTriggerEl =>
new bootstrap.Tooltip(tooltipTriggerEl, {
html: true // HTMLを有効化
})
);
</script>
ポイントは以下の2つです:
data-bs-html="true"
を追加: これによりHTMLタグの解釈を有効にします<br>
タグを使用: 改行したい箇所に<br>
タグを挿入します
また、JavaScriptでツールチップを初期化する際にもHTMLオプションを有効にできます:
// グローバル設定でHTMLを有効化
const tooltips = document.querySelectorAll('[data-bs-toggle="tooltip"]');
[...tooltips].forEach(tooltipEl => {
new bootstrap.Tooltip(tooltipEl, {
html: true,
template: '<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner custom-tooltip"></div></div>'
});
});
実務でよく使うテクニックとして、ツールチップの内容を別の要素に記述する方法もあります:
<button type="button" class="btn btn-info"
data-bs-toggle="tooltip"
data-bs-html="true"
data-bs-placement="bottom"
title="<div id='tooltip-content'>内容はJSで動的に設定</div>">
動的ツールチップ
</button>
<script>
// 動的にツールチップの内容を設定
document.getElementById('tooltip-content').innerHTML =
'1行目<br>' +
'2行目<br>' +
'<strong>太字</strong>にもできます';
</script>
Bootstrapのツールチップは、デザイン面でも充実しており、カスタマイズも容易です。カラーテーマの変更や、アニメーション効果の調整なども簡単に行えるため、デザイン性を重視するプロジェクトにおすすめです。
【jQuery UI対応】tooltip()でHTML改行を有効にする設定と注意点
jQuery UIは、今でも多くのWebサイトで利用されている信頼性の高いライブラリです。特にレガシーシステムの保守や拡張を行う場合に遭遇することが多いでしょう。
jQuery UIのツールチップは非常に柔軟性が高く、改行も簡単に実装できます:
<!-- jQuery と jQuery UI を読み込む -->
<link rel="stylesheet" href="<https://code.jquery.com/ui/1.13.2/themes/base/jquery-ui.css>">
<script src="<https://code.jquery.com/jquery-3.7.0.min.js>"></script>
<script src="<https://code.jquery.com/ui/1.13.2/jquery-ui.min.js>"></script>
<!-- ツールチップを適用する要素 -->
<span id="jquery-tooltip" title="これは<br>複数行の<br>ツールチップです">
ホバーしてください
</span>
<script>
$(function() {
// HTML解釈を有効にしたツールチップを初期化
$("#jquery-tooltip").tooltip({
content: function() {
return $(this).attr('title');
},
track: true,
show: { effect: "fadeIn", duration: 200 },
hide: { effect: "fadeOut", duration: 200 },
position: { my: "left+15 center", at: "right center" },
items: "[title]"
});
});
</script>
jQuery UIのツールチップで改行を実現するポイントは以下の通りです:
- contentオプションの活用: 表示内容をカスタマイズできます
- HTMLコンテンツの許可: jQuery UIはデフォルトでHTMLを解釈します
- positionの調整: 表示位置をきめ細かく制御できます
ただし、次の点に注意が必要です:
- セキュリティリスク: HTMLを有効にすると、XSS攻撃のリスクが増加します
- パフォーマンス: jQueryは現代のフレームワークに比べると重い傾向があります
- 互換性: 最新のブラウザAPIとの互換性に課題があることも
jQuery UIを既に使っているプロジェクトでは、以下のように動的なコンテンツも簡単に実装できます:
$("#dynamic-tooltip").tooltip({
content: function() {
// APIからデータを取得したり、複雑な条件分岐も可能
return "<h4>動的なヘッダー</h4>" +
"<p>これは<strong>動的に生成された</strong>内容です。</p>" +
"<p>複数行対応はもちろん、<br>リストも表示できます:</p>" +
"<ul>" +
" <li>項目1</li>" +
" <li>項目2</li>" +
"</ul>";
},
open: function(event, ui) {
// ツールチップ表示時の処理
console.log("ツールチップが表示されました");
}
});
レガシーシステムの改修時には、このようなアプローチが役立つことが多いでしょう。jQuery UIのツールチップを最新のデザインに合わせて改修することで、コードの大幅な書き換えなしにUXを向上させることができます。
【React+MUI対応】Tooltipコンポーネントで改行するためのコード例
最後に、モダンなフロントエンド開発で人気のReactと、そのコンポーネントライブラリであるMaterial-UI(MUI)でのツールチップ実装方法を紹介します。
ReactとMUIを使えば、見た目も機能も優れたツールチップを簡単に実装できます:
// 必要なコンポーネントをインポート
import React from 'react';
import { Tooltip, Typography, Button, Box } from '@mui/material';
// 基本的なツールチップの例
function BasicTooltip() {
return (
<Tooltip
title={
<React.Fragment>
<Typography color="inherit">複数行のツールチップ</Typography>
<p>この部分が1行目です。</p>
<p>この部分が2行目になります。</p>
<em>書式を変えることも可能です。</em>
</React.Fragment>
}
arrow
placement="right"
>
<Button variant="contained" color="primary">
ホバーしてください
</Button>
</Tooltip>
);
}
// 動的なコンテンツを持つツールチップの例
function DynamicTooltip() {
// 動的なデータ(APIから取得することも可能)
const tooltipData = {
title: "商品情報",
description: "この商品は限定版です。",
features: ["耐水性", "軽量設計", "高耐久性"]
};
return (
<Tooltip
title={
<Box sx={{ p: 1 }}>
<Typography variant="h6">{tooltipData.title}</Typography>
<Typography variant="body2">{tooltipData.description}</Typography>
<ul>
{tooltipData.features.map((feature, index) => (
<li key={index}>{feature}</li>
))}
</ul>
</Box>
}
placement="top"
arrow
enterDelay={500}
leaveDelay={200}
>
<Button variant="outlined">商品詳細</Button>
</Tooltip>
);
}
// カスタムスタイルのツールチップ
function StyledTooltip() {
return (
<Tooltip
title={
<React.Fragment>
<Typography variant="h6">カスタムスタイル</Typography>
<p>好きなようにスタイリングできます。</p>
</React.Fragment>
}
arrow
placement="bottom"
componentsProps={{
tooltip: {
sx: {
bgcolor: 'primary.main',
'& .MuiTooltip-arrow': {
color: 'primary.main',
},
boxShadow: 3,
borderRadius: 2,
p: 2,
maxWidth: 320
},
},
}}
>
<Button variant="contained" color="secondary">
カスタムデザイン
</Button>
</Tooltip>
);
}
MUIのTooltipコンポーネントの主な特徴は:
- JSXの柔軟性: 複雑なレイアウトやコンポーネントのネストが可能
- Reactの状態管理との連携: アプリケーションの状態に応じた表示内容の変更が容易
- スタイルのカスタマイズ: ThemeProviderやSXプロパティによる細かいスタイル調整
- アクセシビリティ対応: ARIA属性が自動的に設定され、キーボード操作も可能
実務でのReact+MUIツールチップ活用のベストプラクティスとして、以下のポイントも押さえておくと良いでしょう:
// ツールチップのコンテンツを外部化
function ProductTooltip({ product }) {
if (!product) return null;
return (
<Box>
<Typography variant="subtitle1">{product.name}</Typography>
<Typography variant="body2">{product.description}</Typography>
{product.inStock ? (
<Box sx={{ color: 'success.main', mt: 1 }}>在庫あり</Box>
) : (
<Box sx={{ color: 'error.main', mt: 1 }}>在庫なし</Box>
)}
</Box>
);
}
// 使用例
function ProductList({ products }) {
return (
<div>
{products.map(product => (
<Tooltip
key={product.id}
title={<ProductTooltip product={product} />}
placement="right"
arrow
PopperProps={{
modifiers: [
{
name: 'preventOverflow',
options: {
boundary: document.body,
},
},
],
}}
>
<Box component="div" sx={{ display: 'inline-block', p: 1, border: '1px solid #ddd', m: 1 }}>
{product.name}
</Box>
</Tooltip>
))}
</div>
);
}
Reactを使ったプロジェクトでは、ツールチップの内容を別コンポーネントとして分離することで、コードの再利用性と保守性が向上します。また、MUIのTooltipコンポーネントは、モバイル対応も考慮されており、タッチデバイスでの表示にも対応しています。
大規模なReactプロジェクトでは、ツールチップの表示ロジックをカスタムフックとして実装することで、さらに再利用性を高めることができます:
// カスタムフック
function useCustomTooltip() {
const [open, setOpen] = React.useState(false);
const handleOpen = () => {
setOpen(true);
};
const handleClose = () => {
setOpen(false);
};
return {
open,
handleOpen,
handleClose,
tooltipProps: {
open,
onOpen: handleOpen,
onClose: handleClose,
disableFocusListener: true,
disableTouchListener: false,
disableHoverListener: false
}
};
}
// 使用例
function ControlledTooltip() {
const tooltip = useCustomTooltip();
return (
<Tooltip
{...tooltip.tooltipProps}
title="カスタム動作のツールチップ"
placement="top"
>
<Button variant="contained" onClick={tooltip.handleOpen}>
クリックでも表示
</Button>
</Tooltip>
);
}
React+MUIのアプローチは学習コストがやや高いものの、複雑なUI要件を効率的に実装できるため、大規模プロジェクトやUIの一貫性を重視するプロジェクトに最適です。特に、デザインシステムを導入している企業では、MUIのカスタマイズ機能を活用することで、ブランドに合わせたツールチップを実現できます。

HTMLツールチップの改行対応まとめ
ここまでHTMLツールチップの改行方法について詳しく見てきましたが、いかがでしたか?最初は「なぜ改行できないんだろう?」と悩んでいた方も、今ではきっと解決策が見つかったのではないでしょうか。

実際のプロジェクトでは、サイトの規模や既存の技術スタック、ターゲットユーザーのデバイスなどを考慮して、最適な実装方法を選ぶことが大切です。例えば、すでにBootstrapを使っているサイトなら、新たにライブラリを追加するよりも、Bootstrapのツールチップ機能を拡張する方が効率的です。
また、ツールチップはユーザーの理解を助ける重要なUI要素ですが、使いすぎるとかえって画面が煩雑になってしまいます。本当に必要な場所に、本当に必要な情報を表示するよう心がけるべきです。

