从中间向外扩展透明背景的过渡

Transition to expand transparent background from middle outward

我想做一个CSS动画,从中心到边框(右边和左边)打开一个透明背景,边框为红色,文本为红色,没有任何背景。

可以吗?我想我在 class "bottone" 上弄错了,但我不知道在哪里!

按钮需要像这样,但颜色要反转:

.bottone {
  background: red;
  box-sizing: border-box;
  appearance: none;
  color: #fff;
  border: 2px solid red;
  cursor: pointer;
  display: inline-block;
  position: relative;
  align-self: center;
  font-size: 1rem;
  font-weight: 400;
  line-height: 1;
  margin: 20px;
  padding: 1.2em 2.8em;
  text-decoration: none;
  text-align: center;
  text-transform: uppercase;
  font-family: 'Montserrat', sans-serif;
  font-weight: 700;
  position: relative;
  overflow: hidden;
  z-index: 1;
  transition: color 150ms ease-in-out;
}

.bottone:after {
  content: '';
  position: absolute;
  display: block;
  top: 0;
  left: 50%;
  transform: translateX(-50%);
  width: 0%;
  height: 100%;
  background: red;
  z-index: -1;
  transition: width 150ms ease-in-out;
}

.bottone:hover {
  color: red;
}

.bottone:hover:after {
  width: 110%;
}
<a class="bottone">example</a>

这是另一个尝试:

.bottone {
  background: transparent;
  box-sizing: border-box;
  appearance: none;
  color: red;
  border: 2px solid red;
  cursor: pointer;
  display: inline-block;
  position: relative;
  align-self: center;
  font-size: 1rem;
  font-weight: 400;
  line-height: 1;
  margin: 20px;
  padding: 1.2em 2.8em;
  text-decoration: none;
  text-align: center;
  text-transform: uppercase;
  font-family: 'Montserrat', sans-serif;
  font-weight: 700;
  position: relative;
  overflow: hidden;
  z-index: 1;
  transition: color 150ms ease-in-out;
}

.bottone:after {
  content: '';
  position: absolute;
  display: block;
  top: 0;
  left: 50%;
  transform: translateX(-50%);
  width: 0%;
  height: 100%;
  background: red;
  z-index: -1;
  transition: width 150ms ease-in-out;
}

.bottone:hover {
  color: #fff;
}

.bottone:hover:after {
  width: 110%;
}
<a class="bottone">example</a>

而不是 "opening a transparent background",考虑 "moving two elements to reveal a transparent background"。一种想法是使用两个伪元素 :before:after,它们后退到框的相对两侧。

在我的例子中,一个是left:0,另一个是right:0
它们的宽度都从 50% 过渡到 0。

body {
  background-color: lightgreen;
}

.bottone {
  background: transparent;
  box-sizing: border-box;
  appearance: none;
  color: white;
  border: 2px solid red;
  cursor: pointer;
  display: inline-block;
  position: relative;
  align-self: center;
  font-size: 1rem;
  font-weight: 400;
  line-height: 1;
  margin: 20px;
  padding: 1.2em 2.8em;
  text-decoration: none;
  text-align: center;
  text-transform: uppercase;
  font-family: 'Montserrat', sans-serif;
  font-weight: 700;
  position: relative;
  overflow: hidden;
  z-index: 1;
  transition: color 150ms ease-in-out;
}

.bottone:hover {
  color: red;
}

.bottone:before,
.bottone:after {
  content: '';
  position: absolute;
  display: block;
  top: 0;
  width: 50%;
  height: 100%;
  background: red;
  z-index: -1;
  transition: width 150ms ease-in-out;
}

.bottone:before {
  left: 0;
}

.bottone:after {
  right: 0;
}

.bottone:hover:before,
.bottone:hover:after {
  width: 0;
}
<a class="bottone">example</a>

颜色需要调换。

伪尺寸也需要在悬停时设置和重置。

CSS 评论

.bottone {
  background: transparent;
  box-sizing: border-box;
  appearance: none;
  color: white;/* inverted*/
  border: 2px solid red;
  cursor: pointer;
  display: inline-block;
  position: relative;
  align-self: center;
  font-size: 1rem;
  font-weight: 400;
  line-height: 1;
  margin: 20px;
  padding: 1.2em 2.8em;
  text-decoration: none;
  text-align: center;
  text-transform: uppercase;
  font-family: 'Montserrat', sans-serif;
  font-weight: 700;
  position: relative;
  overflow: hidden;
  z-index: 1;
  transition: color 150ms ease-in-out;
}

.bottone:after {
  content: '';
  position: absolute;
  display: block;
  top: 0;
  left: 50%;
  width: 0%;
  height: 100%;
  width: 110%;/* moved here */
  background: red;
  transform: translateX(-50%);
  z-index: -1;
  transition: width 150ms ease-in-out;
}

.bottone:hover {
  color: red;/* inverted */
}

.bottone:hover:after {
  width: 0;/* reset here */
}
<a class="bottone">example</a>