Javascript 空文本节点&;内联块布局
使用以下标记Javascript 空文本节点&;内联块布局,javascript,html,css,Javascript,Html,Css,使用以下标记 <ul> <li> <label class="field"> Some Stuff 1 </label> <input class="value" type="text" /> </li> <li> <label class="field">Some Stuff 2</
<ul>
<li>
<label class="field">
Some Stuff 1
</label>
<input class="value" type="text" />
</li>
<li>
<label class="field">Some Stuff 2</label>
<input class="value" type="text" />
</li>
<li>
<label class="field">Some Stuff 3</label>
<input class="value" type="text" />
</li>
<li>
<label class="field">Some Stuff 4</label>
<input class="value" type="text" />
</li>
<li>
<label class="field">Some Stuff 5</label>
<input class="value" type="text" />
</li>
<li>
<label class="field">Some Stuff 6</label>
<input class="value" type="text" />
</li>
<li>
<label class="field">Some Stuff 7</label>
<input class="value" type="text" />
</li>
<li>
<label class="field">Some Stuff 8</label>
<input class="value" type="text" />
</li>
</ul>
请不要介意这有多可怕,这只是为了证明问题。
您可能希望一行中有4个li
,因为没有边距填充或边框来占用它们可用的任何空间,并且每个都大小为父ul
的25%
但因为我们都喜欢让标记可读,而不仅仅是在一行中,所以我们添加了额外的分隔符和制表符/空格来缩进等等。。。但这最终在DOM中成为空文本节点,这些当然是完全自然的,应该存在,但由于它们占用空间4px,因此它们破坏了使用内联块的良好流动布局
在进行流体布局时,我不喜欢浮动元素,我喜欢使用display:inline块
,而只是空文本节点有一个烦人的问题
现在我有一个解决方案,我使用巫婆是删除它们与javascript你可以检查它在这里或在
这同样有效,但是你必须记住在你使用的任何地方都要应用和撤销单词间距破解。这也会产生一些问题,如果你的一个部分中有文本,而其他内联块元素需要这种破解,那么你就必须添加一个
或其他包装元素,这样你就可以逆转破解了。这里有一个相当不错的例子简单修复:
ul {
list-style: none;
margin-left: 4px;
width: 100%;
}
ul > li {
display: inline-block;
margin-left: -4px;
padding: 3px 8px;
width: 25%;
}
不需要JavaScript
编辑:
FWIW,我认为你最好接受这样一个事实,浮动li
元素是实现你想要的最简单的方法:
ul {
clear: both;
list-style: none;
width: 100%;
}
ul > li {
float: left;
padding: 3px 8px;
width: 25%;
}
这适用于Chrome、FF、Safari、Opera和IE 8+。它在IE 7中失败了,但我相信这是因为IE 7不支持框大小调整。有一个非常好的跨浏览器解决方案,我在下面的代码中对其进行了调整:
html,正文{
宽度:100%;
}
* {
保证金:0;
填充:0;
边界:0;
-moz框大小:边框框;
-webkit框大小:边框框;
框大小:边框框;
}
输入{
边框:1px实心;
}
保险商实验室{
列表样式:无;
宽度:100%;
}
ul>li{
显示:内联块;
宽度:25%;
填充:3px8px;
}
领域
.价值{
显示:块;
宽度:100%;
}
保险商实验室{
显示:表;/*Webkit修复程序*/
宽度:100%;/*设置宽度以阻止FF包裹li*/
文本对齐:居中;/*居中列表项*/
字间距:-.25em;/*在所有现代浏览器中隐藏空白节点(不适用于webkit)*/
保证金:0;
填充:.25em0;
列表样式:无;
}
ulli{
显示:-moz内联框;/*FF2和K-Meleon*/
显示:内联块;
垂直对齐:底部对齐;
字间距:0;/*从父ul重置*/
/*边距:0.25em;/*现在您可以设置边距,而不会产生节点冲突*/
填充:0.5em;
}
*html ul li{display:inline;}/*IE6*/
*+html ul li{display:inline;}/*IE7*/
-
一些东西1
-
一些东西2
-
一些东西3
-
一些东西4
-
一些东西5
-
一些东西
-
一些东西7
-
一些东西8
lable
需要更改为label
。Lol现在会改变这一点是的flexbox
是解决我所有问题的圣杯,但是现在几乎没有人支持它,如果我告诉他我们只能使用Chrome,老板会发疯的。其他解决方案都有自己的小怪癖,但感谢您提供有用的信息,即使我找不到完美的解决方案,这与字母间距:-4px基本相同;字距:-4px我知道你想避免浮动元素,但这是一个简单的解决方案!请看我的编辑。谢谢,我知道这很简单,但我尽量不使用浮动。这只是个人喜好。我不喜欢他们从流中删除内容的方式,这使得标记和样式更为困难。
<ul
><li
><label class="field">Some Stuff 1</label
><input class="value" type="text"
/></li
><li
><label class="field">Some Stuff 2</label
><input class="value" type="text"
/></li
><li
><label class="field">Some Stuff 3</label
><input class="value" type="text"
/></li
><li
><label class="field">Some Stuff 4</label
><input class="value" type="text"
/></li
><li
><label class="field">Some Stuff 5</label
><input class="value" type="text"
/></li
><li
><label class="field">Some Stuff 6</label
><input class="value" type="text"
/></li
><li
><label class="field">Some Stuff 7</label
><input class="value" type="text"
/></li
><li
><label class="field">Some Stuff 8</label
><input class="value" type="text"
/></li
></ul>
ul {
list-style: none;
width: 100%;
/* Hack to keep "Text - Empty Text Node" elements from taking up space. */
letter-spacing: -4px;
word-spacing: -4px;
}
ul > li {
display: inline-block;
width: 25%;
padding: 3px 8px;
/* Reverse the Needed Hack to keep "Text - Empty Text Node" elements from taking up space. */
letter-spacing: normal;
word-spacing: normal;
}
ul {
list-style: none;
margin-left: 4px;
width: 100%;
}
ul > li {
display: inline-block;
margin-left: -4px;
padding: 3px 8px;
width: 25%;
}
ul {
clear: both;
list-style: none;
width: 100%;
}
ul > li {
float: left;
padding: 3px 8px;
width: 25%;
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<style media="all">
html, body {
width: 100%;
}
* {
margin: 0;
padding: 0;
border: 0;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
box-sizing: border-box;
}
input {
border: 1px solid;
}
ul {
list-style: none;
width: 100%;
}
ul > li {
display: inline-block;
width: 25%;
padding: 3px 8px;
}
.field,
.value {
display: block;
width: 100%;
}
ul {
display:table;/* Webkit Fix */
width:100%;/* set width to stop FF from wrapping li's*/
text-align:center; /* center list items*/
word-spacing:-.25em; /* hide whitespace nodes in all modern browsers (not for webkit)*/
margin:0;
padding:.25em 0;
list-style:none;
}
ul li {
display:-moz-inline-box; /* FF2 and K-Meleon */
display:inline-block;
vertical-align:bottom;
word-spacing:0; /* reset from parent ul*/
/*margin:0 .25em; /*now you can set side margins without node conflict */
padding:0 .5em;
}
* html ul li { display:inline;} /*IE6*/
*+html ul li { display:inline;} /*IE7*/
</style>
</head>
<body>
<ul>
<li>
<label class="field">
Some Stuff 1
</label>
<input class="value" type="text" />
</li>
<li>
<label class="field">Some Stuff 2</label>
<input class="value" type="text" />
</li>
<li>
<label class="field">Some Stuff 3</label>
<input class="value" type="text" />
</li>
<li>
<label class="field">Some Stuff 4</label>
<input class="value" type="text" />
</li>
<li>
<label class="field">Some Stuff 5</label>
<input class="value" type="text" />
</li>
<li>
<label class="field">Some Stuff 6</label>
<input class="value" type="text" />
</li>
<li>
<label class="field">Some Stuff 7</label>
<input class="value" type="text" />
</li>
<li>
<label class="field">Some Stuff 8</label>
<input class="value" type="text" />
</li>
</ul>
</body>
</html>