纯 CSS 实现浮动介绍

“The people who drive us nuts often change us most.”
Auliq Ice

把扩展上传到 Chrome 商店需要在开发者后台填写一系列表单,非常喜欢它对详细介绍的处理,就想着偷师一下。

先上效果,下面是模仿的样子。由于详细介绍一般比设置本身要长,它使用了隐藏、按需显示的方式减少了高度。

看了开发者后台的代码,它是使用 JavaScript 响应鼠标事件并计算高度和显示。作为 CSS 洁癖,我第一反应当然是先考虑用 CSS 实现。

这里主要的问题其实就是如何让鼠标在设置(body)上响应介绍(aside)的显示。

在实现 iPhone 滑块开关的时候,就是通过 <input>:check 来控制 <label> 的变化,方法是利用 + 选择符选择兄弟姐妹元素。

像这种控制其它元素的情况都可以用这个方法。

1
2
3
4
5
6
7
8
9
.item-aside {
z-index: -1;
opacity: 0;
}

.item-body:hover + .item-aside {
z-index: 1;
opacity: 1;
}

全部的代码,也火速使(tou)用(shi)在了 Saladit 的设置界面:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<ul class="menu">
<!-- (li.item>((.item-header>lipsum1)+(.item-body>lipsum5)+(.item-aside>lipsum10)))*10 -->
<li class="item">
<div class="item-header">Lorem.</div>
<div class="item-body">Lorem ipsum dolor sit amet.</div>
<div class="item-aside">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Fugiat, vitae.</div>
</li>
<li class="item">
<div class="item-header">Nesciunt.</div>
<div class="item-body">Sit doloremque repellat natus libero.</div>
<div class="item-aside">Pariatur quibusdam voluptas, vero accusamus itaque. Neque magni autem sunt.</div>
</li>
<li class="item">
<div class="item-header">Animi!</div>
<div class="item-body">Similique voluptas, sint quam eligendi.</div>
<div class="item-aside">Unde repudiandae, mollitia voluptatum similique repellendus eum. Ut, quae! Deleniti.</div>
</li>
<!-- ...... -->
</ul>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
* {
box-sizing: border-box;
}

.menu {
margin: 15px 10%;
}

.item {
display: flex;
position: relative;
margin-bottom: 15px;
line-height: 1.6;
word-wrap: break-word;
}

.item-header {
width: 2 / 12 * 100%;
padding: 0 10px;
text-align: right;
font-weight: bold;
}

.item-body {
flex: 1;
width: 10 / 12 * 100%;
margin-right: 4 / 12 * 100%;
padding: 10px;
background-color: #fafafa;

&:hover + .item-aside {
z-index: 1;
opacity: 1;
}
}

.item-aside {
width: 4 / 12 * 100%;
position: absolute;
z-index: -1;
top: 0;
right: 0;
padding-left: 10px * 2 + 1px;
padding-right: 10px;
opacity: 0;
transition: all 400ms;

// left line
&::after {
content: '';
position: absolute;
top: 0;
bottom: 0;
left: 10px;
border-left: 1px #ddd solid;
}

&:hover {
z-index: 1;
opacity: 1;
}
}

您还在局域网。 ——来自隔墙相望的评论