如何通过hover控制相邻、平级元素的样式

1,485 阅读1分钟

这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战

网上有很多资料是关于如何通过 hover 控制子元素的样式。

具体是这样

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        .inter{display: none;}
        .app:hover .inter{display: block;}
    </style>
</head>
<body>
    <div class="app">
        top
        <div class="inter">inter</div>
    </div>
</body>
</html>

按正常思路来讲,这是前端最基础的一个功能,相当于京东、淘宝头部导航栏的一个小功能。这功能可以通过js来写,而且更灵活,但本文主要讲css,所以不做延伸。

本文的重点是,如何通过 hover 控制相邻、平级元素的样式。

看这样一段代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style></style>
</head>
<body>
    <div class="app">
        app
    </div>
    <div class="bottom">bottom</div>
</body>
</html>

思考一下,如何通过app类控制bottom类的样式?

我们可以使用相邻兄弟选择器。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        .bottom {
            display: none;
        }
        .app:hover+.bottom {
            display: block;
        }
    </style>
</head>
<body>
    <div class="app">
        app
    </div>
    <div class="bottom">bottom</div>
</body>
</html>

那什么是相邻兄弟选择器?

相邻兄弟选择器(Adjacent sibling selector)可选择紧接在另一元素后的元素,且二者有相同父元素。

那如果不是相邻元素,而是平级元素,又是否有办法控制其样式呢?

有办法的,可以使用兄弟选择器。

    <!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        .bottom {
            display: none;
        }
        .app:hover~.bottom {
            display: block;
        }
    </style>
</head>
<body>
    <div class="app">
        app
    </div>
    <div class="app_bottom">app_bottom</div>
    <div class="bottom">bottom</div>
</body>
</html>

什么是兄弟选择器?

兄弟选择器:~表示某元素后所有同级的指定元素,强调所有的。

那如果存在多个类名相同的元素,我只想对其中一个元素进行操作是否有方法呢?

这种方法也是有的。

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        .bottom {
            display: none;
        }
        .app:hover~.bottom.show {
            display: block;
        }
    </style>
</head>
<body>
    <div class="app">
        app
    </div>
    <div class="app_bottom">app_bottom</div>
    <div class="bottom">bottom</div>
    <div class="bottom show">bottom bottom</div>
</body>
</html>

灵活一点,修改兄弟选择器的指向。