我试图弄清楚什么CSS导致a
元素在具有Bootstrap的nav
类时坐在自己的行上,当我发现应用于它们与a
的样式没有任何有意义的区别时没有nav
的元素。我已经查看了所应用的规则,甚至比较了计算出的样式,但没有任何东西可以解释它。
这是一个示例:第一个段落中的a
(带有nav
类)位于其自己的行上,而第二个段落中的a
不是:
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet" />
<p>before <a id="a1" class="nav" href="#">link</a> after</p>
<p>before <a id="a2" href="#">link</a> after</p>
如果我检查
a.nav
元素,则会看到此规则适用:.nav {
padding-left: 0;
margin-bottom: 0;
list-style: none;
}
...但是我不知道这是如何导致它坐在自己的线上的。因此,在上面的示例中,我写了一些代码来比较两个
a
元素的计算样式,以防万一我神奇地错过了其他规则。看起来不像;它们的计算样式与list-style-type
相同(因此与list-style
相同):(function() {
var s1 = getComputedStyle(document.getElementById("a1")),
s2 = getComputedStyle(document.getElementById("a2")),
diffs = {};
function logDifferences(prop) {
var s1value = s1[prop],
s2value = s2[prop];
if (prop != "cssText" && s1value !== s2value) {
diffs[prop] = {
s1: s1value,
s2: s2value
}
}
}
Object.keys(s1).forEach(logDifferences);
Object.keys(s2).forEach(logDifferences);
Object.keys(diffs).sort().forEach(function(prop) {
var diff = diffs[prop];
display(prop + ": '" + diff.s1 + "' != '" + diff.s2 + "'")
});
function display(msg) {
var p = document.createElement('p');
p.innerHTML = msg;
document.body.appendChild(p);
}
})();
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet" />
<p>before <a id="a1" class="nav" href="#">link</a> after</p>
<p>before <a id="a2" href="#">link</a> after</p>
list-style-type
不应导致此行为,并且确实,如果我推翻了我仍然可以得到该行为,并且元素的计算样式相同,那么:(function() {
var s1 = getComputedStyle(document.getElementById("a1")),
s2 = getComputedStyle(document.getElementById("a2")),
diffs = {};
function logDifferences(prop) {
var s1value = s1[prop],
s2value = s2[prop];
if (prop != "cssText" && s1value !== s2value) {
diffs[prop] = {
s1: s1value,
s2: s2value
}
}
}
Object.keys(s1).forEach(logDifferences);
Object.keys(s2).forEach(logDifferences);
Object.keys(diffs).sort().forEach(function(prop) {
var diff = diffs[prop];
display(prop + ": '" + diff.s1 + "' != '" + diff.s2 + "'")
});
function display(msg) {
var p = document.createElement('p');
p.innerHTML = msg;
document.body.appendChild(p);
}
})();
a.nav {
list-style-type: disc;
}
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet" />
<p>before <a id="a1" class="nav" href="#">link</a> after</p>
<p>before <a id="a2" href="#">link</a> after</p>
因此它不是
list-style-type
。元素的顺序也不是:
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet" />
<p>before <a id="a2" href="#">link</a> after</p>
<p>before <a id="a1" class="nav" href="#">link</a> after</p>
是什么导致
a.nav
移至其自己的行?请注意,问题不在于如何解决。我们已经修复了它(它们不应该具有
nav
,在将Bootstrap应用于项目之前,我们已经将其用于其他用途,并且我们刚刚对其进行了重命名,因此不会错误地应用Bootstrap的规则)。问题是什么原因造成的? 最佳答案
这是由于::before
和::after
伪元素造成的。专门设置它们是为了清除围绕它们的所有浮动元素,但是这样做的副作用是,它们还会导致元素本身被下推到新行。
令人讨厌的样式很简单:
...::before, ...::after {
display: table;
content: " ";
}
其中...这里是一长串的选择器,包括
.nav::after
和.nav::before
。关于css - Bootstrap的`nav`类如何使 anchor 移动到自己的行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31404746/