我想在选择框中垂直对齐文本


67

我想在选择框中垂直对齐文本。我尝试使用

select{
   verticle-align:middle;
}

但是它不适用于任何浏览器。Chrome似乎默认将选择框中的文本与中间对齐。FF将其顶部对齐,IE将其底部对齐。有什么办法可以做到这一点?我在UIBinder中使用GWT的Select小部件。

这是我目前拥有的:

select{
    height: 28px !important;
    border: 1px solid #ABADB3;
    margin: 0;
    padding: 0;
    vertical-align: middle;
}

谢谢!


font-size:22px;一个选择吗?
KeremBaydoğan2011年

我已经将字体大小设置为14px。我认为这
不适用于所有

5
您的第一个示例显示的是“垂直对齐”,而不是“垂直对齐”,这些错别字肯定会给您带来麻烦。
保罗·乔维特

在2016年仍然是一个问题!
Triynko '16

Answers:


54

最好的选择可能是调整顶部填充并在浏览器之间进行比较。它并不完美,但我认为它离您可能的距离很近。

padding-top:4px;

您所需的填充量将取决于字体大小。

提示:如果您的字体设置为px,请同时设置填充px。如果您的字体设置为em,请设置填充em也要。

编辑

这些是我认为您可以使用的选项,因为垂直对齐方式在浏览器中不一致。

A.删除height属性,然后由浏览器处理。这通常对我来说是最好的。

 <style>
    select{
        border: 1px solid #ABADB3;
        margin: 0;
        padding: auto 0;
        font-size:14px;
    }
    </style>
    <select>
        <option>option 1</option>
        <option>number 2</option>
    </select>

B.添加顶部填充以向下推文本。(在某些浏览器中按下箭头)

<style>
select{
    height: 28px !important;
    border: 1px solid #ABADB3;
    margin: 0;
    padding: 4px 0 0 0;
    font-size:14px;
}
</style>
<select>
    <option>option 1</option>
    <option>number 2</option>
</select>

C.您可以使字体变大,以尝试使所选高度更好地匹配。

<style>
select{
    height: 28px !important;
    border: 1px solid #ABADB3;
    margin: 0;
    padding: 0 0 0 0;
    font-size:17px;
}
</style>
<select>
    <option>option 1</option>
    <option>number 2</option>
</select>

1
感谢您的明确示例。我尝试了选项2,并在选择的文本框部分添加了填充,因此用于扩大列表的箭头按钮保持不变...不能选择增大字体大小,因此我需要找到其他解决方案。谢谢。
用户

30
以我的经验,这是行不通的,因为任何将您填充到顶部的操作都不仅会降低文本,还会降低带有打开选项列表的箭头的按钮。
pupeno 2012年

如果您的选择框更大,对我有用的是将padding = box height / 5设置为só,我的选择框的高度为35,而我将padding设置为7px,这似乎可以解决问题
Thiago Dantas

1
正如J.PabloFernández所说,填充将箭头向下推,对于某些人,尤其是注重审美的客户来说,这不是可接受的选择。
Agi Hammerthief

19

我偶然发现了这组CSS属性,这些属性似乎在Firefox中的选择元素中将文本垂直对齐:

select
{
    box-sizing: content-box;
    -moz-box-sizing:content-box;
    -webkit-box-sizing:content-box;
}

但是,如果有的话,它将在IE8中将文本推得更远。如果将box-sizing属性设置回border-box,则至少不会使IE8变差(并且FF仍会应用-moz-box-sizing属性)。找到IE的解决方案会很高兴,但我没有屏息。

编辑: 消除这个。测试后无法正常工作。但是,对于任何有兴趣的人来说,问题似乎出在FF的forms.css文件中的内置样式会影响输入和选择元素。有问题的属性是line-height:normal!important。它不能被覆盖。我试过了。我发现,如果删除Firebug中的内置属性,则会得到一个带有合理垂直居中文本的select元素。


10

我的解决方案是仅针对像这样针对Firefox的选择添加padding-top

// firefox vertical aligment of text
@-moz-document url-prefix() {
    select {
        padding-top: 13px;
   }
}

我最喜欢您的解决方案!这样,填充不会弄乱webkit浏览器。(尽管我尚未在IE上进行测试)
Maurice 2014年

4

我恰好遇到了这个问题。我的选择选项在webkit中垂直居中,但ff默认将它们置于顶部。环顾四周后,我真的不想创建一个凌乱的工作,最终并没有解决我的问题。

解决方案:Javascript。

if ($.browser.mozilla) {
            $('.styledSelect select').css( "padding-top","8px" );
        }

这可以非常精确地解决您的问题。唯一的缺点是我正在使用jQuery,并且如果您尚未在项目中使用jQuery,则可能不希望一次性包含js库。

注意:除非绝对必要,否则我建议您不要使用js样式。CSS应该始终是样式设计的主要解决方案-认为jQuery(在此特定示例中)为标有“紧急情况下中断”的斧头。

*更新*这是一篇旧文章,由于似乎人们仍在引用此解决方案,因此我应该指出(如评论中所述),自1.9起,此功能已从jQuery中删除。请参阅Modernizr项目以执行功能检测以代替浏览器嗅探


5
我喜欢人们对此表示反对,但没有提供解决方案。如果有更好的选择,我很乐意考虑。
Scott Sword

1
我得到downvoted一个前几天没有明显的原因......在上面的响应是近一年半的老编辑,以澄清为什么出现问题(至少在Firefox的版本,这是当前的时间) 。有人在玩游戏。
雪莉·史肯斯

2
我没有拒绝投票,但是您回答了一个使用jquery的解决方案的问题,而该问题显然使用了另一个库。GWT,仅为此目的添加jquery并不是解决方案,它应该至少已将GWT用于该解决方案。因此,您的答案并非没有帮助。这也无济于事,因为您没有解释解决方案,因此不知道jquery可能的人不理解它,并且在将解决方案转换为他们自己的上下文时会遇到麻烦。
Hilbrand Bouwkamp,

@HilbrandBouwkamp我理解您的意思,但是我的意图不是为OP提供答案,因为在我撰写本文时它已经解决了。我为像我这样的人提供了此答案,他们正在通过SO来解决此问题。虽然我的答案没有使用GWT,但它确实为可能遇到类似但不是确切问题的人们提供了替代解决方案。RE:“没有解释您的解决方案”。IMO的片段表现力十足,因此无需解释。如果有人不了解$或.css,则应参阅jQuery API文档,在此可以对其进行详细说明。
Scott Sword

4
$.browser从jQuery 1.3开始不推荐使用,从1.9开始删除。
emc 2013年

2

只是有这个问题,但对于移动设备,主要是移动Firefox。我的诀窍是在select元素上定义heightpaddingline height以及最后的框大小。这里不使用示例编号,而是为了示例:

padding: 20px;
height: 60px;
line-height: 1;
-webkit-box-sizing: padding-box;
-moz-box-sizing: padding-box;
box-sizing: padding-box;

2

到目前为止,这对我来说还不错:

line-height: 100%;

1

我尝试了以下方法,它为我工作:

select {
     line-height:normal;
     padding:3px;
} 

1

我发现仅将行高和行高设置为相同的像素数量就可以得到最一致的结果。“最一致”是指最佳一致,但是在所有浏览器中当然不是100%“完美像素”。另外,我发现Firefox(v。17.x)倾向于将选项文本挤在下拉箭头的右边;我仅在OPTION元素上设置了少量的padding-right来缓解这种情况。此设置不会影响IE 7-9中的外观。

我的结果:

select, option {
    font-size:10px;
    height:19px;
    line-height: 19px;
    padding:0;
    margin:0;
}

option {
    padding-right:6px; /* Firefox */
}

注意-我的SELECT元素使用较小的字体10px。显然,您将需要针对特定​​的UI上下文相应地调整比例。




0

我曾经使用heightline-height具有相同的值,但是事实证明在整个网络中不一致。我当前的方法是像这样将其与填充混合。

select {
  font-size:14px;
  height:18px;
  line-height:18px;
  padding:5px 0;
  width:200px;
  text-align:center;
}

您也可以使用padding水平值代替width+text-align


0

我遇到了同样的问题,并且已经研究了几个小时。我终于想出了一些可行的方法。

基本上,在将div复制到选择框上并复制第一个选项的文本并将实际的第一个选项留为空白之前,我在每种情况下都没有尝试过。我使用{pointer-events:none;}来让用户点击div。

的HTML

    <div class='custom-select-container'>
      <select>
        <option></option>
        <option>option 1</option>
        <option>option 2</option>
      </select>
      <div class='custom-select'>
        Select an option
      </div>
    <div>

的CSS

.custom-select{position:absolute; left:28px; top:10px; z-index:1; display:block; pointer-events:none;}

1
Internet Explorer(所有版本)均不支持指针事件,因此建议不要使用此解决方案。
daan_tallguys

0

我发现只有添加会padding-top按下右侧的灰色下拉箭头框,这是不希望的。

对我有用的方法是进入检查器并逐步添加padding直到文本居中。这也将减小下拉图标的大小,但也将居中,因此不会造成视觉上的干扰。



0

你可以给:

select{
   position:absolute;
   top:50%;
   transform: translateY(-50%);
}

对于父母,您必须给出position:relative。它会工作。


-1

最近通用的解决方案,我知道使用盒-align属性,描述在这里这里是工作示例(我只能在Chrome上测试它,相信也可以与其他浏览器等效)。

CSS:

select{
  display:-webkit-box;
  display:-moz-box;
  display:box;
  height: 30px;;
}
select:nth-child(1){
  -webkit-box-align:start;
  -moz-box-align:start;
  box-align:start;
}
select:nth-child(2){
  -webkit-box-align:center;
  -moz-box-align:center;
  box-align:center;
}
select:nth-child(3){
  -webkit-box-align:end;
  -moz-box-align:end;
  box-align:end;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.