这个想法来自 Veer.com,以及他们如何处理下拉菜单,例如 T恤尺寸。感谢 Dennis Sa。
HTML
我们将一个普通的文本输入包装在 <div> 内,其中还包含一个无序列表,该列表将表示弹出菜单的值。
<div class="size">
<input type="text" name="test" value="choose your size" class="field" readonly="readonly" />
<ul class="list">
<li>Male - M</li>
<li>Female - M</li>
<li>Male - S</li>
<li>Female - S</li>
</ul>
</div>
CSS
默认情况下,列表将隐藏,但仍会全部设置样式并准备就绪,以便在单击触发显示它们时可以使用。
.size { position:relative }
.size .field {
width:300px; background:#EC6603; color:#fff; padding:5px; border:none; cursor:pointer;
font-family:'lucida sans unicode',sans-serif; font-size:1em;
border:solid 1px #EC6603;
-webkit-transition: all .4s ease-in-out;
transition: all .4s ease-in-out;
}
.size .field:hover {
border:solid 1px #fff;
-moz-box-shadow:0 0 5px #999; -webkit-box-shadow:0 0 5px #999; box-shadow:0 0 5px #999
}
.size>ul.list { display:none;
position:absolute; left:30px; top:-30px; z-index:999;
width:300px;
margin:0; padding:10px; list-style:none;
background:#fff; color:#333;
-moz-border-radius:5px; -webkit-border-radius:5px; border-radius:5px;
-moz-box-shadow:0 0 5px #999; -webkit-box-shadow:0 0 5px #999; box-shadow:0 0 5px #999
}
.size>ul.list li {
padding:10px;
border-bottom: solid 1px #ccc;
}
.size>ul.list li:hover {
background:#EC6603; color:#fff;
}
.size>ul.list li:last-child { border:none }
jQuery
我们将快速组合一个插件,以便可以在包含相同 HTML 设置的任何 div 包装器上调用此功能。
(function($){
$.fn.styleddropdown = function(){
return this.each(function(){
var obj = $(this)
obj.find('.field').click(function() { //onclick event, 'list' fadein
obj.find('.list').fadeIn(400);
$(document).keyup(function(event) { //keypress event, fadeout on 'escape'
if(event.keyCode == 27) {
obj.find('.list').fadeOut(400);
}
});
obj.find('.list').hover(function(){ },
function(){
$(this).fadeOut(400);
});
});
obj.find('.list li').click(function() { //onclick event, change field value with selected 'list' item and fadeout 'list'
obj.find('.field')
.val($(this).html())
.css({
'background':'#fff',
'color':'#333'
});
obj.find('.list').fadeOut(400);
});
});
};
})(jQuery);
用法
然后,我们只需在 DOM 准备好时调用插件即可。
$(function(){
$('.size').styleddropdown();
});
这是一个非常不错的插件。我只是想知道是否有一种方法可以使用 select 元素来实现它。
然后使用 jQuery 将 select 元素转换为上述标记。这可能吗?
您可能也可以使用 select 元素来实现它。不过,这需要一些额外的特殊调整。它不必像现在这样是输入,而可以只是一个 div 或其他东西。加载 JavaScript 时,它将从 select 元素中创建一个 UL,但同时保持它和 select 隐藏。然后,当您单击 div 时,它将像现在一样显示 UL,并且当单击列表项时,它将设置 div 的文本以显示选择并更改隐藏 select 元素的值。有点复杂,但可以实现,并且在回退场景中可能是更好的选择。
演示由于结束标题标记中的错别字而无法正常工作。
这听起来非常有趣,我将在我的下一个设计中尝试将其集成。
只是一点小问题
===
var obj = $(this)
===
而不是
obj = $(this)
允许您拥有多个元素……
kr,tara
当然,它在 IE6 中不起作用……
(人们还在为 IE6 编写代码吗?)
不。
是的
非常感谢您分享如此翔实的文章。我从您的代码中学到的所有内容都是 keyup、keydown 事件处理。谢谢
谢谢 Chris,感谢您推荐此代码片段。
@John Valis,不知何故,我认为键事件可能会有用 :)
很棒的效果,我一直以为我需要调整选项字段才能实现这种样式。在移动网站上,这应该是一个有价值的用户体验补充。另一方面,我建议将 unselectable=”on” 属性添加到输入中。
如果您在 IE 7/8 上测试此功能,即使在列表下方,您也会看到闪烁的光标,添加该属性可以确保它消失。
谢谢!
我正在尝试添加多个选择框,但 js 无法正常工作。
只需添加一点
===
var obj = $(this)
而不是
obj = $(this)
不错,但如果它有键盘支持会更酷 :-) 就像 Mac 样式的弹出窗口,继续努力
是我一个人,还是如果将 .size 类更改为任何包含连字符的内容,它就会中断?例如,如果我将所有对 .size 的引用更改为 .tool-tip,则没有任何效果。
使它正常工作并在 magento 1.5.1.0 的工具栏中使用了它(使用 jq 1.4.2)……
用于“按”和“每页显示”分页。
对于两个实例,将此添加到 jquery 中,无需冲突(您可能需要将选择器 jQuery() 更改为 $())
添加/更改了 jquery,以便在单击链接时有一个预加载器(使用 magento 结帐预加载器!)
(将此添加到文件 template/page/html/head.phtml 中)
添加到 css 中(用于修复第二个实例中的错误)
一旦成功加载 jquery 和 css 就位
…然后我使用…编辑了 template/catalog/product/list/toolbar.phtml
使用注释掉了第 53 行到第 65 行并将此代码粘贴到 div 类“sort-by”之间…
(全部基于在管理员中设置的“排序”配置(在系统->配置->目录中找到),因此请设置/匹配管理员中保存的参数)
以及第 70 行到第 77 行,使用 <!– –> 将其注释掉
并在 div 类“limiter”中放置此代码…
(全部基于在管理员中设置的“排序”配置(在系统->配置->目录中找到),因此请设置/匹配管理员中保存的参数)
执行我想要的方式
您是否听说过在 PHP 中也可以使用循环(如“for”和“while”)?
所以,而不是这个
<a href="getCurrentUrl() ?>?limit=5">5
<a href="getCurrentUrl() ?>?limit=10">10
<a href="getCurrentUrl() ?>?limit=15">15
<a href="getCurrentUrl() ?>?limit=20">20
<a href="getCurrentUrl() ?>?limit=25">25
<a href="getCurrentUrl() ?>?limit=all">全部
您可以编写类似这样的内容
<?php printf("%s", $this->getCurrentUrl(), $limit, ucfirst("$limit")) ?>
如何分配选择选项时的操作?
我在 iOS Safari 中遇到了这个问题。问题是,一旦菜单打开,就无法关闭它。有没有解决办法?谢谢!
我无法在同一页面上创建两个具有不同值集的同步样式下拉菜单。
您能否为此提供一个可行的示例?
此外,评论中提到的两个样式下拉菜单的代码也不起作用
谢谢,
Umang
太棒了!