在CSS中,选择器是用来定位和选择HTML元素的工具。以下是一些常用的选择器及其兼容性:

1. 通用选择器(*)

```css

*{

margin: 0;

padding: 0;}

```

这个选择器会选中页面上的所有元素,并清除它们的margin和padding。虽然在练习时可以使用,但不建议在生产环境中使用,因为它会给浏览器增加不必要的负担。* 也可以用来选择某个元素的所有子元素。

兼容性:IE6+、Firefox、Chrome、Safari、Opera。

2. ID选择器(#X)

```css

#container {

width: 960px;

margin: auto;}

```

在选择器中使用#可以用id来定位某个元素。需要谨慎使用,确保必须为该元素赋值一个id来定位它。id选择器是严格的,无法复用。如果可能的话,首先尝试使用标签名、HTML5中的新元素或伪类。

兼容性:IE6+、Firefox、Chrome、Safari、Opera。

3. 类选择器(.X)

```css

.error {

color: red;}

```

类选择器可以定位多个元素。当需要对多个元素进行样式修饰时使用class,而要对特定元素进行修饰时使用id。

兼容性:IE6+、Firefox、Chrome、Safari、Opera。

4. 后代选择器(X Y)

```css

li a {

text-decoration: none;}

```

后代选择器用于更具体地定位元素。例如,如果你只需要定位li标签下的a标签,而不是所有的a元素,可以使用后代选择器。

专家提示:避免使用像X Y Z A B.error这样的选择器,时刻提醒自己是否真的需要对那么多元素进行修饰。

兼容性:IE6+、Firefox、Chrome、Safari、Opera。

5. 属性选择器(X)

```css

a { color: red; }

ul { margin-left: 0; }

```

要定位页面上所有的某标签,不是通过id或者是'class',可以使用类型选择器。以下是不同浏览器的兼容性:

1. 颜色选择器:

```css

a:link {color:red;}

a:visited {color: purple;}

```

2. 相邻选择器:

```css

ul + p {

color: red;}

```

3. 直接子元素选择器:

```css

div#container > ul {

border: 1px solid black;}

```

4. 子节点组合选择器(性能优势):

```css

ul ~ p {

color: red;}

```

兄弟节点组合选择器(X+Y)与属性选择器相似,但不完全相同。前者仅选择紧邻指定元素的元素,而后者则选择紧跟在目标元素后面的所有匹配元素。以下是一些兼容性较好的浏览器:

- IE7+

- Firefox

- Chrome

- Safari

- Opera

1. X[title] 选择器:选择具有 title 属性的元素。例如:

```css

a[title] {

color: green;

}

```

2. X[href="foo"] 选择器:选择 href 属性值为 "foo" 的锚点标签。例如:

```css

a[href="http://strongme.cn" rel="external nofollow" target="_blank"] {

color: #1f6053; /* nettuts green */

}

```

注意:在使用 JavaScript 时,需要将值用双引号括起来。尽量使用标准的 CSS3 选择器。

3. X[href="strongme"] 选择器:选择 href 属性值为 "strongme" 的锚点标签。例如:

```css

a[href="strongme"] {

color: #1f6053;

}

```

4. X[href^="href"] 选择器:选择 href 属性值以 "href" 开头的锚点标签。例如:

```css

a[href^="http"] {

background: url(path/to/external/icon.png) no-repeat;

padding-left: 10px;

}

```

以下是重构后的内容:

## 伪类选择器

### 1. `X[href$=".jpg"]`

- 在链接中查找以`.jpg`结尾的文件名。

- 颜色设置为红色。

- 支持的浏览器:IE7+、Firefox、Chrome、Safari、Opera。

- 示例代码:

```css

a[href$=".jpg"], a[href$=".jpeg"], a[href$=".png"], a[href$=".gif"] {

color: red; }

```

### 2. `X[data-*="foo"]`

- 在元素上查找具有`data-*`属性值为`foo`的元素。

- 颜色设置为红色。

- 支持的浏览器:IE7+、Firefox、Chrome、Safari、Opera。

- 示例代码:

```css

a[data-filetype="image"] {

color: red; }

```

### 3. `X[foo~="bar"]`

- 在元素上查找属性值包含`bar`的元素。

- 示例代码:

```html

Click Me, Fool

```

- 颜色设置为红色。

- 支持的浏览器:IE9+、Firefox、Chrome、Safari、Opera。

- 示例代码:

```css

a[data-info~="external"] {

color: red;}

a[data-info~="image"] {

border: 1px solid black;}

```

### 4. `X:checked`

- 定位被选中的单选框和多选框。

- 支持的浏览器:IE9+、Firefox、Chrome、Safari、Opera。

以下是根据您提供的内容重构的代码:

```css

.clearfix {

display: inline-block;

}

.clearfix::after {

content: "";

display: block;

clear: both;

visibility: hidden;

font-size: 0;

height: 0;

}

.clearfix:hover {

background: #e3e3e3;

}

a:hover {

border-bottom: 1px solid black;

text-decoration: underline;

}

div:not(#container) {

color: blue;

}

p::first-letter {

float: left;

font-size: 2em;

font-weight: bold;

font-family: cursive;

padding-right: 2px;

}

```

兼容性如下:

- IE8+, Firefox, Chrome, Safari, Opera。

- X:hover 在鼠标飘过锚点链接时为元素添加下边框。

以下是重构后的内容:

## 兼容性

- IE6+

- Firefox

- Chrome

- Safari

- Opera

### 22. `nth-child`

`li:nth-child(3)` {

color: red;

}

`nth-child` 选择器可以很正确地代替第16个TIP,不同的就是它是从结尾处开始的,倒回去的。

兼容性:IE9+、Firefox3.5+、Chrome、Safari。

### 23. `nth-last-child`

`li:nth-last-child(2)` {

color: red;

}

这个技巧可以很正确的代替第16个TIP,不同的就是它是从结尾处开始的,倒回去的。

兼容性:IE9+、Firefox3.5+、Chrome、Safari、Opera。

### 24. `nth-of-type`

`ul:nth-of-type(3)` {

border: 1px solid black;

}

曾几何时,我们不想去选择子节点,而是想根据元素的类型来进行选择。

`nth-of-type` 选择器可以根据元素的类型进行选择。

兼容性:IE9+、Firefox3.5+、Chrome、Safari。

### 25. `nth-last-of-type`

`ul:nth-last-of-type(3)` {

border: 1px solid black;

}

`nth-last-of-type` 选择器可以选择到最后一个指定类型的元素。

兼容性:IE9+、Firefox3.5+、Chrome、Safari、Opera。

### 26. `first-child`

`ul li:first-child` {

border-top: none;

}

这个结构性的伪类可以选择到第一个子标签,你会经常使用它来取出第一个和最后一个的边框。假设有个列表,每个标签都有上下边框,那么效果就是第一个和最后一个就会看起来有点奇怪。这时候就可以使用这个伪类来处理这种情况了。

兼容性:IE7+、Firefox、Chrome、Safari、Opera。

以下是重构后的内容:

```css

ul {

width: 200px;

background: #292929;

color: white;

list-style: none;

padding-left: 0;

}

li {

padding: 10px;

border-bottom: 1px solid black;

border-top: 1px solid #3c3c3c;

}

li:only-child {

color: red;

}

div p:only-child {

color: red;

}

div {

margin-bottom: 10px;

}

p + ul li:last-child {

font-weight: bold;

}

ul:first-of-type li:nth-last-child(1) {

font-weight: bold;

}

```

兼容性:IE9+, Firefox, Chrome, Safari, Opera。

Opera

结论:如果你需要在旧版本浏览器(如IE6)上使用新的选择器,那么在使用这些新特性时需要小心谨慎。不要让IE6阻止你学习新的技能,这样做对你来说并不公平。在实际开发中,要多查阅兼容性列表,或者使用Dean Edward的优秀IE9.js脚本来实现对这些特性的支持。此外,在与jQuery结合使用时,尽量使用原生的CSS3选择器,这样可以提高代码的执行速度。这是因为选择器引擎可以使用浏览器自带的解析器,而不是选择器自身的解析器。