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


287

目前,我有以下代码:

@-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。那可能吗?


1
如果你把这个页面的右边一看,有一个名为列相关的许多“相关”的话题。看看其中的一些..您将能够学习所需的所有内容。
米歇尔·帕特恩

2
您可以在bradshaw上学习有关CSS转换的快速课程:css3.bradshawenterprises.com
Milche Patern,

82
没有冒犯,如果他想眨眼,他想眨眼。不管是哪一年。世界上最具创新精神的人是那些不遵守规则生活的人。相反,它们通常会破坏它们,然后每个人都复制它们。我想苹果就是一个很好的例子。Mackie等也是如此。如果人们只是保留自己的意见并回答问题的重点,我会感觉更好:-)如前所述,没有冒犯。听起来有些刺耳,但我不想激怒任何人。别往心里放。;-)
劳伦斯


Answers:


655

首先设置opacity: 1;,然后在上结束它0,所以它从开始,0%在上结束100%,因此只需将opacity设置为0at 50%,其余的将自己处理。

演示版

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

@keyframes blinker {
  50% {
    opacity: 0;
  }
}
<div class="blink_me">BLINK ME</div>

在这里,我将动画持续时间设置为1 second,然后将设置timinglinear。这意味着它将始终保持不变。最后,我正在使用infinite。这意味着它将继续下去。

注:如果这不会为你工作,使用浏览器前缀喜欢 -webkit-moz等按要求animation@keyframes。你可以在这里参考我的详细代码


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

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

感谢Alnitak提出了一种更好的方法

演示 (使用jQuery的闪烁器)


7
刚刚注意到,将其应用于一个文本元素后,使用firefox消耗了我计算机上大量的CPU。谨防。
2014年

2
最容易理解的解决方案的最佳答案
失落的银子

4
@ Mr.Alien两者之间没有同步-淡变所花的时间比计时器要长一点(而且计时器无论如何都不可靠),最终您最终可能会在元素上排队无穷的动画队列。正确的方法是不使用计时器,而以“递归”方式调用blinker该调用的完成回调.fadeIn
Alnitak

3
@Alien先生,整个事情也可能只是IIFE-这一行将完成整个事情,包括初始调用: (function blink() { $('.blink_me').fadeOut(500).fadeIn(500, blink); })();
Alnitak

2
step-end而不是linear我想要的。
Alex S

71

将该alternate值用作animation-direction(并且您无需以这种方式添加任何keframe)。

alternate

动画应在每个循环中反转方向。反向播放时,动画步骤将向后执行。另外,定时功能也相反。例如,反向播放时,缓入动画会替换为缓入动画。要确定是偶数还是奇数迭代的计数从1开始。

CSS

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

我删除了from关键帧。如果缺少它,它将从您为opacity元素上的animation属性设置的值(在这种情况下)或默认值(如果没有设置)生成(1用于opacity)。

并且请不要仅使用WebKit版本。在其后也添加无前缀的。如果您只想编写更少的代码,请使用简写形式


如何使其闪烁更快?更改1.7s会使事情搞砸。
亚历克斯G

1
@AlexG,您可以将cubic-bezier零件替换为ease-in-out或其他:cubic-bezier.com
Danilo Bargen

+对于三次贝塞尔曲线,因为所有有趣的事物都是非线性的
Agnius Vasiliauskas

57

像旧<blink>的一样,获得纯“ 100%开启,100%关闭”眨眼的最佳方法是这样的:

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

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


5
唯一真正的“闪烁”解决方案。并且还可以与color属性等配合使用。其他内容是解决方法或“淡入淡出”动画。
马丁·施耐德

15

或者,如果您不希望在显示和隐藏之间进行逐步过渡(例如,闪烁的文本光标),则可以使用以下方法:

/* 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都会从visiblehidden

如果不支持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是不可能的。


除了适用于iOS Safari之外,此功能都很好。有什么想法如何使其在Safari上运行吗?
Joe Orost

@JoeOrost我为不支持CSS动画的浏览器提供了JS替代方案。我认为这实际上可能实际上是一个更好的解决方案!
MattSturgeon,2015年

14

我不知道为什么,但是仅对该visibility属性设置动画无法在任何浏览器上运行。

您可以做的是opacity,以一种使浏览器没有足够的框架淡入或淡出文本的方式对属性进行动画处理。

例:

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

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


2
这很愚蠢-只需使用step-start(请参阅我的答案)。
Timmmm

完美,正是我想要的。竖起大拇指。
塞缪尔·拉姆赞

9

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

.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; } 
}

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


4

最近,但想添加一个具有更多关键帧的新代码...这是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>


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>

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);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.