我想做的是根据它具有的选项数量来改变选择框的样式。更具体地说,我希望它在span
只有一个选项时看起来像一个,select
否则就像一个典型元素。换句话说,我想在没有选择的情况下隐藏做出选择的可能性。
到目前为止,我发现的唯一解决方案是使用 jQuery 和另一个SO 答案select
来回更改标签的类型,但由于这与样式有关,我想了解纯 CSS解决方案(或至少,CSS + jQuery 解决方案)。span
select {
border: none;
-webkit-appearance: none;
font: inherit;
}
select::-ms-expand {
display: none;
}
select:focus {
outline:none;
outline-offset:0;
}
select > option {
display:none;
}
这些选择样式应该只应用于<select>
只有一个的元素<option>
$('select').each(function(i, el) {
if ($(el).children().length == 1) {
$(el).css("display", "none"); // Hide it
var optionVal = $(el).children().eq(0).text();
$(el).after($("<span>" + optionVal + "</span>"));
}
});
这将遍历<select>
页面上的每一个,然后检查它是否有一个选项。如果是这样,它将隐藏选择并在之后插入一个跨度。
没有 CSS 功能来确定一个选择有多少选项;如果这是您使用的唯一检查,“它有多个选项吗?”,那么您将需要一些 JavaScript。
一般来说,<select>
用 CSS 正确地设置 a 的样式确实很困难,尤其是在跨浏览器的情况下。请参阅如何从 Firefox 中的标签中删除箭头,以了解其他用户在做类似事情时的努力。他的解决方案可能对您有用,但它涉及修改 HTML,如果您仍要这样做,不妨将其更改为<span>
.
没有意识到您也在寻找 JavaScript 解决方案。这是最简单的方法,应该像 jQuery 一样跨浏览器:
$("select").each(function(i, elem){
if ($(this).children().length == 1) {
this.outerHTML = "<span>"+this.innerHTML+"</span>";
}
});
如果您放弃纯 CSS 解决方案并决定使用 CSS/JS 组合解决方案。这里是:
$("select").each( function(i) {
if( this.length ==1) {
var val = $(this).first().val();
$(this).before("<span>" + val + "</span>");
$(this).addClass("hidden");
}
} );
此时,您也可以通过向其添加类来以任何方式设置跨度的样式。
据我所知,SELECT 的 CSS 样式没有跨浏览器解决方案。这就是为什么有这么多解决方案在页面上将 SPAN 转换为类似 SELECT 的对象。