web-dev-qa-db-ja.com

Htmlホバーのボックスオプションを選択しますか?

次のスクリーンショットに示すように、YouTubeでこの非常にシンプルな選択ボックスを見たことがあります。選択オプションはホバー(クリックではなく)で表示されます。

alt text

次の簡単な選択ボックスで同様の効果を作成しようとしています。誰かがこれを行う方法を手伝ってもらえますか?ありがとう。

<select name="size">
   <option value="small">Small</option>
    <option value="medium">Medium</option>
    <option value="large">Large</option>
  </select> 
10
John

これを行う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).
    });
_

JS Fiddleデモ


編集されてalert要素の値の変更を示すselectを含めるように: JS Fiddleデモ


編集して、デモで使用されるcssとhtmlを含めます。

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>
_

css:

_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をより見やすくするために、最新の編集を反映しています。

最新のJS Fiddle demo


編集済みええと、少し退屈したからです。そして、これ以上のことは何もなかったので、簡単なプラグインを作成しました。

_(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();
_

JS Fiddleデモ、「プラグイン」を含む

ノート:

  • これは完全に配置されているわけではないので、selectが複数ある場合(これは確実に実行でき、問題なく動作します)、doesページフローを少しねじ込みます(または多くの)、しかし、これはCSSで修正することができます(私はまだ試していませんが、想像します)。
  • おそらくいくつかのオプションで実行でき、現在のdlの代わりにul要素を使用できるようになり、使用可能なオプションの説明が可能になります。
  • 現在よりも大幅に最適化できるのではないかと思いますが、どうすればよいかわかりません。おそらく少し眠り、遅くなって jQuery API を閲覧すると、いくつかの洞察が得られる可能性があります(ただし、明らかなものがあればコメントを残してください!または JS Fiddle そして、より良い用語が必要な場合は、それをフォークします(ただし、後続のフォーク/更新へのリンクに感謝します)。
  • どのライセンスオプションが利用できるのか完全にはわかりません(SOのすべてが Creative Commons cc-by-sa であるため、 Jeff Atwood 、およびこのサイトの footer によると、とにかく)、しかし、それだけの価値があるので、誰もが上記を取り入れて、それを使って好きなことをすることができてとてもうれしいです(もしそれが役に立ったら、楽しんでください!)。

編集済み私は目に見える「ガイダンス」要素があるべきだと感じたので、それがすべてどのように機能するのかを試して説明しようとしました。

与えられた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;
}
_

JS Fiddleデモ

33
David Thomas

あなたが説明している単純な方法でselectボックスを開くことは不可能です。あなたが提供した画像が通常の選択ボックスのように見えないのは偶然ではありません。これはおそらく実際にはulリストであり、実際のように見えるようにスタイル設定されており、カーソルを合わせると明らかになります。

私はそれをどのように行うことができるかの例 over on jsfiddle を作成しました。

5
Marcus Whybrow

あなたがこの方法でそれを行うことに興味があるなら、私は 私の現在のプロジェクト でそれを行う簡単な非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&#8217;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
    }
4
JakeParis

現在、YouTubeをチェックすることはできませんが、スタイリングから、その「選択」コントロールは実際の選択コントロールではないと推測しています。ほとんどの場合、ナビゲーションドロップダウンメニューのように実装されますが、クリックしてURLに移動する代わりに、入力ラベルの内容と値を置き換えます。次に、フォームを送信すると、ラベルの値を取得できます。

0
Adrian

更新されたjqueryプラグインへのリンク Forked $ .selectUI plugin

  • 渡された複数の要素の反復を修正
0
Bob Gregor