我认为问题很明显。 如果你在 <select>
元素上设置了一个静态宽度,而 <option>
中文本的宽度比该宽度更宽,那么在 IE 6-8 中文本就会被截断。 我找不到任何好的纯 CSS 解决方案。 它已经通过 JavaScript 使用多种方法解决了。
- Yahoo! 在他们的库中有一个修复方法。 但我已经在使用 jQuery,不想添加很多我不需要的大部分库。
- 有一个使用 通过 CSS 行为表达式应用的 JavaScript 的解决方案。 但那些让我很害怕,当我尝试这样做时,我发现了一些重大问题(整个页面都不想加载)。
- 你可以使用一些 在点击时改变宽度的内联 JavaScript。 这更接近我想要的,但当然内联 JavaScript 通常不是好消息。
我做了什么
我决定最好的方法是默认情况下保持选择元素的静态宽度,但在 IE 中鼠标悬停时,将宽度更改为“auto”以适应。 当然,当用户“完成”时,将其恢复为静态宽度。 以下是如何使用 jQuery 实现它:
var el;
$("select")
.each(function() {
el = $(this);
el.data("origWidth", el.outerWidth()) // IE 8 can haz padding
})
.mouseenter(function(){
$(this).css("width", "auto");
})
.bind("blur change", function(){
el = $(this);
el.css("width", el.data("origWidth"));
});
用通俗的话说
- 记住选择框的原始宽度。
- 当鼠标光标移至选择框元素上时,将
width
设置为auto
,使其根据需要展开。 - 当字段发生更改或失去焦点时,将宽度恢复为原始宽度。
当然,只有 IE 8 及更低版本需要此修复方法(该错误已在 IE 9 中修复),因此我通过 IE 条件注释 应用脚本。
<!--[if lt IE 9]>
<script>
// the fix
</script>
<![endif]-->
2012 年 8 月更新:GitHub 上还有一个专门针对此修复方法的项目,名为 IE 8 展开选择宽度。
不错! 我一直都在我们的电子商务网站上遇到这个问题,我打算试试这个!
干得好。 喜欢 jQuery 的巧妙运用,让它发挥作用。
如果用户使用键盘导航,这仍然有效吗? 似乎使用 .mouseover 会将其限制在只有鼠标的用户?
也许 .onfocus 更好用?
做得不错,但不幸的是,这不可访问,因为它需要 JS。 据我所知,没有“真正的”可访问解决方案来解决这个问题,还是我错了?
我找不到… JS 是我能想到的最接近的东西。
很棒的小技巧。 我过去遇到过这个问题,现在我知道如何解决它了!
-Brenelz
是的! 我以前遇到过很多次,而且非常烦人,但我从来没有耐心去真正解决它,哈哈。
一个问题 - 当你在鼠标悬停时将选择框的宽度设置为 auto 时,它会使整个框和下拉菜单变宽,对吗? 所以,这不会将附近的元素推开,并可能弄乱你的页面?
我同意。 对于 IE 布局来说,这可能是个问题。 我的想法是,也许这个元素可以以某种方式“浮动”... 比如暂时悬停(使用 position absolute/relative)以及一些底部的元素来帮助保留原始大小,这样它就可以在获得焦点时“增长”并覆盖周围的任何东西,但在这样做时不会影响(除了遮盖)周围的任何内容(与下拉菜单本身已经做到的方式非常相似)。
啊,确实是一个很棒的修复方法 :) 我要记下这个哈哈
为什么不使用 CSS 的 min-width 属性而不是 width 属性? 似乎它可以实现相同的效果,除了它在 IE 上也能在关闭 JavaScript 的情况下工作。
IE 6 不支持 min-width =)
啊,当然。 我错过了“以及更低版本”。 而且这是一个不错的修复方法。 :-)
再说一次,有一种 JavaScript 解决方案可以解决 IE6 不支持 min-width 的问题。
http://javascript.about.com/library/blwidth.htm(网络上还有其他 JS 解决方案)。
如果你可以实现它,你就可以在更多地方使用 min-width ;)
确实是一个很棒的修复方法!
很高兴你找到了一个修复方法,感谢分享。 这个错误太烦人了,我很惊讶它没有得到更多关注。
我在 Twitter 上看到了你的帖子,想让你看看 hedgerwow 网站,但你找到了解决方案,而我没有找到书签... 你用过非常长的选项测试过它吗? 在我的快速测试中,它闪烁得很厉害(可能是其他原因,还没有时间彻底测试)。
你写道
当然,只有 IE 7 及更低版本需要此修复方法
不幸的是,这仍然存在于 IE8 中,对吗?
太令人沮丧了...
截至 IE8 RC1,选择框问题已修复,与所有其他优秀浏览器一样。
不错的修复方法。 我打算用 mooTools 重写它,并将代码发给你。
这种事让我很生气。 我厌倦了为 IE 提供拙劣的 JavaScript 修复方法或条件样式表! 不过这是一篇非常棒的文章,Chris!
嘿
只是一个建议,你可以在这里实现 jQuery 的“hover”。 它将鼠标悬停作为第一个函数参数,将鼠标离开作为第二个参数。
对我来说,它并不真正起作用。 选择框在鼠标悬停和离开时会调整大小,但当我尝试选择一个选项时,它会消失(看起来它不认为鼠标仍然悬停在选择框上),有人知道我哪里做错了,或者有人遇到过类似的问题吗?
我也看到了相同的行为。
对我的 IE7 来说也是一样的,有人成功了吗?
我没有使用 .mouseout,而是使用了 .change - 它可以防止选择框的大小在选择选项之前恢复。
我也一样。
除非我做错了什么,否则每次触发鼠标悬停事件时,我在 firebug 中都会收到此错误。
$(this).data(“origWidth”, $(this).css(“width”)).css 不是函数
有什么想法吗
谢谢!
更好的是:Chris,你可以发布一个演示吗?
谢谢。
像 Firefox 一样打开选择框时,是否可以只调整列表大小而不调整选择框大小?
据我所知,没有办法。这就是问题所在。
非常感谢您的修复。这是我在 Google 上搜索了好几个小时后唯一有效的修复方法。
感谢您的文章!这非常有用。
为了确保所有页面加载完毕(所有选择框),无论您将 JS 代码放在哪里,都可以添加
你好,
非常棒的解决方案,速度很快。但是我在选项卡索引方面遇到了一些问题,当用户在克隆的控件上按 Tab 键时,下一个控件不会获得焦点。有什么解决办法吗?