垂直拉伸列表项
Vertically Stretch List Items
我正在构建一个Phonegap应用程序。我有以下几点:
<ul>
<li>One</li>
<li>Two</li>
<li>Three</li>
<li>Three <br>a Half</li>
</ul>
我怎样才能使<li>
元素垂直拉伸并填充页面的整个高度,因为这需要动态的,以便它适应其他视口。<li>
元素内的文本需要垂直居中并支持多行。
有没有干净的方法可以做到这一点?
我建议使用 CSS3 规则的display: table
系列。 如果操作正确,它们将是动态的并保持全高间距:
body, html {
height: 100%;
margin: 0;
}
ul {
list-style-type: none;
margin: 0;
padding: 0;
display: table;
width: 100%;
height: 100%;
}
ul li {
display: table-row;
}
ul li a { /* assuming an anchor child. Can be anything */
display: table-cell;
vertical-align: middle;
padding: 1em 3em;
}
演示:http://jsfiddle.net/6z3q35x0/1/
您的问题分为两部分:第一部分是强制<ul>
元素拉伸以填充视口,第二部分是垂直和水平居中<li>
内容。但是,居中需要修改标记。我们可以使用<div>
元素将所有内容包装在<li>
中。
对于居中,我们可以使用 CSS3 flexbox 来实现。这将是一个无JS的解决方案,尽管它享有较少的跨浏览器支持。对于视口大小,我们可以分别使用 vw
和vh
单位。
ul {
display: flex;
flex-direction: column;
list-style: none;
margin: 0;
padding: 0;
width: 100vw;
height: 100vh;
}
li {
display: flex;
align-items: center;
justify-content: center;
flex-grow: 1;
}
li div {
}
/* For stylistics only */
li:nth-child(odd) {
background-color: #ddd;
}
<link href="http://cdnjs.cloudflare.com/ajax/libs/normalize/3.0.2/normalize.min.css" rel="stylesheet"/>
<ul>
<li><div>One</div></li>
<li><div>Two</div></li>
<li><div>Three</div></li>
<li><div>Three <br>a Half</div></li>
</ul>
但是,在某些情况下,使用 CSS flexbox 和视口单元并不理想——例如,iOS7 有一个有据可查的渲染错误,无法正确计算vh
。在这种情况下,我们可能不得不依赖JS。每个<li>
的高度简单地除以容器中存在的<li>
数。
var calcHeight = function() {
var h = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);
var li = document.querySelectorAll("ul li");
for(var i=0; i<li.length; i++) {
li[i].style.height = (h/li.length)+'px';
}
}
calcHeight();
window.onresize = calcHeight();
ul {
list-style: none;
margin: 0;
padding: 0;
width: 100%;
height: 100vh;
}
li {
display: block;
width: 100%;
position: relative;
}
li div {
position: absolute;
top: 50%;
left: 50%;
-webkit-transform: translate(-50%, -50%);
transform: translate(-50%, -50%);
}
li:nth-child(odd) {
background-color: #ddd;
}
<link href="http://cdnjs.cloudflare.com/ajax/libs/normalize/3.0.2/normalize.min.css" rel="stylesheet"/>
<ul>
<li><div>One</div></li>
<li><div>Two</div></li>
<li><div>Three</div></li>
<li><div>Three <br>a Half</div></li>
</ul>
这是一个 JavaScript 解决方案,它将根据视口的height
给出height
s。
强制ul
取整个视口的高度:
小提琴演示
var li = document.getElementsByTagName('li');
function doMath() {
for (i = 0; i < li.length; i++) {
li[i].style.height = window.innerHeight / li.length + 'px';
}
}
doMath();
window.onresize = doMath;
ul {
margin: 0;
padding: 0;
list-style: none;
}
li {
background: rosybrown;
}
span {
display: block;
position: relative;
top: 50%;
text-align: center;
transform: translateY(-50%);
}
li:nth-of-type(2n) {
background: plum;
}
body {
margin: 0;
}
<ul>
<li><span>One</span></li>
<li><span>Two</span></li>
<li><span>Three</span></li>
<li><span>Three<br />a Half</span></li>
<li><span>Four</span></li>
<li><span>Five<br />a Half</span></li>
<li><span>Six</span></li>
</ul>
强制li
取整个视口的高度:
小提琴演示
var li = document.getElementsByTagName('li');
function doMath() {
for (i = 0; i < li.length; i++) {
li[i].style.height = window.innerHeight + 'px';
}
}
doMath();
window.onresize = doMath;
ul {
padding: 0;
margin: 0;
list-style: none;
}
li {
background: rosybrown;
}
span {
display: block;
position: relative;
top: 50%;
text-align: center;
transform: translateY(-50%);
}
li:nth-of-type(2n) {
background: plum;
}
body {
margin: 0;
}
<ul>
<li><span>One</span></li>
<li><span>Two</span></li>
<li><span>Three</span></li>
<li><span>Three<br />a Half</span></li>
<li><span>Four</span></li>
<li><span>Five<br />a Half</span></li>
<li><span>Six</span></li>
</ul>
您需要为正文和 html 添加 100% 的高度,试试这个
<style>
body, html {
height: 100%;
}
ul {
height: 100%;
display: table;
}
li {
height: 25%;
display: table-row;
}
li div{
height: 25%;
display: table-cell;
vertical-align: middle;
}
</style>
Jsfiddle link: http://jsfiddle.net/d80xw55e/1/
由于您允许 Javscript,这很容易,我只是无法正确理解要点。希望你不会使用它?
function liH(){
var lis = document.getElementsByTagName("li");
var spans = document.getElementsByTagName("span");
var liHeight = Math.max(document.documentElement.clientHeight, window.innerHeight || 0) / lis.length;
for(var i = 0; i < lis.length; ++i){
var spanH = spans[i].getBoundingClientRect().height;
lis[i].style.paddingTop = ((liHeight - spanH) / 2) + "px";
lis[i].style.paddingBottom = lis[i].style.paddingTop;
//spans[i].style.top = -(spanH / 4) + "px"
}
}
liH();
window.onresize = liH;
li {background:#eee;margin-bottom:5px;}
span {position:relative;}
<ul>
<li><span>elem1</span></li>
<li><span>elem2</span></li>
<li><span>elem<br />3</span></li>
</ul>
视图不精确的原因是因为顶部的填充不会删除,并且因为我放置了 5px 边距来区分元素。
- 要求输入在数据列表中
- 从javascript创建一个列表
- 在JQM中制作垂直按钮列表
- 使用JavaScript控制iOS网络应用程序中列表的垂直滚动和水平滑动
- 垂直拉伸列表项
- 垂直滚动的 HTML 列表
- 如何获取垂直列表以将PDF加载到iFrame中
- Bootstrap 3.0:如何使垂直导航栏下拉列表不附加到最后一个列表项
- 如何在相反的方向上垂直移动两个列表
- 如何使用HTML/CSS/JavaScript在一个项目上垂直对齐列表
- jQuery Mobile,垂直导航条,就像iphone联系人的字母列表
- 文本如何在列表中垂直居中
- 下拉列表获胜't与下拉按钮垂直对齐
- 垂直滑动列表
- 垂直引导旋转木马箭头和导航列表
- Javascript CSS单选择开关(垂直列表)
- 显示JavaScript数组在垂直列表
- Javascript在下拉列表中显示垂直滚动条
- 基于对象数组创建垂直列表
- 函数将数组中的项显示为垂直列表