表格单元格内块单元的完全可点击区域和垂直对齐

问题描述:

有一个简单的问题,我需要一个表格单元格内的显示块单元来获取单元格的全部可用高度和宽度,同时文本也垂直对齐。表格单元格内块单元的完全可点击区域和垂直对齐

Fiddle Demo

ul { 
 
    background: yellow; 
 
    display: table; 
 
    table-layout: fixed; 
 
    width: 100%; 
 
} 
 

 
li { 
 
    display: table-cell; 
 
    text-align: center; 
 
    vertical-align: middle; 
 
    height: 48px; 
 
} 
 

 
a { 
 
    display: block; 
 
    width: 100%; 
 
    height: 48px; 
 
} 
 

 
a:hover { 
 
    background: red 
 
}
<ul> 
 
    <li> 
 
    <a href="#">Item1</a> 
 
    </li> 
 
    <li> 
 
    <a href="#">Item2</a> 
 
    </li> 
 
    <li> 
 
    <a href="#">Item3</a> 
 
    </li> 
 
    <li> 
 
    <a href="#">Item4</a> 
 
    </li> 
 
    <li> 
 
    <a href="#">Item5</a> 
 
    </li> 
 
</ul>

的所有东西必须响应所以没有行高度固定,如果文本下降到2线和列表中元素的个数是灵活的,这就是为什么我用display:table。然而高兴的另一种方法,如果能做到这一点,由于某种原因,我无法弄清楚如何垂直对齐文本在这种情况下

+0

如果你在li标签中有固定高度,你可以使用'line-heigth:48px'作为标签 –

+0

如上所述,如果文本较长并且在两行上下降,则不是解决方案 – ynter

末我这样做,并适用于我的要求

演示: http://codepen.io/anon/pen/RpGPyO

HTML:

<ul> 
    <li> 
    <a href="#">Item1</a> 
    </li> 
    <li> 
    <a href="#">Item2 or something longer</a> 
    </li> 
    <li> 
    <a href="#">Item3</a> 
    </li> 
    <li> 
    <a href="#" >Item4</a> 
    </li> 
    <li> 
    <a href="#" >Item5</a> 
    </li> 
</ul> 

CSS:

ul { 
    background: yellow; 
    display: table; 
    table-layout: fixed; 
    width: 100%; 
} 

li { 
    display: table-cell; 
    text-align: center; 
    vertical-align: middle; 
    height: 48px; 
    position: relative; 
    z-index: 1; 
} 

a { 
    display: block; 
    width: 100%; 
} 

a:before { 
    content:''; 
    display: block; 
    height: 48px; 
    position: absolute; 
    top: 0; 
    left: 0;  
    z-index: -1; 
    width:100%; 
} 

a:hover:before { 
    background: red; 
} 

你的代码完全性右。但正确vertical-align: middle;只删除风格height: 48px;里面a标签
li:hover风格更换到a:hover

Revise Fiddle

更新风格

a { 
    display: block; 
    width: 100%; 
    word-break: break-all; 
} 

ul { 
 
    background: yellow; 
 
    display: table; 
 
    table-layout: fixed; 
 
    width: 100%; 
 
} 
 

 
li { 
 
    display: table-cell; 
 
    text-align: center; 
 
    vertical-align: middle; 
 
    height: 48px; 
 
} 
 

 
a { 
 
    display: block; 
 
    width: 100%; 
 
    word-break: break-all; 
 
} 
 

 
li:hover { 
 
    background: red 
 
}
<ul> 
 
    <li> 
 
    <a href="#">Item1</a> 
 
    </li> 
 
    <li> 
 
    <a href="#">Item2 Text isveryveryveryvery longer</a> 
 
    </li> 
 
    <li> 
 
    <a href="#">Item3</a> 
 
    </li> 
 
    <li> 
 
    <a href="#">Item4</a> 
 
    </li> 
 
    <li> 
 
    <a href="#">Item5</a> 
 
    </li> 
 
</ul>

+0

谢谢, t似乎工作,如果文本更长,并在2行上下降 – ynter

+0

你想要的文字是更长的然后显示2行右? –

+0

我更新了我的答案。请检查它。如果文字很长,则显示2行和垂直正确的显示中间。任何其他查询发表评论我解决它 –

使用Flexbox的可以存档此:

ul { 
 
    background: yellow; 
 
    display: -webkit-box; 
 
    display: -moz-box; 
 
    display: -ms-flexbox; 
 
    display: -webkit-flex; 
 
    display: flex; 
 
    width: 100%; 
 
    list-style:none; 
 
    padding:0; 
 
    margin:0; 
 
    align-item:center; 
 
} 
 

 
li { 
 
    text-align: center; 
 
    vertical-align: middle;  
 
    /*width:20%;*/ 
 
    display:flex; 
 
    flex-direction:column; 
 
    flex: 1 0 auto; 
 
} 
 

 
a {   
 
    padding:10px 0; 
 
    display:flex; 
 
    flex-direction:column; 
 
    flex: 1 0 auto; 
 
    justify-content: center; 
 
} 
 

 
a:hover { 
 
    background: red 
 
}
<ul> 
 
    <li> 
 
    <a href="#">Item1</a> 
 
    </li> 
 
    <li> 
 
    <a href="#">Item2</a> 
 
    </li> 
 
    <li> 
 
    <a href="#">Item3</a> 
 
    </li> 
 
    <li> 
 
    <a href="#" >Item4 with very very long long long text</a> 
 
    </li> 
 
    <li> 
 
    <a href="#" >Item5</a> 
 
    </li> 
 
    <li> 
 
    <a href="#" >Item6</a> 
 
    </li> 
 
    <li> 
 
    <a href="#" >Item7</a> 
 
    </li> 
 
</ul>

+0

我使用显示表的原因是因为这给了我具有尽可能多的列表项目的灵活性。有没有一种方法可以使用flexbox?基本上不希望宽度:20% – ynter

+0

是的,你可以从李和更多列表项删除固定宽度...更新我的答案 –

+0

但是,如果你比较我的代码段和你的代码段,你会注意到我的显示器:表格列表中的项目均匀地占用空间,无论文字有多少,因为我对2行文本没有问题 – ynter