Hover bugs with :before On Safari

2019-09-05 17:31发布

问题:

I use the underline reveal hover effects on navigation links. When I hover on Safari, first hover background appears according with my css, but than I see the orange background. I found if I delete the height of pseudo elements this orange backgrounds doesn't visible.

 @mixin underline-reveal {

    vertical-align: middle;
    -webkit-transform: translateZ(0);
    transform: translateZ(0);
    box-shadow: 0 0 1px rgba(0, 0, 0, 0);
    -webkit-backface-visibility: hidden;
     backface-visibility: hidden;
    -moz-osx-font-smoothing: grayscale;
     position: relative;
     overflow: hidden;
     }


     @mixin underline-reveal-before ($color) {
     content: "";
     position: absolute;
     z-index: -1;
     left: 0;
     right: 0;
     bottom: 0;
     background-color: $color;
     height: 3px;
     -webkit-transform: translateY(4px);
     transform: translateY(4px);
     -webkit-transition-property: transform;
     transition-property: transform;
     -webkit-transition-duration: 0.3s;
     transition-duration: 0.3s;
     -webkit-transition-timing-function: ease-out;
     transition-timing-function: ease-out;
     }

回答1:

Usually the best fix is to add -webkit-transform: translate3d(0,0,0)on the elements that have the transition in Safari.

In my case:

  ul {
    @include menu-base;
    background-color: $blue;
    line-height: 2.5;

    > li {
        display: inline-block;

        > a {
            @include mainnav-align-a;
            @include underline-reveal;
        }

        > a::before {
            @include underline-reveal-before (#EDEDED);
            height: 3px;
        }

         > a:focus,
        > a:hover {
            background-color: $hover-blue;
        }

         > a:focus::before,
        > a:hover::before {
            -webkit-transform: translateY(0px);
            transform: translateY(0px);
              <!--Fix bugs ON Safari-->
            -webkit-transform: translate3d(0, 0, 0);
        }

        a.active:before {
            display: none;
        }
    }
}