悬停时用动画颜色填充文本颜色动画

时间:2018-11-06 17:41:27

标签: html css css3 css-animations

我希望将鼠标悬停在其上方时填充标题的文本颜色,但是文本始终会更改其颜色,而且我不知道/认为您可以将背景的一部分变为一种颜色,而另一种颜色会不断变化。我已经添加了实现了悬停功能的代码,但是没有进行过渡。

:root {
  --txt-color: #fff;
  --txt-box-bg: #424242;
  --main-bg: #000;
  /* front page title text */
  --main-front-color: #00a8ff;
  --second-front-color: #e84118;
  --third-front-color: #fbc531;
}

* {
  margin: 0px;
  padding: 0px;
}


/* Text */

.head-text {
  font-family: "IBM Plex Sans", sans-serif;
  color: var(--txt-color);
}

.main-text {
  font-family: "IBM Plex Mono" monospace;
  color: var(--txt-color);
}


/* Allgin */

.center {
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
}


/* classes */

.front-page {
  background-color: var(--main-bg);
  color: #000;
  animation: text-rainbow 13s linear infinite;
}

.full-page {
  background-size: cover;
  height: 100vh;
}


/* IDs */

#title-text {
  position: absolute;
  color: var(--main-bg);
  font-weight: bold;
  text-align: center;
  font-size: 90px;
  -webkit-text-stroke: 2px var(--main-front-color);
  animation: stroke-rainbow 13s linear infinite;
}

#title-text:hover {
  color: inherit;
}

@keyframes stroke-rainbow {
  0% {
    border-color: var(--main-front-color);
    -webkit-text-stroke-color: var(--main-front-color);
  }
  25% {
    border-color: var(--second-front-color);
    -webkit-text-stroke-color: var(--second-front-color);
  }
  50% {
    border-color: var(--third-front-color);
    -webkit-text-stroke-color: var(--third-front-color);
  }
  75% {
    border-color: var(--second-front-color);
    -webkit-text-stroke-color: var(--second-front-color);
  }
  100% {
    border-color: var(--main-front-color);
    -webkit-text-stroke-color: var(--main-front-color);
  }
}

@keyframes text-rainbow {
  0% {
    color: var(--main-front-color);
  }
  25% {
    color: var(--second-front-color);
  }
  50% {
    color: var(--third-front-color);
  }
  75% {
    color: var(--second-front-color);
  }
  100% {
    color: var(--main-front-color);
  }
}
<div class="front-page full-page">
  <span id="title-text" class="center head-text">Hi</span>
</div>

What I want

/* REQUIRES FALLBACK FOR FIREFOX */
* {
  box-sizing: border-box;
}

html, body {
  height: 100%;
}

nav {
  display: flex;
  height: 100%;
}

nav ul {
  align-self: center;
}

a {
  font: 300 42px/1.5 "Helvetica Neue", sans-serif;
  margin-left: 80px;
  color: #d7a150;
  text-decoration: none;
  -webkit-background-clip: text;
  -webkit-text-fill-color: transparent;
  background-image: linear-gradient(to right, #283271, #283271 50%, #d7a150 50%);
  background-size: 200% 100%;
  background-position: 100%;
}

a:hover {
  transition: all 0.3s cubic-bezier(0, 0, 0.23, 1);
  background-position: 0%;
}
<nav>
  <ul>
    <li><a href="#">About</a></li>
    <li><a href="#">Services</a></li>
    <li><a href="#">Portfolio</a></li>
    <li><a href="#">Contact</a></li>
  </ul>
</nav>

1 个答案:

答案 0 :(得分:5)

您可以考虑使用背景动画,并且可以轻松实现这一目的。想法是使用background-color进行文本着色,然后使用另一个背景层将在悬停时显示/显示该颜色:

:root {
  --txt-color: #fff;
  --txt-box-bg: #424242;
  --main-bg: #000;
  /* front page title text */
  --main-front-color: #00a8ff;
  --second-front-color: #e84118;
  --third-front-color: #fbc531;
}

* {
  margin: 0px;
  padding: 0px;
}


/* Text */

.head-text {
  font-family: "IBM Plex Sans", sans-serif;
  color: var(--txt-color);
}

.main-text {
  font-family: "IBM Plex Mono" monospace;
  color: var(--txt-color);
}


/* Allgin */

.center {
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
}


/* classes */

.front-page {
  background-color: var(--main-bg);
  color: #000;
}

.full-page {
  background-size: cover;
  height: 100vh;
}


/* IDs */

#title-text {
  position: absolute;
  /*Color the text with background*/
  background-clip: text;
  color: transparent;
  -webkit-background-clip: text;
  -webkit-text-fill-color: transparent;
  /**/
  /*The animated layer*/
  background-image:linear-gradient(#000,#000);
  background-size:100% 100%;
  background-position:right;
  background-repeat:no-repeat;
  /**/
  transition:1s all;
  font-weight: bold;
  text-align: center;
  font-size: 90px;
  -webkit-text-stroke: 2px var(--main-front-color);
  animation: stroke-rainbow 13s linear infinite,
             text-rainbow 13s linear infinite;
}

#title-text:hover {
  background-size:0% 100%;
}

@keyframes stroke-rainbow {
  0% {
    border-color: var(--main-front-color);
    -webkit-text-stroke-color: var(--main-front-color);
  }
  25% {
    border-color: var(--second-front-color);
    -webkit-text-stroke-color: var(--second-front-color);
  }
  50% {
    border-color: var(--third-front-color);
    -webkit-text-stroke-color: var(--third-front-color);
  }
  75% {
    border-color: var(--second-front-color);
    -webkit-text-stroke-color: var(--second-front-color);
  }
  100% {
    border-color: var(--main-front-color);
    -webkit-text-stroke-color: var(--main-front-color);
  }
}

@keyframes text-rainbow {
  0% {
    background-color: var(--main-front-color);
  }
  25% {
    background-color: var(--second-front-color);
  }
  50% {
    background-color: var(--third-front-color);
  }
  75% {
    background-color: var(--second-front-color);
  }
  100% {
    background-color: var(--main-front-color);
  }
}
<div class="front-page full-page">
  <span id="title-text" class="center head-text">Hi</span>
</div>