我在youtube上看到了这个非常简单的选择框,其中选择选项在悬停时可见(而非点击),如下面的屏幕截图所示。
我正在尝试在以下简单的选择框中创建类似的效果。有人可以帮助我们如何做到这一点?感谢。
<select name="size">
<option value="small">Small</option>
<option value="medium">Medium</option>
<option value="large">Large</option>
</select>
答案 0 :(得分:32)
这是一种方法,虽然我更喜欢更多的插件方法(而不是硬编码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 demo。
已编辑以包含演示中使用的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
类名称为未单击的元素;这允许点击的元素在mouseout上仍然可见。
上面的CSS反映了最近的编辑,以使当前选中,:hover
- 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();
JS Fiddle demo, including the 'plug-in'
注意:
select
(你当然可以做,并且工作正常)它 搞定页面流一点点(或很多),但这可以在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;
}
答案 1 :(得分:5)
无法以您描述的简单方式打开select
框。您提供的图像看起来不像普通的选择框,这绝非巧合。这是因为它实际上可能是一个ul
列表,其样式看起来像它一样,在悬停时显示出来,这实际上是可能的。
我创建了一个如何完成的示例over on jsfiddle。
答案 2 :(得分:4)
如果你有兴趣这样做,我实际上有一个简单的,非JavaScript的方式在my current project上做(看看顶部的“我想要”菜单)。就像@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,基本上只是前两个规则。由于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
}
答案 3 :(得分:0)
此刻工作所以无法检查youtube但是从造型我猜测“select”控件不是实际的选择控件。它很可能像导航下拉菜单一样实现,但不是在点击时导航到URL,而是替换输入标签的内容和值。然后在表单提交上,它可以获取标签的值。
答案 4 :(得分:0)
链接到更新的jquery插件Forked $.selectUI plugin