菜单光棒划出效果

两个要点

要点:

1. z-index为任意值,包括负值,可实现与isolation: isolate;一样效果,生产独立的层级上下文。

   产生独立层级的目的是为了让绝对定位的伪元素显示在元素上方,但是在文字下方

   如果仅仅将伪元素的z-index设置为-1,则伪元素会显示在元素下方,将不可见

2. 元素的scaleX宽度变化,扩大从中间向两侧扩大,缩小从两侧向中间缩小,原因是transform-origin默认值为center,遮罩元素从两侧向中间收缩

    若遮罩transform-origin为left center,则光棒从右向左伸展

    若遮罩transform-origin为right center,则光棒从左向右伸展

    若改为元素伸展,则transform-origin为left center,为元素从左向右伸展,更为直观一些

3. 菜单划出动画用background来实现,其实更简洁

基本结构

<ul>
    <li>Coffee</li>
    <li>Tea</li>
    <li>Milk</li>
</ul>

1. 两侧向中间高亮效果

此时遮罩负责遮盖元素背景色

li{
    position: relative;
    margin-top: 10px;
    background: lightsalmon;
    /* isolation: isolate; */
    z-index: 1;
    padding-left: 10px;
}
li:before{
    content: "";
    position: absolute;
    z-index: -1;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
    background: #fff;
    transition: .3s ease-out;
    /* transition-timing-function: cubic-bezier(.52,1.64,.37,.66); */
}
li:hover:before{
    transform: scaleX(0);
}
li:hover{
    cursor: pointer;   
    color: #fff; 
}
ul{width: 200px;list-style: none;}

2. 左侧划出效果

此时遮罩负责显示高亮色

li{
    position: relative;
    margin-top: 10px;
    z-index: 1;
    padding-left: 10px;
}
li:before{
    content: "";
    position: absolute;
    z-index: -1;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
    background: lightsalmon;
    transition: .3s ease-out;
    transform: scaleX(0);
    transform-origin: left center;
}
li:hover{
    color: #fff;
    cursor: pointer;
}
li:hover:before{
    transform: scaleX(1);
}
ul{width: 200px;list-style: none;}

3. background-size实现

li{
    position: relative;
    margin-top: 10px;
    z-index: 1;
    background: linear-gradient(lightcoral 0 0) no-repeat;
    background-size: 0;
    transition: background-size .3s;
    padding-left: 10px;
}
li:hover{
    background-size: 100%;
    color: #fff;
    cursor: pointer;
}
ul{width: 200px;list-style: none;}

4. background-position实现

li{
    position: relative;
    margin-top: 10px;
    z-index: 1;
    background: linear-gradient(lightcoral 100%, #0000 0) no-repeat;
    background-size: 200%;
    transition: background-position 1s;
    padding-left: 10px;
    background-position: 200%;
}
li:hover{
    background-position: 100%;
    color: #fff;
    cursor: pointer;
}
ul{width: 200px;list-style:none;}

 

 

可参考此文的右侧导航的高亮效果 JavaScript 如何将一个迭代器转化为一个数组 和 此文 CSS 如何使用CSS替换或更改文本效果对比

要实现背景渐变可参考此文 CSS背景渐变支持transition过渡效果

posted @ 2023-12-08 14:32  全玉  阅读(7)  评论(0编辑  收藏  举报