You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

实现鼠标悬停容器时触发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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 03:00:56