前端 CSS 基础大揭秘:从选择器到伪类的奇妙之旅

153 阅读3分钟

引言

在前端开发的世界里,CSS 就像是一位神奇的魔法师,能够将平淡无奇的 HTML 页面变得绚丽多彩。而 CSS 选择器和伪类则是这位魔法师手中的魔法棒,通过它们可以精准地控制页面元素的样式。今天,就让我们一起深入探索 CSS 基础中的这些重要概念。

一、CSS 基础概念

声明(Declaration)

在 CSS 里,一个属性与值的键值对就被称为声明(declaration)。比如 color: red;color 是属性, red 是值,它们组成了一个声明。而一个声明块 {} 中可以包含多个这样的声明,像下面这样:

p {
    color: red;
    font-size: 16px;
}

选择器(Selector)

选择器决定了声明块作用于哪些元素。例如上面代码中的 p 就是选择器,它表示这些样式会应用到所有的p标签元素上。

二、CSS 选择器详解

<div class="container">
    <p>标题之前</p>
    <h1>标题</h1>
    <p>第一段文字</p>
    <p>第二段文字</p>
    <a href="#">链接</a>
    <span>这是一个span元素</span>
    <div class="inner">
        <p>这是内部段落</p>
    </div>
</div>

效果图:

image.png

1.后代选择器

  • 定义:通过空格分隔选择器,可选中某元素的所有后代元素
.container  p{
   text-decoration: underline;
}

image.png

2.子代选择器

  • 定义:使用 > 连接,仅选中某元素的直接子元素
/* 子代选择器 */
.container > p{
   color:rgb(70, 255, 251);
}

image.png

3.兄弟选择器

  • 兄弟选择器:用 + 连接,选中某个元素的下一个相邻兄弟元素
  • 通用兄弟选择器:用 ~ 连接,选中某个元素后面的所有同级兄弟元素
 /* 兄弟选择器(紧挨着) */
h1 + p {
    color: green;
}

image.png

/* ~ 同级兄弟选择器 -- 选择所有位于 h1 元素之后的 p 元素 */
h1 ~ p{
    color: red;
}

image.png

三、伪类选择器的魅力

1. 行为伪类

  • button:active :当鼠标点击按钮时,改变按钮的样式。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <style>
        button:active {
            background-color: green;
            color: white;
        }
    </style>
</head>
<body>
    <button>点击我</button>
</body>
</html>
  • p:hover :当鼠标悬浮在段落上时,改变文字样式。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <style>
        p:hover {
            color: red;
            font-weight: bold;
            text-decoration: underline;
        }
    </style>
</head>
<body>
    <p>鼠标悬浮试试</p>
</body>
</html>

2. 伪元素选择器

  • ::selection :当用户选中文本时,改变选中文本的样式。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <style>
        ::selection {
            background-color: yellow;
            color: white;
        }
    </style>
</head>
<body>
    <p>选我试试,看看效果</p>
</body>
</html>

3. 状态伪类

  • input:focus :当输入框获得焦点时,改变输入框的样式。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <style>
        input:focus {
            outline: none;
            border: 2px solid blue;
        }
    </style>
</head>
<body>
    <input type="text" placeholder="输入内容">
</body>
</html>
  • input:checked :当复选框被选中时,改变复选框和关联标签的样式。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <style>
        input:checked {
            background-color: green;
        }
        input:checked + label {
            color: red;
            font-weight: bold;
        }
    
    <input type="checkbox" id="option1">
    <label for="option1">选项一</label>
</body>
</html>

4. 结构伪类

  • li:nth-child(odd)li:nth-child(even) :分别为列表中的奇数项和偶数项设置不同的背景色。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <style>
        li:nth-child(odd) {
            background-color: lightgray;
        }
        li:nth-child(even) {
            background-color: rgb(214, 89, 228);
        }
    </style>
</head>
<body>
    <ul>
        <li>列表项 1</li>
        <li>列表项 2</li>
        <li>列表项 3</li>
        <li>列表项 4</li>
    </ul>
</body>
</html>

5. 条件伪类

  • li:not(:first-child) :为列表中除第一项外的其他项设置文字颜色。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <style>
        li:not(:first-child) {
            color: red;
        }
    </style>
</head>
<body>
    <ul>
        <li>第一项</li>
        <li>第二项</li>
        <li>第三项</li>
    </ul>
</body>
</html>

四、 :nth-child() 与 :nth-of-type() 的区别

  • :nth-child() 是按照父元素的所有子元素位置来选择的。
  • :nth-of-type() 是按照同类型元素的位置来选择。

下面是一个对比代码案例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <style>
        /* 对所有同级元素都进行排序。直接定位到div元素上,但只对p有效 */
        .container p:nth-child(3) {
            color: red;
        }
        /* 只对p类型生效排序 */
        .container p:nth-of-type(3) {
            color: rgb(30, 199, 232);
            background-color: aliceblue;
        }
    </style>
</head>
<body>
    <div class="container">
        <h1>标题</h1>
        <p>第一个段落</p>
        <div>这是一个 div</div>
        <p>第二个段落</p>
        <p>第三个段落</p>
    </div>
</body>
</html>

image.png

总结

CSS 选择器和伪类是前端开发中非常重要的知识点,掌握它们可以让我们更加灵活地控制页面样式。通过今天的学习,希望大家对这些概念有了更深入的理解,并且能够在实际开发中熟练运用。让我们一起用 CSS 打造出更加美观、交互性更强的页面吧!