如何使用CSS 3制作闪烁/闪烁文本?

时间:2013-05-02 17:39:06

标签: css html5 css3 opacity css-animations

目前,我有这段代码:

@-webkit-keyframes blinker {
  from { opacity: 1.0; }
  to { opacity: 0.0; }
}

.waitingForConnection {
  -webkit-animation-name: blinker;
  -webkit-animation-iteration-count: infinite;
  -webkit-animation-timing-function: cubic-bezier(.5, 0, 1, 1);
  -webkit-animation-duration: 1.7s;
}

它闪烁,但它只在“一个方向”闪烁。我的意思是,它只会消失,然后它会显示回opacity: 1.0,然后再次淡出,再次出现,等等...我希望它淡出,然后从这个淡入淡出“提升”再回到opacity: 1.0。这可能吗?

13 个答案:

答案 0 :(得分:531)

您首先设置opacity: 1;,然后在0上结束,因此它从0%开始,到100%结束,因此只需将不透明度设置为{{ 1}}在0,休息会照顾好自己。

Demo

50%
.blink_me {
  animation: blinker 1s linear infinite;
}

@keyframes blinker {
  50% {
    opacity: 0;
  }
}

此处,设置动画持续时间应为<div class="blink_me">BLINK ME</div>,而不是将1 second设置为timing,这意味着它将始终保持不变,并且最后一次使用linear意味着它会继续下去。

  

注意:如果这对您不起作用,请使用浏览器前缀   infinite-webkit所需的-mozanimation等等   @keyframes。您可以参考我的详细代码here


如评论所述,这不适用于旧版本的Internet Explorer,因为您需要使用jQuery或JavaScript ....

(function blink() { 
  $('.blink_me').fadeOut(500).fadeIn(500, blink); 
})();

感谢Alnitak建议better approach

Demo (使用jQuery的Blinker)

答案 1 :(得分:65)

使用animation-direction alternate 值(您不需要以这种方式添加任何keframe)。

  

alternate

     

动画应该在每个循环中反转方向。反向播放时,向后执行动画步骤。此外,定时功能也相反;例如,当反向播放时,轻松动画会被轻松动画取代。确定它是偶数还是奇数迭代的计数从1开始。

<强> CSS

.waitingForConnection {
  animation: blinker 1.7s cubic-bezier(.5, 0, 1, 1) infinite alternate;  
}
@keyframes blinker { to { opacity: 0; } }

我删除了from关键帧。如果它丢失,它将从您为元素设置的动画属性(在这种情况下为opacity)生成的值生成,或者如果您尚未设置它(在这种情况下您没有) ,来自默认值(1opacity)。

请不要只使用WebKit版本。在它之后添加未加前缀的那个。如果您只想编写更少的代码,请使用the shorthand

答案 2 :(得分:43)

获得纯正&#34; 100%开启,100%折扣&#34;的最佳方式眨眼,就像旧的<blink>一样:

&#13;
&#13;
.blink {
  animation: blinker 1s step-start infinite;
}

@keyframes blinker {
  50% {
    opacity: 0;
  }
}
&#13;
<div class="blink">BLINK</div>
&#13;
&#13;
&#13;

答案 3 :(得分:15)

或者,如果您不希望在show和hide之间逐渐过渡(例如闪烁的文本光标),您可以使用以下内容:

/* Also use prefixes with @keyframes and animation to support current browsers */
@keyframes blinker {  
  from { visibility: visible }
  to { visibility: hidden }

  /* Alternatively you can do this:  
  0% { visibility: visible; }
  50% { visibility: hidden; }
  100% { visibility: visible; }
  if you don't want to use `alternate` */
}
.cursor {
  animation: blinker steps(1) 500ms infinite alternate;
}

每个1s .cursor都会从visible转到hidden

如果不支持CSS动画(例如在某些版本的Safari中),您可以回退到这个简单的JS间隔:

(function(){
  var show = 'visible'; // state var toggled by interval
  var time = 500; // milliseconds between each interval

  setInterval(function() {
    // Toggle our visible state on each interval
    show = (show === 'hidden') ? 'visible' : 'hidden';

    // Get the cursor elements
    var cursors = document.getElementsByClassName('cursor');
    // We could do this outside the interval callback,
    // but then it wouldn't be kept in sync with the DOM

    // Loop through the cursor elements and update them to the current state
    for (var i = 0; i < cursors.length; i++) {
      cursors[i].style.visibility = show;
    }
  }, time);
})()

这个简单的JavaScript实际上非常快,在许多情况下甚至可能是比CSS更好的默认值。值得注意的是,很多DOM调用使JS动画变慢(例如JQuery的$ .animate())。

它还有第二个好处,即如果稍后添加.cursor个元素,它们仍会在与共享状态的其他.cursor完全相同的时间生成动画,这对于CSS来说是不可能的据我所知。

答案 4 :(得分:12)

我不知道为什么但仅动画visibility属性不能在任何浏览器上运行。

您可以做的是为opacity属性设置动画,使浏览器没有足够的帧来淡入或淡出文本。

示例:

&#13;
&#13;
span {
  opacity: 0;
  animation: blinking 1s linear infinite;
}

@keyframes blinking {
  from,
  49.9% {
    opacity: 0;
  }
  50%,
  to {
    opacity: 1;
  }
}
&#13;
<span>I'm blinking text</span>
&#13;
&#13;
&#13;

答案 5 :(得分:8)

@-webkit-keyframes blinker {  
  0% { opacity: 1.0; }
  50% { opacity: 0.0; }
  100% { opacity: 1.0; }
}

答案 6 :(得分:8)

更改持续时间和不透明度以适应。

.blink_text { 
    -webkit-animation-name: blinker;
    -webkit-animation-duration: 3s;
    -webkit-animation-timing-function: linear;
    -webkit-animation-iteration-count: infinite;
    -moz-animation-name: blinker;
    -moz-animation-duration: 3s;
    -moz-animation-timing-function: linear;
    -moz-animation-iteration-count: infinite;
    animation-name: blinker;
    animation-duration: 3s;
    animation-timing-function: linear; 
    animation-iteration-count: infinite; color: red; 
} 

@-moz-keyframes blinker {
    0% { opacity: 1.0; }
    50% { opacity: 0.3; }
    100% { opacity: 1.0; } 
}

@-webkit-keyframes blinker { 
    0% { opacity: 1.0; }
    50% { opacity: 0.3; }
    100% { opacity: 1.0; } 
} 

@keyframes blinker { 
    0% { opacity: 1.0; } 
    50% { opacity: 0.3; } 
    100% { opacity: 1.0; } 
}

答案 7 :(得分:2)

最近但想添加一个具有更多关键帧的新代码...这是example on CodePen,因为内置代码段存在问题:

.block{
  display:inline-block;
  padding:30px 50px;
  background:#000;
}
.flash-me {
  color:#fff;
  font-size:40px;
  -webkit-animation: flash linear 1.7s infinite;
  animation: flash linear 1.7s infinite;
}

@-webkit-keyframes flash {
  0% { opacity: 0; } 
  80% { opacity: 1; color:#fff; } 
  83% { opacity: 0; color:#fff; } 
  86% { opacity: 1; color:#fff;}  
  89% { opacity: 0} 
  92% { opacity: 1; color:#fff;} 
  95% { opacity: 0; color:#fff;}
  100% { opacity: 1; color:#fff;}
}
@keyframes flash {
  0% { opacity: 0; } 
  80% { opacity: 1; color:#fff; } 
  83% { opacity: 0; color:#fff; } 
  86% { opacity: 1; color:#fff;}  
  89% { opacity: 0} 
  92% { opacity: 1; color:#fff;} 
  95% { opacity: 0; color:#fff;}
  100% { opacity: 1; color:#fff;}
}
<span class="block">
  <span class="flash-me">Flash Me Hard</span>
</span>

答案 8 :(得分:1)

我的解决方案:

.blink {
 animation: blinkMe 2s linear infinite;
}
@keyframes blinkMe {
 0% {
  opacity: 0;
 }
 50% {
  opacity: 1;
 }
 100% {
  opacity: 0;
 }
}
<p class="blink">Blink</p>

我使用blinkMe作为动画名称,持续时间为2s,时间为线性,无限以使其永远重复。

我们需要为旧版浏览器使用 JavaScript 和 jQuery,因为它们不支持动画和/或 @keyframes:

$(document).ready(function() {
 window.setInterval(function() {
  $(".blink").fadeIn(1000).fadeOut(1000);
 }, 2000)
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<p class="blink">Blink</p>

如果你想制作一个像眨眼标签一样工作的眨眼效果,这会起作用:

.blink {
 animation: blink 0.5s step-start infinite;
}
@keyframes blink {
 0% {
  opacity: 1;
 }
 50% {
  opacity: 0;
 }
 100% {
  opacity: 1;
 }
}
<p class="blink">Blink</p>

如果您想调整速度,请更改持续时间。

答案 9 :(得分:0)

<style>
    .class1{
        height:100px;
        line-height:100px;
        color:white;
        font-family:Bauhaus 93;
        padding:25px;
        background-color:#2a9fd4;
        border:outset blue;
        border-radius:25px;
        box-shadow:10px 10px green;
        font-size:45px;
    }
     .class2{
        height:100px;
        line-height:100px;
        color:white;
        font-family:Bauhaus 93;
        padding:25px;
        background-color:green;
        border:outset blue;
        border-radius:25px;
        box-shadow:10px 10px green;
        font-size:65px;
    }
</style>
<script src="jquery-3.js"></script>
<script>
    $(document).ready(function () {
        $('#div1').addClass('class1');
        var flag = true;

        function blink() {
            if(flag)
            {
                $("#div1").addClass('class2');
                flag = false;
            }
            else
            { 
                if ($('#div1').hasClass('class2'))
                    $('#div1').removeClass('class2').addClass('class1');
                flag = true;
            }
        }
        window.setInterval(blink, 1000);
    });
</script>

答案 10 :(得分:0)

通过对各个元素使用 class = blink ,它对我有用

简单的JS代码

// Blink
      setInterval(function()
        {

        setTimeout(function()
        {

        //$(".blink").css("color","rgba(0,0,0,0.1)"); // If you want simply black/white blink of text
        $(".blink").css("visibility","hidden"); // This is for Visibility of the element  


        },900);


        //$(".blink").css("color","rgba(0,0,0,1)");  // If you want simply black/white blink of text
        $(".blink").css("visibility","visible");  // This is for Visibility of the element

        },1000);

答案 11 :(得分:0)

enter image description here

.neon {
  font-size: 20px;
  color: #fff;
  text-shadow: 0 0 8px yellow;
  animation: blinker 6s;
  animation-iteration-count: 1;
}
@keyframes blinker {
  0% {
    opacity: 0.2;
  }
  19% {
    opacity: 0.2;
  }
  20% {
    opacity: 1;
  }
  21% {
    opacity: 1;
  }
  22% {
    opacity: 0.2;
  }
  23% {
    opacity: 0.2;
  }
  36% {
    opacity: 0.2;
  }
  40% {
    opacity: 1;
  }
  41% {
    opacity: 0;
  }
  42% {
    opacity: 1;
  }
  43% {
    opacity: 0.5;
  }
  50% {
    opacity: 1;
  }
  100% {
    opacity: 1;
  }
}

我使用了 font-family: "Quicksand", sans-serif;

这是字体的导入(在style.css的顶部)

@import url("https://fonts.googleapis.com/css2?family=Quicksand:wght@300&display=swap");

答案 12 :(得分:0)

如果你想要流畅的动画,试试这个。

.blink {
    animation: blinker 1s infinite;
}
  
@keyframes blinker {
    from { opacity: 1.0; }
    50% { opacity: 0.5; }
    to { opacity: 1.0; }
}

.

<span class="blink">I am blinking</span>