次のスクリーンショットに示すように、YouTubeでこの非常にシンプルな選択ボックスを見たことがあります。選択オプションはホバー(クリックではなく)で表示されます。
次の簡単な選択ボックスで同様の効果を作成しようとしています。誰かがこれを行う方法を手伝ってもらえますか?ありがとう。
<select name="size">
<option value="small">Small</option>
<option value="medium">Medium</option>
<option value="large">Large</option>
</select>
これを行う1つの方法がありますが、(html ul
をハードコーディングするよりも)よりプラグインのアプローチを好むでしょう:
_$('#selectUl li:not(":first")').addClass('unselected');
// Used to hide the 'unselected' elements in the ul.
$('#selectUl').hover(
function(){
// mouse-over
$(this).find('li').click(
function(){
$('.unselected').removeClass('unselected');
// removes the 'unselected' style
$(this).siblings('li').addClass('unselected');
// adds 'unselected' style to all other li elements
var index = $(this).index();
$('select option:selected').removeAttr('selected');
// deselects the previously-chosen option in the select
$('select[name=size]')
.find('option:eq(' + index + ')')
.attr('selected',true);
// assumes a 1:1 relationship between the li and option elements
});
},
function(){
// mouseout (or mouseleave, if they're different, I can't remember).
});
_
編集されてalert
要素の値の変更を示すselect
を含めるように: JS Fiddleデモ 。
編集して、デモで使用されるcssとhtmlを含めます。
_<select name="size">
<option value="small">Small</option>
<option value="medium">Medium</option>
<option value="large">Large</option>
</select>
<ul id="selectUl">
<li>small</li>
<li>medium</li>
<li>large</li>
</ul>
_
_select {
opacity: 0.5;
}
ul {
width: 8em;
line-height: 2em;
}
li {
display: list-item;
width: 100%;
height: 2em;
border:1px solid #ccc;
border-top-width: 0;
text-indent: 1em;
background-color: #f90;
}
li:first-child {
border-top-width: 1px;
}
li.unselected {
display: none;
background-color: #fff;
}
ul#selectUl:hover li.unselected {
background-color: #fff;
}
ul#selectUl:hover li,
ul#selectUl:hover li.unselected {
display: list-item;
}
ul#selectUl:hover li {
background-color: #fc0;
}
ul#selectUl li:hover,
ul#selectUl li.unselected:hover {
background-color: #f90;
}
_
これにより、メニューはunselected
にカーソルを合わせるまでul
アイテムを非表示にし、すべてのオプションを表示して、 click()
を使用します。 クリックされていない要素にunselected
クラス名を割り当てるイベント。これにより、クリックされた要素をマウスアウトで引き続き表示できます。
上記のCSSは、現在選択されている_:hover
_- ed、li
をより見やすくするために、最新の編集を反映しています。
編集済みええと、少し退屈したからです。そして、これ以上のことは何もなかったので、簡単なプラグインを作成しました。
_(function($) {
$.fn.selectUl = function(){
var $origSelect = $(this);
var newId = $(this).attr('name') + '-ul';
var numOptions = $(this).children().length;
$('<ul id="' + newId + '" class="plainSelect" />')
.insertAfter($(this));
for (var i = 0; i < numOptions; i++) {
var text = $(this).find('option').eq(i).text();
$('<li />').text(text).appendTo('#' + newId);
}
if ($(this).find('option:selected')) {
var selected = $(this).find('option:selected').index();
$('#' + newId)
.find('li')
.not(':eq(' + selected + ')')
.addClass('unselected');
}
$('#' + newId + ' li')
.hover(
function(){
$(this).click(
function(){
var newSelect = $(this).index();
$(this)
.parent()
.find('.unselected')
.removeClass('unselected');
$(this)
.parent()
.find('li')
.not(this)
.addClass('unselected');
$($origSelect)
.find('option:selected')
.removeAttr('selected');
$($origSelect)
.find('option:eq(' + newSelect + ')')
.attr('selected',true);
});
},
function(){
});
// assuming that you don't want the 'select' visible:
$(this).hide();
return $(this);
}
})(jQuery);
$('#sizes').selectUl();
_
ノート:
select
が複数ある場合(これは確実に実行でき、問題なく動作します)、doesページフローを少しねじ込みます(または多くの)、しかし、これはCSSで修正することができます(私はまだ試していませんが、想像します)。dl
の代わりにul
要素を使用できるようになり、使用可能なオプションの説明が可能になります。編集済み私は目に見える「ガイダンス」要素があるべきだと感じたので、それがすべてどのように機能するのかを試して説明しようとしました。
与えられたhtml:
_<select name="sizes" id="sizes" class="makePlain" title="Select a size:">
<option value="xxs">XX-Small</option>
<option value="xs">X-Small</option>
<option value="s">Small</option>
<option value="m">Medium</option>
<option value="l">Large</option>
<option value="xl">X-Large</option>
<option value="xxl">XX-Large</option>
</select>
_
JQueryを使用してプラグインを呼び出します。
_$('#sizes').selectUl();
_
これは上記の選択を取り、次のマークアップでul
を作成します。
_<ul id="sizes-ul" class="plainSelect">
<li class="guidance">Select a size:</li>
<li>XX-Small</li>
<li class="unselected">X-Small</li>
<li class="unselected">Small</li>
<li class="unselected">Medium</li>
<li class="unselected">Large</li>
<li class="unselected">X-Large</li>
<li class="unselected">XX-Large</li>
</ul>
_
使用されるCSS(デモで):
_ul.plainSelect {
/* targets those 'ul' elements created by the plug-in */
border: 1px solid #000;
}
ul.plainSelect li {
/* this styles the 'selected' li 'option' element */
background-color: #f90;
display: list-item;
}
ul.plainSelect li.guidance {
/* this is the 'Select a Reason' guidance/explanation from the image in the question */
border-bottom: 1px solid #000;
padding: 0.3em;
font-weight: bold;
font-size: 1.2em;
background-color: #fff;
}
ul.plainSelect li.unselected {
/* hides the 'unselected' options, and removes the background-color for contrast */
background-color: #fff;
display: none;
}
ul.plainSelect:hover li,
ul.plainSelect:hover li.unselected {
/* ensures that the 'li' elements pop-up when the list is hovered over, */
/* and act/display like 'li' elements */
display: list-item;
}
_
あなたが説明している単純な方法でselect
ボックスを開くことは不可能です。あなたが提供した画像が通常の選択ボックスのように見えないのは偶然ではありません。これはおそらく実際にはul
リストであり、実際のように見えるようにスタイル設定されており、カーソルを合わせると明らかになります。
私はそれをどのように行うことができるかの例 over on jsfiddle を作成しました。
あなたがこの方法でそれを行うことに興味があるなら、私は 私の現在のプロジェクト でそれを行う簡単な非JavaScriptの方法を持っています(実際に上部の「I Want To」メニューを見てください) )。 @Marcusが言ったように、これは選択ボックスではなく、順序付けられていないリスト(<ul>
)で行われます。
Htmlは単純です:
<div id="iWantToMenuContainer">
<ul id="i-want-to" class="menu">
<li><a href="http://cumberlandme.info/contact">contact the town office</a></li>
<li><a href="http://cumberlandme.info/upcoming-events">find out what’s happening</a></li>
<li><a href="http://cumberlandme.info/online-services">get permits and services applications</a></li>
</ul>
</div>
重要な部分はcssであり、基本的に最初の2つのルールだけです。 overflow:visible
の:hover
が原因で、divが展開しているように見えます。
#iWantToMenuContainer {
overflow:hidden;
}
#iWantToMenuContainer:hover {
overflow:visible
}
#iWantToMenuContainer ul {
border:1px solid #b6c2b9;
background:#fff;
padding:1px 20px 3px 5px
}
#iWantToMenuContainer a:link,#iWantToMenuContainer a:visited {
display:block;
background: #fff;
}
#iWantToMenuContainer a:hover {
background:#e6e6e6
}
現在、YouTubeをチェックすることはできませんが、スタイリングから、その「選択」コントロールは実際の選択コントロールではないと推測しています。ほとんどの場合、ナビゲーションドロップダウンメニューのように実装されますが、クリックしてURLに移動する代わりに、入力ラベルの内容と値を置き換えます。次に、フォームを送信すると、ラベルの値を取得できます。
更新されたjqueryプラグインへのリンク Forked $ .selectUI plugin