当前位置: 首页 > 科技观察

CSS过渡技巧!如何保持悬停状态?

时间:2023-03-13 00:42:58 科技观察

通常情况下,悬停不能保存状态。其他样式在鼠标悬停时触发,并在鼠标移出时恢复。:hover{color:red}这意味着如果你需要保持悬停状态,你可能不得不使用JS。比如下面是[1]的首页排行榜效果。这里的主要交互如下:鼠标滑过触发选中状态。鼠标移出列表后,仍保留上次选中状态(强调)。默认列表中的第一项被选中。目前官网的实现也是通过JS实现的。其实完全可以只通过CSS来实现。需要一些过渡延迟技巧。让我们来看看!1.鼠标悬停触发选中状态。一切都离不开布局。假设列表HTML是这样的。将军,夫人叫你去种田刚才在休息室玩了之后一个小睡,睁眼一看,她变成了古代一个胖胖的不识字的乡下姑娘。他不仅好吃懒做,在村子里还很霸道。十里八寨没人愿意娶她,好不容易买了个豪门女婿,可是大婚之日,人跑了。一气之下,恶霸父亲顺路为她拐走了一个丈夫。那是……爸,绑架你是不是有点不对劲?*苏胖子婚后很忙。忙着改造霸道总裁霸道哥哥。忙于营救神将美丽如花的丈夫。忙着养三个小霸王,小豆丁。一不小心,忙成了大衍最有权势的一品女侯爵!

被夺走一切后,她成神归来【甜甜的爽快、群宠、玄学】司浮晴一睁眼,不仅气运被抢,所有人还让她滚出娱乐圈。为了重活,她只想和咸鱼一起躺下。谁知圈内人只知道推销,没有真本事,不磨练演技。这怎么能继续下去?不管怎样,我得收拾一下。司浮清捏了捏他的手腕,动了动。后来网上疯骂她太过分发帖于瑶,造谣私生活不检点,还有——国际天后:我今天能站在这里,多亏了男一号主播:离我远点姐姐@玉耀就连国际运动会官方:恭喜司福清获得第13枚个人金牌,退役之日全网瘫痪。据史书记载,殷帝年少成名,征战四方,平定天下,安玉内是大夏王朝最年轻的皇帝。他完美而强大,胸怀天下,却在27岁时病逝,无子无孙,是无数人心目中的白月光男神。谁也不知道,他再睁眼,一千五百年后来到。这一次,他看到了自己想象中的盛夏。·银凰身份曝光后不久,司浮清得知偶像就在身边。她很佩服她,她只想——司浮清:好好努力,报效大夏!银皇:以身相许司浮清:???我工作很努力,你想要我吗?·全能美女女神×击杀青鬼帝从全网黑到神级巅峰,顺便和男神1v1

...简单修改:.list{列表样式:无;保证金:0;填充:0;宽度:400px;}.item{位置:相对;填充:10px10px10px34px;游标:指针;counter-increment:num;}.title::before{content:counter(num)'';宽度:25px;行高:30px;文本对齐:居中;颜色:#fff;位置:绝对;字体大小:14px;字体系列:幻想;左:4px;background:center/100%100%url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADQAAAA8CAMAAAAe9Wm0AAAAbFBMVEUAAACaov2SnPKXnvaXofiyuvuCjPOgqvi4vfiBjPSyuf6Ml/a0u/21vPtte/F/i/WTnfWNmPiyuv6Ik/Zue/GRnPinr/Wfp/Gyuv6Ml/ebo/KTnfOutfqEj/W3vvpue/G/xfd1gvN8iPRodfBFzp+BAAAAF3RSTlMAECA7U2BgdIiTn6Wsvr+/v9Df39/s/o6+GugAAAGPSURBVHjazdZhk4IgEAZgpS6z8iotPEBF8P//x1tJrTxQlrm5uff7MxubLBtF9sQfp+ywjRCJk+zLhPq6SUwuxokhp4/YT1SUVtWam4nSZObImyA2YXHZ022cYsirOzwYoYti7nJzuMOqeHPNvke5jxgP2DRNNqLSMzQQtXjUtv8cBTWiwqOqohcsKikt8ajkHI+4EGjEBWNnNGJ1jUe1Vp9YJLSSeKRkh0eyC0BdEJIBZ5J/h1TA/6SUOgcgjUdaT6gJQA0CjV85jFrq/ZU/UYtA7HFzG5iA1PcOMnbs0b7tU/mcCAhjO/NE52A8jmXKMHYdnukTzE141vhyGWaSTq97ksMQhOnEF8qYFJvXneDO++lU82VznG0giYDppBVzTTvIffdjZSGFVjA2JHeVuRDbopOC6TrJ7GUSx0a1vYGR8u1kQ5krce5hJAUjlRbuRtuyu8GFVopxZ6OtxW5wObU2P3Ewaby+jya6R7UYO+C3xpICbk3NFhptTToaZ6OtzS/WGm39iUdkmdFFv5pvdNPREWjicTcAAAAASUVORK5CYII=);}.title{margin:0;填充:8px0;字体粗细:正常;}.sumary{边距:0;溢出:隐藏;显示:-webkit-box;-webkit-box-orient:垂直;-webkit-line-clamp:2;颜色:#666;字体大小:14px;颜色:20px;高度:0;}.item::before{内容:'';位置:绝对;插图:0;边界半径:8px;不透明度:0;z-指数:-1;background:linear-gradient(270deg,rgb(241,236,249)0%,rgba(241,236,249,0)100%);}效果如下:现在加在hover的效果:.item:hover.title{颜色:rebeccapurple;}.item:hover.sumary{高度:40px;}.item.item:hover::before{opacity:1;}效果如下:就是一个普通的悬停效果,没什么特别的,那么移出后如何保持最终状态呢?再往下看2.保留悬停状态要实现悬停状态,就需要用到这么一个小技巧。例如,为元素添加悬停样式。el:hover{color:red}如果我们给这个元素加一个延迟。el{transition-delay:1s;}那么,鼠标进出的时候会有一个延时。接下来,我们取消悬停延迟。el:hover{颜色:红色;transition-delay:0s;}那么,鼠标移进来的时候会很快响应,移出去的时候还是会有延迟。说到这里相信大家都明白了。如果延迟设置的足够大,比如:el{transition-delay:9999s;},鼠标移出后,需要9999s才能恢复到原来的状态,相当于保留了的原理悬停状态是这样的,我们来看看实际应用吧!3、鼠标移出列表后,仍然保留上次选中的状态。根据以上原理,我们可以很容易的实现hover后的状态,如下:/*defaulttransition*/.item::before,.item.sumary,.item.title{transition:0s9999s;}/*eachitemhover*/.item:hover.title{颜色:rebeccapurple;过渡:无;}.item:悬停.sumary{高度:40px;过渡:无;}。item.item:hover::before{opacity:1;transition:none;}需要注意的是,因为是transition,所以所有的状态变化都需要支持transition属性。比如这里使用height:0来隐藏summary而不是display:none,还有选中的背景色的变化。由于background-image不支持transition,所以换成::before,然后单独使用一些细节比如opacity控制。效果如下:鼠标离开后,之前的Status仍然保留。但是我们只需要保留最后一个,而不是全部,怎么处理呢?这里需要我们换一种思路。你可以这样做。当鼠标移入整个列表时,所有的状态都会被清空,只保留当前悬停的选项。有点类似于JS中的思路。首先把所有的.current全部去掉,然后给当前项加上.current,如下/*Clearallhover*/.list:hover.title{transition:none;颜色:#333;}.list:hover.sumary{transition:none;高度:0;}.list:hover.item::before{transition:none;opacity:0;}这样就实现了鼠标移出列表后保持上次选中状态的功能,有点像单选框的效果,只不过是hover触发的,并且效果如下:4.选中默认列表中的第一项,下面实现最后一个功能。这相对容易,需要使用:first-child伪类来匹配第一个元素。但需要考虑的是轻重缓急的问题。这是默认状态,权限应该是最低的。其他悬停样式应该可以覆盖它,所以可以放在最上面,如下:/*Initialstate(第一个选中的)*/.item:first-child.sumary{height:40px;}.item:first-child.title{color:rebeccapurple;}.item:first-child::before{opacity:1;}/*clearallhover*//*eachhover*/完美实现了文章开头的效果.由于CSS实现,多个列表也可以完全重用。完整代码可以查看在线demo:[2]或[3]5.综上所述,以上就是通过纯CSS实现鼠标悬停样式保持的所有技巧。最主要的是transition-delay的灵活运用。下面总结一下:实现原理是利用transition-delay让“恢复”的时间足够长,从而达到保留悬停状态的效果。单选效果可以清除鼠标移入整个列表时的所有状态,这样只会保留当前悬停的选项,有点类似JS中的思路。需要注意的是所有属性都必须支持transition。比如display:none不支持transition,需要换成其他样式。当然整个实现对CSS和选择器的要求很高,实际项目过程可能没有JS实现快,但是CSS可以实现为什么还要用JS呢?在我看来,JS应该回归本职工作,专心处理数据逻辑交互,把所有视觉方面的事情交给CSS,但是现在的CSS还不够强大,需要很多tricks来实现,但是现在的CSS改变。一定要够强,比如:有伪类,相信以后CSS会越来越好。