Html在Hover上选择框选项?

Joh*_*ohn 10 html css html-select

我在youtube上看到了这个非常简单的选择框,其中选择选项在悬停时可见(而不是点击),如下面的屏幕截图所示.

替代文字

我试图在下面的简单选择框中创建类似的效果.有人可以帮助我们如何做到这一点?谢谢.

<select name="size">
   <option value="small">Small</option>
    <option value="medium">Medium</option>
    <option value="large">Large</option>
  </select> 
Run Code Online (Sandbox Code Playgroud)

Dav*_*mas 33

这是一种方法,虽然我更喜欢更多的插件方法(而不是硬编码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).
    });
Run Code Online (Sandbox Code Playgroud)

JS小提琴演示.


编辑包括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>
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

这会导致菜单隐藏unselected项目直到ul悬停,然后显示所有选项,并使用click()事件将unselected类名称分配给未单击的元素; 这允许点击的元素在mouseout上仍然可见.

上面的CSS反映了最近的编辑,使当前选中和:hover-ed li更加可见.

最新的JS小提琴演示.


编辑,因为,我有点无聊.没有更好的事情要做,所以我做了一个简单的插件:

(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();
Run Code Online (Sandbox Code Playgroud)

JS Fiddle演示,包括'插件'.

笔记:

  • 这不是绝对定位的,所以如果你有多个select(你当然可以做,并且工作正常)它会对页面流程有点(或很多),但这可以在CSS中进行修改(我想,虽然我还没试过).
  • 它可能与某些选项有关,可能允许使用dl元素代替当前ul,这将允许给出可用选项的解释.
  • 我怀疑它可以比目前更好地进行优化,但我不是,不在乎,确定如何.可能有些睡觉,而且,最近浏览jQuery API可能会提供一些见解(虽然如果有人看到任何明显的东西请发表评论!或者拿JS小提琴,并且,为了更好的术语,分叉它(虽然我显然很欣赏链接到任何后续的分支/更新).
  • 我不完全确定我可以获得哪些许可选项(因为SO上的所有内容都是知识共享cc-by-sa,根据Jeff Atwood的说法,无论如何都是这个网站的页脚),但是我觉得它是值得的.很高兴任何人都可以采取上述措施,并且,做任何你喜欢的事情(如果有任何用处,玩得开心!).

编辑,因为我觉得应该有一个明显的"指导"元素,并试图解释一切如何运作.

鉴于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>
Run Code Online (Sandbox Code Playgroud)

使用jQuery调用插件:

$('#sizes').selectUl();
Run Code Online (Sandbox Code Playgroud)

这将采用上面的选择,并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>
Run Code Online (Sandbox Code Playgroud)

使用的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;
}
Run Code Online (Sandbox Code Playgroud)

JS小提琴演示.


Mar*_*row 5

select你所描述的简单方式打开一个盒子是不可能的.您提供的图像看起来不像普通的选择框,这绝非巧合.这是因为它实际上可能是一个ul样式,它看起来像它一样,在悬停时显示自己,这实际上是可能的.

在jsfiddle上创建了一个如何完成它的例子.