实现鼠标悬停容器时触发Button的CSS Hover效果
问题说明
想要实现鼠标悬停**整个容器(而非仅按钮本身)**时,触发按钮的样式变化。目前只有悬停按钮本身时样式才会改变。尝试将CSS中.button:hover span替换为h8:hover span后,仅部分生效,剩余相关样式无法触发。
解决方案
需要将所有与按钮hover相关的样式选择器,修改为容器hover时作用于内部按钮的形式。具体来说,把所有.button:hover的选择器替换为h8:hover .button,这样当鼠标悬停在h8容器上时,按钮的全套hover样式都会被触发。
修改后的关键CSS代码片段
/* Span on container hover and button active */ h8:hover .button span, .button:active span { opacity: 0; -moz-transform: scale(0.3); -ms-transform: scale(0.3); -o-transform: scale(0.3); transform: scale(0.3); } /* Show :before pseudo-element on container hover, :after on button active */ h8:hover .button:before, .button:active:after { opacity: 1; -webkit-transform: translate(0, 0); -moz-transform: translate(0, 0); -ms-transform: translate(0, 0); -o-transform: translate(0, 0); transform: translate(0, 0); -webkit-transition-delay: .4s; -moz-transition-delay: .4s; -o-transition-delay: .4s; transition-delay: .4s; }
完整修改后的CSS代码
@charset "UTF-8"; /* ------ INTRO - TOP PAGE ----- */ /* ------ BLOC MAUVE ----- */ *, *:before, *:after { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } h8 { color: #181818; font-size: 40px; font-family: Outfit; letter-spacing: 0.03em; line-height: 1.4em; } .gras { font-weight: 600; } .handwritting { font-size: 42px; font-family: Gochi Hand; letter-spacing: 0.187em; line-height: 0.9em; } .button { display: inline-block; position: relative; border: 0px solid transparent; overflow: hidden; text-decoration: none; outline: none; color: #FFF; background: #5358E0; font-size: 40px; font-family: Outfit; letter-spacing: 0.03em; line-height: 0.9em; } .button span { -webkit-transition: 0.6s; -moz-transition: 0.6s; -o-transition: 0.6s; transition: 0.6s; -webkit-transition-delay: 0.2s; -moz-transition-delay: 0.2s; -o-transition-delay: 0.2s; transition-delay: 0.2s; } .button:before, .button:after { content: ''; position: absolute; top: -0.1em; left: 0; width: 100%; text-align: center; opacity: 0; background: #F5F6F6; color: #181818; padding-top: 0.1em; padding-bottom: 0.3em; -webkit-transition: .4s, opacity .6s; -moz-transition: .4s, opacity .6s; -o-transition: .4s, opacity .6s; transition: .4s, opacity .6s; } /* :before */ .button:before { content: attr(data-hover); -webkit-transform: translate(-150%, 0); -moz-transform: translate(-150%, 0); -ms-transform: translate(-150%, 0); -o-transform: translate(-150%, 0); transform: translate(-150%, 0); } /* :after */ .button:after { content: attr(data-active); -webkit-transform: translate(150%, 0); -moz-transform: translate(150%, 0); -ms-transform: translate(150%, 0); -o-transform: translate(150%, 0); transform: translate(150%, 0); } /* Span on container hover and button active */ h8:hover .button span, .button:active span { opacity: 0; -moz-transform: scale(0.3); -ms-transform: scale(0.3); -o-transform: scale(0.3); transform: scale(0.3); } /* Show :before pseudo-element on container hover and :after pseudo-element on button active */ h8:hover .button:before, .button:active:after { opacity: 1; -webkit-transform: translate(0, 0); -moz-transform: translate(0, 0); -ms-transform: translate(0, 0); -o-transform: translate(0, 0); transform: translate(0, 0); -webkit-transition-delay: .4s; -moz-transition-delay: .4s; -o-transition-delay: .4s; transition-delay: .4s; } /* Hide :before pseudo-element on button active */ .button:active:before { -webkit-transform: translate(-150%, 0); -moz-transform: translate(-150%, 0); -ms-transform: translate(-150%, 0); -o-transform: translate(-150%, 0); transform: translate(-150%, 0); -webkit-transition-delay: 0s; -moz-transition-delay: 0s; -o-transition-delay: 0s; transition-delay: 0s; } /* ------ TEXT BARRÉ ----- */ .underline-animation { text-decoration: none; position: relative; white-space: nowrap; } .underline-animation svg { position: absolute; top: 30%; opacity: 0.8; left: 0; width: 100%; height: auto; } .underline-animation svg .stroke { stroke: #5358e0; stroke-width: 0.15em; stroke-dasharray: 822; stroke-dashoffset: 822; -webkit-animation: underlineAnimation 1s 0.5s ease-in forwards; animation: underlineAnimation 1s 0.5s ease-in forwards; } @-webkit-keyframes underlineAnimation { from { stroke-dashoffset: 822; } to { stroke-dashoffset: 0; } } @keyframes underlineAnimation { from { stroke-dashoffset: 822; } to { stroke-dashoffset: 0; } } h8:hover .stroke { stroke: #5358e0; stroke-width: 0.15em; stroke-dasharray: 822; stroke-dashoffset: 822; -webkit-animation: hoverunderline 1s ease-out; animation: hoverunderline 1s ease-out; } @-webkit-keyframes hoverunderline { from { stroke-dashoffset: 0; } to { stroke-dashoffset: 822; } } @keyframes hoverunderline { from { stroke-dashoffset: 0; } to { stroke-dashoffset: 822; } }
说明
修改后,当鼠标悬停在h8容器的任意区域时,内部按钮会触发完整的hover动画:原文字缩放消失,同时显示data-hover属性定义的内容;按钮的active状态保持原有逻辑不变。
内容的提问来源于stack exchange,提问作者Marielle Nadeau
相关产品推荐
相关产品推荐

