画面(ウィンドウ)からはみ出さない範囲で、<td>内にある1つの<textarea>を縦横にできる限り広く表示させるには、<table>と<td>にサイズ制限(または自動伸縮)を設定し、<textarea>にwidth: 100%; height: 100%; box-sizing: border-box;を指定するのが最も確実です。
さらに、テキストエリアが広がりすぎて画面外にはみ出るのを防ぐため、テーブル全体、またはコンテナにビューポート単位(vh / vw)を使ったサイズ制限をかけます。
以下に、実用的な実装パターンを2つ紹介します。
パターン1:テーブル全体を画面いっぱいに広げ、特定のセルを最大化する(推奨)
画面全体のサイズ(例えば「画面の高さの80%」など)を基準にし、余ったスペースをすべて<textarea>のある行・列に割り振る方法です。
HTML / CSS コード例
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>フォーム最適化サンプル</title>
<style>
/* 画面全体に対するレイアウト設定 */
body {
margin: 0;
padding: 20px;
box-sizing: border-box;
height: 100vh; /* 画面の高さを基準にする */
}
/* テーブル全体の制限:画面からはみ出さない */
.responsive-table {
width: 100%;
/* 画面の高さ(100vh)から上下の余白(40px)や他の要素分を引いた最大値 */
max-height: calc(100vh - 60px);
height: 80vh; /* デフォルトの高さ */
border-collapse: collapse;
table-layout: fixed; /* 列幅を固定してはみ出しを防ぐ */
}
.responsive-table th,
.responsive-table td {
border: 1px solid #ccc;
padding: 8px;
}
/* 通常の入力欄がある行や列は、コンテンツに合わせるか固定幅にする */
.fixed-col {
width: 150px;
}
.fixed-row {
height: 40px;
}
/* ★最重要:textareaを入れるセルを「自動伸縮(残りすべて)」にする */
.expand-cell {
/* heightやwidthを指定しない、または残り余白をすべて吸い取らせる */
position: relative; /* 子要素の100%基準を安定させるため */
}
/* ★最重要:セルの高さいっぱいにtextareaを広げる */
.full-textarea {
width: 100%;
height: 100%;
min-height: 150px; /* 潰れ防止の最低限の高さ */
display: block; /* 下部の不要な隙間を消す */
box-sizing: border-box; /* paddingとborderを幅に含める */
resize: vertical; /* ユーザーの手動調整は縦方向のみに制限(横崩れ防止) */
}
</style>
</head>
<body>
<form action="#" method="post" style="height: 100%;">
<table class="responsive-table">
<tr class="fixed-row">
<th class="fixed-col">項目名</th>
<th>入力欄</th>
</tr>
<tr class="fixed-row">
<td>お名前</td>
<td><input type="text" style="width: 100%; box-sizing: border-box;"></td>
</tr>
<!-- この行・セルが残りの縦横スペースをすべて使う -->
<tr>
<td>詳細内容</td>
<td class="expand-cell">
<textarea class="full-textarea" placeholder="ここが画面の許す限り自動で最大化されます"></textarea>
</td>
</tr>
<tr class="fixed-row">
<td>ステータス</td>
<td>
<select>
<option>選択してください</option>
</select>
</td>
</tr>
</table>
</form>
</body>
</html>
パターン2:Flexboxのコンテナの中にテーブルを入れる方法(より強固なはみ出し防止)
他の入力項目が多かったり、画面サイズが小さかったりする場合、テーブル自体が画面外に押し出されることがあります。その場合は、テーブルを外枠(div)で囲み、max-height と overflow: hidden を組み合わせると絶対に画面からはみ出さなくなります。
CSSの変更ポイント
/* テーブルを置く親コンテナ */
.form-container {
max-height: 75vh; /* 画面全体の75%を超えないようにロック */
overflow: hidden; /* はみ出しを完全にシャットアウト */
display: flex;
flex-direction: column;
}
.responsive-table {
width: 100%;
height: 100%; /* コンテナの高さ一杯に広げる */
border-collapse: collapse;
}
/* textareaの設定はパターン1と同じ */
.full-textarea {
width: 100%;
height: 100%;
box-sizing: border-box;
resize: none; /* 完全にテーブルのサイズに追従させる場合はnone */
}
記述の必須テクニック解説
box-sizing: border-box;
これを<textarea>(およびその他のインプット)に指定しないと、width: 100%にした際に枠線(border)や内側の余白(padding)の分だけ必ずセルからはみ出します。table-layout: fixed;
テーブル全体の横幅が画面サイズ(100%)を超えてスクロールバーが出るのを防ぎます。各列の幅が指定した比率で固定されます。height: 100%;の連鎖
HTMLの仕様上、子要素(<textarea>)でheight: 100%を効かせるためには、親要素である<td>や<tr>、そして<table>にも具体的な高さ(pxやvh、または親譲りの100%)が決まっている必要があります。そのため、一番大元の<table>にheight: 80vhなどを指定することが重要です。
まずはパターン1のコードをそのまま新規のHTMLファイルとして保存してブラウザで開き、ウィンドウサイズを上下左右に動かしてみてください。テキストエリアが画面に追従して最大化することを確認できるはずです。
もし現在のテーブルの「行数」や「列数」が具体的に決まっている場合、どの行・列にテキストエリアがあるかを教えていただければ、さらに最適な幅(colspanの調整など)をご提案できます。
テキストエリアの位置は、6行中3行目、3列中3列目
ご指定のレイアウト(6行×3列の、3行目・3列目)に合わせて、テーブル全体の崩れを防ぎつつ、テキストエリアを限界まで広く表示するコードを作成しました。
今回は、3行目の3列目に割り振られたスペース(セルのサイズ)そのものが、画面の余白をすべて吸収して自動で縦横に最大化し、その中にある<textarea>が100%連動して広がる設計にしています。
HTML / CSS 実装コード
以下のコードをそのままコピーしてご利用いただけます。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>6行3列 フォーム最適化</title>
<style>
/* 画面全体の余白をリセットし、はみ出しを防ぐ */
html, body {
margin: 0;
padding: 0;
height: 100%;
overflow: hidden; /* 画面全体のスクロールバーを抑止 */
}
body {
padding: 20px;
box-sizing: border-box;
background-color: #f5f5f5;
}
/* フォームのコンテナ(画面高さから上下の余白40pxを引いたサイズに収める) */
.form-container {
width: 100%;
height: calc(100vh - 40px);
background: #fff;
padding: 10px;
box-sizing: border-box;
border-radius: 8px;
box-shadow: 0 2px 5px rgba(0,0,0,0.1);
}
/* <table>全体のレスポンシブ設定 */
.matrix-table {
width: 100%;
height: 100%;
border-collapse: collapse;
table-layout: fixed; /* 列幅を固定し、テキストエリアの横暴走を防ぐ */
}
.matrix-table th,
.matrix-table td {
border: 1px solid #ccc;
padding: 8px;
font-size: 14px;
}
/* --- 列幅(横方向)のコントロール --- */
.col-1 { width: 15%; } /* 1列目:項目名など */
.col-2 { width: 25%; } /* 2列目:通常の入力欄 */
.col-3 { width: 60%; } /* 3列目:テキストエリアがある列(ここを一番広くする) */
/* --- 行高(縦方向)のコントロール --- */
/* 3行目以外の、通常の行は高さを固定(コンテンツの高さ+余白) */
.fixed-row {
height: 45px;
}
/* --- ★最重要:3行目・3列目の最大化設定 --- */
/* 3行目には高さを指定しないことで、テーブルの「残りすべての高さ」がこの行に集約されます */
.expand-cell {
position: relative; /* 子要素のheight: 100%を安定させるためのアンカー */
padding: 4px !important; /* テキストエリアをセルいっぱいに広げるため余白を狭める */
}
/* テキストエリア本体の引き伸ばし */
.full-textarea {
width: 100%;
height: 100%;
min-height: 100px; /* 万が一画面が極小になったときの潰れ防止 */
box-sizing: border-box; /* 枠線と内側余白を100%の中に含める(超重要) */
display: block;
padding: 10px;
border: 1px solid #aaa;
border-radius: 4px;
font-family: inherit;
resize: none; /* テーブルの枠に完全に固定するため、手動サイズ変更を無効化 */
}
/* 通常の入力パーツも横幅いっぱいにして見栄えを整える */
.matrix-table input[type="text"],
.matrix-table select {
width: 100%;
box-sizing: border-box;
padding: 6px;
}
</style>
</head>
<body>
<div class="form-container">
<form action="#" method="post" style="height: 100%;">
<table class="matrix-table">
<!-- 列幅を固定するためのcolgroup設定 -->
<colgroup>
<col class="col-1">
<col class="col-2">
<col class="col-3">
</colgroup>
<!-- 1行目 -->
<tr class="fixed-row">
<th>共通項目</th>
<th>入力欄 A</th>
<th>入力欄 B (右側エリア)</th>
</tr>
<!-- 2行目 -->
<tr class="fixed-row">
<td>ユーザー情報</td>
<td><input type="text" placeholder="氏名"></td>
<td><input type="text" placeholder="備考など"></td>
</tr>
<!-- 3行目:★ここにテキストエリアを配置(この行だけfixed-rowクラスをつけない) -->
<tr>
<td>メインデータ</td>
<td>
<!-- 3行目2列目のコンテンツ量が多くても崩れないよう中身はシンプルに -->
<select>
<option>カテゴリ選択</option>
</select>
</td>
<td class="expand-cell">
<!-- 3行目3列目:画面の許す限り縦横に自動最大化するテキストエリア -->
<textarea class="full-textarea" placeholder="このテキストエリアが、画面からはみ出さない範囲で縦横に最大化されます。"></textarea>
</td>
</tr>
<!-- 4行目 -->
<tr class="fixed-row">
<td>オプション</td>
<td><input type="text" placeholder="設定1"></td>
<td><input type="text" placeholder="設定2"></td>
</tr>
<!-- 5行目 -->
<tr class="fixed-row">
<td>システム設定</td>
<td><input type="text" placeholder="管理コード"></td>
<td><input type="text" placeholder="ログ宛先"></td>
</tr>
<!-- 6行目 -->
<tr class="fixed-row">
<td>送信確認</td>
<td><label><input type="checkbox"> 同意する</label></td>
<td style="text-align: right;">
<button type="submit" style="padding: 6px 20px;">送信する</button>
</td>
</tr>
</table>
</form>
</div>
</body>
</html>
このレイアウトを成立させている仕組み
colgroupによる横幅の配分
3列目(テキストエリアがある列)の横幅をwidth: 60%;と大きく設定しています。これにより横方向は自動的に画面の過半数を占めるようになります。fixed-rowの有無による縦幅の自動計算
1, 2, 4, 5, 6行目には.fixed-row { height: 45px; }を指定して高さを固定しています。一方で、テキストエリアのある3行目だけは高さを指定していません。テーブル全体の高さ(height: 100%)から、固定された他の行の高さ(45px × 5行分など)を差し引いた「残りの高さすべて」が、自動的に3行目に割り当てられます。tdとtextareaの連動
3行目3列目のセルに.expand-cellを指定し、中の<textarea>にwidth: 100%; height: 100%;をかけることで、上記で自動計算されたセルの縦横サイズぴったりにテキストエリアが広がります。
ブラウザのウィンドウサイズを上下左右に縮めても、テーブルやテキストエリアが画面外にはみ出すことなく、常にぴったり収まる状態で最大化されます。実際の環境に合わせて、各列の幅(col-1〜3)や固定行の高さ(fixed-row)の数値を微調整してご活用ください。
もし、各セルの見出し文字が長くて折り返してしまい、固定行(fixed-row)の高さが足りなくなるなどの問題があれば、お気軽にお知らせください。


コメント