次のHTMLを使用すると、これを実行できます(そして、率直に言って、他のHTMLを使用すると、これを実行できます...)が、テーブルを使用する必要があります。
とにかく、そうは言っても、私が使用しているHTMLは次のとおりです。
<ul>
<li class="head">
<span class="col1">Food</span>
<span class="col2">Calories</span>
</li>
<li>Fruits
<ul>
<li>
<span class="col1">Apple</span>
<span class="col2">90</span>
</li>
<li>
<span class="col1">Grape</span>
<span class="col2">5</span>
</li>
<li>
<span class="col1">strawberry</span>
<span class="col2">16</span>
</li>
</ul></li>
<li>Vegetable
<ul>
<li>
<span class="col1">Cucumber</span>
<span class="col2">12</span>
</li>
<li>
<span class="col1">Onion</span>
<span class="col2">29</span>
</li>
</ul></li>
</ul>
そしてCSS:
li.head {
font-weight: bold;
}
span.col1,
span.col2 {
display: inline-block;
width: 48%;
}
ul > li > ul > li {
padding-left: 10%;
height: 0;
line-height: 0;
overflow: hidden;
-webkit-transition: all 1s linear;
}
ul > li:hover > ul > li {
height: 2em;
line-height: 2em;
-webkit-transition: all 1s linear;
}
ul > li > ul > li span:first-child::before {
content: '-';
width: 40%;
}
li li:nth-child(odd) span {
background-color: #aaf;
}
JSフィドルデモ。
キーボードナビゲーションを可能にし、タブイベントに応答してネストされた食品/カロリー値を表示できるようにするために、HTMLを少し修正してfruits
、vegetable
テキストをa
要素でラップしました。
<ul>
<li class="head">
<span class="col1">Food</span>
<span class="col2">Calories</span>
</li>
<li><a href="#">Fruits</a>
<ul>
<li>
<span class="col1">Apple</span>
<span class="col2">90</span>
</li>
<li>
<span class="col1">Grape</span>
<span class="col2">5</span>
</li>
<li>
<span class="col1">strawberry</span>
<span class="col2">16</span>
</li>
</ul></li>
<li><a href="#">Vegetable</a>
<ul>
<li>
<span class="col1">Cucumber</span>
<span class="col2">12</span>
</li>
<li>
<span class="col1">Onion</span>
<span class="col2">29</span>
</li>
</ul></li>
</ul>
次のCSSを使用します。
li.head {
font-weight: bold;
}
li a {
color: inherit;
text-decoration: none;
}
span.col1,
span.col2 {
display: inline-block;
width: 48%;
}
ul > li > ul > li {
padding-left: 10%;
height: 0;
line-height: 0;
overflow: hidden;
-moz-transition: all 1s linear;
-ms-transition: all 1s linear;
-o-transition: all 1s linear;
-webkit-transition: all 1s linear;
transition: all 1s linear;
}
ul > li a:focus + ul > li,
ul > li:hover > ul > li {
height: 2em;
line-height: 2em;
-moz-transition: all 1s linear;
-ms-transition: all 1s linear;
-o-transition: all 1s linear;
-webkit-transition: all 1s linear;
transition: all 1s linear;
}
ul > li > ul > li span:first-child::before {
content: '-';
width: 40%;
}
li li:nth-child(odd) span {
background-color: #aaf;
}
JSフィドルデモ。
ただし、これらは両方とも、自動的に非表示にし、ユーザーの操作に基づいて表示することを前提としています。その仮定が正しくない場合、遷移は必要ありません。
ちなみに、アコーディオンのようなtable
解決策:
<table>
<colgroup>
<col class="foods" />
<col class="calories" />
</colgroup>
<thead>
<tr>
<th>Food</th>
<th>Calories</th>
</tr>
</thead>
<tbody>
<tr class="header">
<td colspan="2">Fruits</td>
</tr>
<tr>
<td>Apple</td>
<td>90</td>
</tr>
<tr>
<td>Grape</td>
<td>5</td>
</tr>
<tr>
<td>Strawberry</td>
<td>16</td>
</tr>
</tbody>
<tbody>
<tr class="header">
<td colspan="2">Vegetable</td>
</tr>
<tr>
<td>Cucumber</td>
<td>12</td>
</tr>
<tr>
<td>Onion</td>
<td>29</td>
</tr>
</tbody>
</table>
CSS:
.foods,
.calories {
width: 8em;
}
tbody tr.header {
height: 2em;
line-height: 2em;
}
tbody tr,
tbody tr td {
max-height: 0;
line-height: 0;
overflow: hidden;
-moz-transition: all 1s linear;
-ms-transition: all 1s linear;
-o-transition: all 1s linear;
-webkit-transition: all 1s linear;
transition: all 1s linear;
}
tbody tr td:first-child {
padding-left: 2em;
}
tbody tr.header td {
padding: 0;
}
tbody:hover tr {
height: 2em;
max-height: 2em;
line-height: 2em;
-moz-transition: all 1s linear;
-ms-transition: all 1s linear;
-o-transition: all 1s linear;
-webkit-transition: all 1s linear;
transition: all 1s linear;
}
JSフィドルデモ。
これは、ヘッダーにカーソルを合わせて非表示のコンテンツを表示することで可視性を制御するという、以前と同じ仮定を行います。
そして、キックのためだけに、要素の属性をtab使用して、キーボードナビゲーション(を使用)を追加します。tabindex
tr.header
<table>
<colgroup>
<col class="foods" />
<col class="calories" />
</colgroup>
<thead>
<tr>
<th>Food</th>
<th>Calories</th>
</tr>
</thead>
<tbody>
<tr class="header" tabindex="1">
<td colspan="2">Fruits</td>
</tr>
<!-- unchanged from the previously-posted table mark-up -->
</tbody>
<tbody>
<tr class="header" tabindex="2">
<td colspan="2">Vegetable</td>
</tr>
<!-- unchanged from the previously-posted table mark-up -->
</tbody>
</table>
およびCSS:
/* Other CSS remains the same */
tr.header:focus ~ tr,
tbody:hover tr {
height: 2em;
max-height: 2em;
line-height: 2em;
-moz-transition: all 1s linear;
-ms-transition: all 1s linear;
-o-transition: all 1s linear;
-webkit-transition: all 1s linear;
transition: all 1s linear;
}
tr.header:focus {
outline: none;
font-style: italic;
background-color: #ffa;
}
JSフィドルデモ。