Combinators and multiple selectors
2018-05-15 17:26 更新
组合器
一次使用一个选择器是有用的,但在某些情况下可能效率低下。 当您开始组合它们以执行细粒度选择时,CSS选择器变得更加有用。 CSS有几种方法来选择元素,基于它们如何相互关联。 这些关系用组合器表示如下(A和B表示上面看到的任何选择器):
| 组合器 | 选择 |
|---|---|
| AB | 任何元素同时匹配A和B. |
| A B | 与匹配A的元素(即:子元素或子元素等)的匹配B的元素的任何元素,其是后代。 |
| A> B | 匹配B的任何元素,它是匹配A的元素的直接子。 |
| A + B | 与匹配A的元素(即:同一父元素的下一个子元素)匹配的下一个同属元素的任何元素。 |
| A〜B | 与匹配A的元素(即:同一父代的下一个子代)中的下一个同级中匹配B的任何元素。 |
组合器示例
让我们看一个例子,所有这些一起工作:
<table lang="en-US" class="with-currency">
<thead>
<tr>
<th scope="col">Product</th>
<th scope="col">Qty.</th>
<th scope="col">Price</th>
</tr>
</thead>
<tfoot>
<tr>
<th colspan="2" scope="row">Total:</th>
<td>148.55</td>
</tr>
</tfoot>
<tbody>
<tr>
<td>Lawnchair</td>
<td>1</td>
<td>137.00</td>
</tr>
<tr>
<td>Marshmallow rice bar</td>
<td>2</td>
<td>1.10</td>
</tr>
<tr>
<td>Book</td>
<td>1</td>
<td>10.45</td>
</tr>
</tbody>
</table>
然后让我们使用下面的样式表:
/* Basic table setup */
table {
font: 1em sans-serif;
border-collapse: collapse;
border-spacing: 0;
}
/* All <td>s within a <table> and all <th>s within a <table>
Comma is not a combinator, it just allows you to target
several selectors with the same CSS ruleset */
table td, table th {
border : 1px solid black;
padding: 0.5em 0.5em 0.4em;
}
/* All <th>s within <thead>s that are within <table>s */
table thead th {
color: white;
background: black;
}
/* All <td>s preceded by another <td>,
within a <tbody>, within a <table> */
table tbody td + td {
text-align: center;
}
/* All <td>s that are a last child,
within a <tbody>, within a <table> */
table tbody td:last-child {
text-align: right
}
/* All <th>s, within a <tfoot>s, within a <table> */
table tfoot th {
text-align: right;
border-top-width: 5px;
border-left: none;
border-bottom: none;
}
/* All <td>s preceded by a <th>, within a <table> */
table th + td {
text-align: right;
border-top-width: 5px;
color: white;
background: black;
}
/* All pseudo-elements "before" <td>s that are a last child,
appearing within elements with a class of "with-currency" that
also have an attribute "lang" with the value "en-US" */
.with-currency[lang="en-US"] td:last-child::before {
content: '$';
}
/* All pseudo-elements "after" <td>s that are a last child,
appearing within elements with the class "with-currency" that
also have an attribute "lang" with the value "fr" */
.with-currency[lang="fr"] td:last-child::after {
content: ' €';
}
这给了我们以下相当不错的表样式:
主动学习:编写自己的组合器
以上示例旨在显示您可以使用组合器开始实现的复杂性。 在这种主动学习中,我们将让你写一些自己的,更简单的选择器,包括组合器。 在本练习中,您需要向规则2-4添加选择器,以:
- Style links, but only links that are inside the unordered list.
- Style links inside the unordered list, only when they are being hovered over.
- Style only the paragraph that comes directly after the top level heading.
如果发生错误,您可以随时使用重置按钮重置。 如果您遇到问题,请按显示解决方案按钮查看一个潜在的答案。
Playable code 7
<div class="body-wrapper" style="font-family: 'Open Sans Light',Helvetica,Arial,sans-serif;">
<h2>HTML Input</h2>
<textarea id="code" class="html-input" style="width: 90%;height: 10em;padding: 10px;border: 1px solid #0095dd;"><ul>
<li><a href="#">Home</a></li>
<li><a href="#">Portfolio</a></li>
<li><a href="#">About</a></li>
</ul>
<h1>Welcome to my website</h1>
<p>Hello, and welcome! I hope you enjoy your time here.</p>
<h2>My philosophy</h2>
<p>I am a believer in chilling out, and not getting grumpy. I think everyone else should follow this ideal, and <a href="#">drink green tea</a>.</p></textarea>
<h2>CSS Input</h2>
<textarea id="code" class="css-input" style="width: 90%;height: 10em;padding: 10px;border: 1px solid #0095dd;">ul {
padding: 0;
list-style-type: none;
}
{
text-decoration: none;
display: block;
color: black;
background-color: red;
padding: 5px;
margin-bottom: 10px;
}
{
color: red;
background-color: black;
}
{
font-style: bold;
color: blue;
}</textarea>
<h2>Output</h2>
<div class="output" style="width: 90%;height: 10em;padding: 10px;border: 1px solid #0095dd;overflow:auto;"></div>
<div class="controls">
<input id="reset" type="button" value="Reset" style="margin: 10px 10px 0 0;">
<input id="solution" type="button" value="Show solution" style="margin: 10px 0 0 10px;">
</div>
</div>
var htmlInput = document.querySelector(".html-input");
var cssInput = document.querySelector(".css-input");
var reset = document.getElementById("reset");
var htmlCode = htmlInput.value;
var cssCode = cssInput.value;
var output = document.querySelector(".output");
var solution = document.getElementById("solution");
var styleElem = document.createElement('style');
var headElem = document.querySelector('head');
headElem.appendChild(styleElem);
function drawOutput() {
output.innerHTML = htmlInput.value;
styleElem.textContent = cssInput.value;
}
reset.addEventListener("click", function() {
htmlInput.value = htmlCode;
cssInput.value = cssCode;
drawOutput();
});
solution.addEventListener("click", function() {
htmlInput.value = htmlCode;
cssInput.value = 'ul {\n padding: 0;\n list-style-type: none;\n}\n\nul a {\n text-decoration: none;\n display: block;\n color: black;\n background-color: red;\n padding: 5px;\n margin-bottom: 10px;\n}\n\nul a:hover {\n color: red;\n background-color: black;\n}\n\nh1 + p {\n font-style: bold;\n color: blue;\n}';
drawOutput();
});
htmlInput.addEventListener("input", drawOutput);
cssInput.addEventListener("input", drawOutput);
window.addEventListener("load", drawOutput);
一个规则上有多个选择器
你已经看到了这个在行动的多个例子,但让我们清楚地阐明它澄清。 您可以编写多个选择器,以逗号分隔,以将同一规则一次性应用到多个选定元素集。 例如:
p, li {
font-size: 1.6em;
}
或这个:
h1, h2, h3, h4, h5, h6 {
font-family: helvetica, 'sans serif';
}
下一步是什么
恭喜,您已经到了我们相当长的时间去了解Selectors的结束。 即使是最熟练的Web开发人员仍然对使用选择器的可能性感到惊讶 - 如果您不记得所有选项,请不要感觉不好 - 将主要的选择器页面 a>并在需要时参考它。
在下一篇文章中,我们将讨论另一个非常重要的基本CSS主题 - 值属性的种类,以及表示长度,颜色或其他值的单位。 让我们探索 CSS值和单位。
以上内容是否对您有帮助:

免费 AI IDE


更多建议: