我刚刚遇到一个模糊的问题,select
框在文本周围有额外的空间,似乎不是框模型的一部分。这是我的意思的两张照片:
Here is an example of it happening (on JSFiddle)或者您可以查看以下示例的来源:
select, input
{
padding:0px;
font-size:20px;
}
select.textIndent
{
text-indent:-1.5px;
}
select.paddingOffset
{
padding-left:2.5px;
}
input.paddingOffset
{
padding-left:5px;
}
<h3>No Padding Test</h3>
<select>
<option>Item 1</option>
<option>Item 2</option>
<option>Item 3</option>
</select><br />
<input type="text" value="Item 1" />
<h3>Negative Text Indent</h3>
<select class="textIndent">
<option>Item 1</option>
<option>Item 2</option>
<option>Item 3</option>
</select><br />
<input type="text" value="Item 1" />
<h3>Padding Offset</h3>
<select class="paddingOffset">
<option>Item 1</option>
<option>Item 2</option>
<option>Item 3</option>
</select><br />
<input class="paddingOffset" type="text" value="Item 1" />
我已经找到了两种尝试解决问题的方法,通过使用否定text-indent
或使用左边距填充调整input
和select
框来匹配。
这两种方法都不完美。 Chrome和Firefox的否定text-indent
之间存在差异,如果select
和input
一个接一个地排列,则会产生明显的空间。尝试抵消填充可能会使您在应用一定百分比的填充时难以保持各种input
和select
字段的样式。
我首先在客户的网站上注意到它的部分字词被切断,但如果那个空格不存在,那么这个词看起来就像是适合的。
虽然我可以为我的客户解决这个特定问题(例如,更宽select
框,更少填充),但我想知道是否存在隐藏/抵消/删除“其他”填充的不同解决方案在文本的左侧/右侧。我应该看看另一个CSS属性吗?
我有一种感觉,这可能只是select
盒子的工作方式,但我希望SO的集体蜂巢证明我是错的。
我希望解决方案是纯CSS。我知道如果我使用JS库对select
框进行直接替换,则不会出现同样的问题。
为了更好地阐明我的目标,select
框在框模型外面有一个额外的填充。下面的图片显示select
框的6px和input
的~3px。我想控制这个特殊的填充或完全删除它。我已经尝试使用text-indent
并使用填充偏移来对齐input
和select
元素中的文本,但这两个看起来都是hackish。我认为有一种更好的CSS方式。
答案 0 :(得分:22)
不幸的是,这个额外的空格是由浏览器的渲染引擎添加的。表单元素呈现在浏览器中不一致,在这种情况下不由CSS确定。
看看this article from Mozilla解释某些方法可以缓解选择框错误,然后您可以阅读Smashing Magazine中关于样式表单元素的this article(请务必查看评论和人们遇到的问题)有选择)。
答案 1 :(得分:17)
您看到的填充来自浏览器特定的样式表。在chrome中,负责为这些下拉列表设置样式的属性为-webkit-appearance
,在firefox中为-moz-appearance
您可以通过执行以下操作来标准化选择菜单的外观:
select {
-webkit-appearance: none;
-moz-appearance : none;
border:1px solid #ccc;
border-radius:3px;
padding:5px 3px;
}
注意:这不会产生好看的效果,只会在您的选择框中为您提供标准的填充/间距。要获得外观漂亮,可自定义的选择框,您可以完全控制填充/大小等,那里有大量的教程。这是我在快速谷歌搜索后发现的一个:
http://www.htmllion.com/default-select-dropdown-style-just-css.html
答案 2 :(得分:3)
左侧填充:
这些值可能需要更广泛的跨浏览器测试,我稍后可能会更新。我使用一组CSS hacks来为每个浏览器分配不同的padding-left
值,并使用calc
的左侧填充为“基本”值。即如果左基础填充为5%,则可以使用以下SCSS(可以使用CSS预处理器以避免重复):
$select-base-gap-x: 5%;
$select-gap-x: calc(#{$select-base-gap-x} - 4px);
$select-gap-x_edge: calc(#{$select-base-gap-x} - 3px);
$select-gap-x_ie: calc(#{$select-base-gap-x} - 2px);
.select {
-moz-appearance: none;
-webkit-appearance: none;
appearance: none;
border-radius: 0;
margin: 0;
padding-left: $select-gap-x;
}
/* edge 12-18 */
@supports (-ms-ime-align:auto) {
.select {
padding-left: $select-gap-x_edge;
}
}
/* ie10-11 */
_:-ms-input-placeholder, :root .select {
padding-left: $select-gap-x_ie;
}
/* Chrome 38+ (and Opera 25+) */
@supports (-webkit-appearance:none) and (font-stretch:normal) and (not (-ms-accelerator:true)) {
.select {
// Webkit doesn't need any correction for padding so it uses raw base value
padding-left: $select-base-gap-x;
}
}
/* Safari 6.2,7.1+ */
_::-webkit-full-page-media, _:future, :root .select {
// Webkit doesn't need any correction for padding so it uses raw base value
padding-left: $select-base-gap-x;
}
/* Firefox */
@-moz-document url-prefix() {
.select {
// Firefox recognizes hacks for webkit, so it needs a proper padding setting again
padding-left: $select-gap-x;
}
}
答案 3 :(得分:0)
一个不错的选择是用输入数据列表替换选择框
答案 4 :(得分:-3)
解决这个问题的方法是在选择框上覆盖Chrome的“box-sizing”属性。它有“边框” - 我覆盖它并使用“内容框”
答案 5 :(得分:-4)
要编辑选择框,您必须使用jQuery(或一般的javascript)。
无论如何,您可以使用此&#34;技巧&#34;:
来解决问题http://jsfiddle.net/Clear/hwzd88o5/6/
看看:
select.textIndent
{
height: 80px;
line-height: 80px;
width: 300px;
padding-left: 50px !important;
}
)
答案 6 :(得分:-5)
试试这个。它对我有用。
<div id="div">
<select size=1>
<option value="0">Option 1</option>
<option value="1">Option 2</option>
</select>
</div>
CSS
#div option {padding-left: 5px;}