【问题标题】:Background-color transition & before/after opacity transition sync issue背景颜色过渡和不透明度过渡同步之前/之后的问题
【发布时间】:2020-06-23 08:17:15
【问题描述】:

我目前正面临使用 before 和 after 伪元素淡入导航项的问题。

当我悬停导航项时,它必须将其背景颜色从白色更改为蓝色。没什么疯狂的。 但它还必须显示两个背景图像,分别将 ::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>

【问题讨论】:

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


    【解决方案1】:

    您可以在不需要 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>

    【讨论】:

    • 哇,感谢您的快速回答 :) 如果您对我上面提到的行为有任何解释,请告诉我。
    • @Gloubiboulga 您的伪元素正在移动,而背景仅出现,因此产生这种效果是合乎逻辑的,因为伪元素会移动并出现,从而产生您看到的小问题。去掉不透明效果,只保留另一个来理解
    • 事实上,如果我删除移动效果并只保留不透明度,它仍然会出现“在不同的时间”。延迟仍然存在,您可以在此处看到:jsfiddle.net/hw5qozkt
    猜你喜欢
    • 2013-08-23
    • 2019-08-14
    • 1970-01-01
    • 2013-10-20
    • 2014-07-22
    • 2023-03-10
    • 1970-01-01
    • 2019-09-24
    • 2015-01-12
    相关资源
    最近更新 更多