オプショングループを選択可能にする方法はありますか?
<select>
<optgroup value="0" label="Parent Tag">
<option value="1">Child Tag</option>
<option value="2">Child Tag</option>
</optgroup>
</select>
できるとは思いませんが、cssで視覚的なスタイルを簡単に再現できるため、選択できるのはオプションだけなので、すべてが選択可能です。
.optionGroup {
font-weight: bold;
font-style: italic;
}
.optionChild {
padding-left: 15px;
}
<select multiple="multiple">
<option value="0" class="optionGroup">Parent Tag</option>
<option value="1" class="optionChild">Child Tag</option>
<option value="2" class="optionChild">Child Tag</option>
</select>
Multiple属性を使用すると、複数の行を選択できます(ctrlクリック)。必要でない場合は削除できます。すべてが選択可能になり、optiongroup要素と同じように見えることを示しました。
これは、プレーンHTMLでは不可能です。いくつかのブラウザー(mozilla)では、cssを使用して同様のことを実現できますが、この記事の執筆時点では、ブラウザーの大部分(webkit、et.al)はhtml select要素のスタイル設定をサポートしていません。
ただし、html-selectウィジェットを強化し、要求した機能などの欠落している機能を提供するように設計されたjavascriptライブラリがいくつかあります。いくつか例を挙げると:
これがhtml標準でサポートされるまで、与えられたすべての答えは以下を含む問題があります:
これにより、問題を回避する最善の方法は、サイト全体のすべての選択にUI-Selectableなどのライブラリを使用すること(一貫性のため)、ORの最初のオプションを使用する、明確な説明(「ALLスウェーデン車」など)を使用して、すべての子の選択を表すoptgroup:
<select multiple="multiple">
<optgroup label="Parent">
<option value="0" class="optionChild">ALL Children</option>
<option value="1" class="optionChild">Child Tag 1</option>
<option value="2" class="optionChild">Child Tag 2</option>
</optgroup>
</select>
.my-select {
width: 60px;
}
<select class="my-select">
<option>Parent</option>
<option selected="selected"> Child</option>
</select>
少し異なるソリューション..
.optionGroup {
font-weight: bold;
}
<select>
<option value="0" class="optionGroup">Parent Tag</option>
<option value="1"> Child Tag1</option>
<option value="2"> Child Tag2</option>
</select>
@grifosの答えはWebKitブラウザではサポートされておらず、IE 11。
1つの提案は、Unordered/Orderedリストを使用し、CSSでスタイルを設定してから、JavaScript/jQueryで機能を追加することです。
私は過去にこれの素晴らしい実装を見てきました、それは本当に滑らかに見えることができます!
これにより、選択可能なoptgroupを含むドロップダウンリストの素朴な感覚が得られます。それを非常に単純に残しましたが、心のコンテンツに合わせてスタイルを設定できます。
.hide {
display:none;
}
.show {
display:block;
}
.selected.button {
display:block;
font-weight: bold;
}
button {
text-align: left;
min-width: 200px;
margin-left: 10px;
border: 0px;
background: #eee;
display: block;
}
#value_display {
width: 210px;
border: 1px solid #ddd;
border-radius: 4px;
padding-left: 8px;
}
</style>
<html>
<body>
<!-- Div is a display and also trigger for displaying dropdown -->
<div id="value_display" onclick="showOptions(this.value)">
opt 0
</div>
<!-- setting height and doing overflow-y allows dropdown list with scrollbox -->
<div id="select_div" class="hide" style="height: 80px; overflow-y: scroll;">
<button class="selected button" onclick="select(this.id)" id="opt 0">opt 0</button>
<button onclick="select(this.id)" id="opt 0-1" style="padding-left: 15px">opt 0-1</button>
<button onclick="select(this.id)" id="opt 0-2" style="padding-left: 15px">opt 0-2</button>
<button onclick="select(this.id)" id="opt 0-3" style="padding-left: 15px">opt 0-3</button>
<button onclick="select(this.id)" id="opt 0-4" style="padding-left: 15px">opt 0-4</button>
<button class="" onclick="select(this.id)" id="opt 1">opt 1</button>
<button onclick="select(this.id)" id="opt 1-1" style="padding-left: 15px">opt 1-1</button>
<button onclick="select(this.id)" id="opt 1-2" style="padding-left: 15px">opt 1-2</button>
<button onclick="select(this.id)" id="opt 1-3" style="padding-left: 15px">opt 1-3</button>
<button onclick="select(this.id)" id="opt 1-4" style="padding-left: 15px">opt 1-4</button>
<script>
var showingOptions = false;
var showingID = document.getElementById('value_display').innerHTML;
function showOptions() {
if(showingOptions) {
document.getElementById('select_div').className = "hide";
showingOptions = false;
}
else {
document.getElementById('select_div').className = "show";
showingOptions = true;
}
}
function select(id){
document.getElementById(id).className = 'selected button';
document.getElementById(showingID).className = 'show';
showingID = id;
document.getElementById('value_display').innerHTML = id;
document.getElementById('select_div').className = 'hide';
}
</script>