css - 背景颜色过渡和不透明度过渡同步问题之前/之后

标签 css css-transitions background-image background-color pseudo-element

我目前面临使用前后伪元素淡入导航项的问题。

当我悬停导航项时,它必须将其背景颜色从白色更改为蓝色。没什么疯狂的。 但它也必须显示两个背景图像,分别通过将::before 伪元素从 0 更改为 1 和::after 伪元素也从 0 更改为 1。

问题是,虽然我设置了相同的过渡持续时间,但元素的淡入淡出行为与自身的背景颜色过渡相比有点不同。

您还可以通过快速进出鼠标来“玩”悬停 (jsfiddle),以便更清楚地查看问题。

如果有人能帮我解开这个谜团,那将不胜感激:)

这是我的 jsfiddle:https://jsfiddle.net/5qnw8ke4/

这里是转换问题的截图:screen capture

a {
    display: block;
    width: 61px;
    height: 67px;
    margin: 50px;
    background-color: #fff;
    text-align: center;
    font-family: "Roboto", sans-serif;
    text-decoration: none;
    line-height: 67px;
    color: #259cff;
    position: relative;
    transition: background-color 0.3s, color 0.3s;
}

a::before, a::after {
    opacity: 0;
    height: 100%;
    position: absolute;
    top: 0;
    content: "";
    -webkit-transition: opacity 0.3s,width 0.3s,left 0.3s,right 0.3s;
    transition: opacity 0.3s,width 0.3s,left 0.3s,right 0.3s;
}

a::before {
    width: 12px;
    left: -12px;
    background: url("https://svgshare.com/i/J61.svg") no-repeat 0;
    background-size: auto 100%;
}

a::after {
    width: 12px;
    right: -12px;
    background: url("https://svgshare.com/i/J4j.svg") no-repeat 100%;
    background-size: auto 100%;
}

a:hover {
    background-color: #259cff;
    color: #fff;
}

a:hover::before, a:hover::after {
    opacity: 1;
    width: 17px;
}

a:hover::before {
    left: -17px;
}

a:hover::after {
    right: -17px;
}
<a href="#">My link</a>

最佳答案

您可以像下面这样简化效果,而不需要 SVG 并依赖整个形状的一个伪元素:

a {
    display: block;
    width: 61px;
    height: 67px;
    margin: 50px;
    text-align: center;
    font-family: "Roboto", sans-serif;
    text-decoration: none;
    line-height: 67px;
    color: #259cff;
    position: relative;
    transition:0.2s;
}

a::before {
   content:"";
   position:absolute;
   z-index:-1;
   top:0;
   bottom:0;
   left:0;
   right:0; 
   opacity:0;
   padding:0 15px;
   background:
    linear-gradient(#259cff,#259cff) content-box,
    linear-gradient(to top    right,transparent 47%,#259cff 50%) left /15px 100%,
    linear-gradient(to bottom right,transparent 47%,#d4ecff 50%) left /15px 100%,
    linear-gradient(to bottom left ,transparent 47%,#259cff 50%) right/15px 100%,
    linear-gradient(to top    left ,transparent 47%,#d4ecff 50%) right/15px 100%;
   background-repeat:no-repeat;
   transition:inherit;
}
a:hover::before {
  left:-17px;
  right:-17px;
  opacity:1;
}
a:hover {
  color:#fff;
}
<a href="#">My link</a>

倾斜变换的另一个想法:

a {
  display: block;
  width: 61px;
  height: 67px;
  margin: 50px;
  text-align: center;
  font-family: "Roboto", sans-serif;
  text-decoration: none;
  line-height: 67px;
  color: #259cff;
  position: relative;
  transition: 0.2s;
}

a::before,
a::after {
  content: "";
  position: absolute;
  z-index: -1;
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
  opacity: 0;
  background: #d4ecff;
  transform: skewX(-12deg);
  transition: inherit;
}

a::after {
  background: #259cff;
  transform: skewX(12deg);
}

a:hover::before,
a:hover::after {
  left: -17px;
  right: -17px;
  opacity: 1;
}

a:hover {
  color: #fff;
}
<a href="#">My link</a>

关于css - 背景颜色过渡和不透明度过渡同步问题之前/之后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60634476/

相关文章:

html - 单独组件 Angular2 中的备用 div 样式

javascript - 无法在条件检查时设置 .css() 方法

javascript - 通过鼠标移动实现页面倾斜和缩放

css - 我怎样才能添加两个过渡变换,但一个接一个?

html - 单击显示/隐藏仅 div 的 css 且没有 href。没有jquery

html - 在第一张图片下重复第二张背景图片

html - 背景 CSS 属性似乎无法正常工作

css - CSS3如何制作矩形透明度渐变?

css - 背景图像不会在网站上显示,但会在 Dreamweaver 中显示

html - 如果有两个以上的子级可用,则更改父级 div 样式(仅限 CSS)