在实现下拉菜单时候,会遇到并不是所有的选项都有下拉列表的情况,通常的设计是在有下拉列表的选项后面添加一个向下的小三角。

更进一步的是在下拉列表展开时,小三角指向上方;下拉列表隐藏时,小三角又恢复为指向下方;而且变化过程以动画形式实现。

下面就来一步一步地实现动画小三角。

首先来做一个小三角。

通过设置border属性实现小三角

当我们为一个元素的border的每一边设置不同的颜色,我们就能观察到元素的每一边的边框实际上是梯形。那我们把元素的width属性和height属性都设置为0时,我们就得到了三角形。

还是来看示例吧。

See the Pen 使用边框实现三角 by xingzhi (@xingzhi) on CodePen.

做好了小三角,下面我们来把它添加到有下拉列表的下拉选项中。

通过after伪元素添加小三角

要把小三角添加到下拉选项后面并不需要添加一个新的元素,利用after伪元素就可以了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
.dropdown {
    &:after {
        content: '';
        border: 5px solid transparent;
        border-top-color: black;
        position: absolute;
        top: 50%;
        right: 0;
        transition: transform 0.5s;
        transform-origin: 50% 25%;
        transform: translate(0, -25%);
    }
    &:hover {
        &:after {
            transform: translate(0, -25%) rotate(-180deg);
        }
    }
}

这里需要注意的是,因为transform属性默认的变换参考点是元素的中心,而我们的小三角只是元素的四分之一,所以要使两种状态下的小三角位置不变,需要设置transform-origin: 50% 25%;要使小三角垂直方向居中,需要设置transform: translate(0, -25%)

把小三角添加到下拉选项后面之后,下一步就是当下拉列表展开或者隐藏时,小三角以动画的形式实现切换。

动起来

我们已经为小三角定义了两种状态:下拉列表隐藏时小三角向下,表示有下拉列表;下拉列表显示时小三角向上,表示下拉列表能够隐藏。

要两个状态的切换以动画的形式实现,只需要把transform属性添加给transition属性。改动很小,这里就不再贴代码了,直接在完整示例中看吧。

完整示例

下面是完整的示例。

See the Pen 带小三角的下拉菜单 by xingzhi (@xingzhi) on CodePen.