在显示数组的每个值后,向<div>添加属性

时间:2017-04-06 11:24:51

标签: javascript jquery html css animation

我正在显示类似数组的每个值。在完全显示一个值后,我希望<div />获取属性(data-text的{​​{1}}),并在输入下一个值时将其删除。< / p>

&#13;
&#13;
words[x]
&#13;
var words = [
  "Apple",
  "Car",
  "Building",
  "Random"
];

var time = 0;

function typeWord(word, time) {
  setTimeout(
    function() {
      $('#id')
        .html(word)
    },
    time
  );
}

function writeWords() {
  for (x = 0; x < words.length; x++) {
    for (y = 0; y <= words[x].length; y++) {
      var word = words[x].substr(0, y)
      time = time + 50;
      typeWord(word, time);
    }
    time = time + 3000;
  }
  return time;
}

function toggleClasses() {
  $(".text").addClass("hide");
  $(".error").removeClass("hide");
}

$(document).ready(function() {
  setInterval(toggleClasses, writeWords());
});
&#13;
* {
  margin: 0px;
  padding: 0px;
}

body {
  background: pink;
  height: 100vh;
  width: 100vw;
}

.container {
  // background: pink;
  height: 100%;
  width: 100%;
  display: flex;
  justify-content: center;
  align-items: center;
}

.error {
  height: 80%;
  width: 80%;
  max-height: 300px;
  max-width: 500px;
  border: 1px solid #ccc;
  text-align: center;
  display: flex;
  flex-direction: column;
  justify-content: space-around;
  align-items: center;
  opaciti: 1;
  transition: 0.3s ease;
}

.error .errorHeader {
  display: flex;
  justify-content: center;
}

.error h1 {
  font-size: 72px;
  color: #20aaff;
  font-weight: 700;
}

.error p {
  color: white;
}

.text {
  color: #20aaff;
  font-size: 40px;
  font-weight: 300;
  position: relative;
  text-transform: UPPERCASE;
  opacity: 1;
}
@keyframes noise-anim {
  0% {
    clip: rect(23px, 9999px, 17px, 0);
  }
  
  5% {
    clip: rect(34px, 9999px, 24px, 0);
  }
  
  10% {
    clip: rect(34px, 9999px, 9px, 0);
  }
  
  15.0% {
    clip: rect(20px, 9999px, 22px, 0);
  }
  
  20% {
    clip: rect(5px, 9999px, 18px, 0);
  }
  
  25% {
    clip: rect(15px, 9999px, 35px, 0);
  }
  
  30.0% {
    clip: rect(26px, 9999px, 36px, 0);
  }
  
  35% {
    clip: rect(26px, 9999px, 33px, 0);
  }
  
  40% {
    clip: rect(26px, 9999px, 5px, 0);
  }
  
  45% {
    clip: rect(13px, 9999px, 28px, 0);
  }
  
  50% {
    clip: rect(29px, 9999px, 38px, 0);
  }
  
  55.0% {
    clip: rect(30px, 9999px, 13px, 0);
  }
  
  60.0% {
    clip: rect(7px, 9999px, 36px, 0);
  }
  
  65% {
    clip: rect(28px, 9999px, 14px, 0);
  }
  
  70% {
    clip: rect(15px, 9999px, 16px, 0);
  }
  
  75% {
    clip: rect(8px, 9999px, 8px, 0);
  }
  
  80% {
    clip: rect(39px, 9999px, 2px, 0);
  }
  
  85.0% {
    clip: rect(20px, 9999px, 18px, 0);
  }
  
  90% {
    clip: rect(27px, 9999px, 8px, 0);
  }
  
  95% {
    clip: rect(33px, 9999px, 14px, 0);
  }
  
  100% {
    clip: rect(23px, 9999px, 25px, 0);
  }
}
.text:after {
  content: attr(data-text);
  position: absolute;
  left: 2px;
  text-shadow: -1px 0 red;
  top: 0;
  color: black;
  overflow: hidden;
  clip: rect(0, 900px, 0, 0);
  animation: noise-anim 2s infinite linear alternate-reverse;
}
@keyframes noise-anim-2 {
  0% {
    clip: rect(5px, 9999px, 21px, 0);
  }
  
  5% {
    clip: rect(38px, 9999px, 11px, 0);
  }
  
  10% {
    clip: rect(37px, 9999px, 18px, 0);
  }
  
  15.0% {
    clip: rect(11px, 9999px, 38px, 0);
  }
  
  20% {
    clip: rect(24px, 9999px, 13px, 0);
  }
  
  25% {
    clip: rect(37px, 9999px, 25px, 0);
  }
  
  30.0% {
    clip: rect(28px, 9999px, 40px, 0);
  }
  
  35% {
    clip: rect(14px, 9999px, 33px, 0);
  }
  
  40% {
    clip: rect(35px, 9999px, 3px, 0);
  }
  
  45% {
    clip: rect(23px, 9999px, 19px, 0);
  }
  
  50% {
    clip: rect(7px, 9999px, 18px, 0);
  }
  
  55.0% {
    clip: rect(18px, 9999px, 15px, 0);
  }
  
  60.0% {
    clip: rect(14px, 9999px, 31px, 0);
  }
  
  65% {
    clip: rect(29px, 9999px, 4px, 0);
  }
  
  70% {
    clip: rect(12px, 9999px, 2px, 0);
  }
  
  75% {
    clip: rect(3px, 9999px, 38px, 0);
  }
  
  80% {
    clip: rect(24px, 9999px, 39px, 0);
  }
  
  85.0% {
    clip: rect(34px, 9999px, 12px, 0);
  }
  
  90% {
    clip: rect(15px, 9999px, 11px, 0);
  }
  
  95% {
    clip: rect(10px, 9999px, 14px, 0);
  }
  
  100% {
    clip: rect(38px, 9999px, 21px, 0);
  }
}
.text:before {
  content: attr(data-text);
  position: absolute;
  left: -2px;
  text-shadow: 1px 0 blue;
  top: 0;
  color: #a8d500;
  overflow: hidden;
  clip: rect(0, 900px, 0, 0);
  animation: noise-anim-2 3s infinite linear alternate-reverse;
}
.arrow-up {
  width: 0px;
  height: 0px;
  border-left: 40px solid transparent;
  border-right: 40px solid transparent;
  border-bottom: 70px solid white;
  position: relative;
  transform: translateY(15px);
}
.arrow-up:before {
  content: "";
  height: 0px;
  width: 0px;
  border-left: 35px solid transparent;
  border-right: 35px solid transparent;
  border-bottom: 65px solid #20aaff;
  position: absolute;
  transform: translatex(-50%) translatey(5%);
}
.arrow-up:after {
  content: "!";
  color: white;
  font-size: 50px;
  display: block;
  position: absolute;
  transform: translatex(-50%) translatey(15%);
}

.hide {
  opacity: 0;
  display: none;
}
&#13;
&#13;
&#13;

感谢您的时间,对不起我的英语。

2 个答案:

答案 0 :(得分:0)

试试这个,然后将id更改为你想要的div。

function writeWords() {
  for (x = 0; x < words.length; x++) {
    document.getElementById("id").setAttribute("data-text",words[x]);
    for (y = 0; y <= words[x].length; y++) {
      var word = words[x].substr(0, y)
      time = time + 50;
      typeWord(word, time);
    }
    time = time + 3000;
  }
  return time;
}

答案 1 :(得分:0)

我冒昧地为你编写了几个替代实现。

&#13;
&#13;
(function(d){
    var text=d.getElementById("id"),
        error=d.getElementById("errorId"),
        node=text.appendChild(d.createTextNode("")),
        time=0,
        writer;
    ["Apple","Car","Building","Random"].forEach(function(word){
        setTimeout(function(word){
            node.nodeValue=text.dataset.text="";
            writer=0;
            chars=word.length;
            word.split("").forEach(function(char){
                writer+=50;
                setTimeout(function(char){
                    node.nodeValue+=char;
                },writer,char);
            });
            setTimeout(function(word){
                text.dataset.text=word;
            },writer,word);
            time+=writer;
        },time,word);
        time+=3000;
    });
    setTimeout(function(){
        text.classList.add("hide");
        error.classList.remove("hide");
    },time);
})(document);
&#13;
*{margin:0px;padding:0px;}
body{
  background:pink;
  height:100vh;
  width:100vw;
}
.container{
  align-items:center;
  display:flex;
  height:100%;
  justify-content:center;
  width:100%;
}
.text{
  color:#20aaff;
  font-size:40px;
  font-weight:300;
  position:relative;
  text-transform:uppercase;
}
.text:before{
  animation:noise-anim-2 3s infinite linear alternate-reverse;
  clip:rect(0,900px,0,0);
  color:#a8d500;
  content:attr(data-text);
  left:-2px;
  overflow:hidden;
  position:absolute;
  text-shadow:1px 0 blue;
  top:0;
}
.text:after{
  animation:noise-anim 2s infinite linear alternate-reverse;
  clip:rect(0,900px,0,0);
  color:black;
  content:attr(data-text);
  left:2px;
  position:absolute;
  text-shadow:-1px 0 red;
  top:0;
  overflow:hidden;
}
.error{
  align-items:center;
  border:1px solid #ccc;
  display:flex;
  flex-direction:column;
  height:80%;
  justify-content:space-around;
  max-height:300px;
  text-align:center;
  width:80%;
  max-width:500px;
}
.error .errorHeader{
  display:flex;
  justify-content:center;
}
.error h1{
  font-size:72px;
  color:#20aaff;
  font-weight:700;
  text-transform:uppercase;
}
.error p{
  color:white;
}
.arrow-up {
  width: 0px;
  height: 0px;
  border-left: 40px solid transparent;
  border-right: 40px solid transparent;
  border-bottom: 70px solid white;
  position: relative;
  transform: translateY(15px);
}
.arrow-up:before{
  border-left:35px solid transparent;
  border-right:35px solid transparent;
  border-bottom:65px solid #20aaff;
  content:"";
  height:0px;
  position:absolute;
  transform:translate(-50%,5%);
  width:0px;
}
.arrow-up:after{
  content:"!";
  color:white;
  display:block;
  font-size:50px;
  position:absolute;
  transform:translate(-50%,15%);
}
.hide{display:none;}
@keyframes noise-anim{0%{clip:rect(23px,9999px,17px,0);}5%{clip:rect(34px,9999px,24px,0);}10%{clip:rect(34px,9999px,9px,0);}15%{clip:rect(20px,9999px,22px,0);}20%{clip:rect(5px,9999px,18px,0);}25%{clip:rect(15px,9999px,35px,0);}30%{clip:rect(26px,9999px,36px,0);}35%{clip:rect(26px,9999px,33px, 0);}40%{clip:rect(26px,9999px,5px,0);}45%{clip:rect(13px,9999px,28px,0);}50%{clip:rect(29px,9999px,38px,0);}55%{clip:rect(30px,9999px,13px,0);}60%{clip:rect(7px,9999px,36px,0);}65%{clip:rect(28px,9999px,14px,0);}70%{clip:rect(15px,9999px,16px,0);}75%{clip:rect(8px,9999px,8px,0);}80%{clip:rect(39px,9999px,2px,0);}85%{clip:rect(20px,9999px,18px,0);}90%{clip:rect(27px,9999px,8px,0);}95%{clip:rect(33px,9999px,14px,0);}100%{clip:rect(23px,9999px,25px,0);}}
@keyframes noise-anim-2{0%{clip:rect(5px, 9999px, 21px, 0);}5%{clip:rect(38px,9999px,11px,0);}10%{clip:rect(37px,9999px,18px,0);}15%{clip:rect(11px,9999px,38px,0);}20%{clip:rect(24px,9999px,13px,0);}25%{clip:rect(37px,9999px,25px,0);}30%{clip:rect(28px,9999px,40px,0);}35%{clip:rect(14px,9999px,33px,0);}40%{clip:rect(35px,9999px,3px,0);}45%{clip:rect(23px,9999px,19px,0);}50%{clip:rect(7px,9999px,18px,0);}55%{clip:rect(18px,9999px,15px,0);}60%{clip:rect(14px,9999px,31px,0);}65%{clip:rect(29px,9999px,4px,0);}70%{clip:rect(12px,9999px,2px,0);}75%{clip:rect(3px,9999px,38px,0);}80%{clip:rect(24px,9999px,39px,0);}85%{clip:rect(34px,9999px,12px,0);}90%{clip:rect(15px,9999px,11px,0);}95%{clip:rect(10px,9999px,14px,0);}100%{clip:rect(38px,9999px,21px,0);}}
&#13;
<div class="container">
  <p id="id" class="text"></p>
  <div id="errorId" class="error hide">
    <div class="errorHeader">
      <div class="arrow-up"></div>
      <h1>End</h1>
      <div class="arrow-up"></div>
    </div>
  </div>
</div>
&#13;
&#13;
&#13;

&#13;
&#13;
(function(d){
    var words=["Apple","Car","Building","Random"],
        count=words.length,
        text=d.getElementById("id"),
        error=d.getElementById("errorId"),
        node=text.appendChild(d.createTextNode("")),
        chars,time,word,y;
    (function write(x){
        if(x===count){
            text.classList.add("hide");
            error.classList.remove("hide");
            return;
        }
        node.nodeValue=text.dataset.text="";
        time=0;
        word=words[x];
        chars=word.length;
        for(y=0;y<chars;y++){
            time+=50;
            setTimeout(function(y){
                node.nodeValue+=word[y];
            },time,y);
        }
        setTimeout(function(word){
            text.dataset.text=word;
            setTimeout(function(x){
                write(x);
            },3000,++x);
        },time,word);
    })(0);
})(document);
&#13;
*{margin:0px;padding:0px;}
body{
  background:pink;
  height:100vh;
  width:100vw;
}
.container{
  align-items:center;
  display:flex;
  height:100%;
  justify-content:center;
  width:100%;
}
.text{
  color:#20aaff;
  font-size:40px;
  font-weight:300;
  position:relative;
  text-transform:uppercase;
}
.text:before{
  animation:noise-anim-2 3s infinite linear alternate-reverse;
  clip:rect(0,900px,0,0);
  color:#a8d500;
  content:attr(data-text);
  left:-2px;
  overflow:hidden;
  position:absolute;
  text-shadow:1px 0 blue;
  top:0;
}
.text:after{
  animation:noise-anim 2s infinite linear alternate-reverse;
  clip:rect(0,900px,0,0);
  color:black;
  content:attr(data-text);
  left:2px;
  position:absolute;
  text-shadow:-1px 0 red;
  top:0;
  overflow:hidden;
}
.error{
  align-items:center;
  border:1px solid #ccc;
  display:flex;
  flex-direction:column;
  height:80%;
  justify-content:space-around;
  max-height:300px;
  text-align:center;
  width:80%;
  max-width:500px;
}
.error .errorHeader{
  display:flex;
  justify-content:center;
}
.error h1{
  font-size:72px;
  color:#20aaff;
  font-weight:700;
  text-transform:uppercase;
}
.error p{
  color:white;
}
.arrow-up {
  width: 0px;
  height: 0px;
  border-left: 40px solid transparent;
  border-right: 40px solid transparent;
  border-bottom: 70px solid white;
  position: relative;
  transform: translateY(15px);
}
.arrow-up:before{
  border-left:35px solid transparent;
  border-right:35px solid transparent;
  border-bottom:65px solid #20aaff;
  content:"";
  height:0px;
  position:absolute;
  transform:translate(-50%,5%);
  width:0px;
}
.arrow-up:after{
  content:"!";
  color:white;
  display:block;
  font-size:50px;
  position:absolute;
  transform:translate(-50%,15%);
}
.hide{display:none;}
@keyframes noise-anim{0%{clip:rect(23px,9999px,17px,0);}5%{clip:rect(34px,9999px,24px,0);}10%{clip:rect(34px,9999px,9px,0);}15%{clip:rect(20px,9999px,22px,0);}20%{clip:rect(5px,9999px,18px,0);}25%{clip:rect(15px,9999px,35px,0);}30%{clip:rect(26px,9999px,36px,0);}35%{clip:rect(26px,9999px,33px, 0);}40%{clip:rect(26px,9999px,5px,0);}45%{clip:rect(13px,9999px,28px,0);}50%{clip:rect(29px,9999px,38px,0);}55%{clip:rect(30px,9999px,13px,0);}60%{clip:rect(7px,9999px,36px,0);}65%{clip:rect(28px,9999px,14px,0);}70%{clip:rect(15px,9999px,16px,0);}75%{clip:rect(8px,9999px,8px,0);}80%{clip:rect(39px,9999px,2px,0);}85%{clip:rect(20px,9999px,18px,0);}90%{clip:rect(27px,9999px,8px,0);}95%{clip:rect(33px,9999px,14px,0);}100%{clip:rect(23px,9999px,25px,0);}}
@keyframes noise-anim-2{0%{clip:rect(5px, 9999px, 21px, 0);}5%{clip:rect(38px,9999px,11px,0);}10%{clip:rect(37px,9999px,18px,0);}15%{clip:rect(11px,9999px,38px,0);}20%{clip:rect(24px,9999px,13px,0);}25%{clip:rect(37px,9999px,25px,0);}30%{clip:rect(28px,9999px,40px,0);}35%{clip:rect(14px,9999px,33px,0);}40%{clip:rect(35px,9999px,3px,0);}45%{clip:rect(23px,9999px,19px,0);}50%{clip:rect(7px,9999px,18px,0);}55%{clip:rect(18px,9999px,15px,0);}60%{clip:rect(14px,9999px,31px,0);}65%{clip:rect(29px,9999px,4px,0);}70%{clip:rect(12px,9999px,2px,0);}75%{clip:rect(3px,9999px,38px,0);}80%{clip:rect(24px,9999px,39px,0);}85%{clip:rect(34px,9999px,12px,0);}90%{clip:rect(15px,9999px,11px,0);}95%{clip:rect(10px,9999px,14px,0);}100%{clip:rect(38px,9999px,21px,0);}}
&#13;
<div class="container">
  <p id="id" class="text"></p>
  <div id="errorId" class="error hide">
    <div class="errorHeader">
      <div class="arrow-up"></div>
      <h1>End</h1>
      <div class="arrow-up"></div>
    </div>
  </div>
</div>
&#13;
&#13;
&#13;

而且,为了解决问题,这是一个ES6解决方案:

&#13;
&#13;
{
    let d=document,
        words=["Apple","Car","Building","Random"],
        text=d.getElementById("id"),
        error=d.getElementById("errorId"),
        node=text.appendChild(d.createTextNode("")),
        time=0,
        chars,writer;
    words.forEach(word=>{
        setTimeout(word=>{
            node.nodeValue=text.dataset.text="";
            writer=0;
            chars=word.split``;
            chars.forEach(char=>{
                writer+=50;
                setTimeout(char=>node.nodeValue+=char,writer,char);
            });
            setTimeout(word=>text.dataset.text=word,writer,word);
            time+=writer;
        },time,word);
        time+=3000;
    });
    setTimeout(()=>{
        text.classList.add("hide");
        error.classList.remove("hide");
    },time);
}
&#13;
*{margin:0px;padding:0px;}
body{
  background:pink;
  height:100vh;
  width:100vw;
}
.container{
  align-items:center;
  display:flex;
  height:100%;
  justify-content:center;
  width:100%;
}
.text{
  color:#20aaff;
  font-size:40px;
  font-weight:300;
  position:relative;
  text-transform:uppercase;
}
.text:before{
  animation:noise-anim-2 3s infinite linear alternate-reverse;
  clip:rect(0,900px,0,0);
  color:#a8d500;
  content:attr(data-text);
  left:-2px;
  overflow:hidden;
  position:absolute;
  text-shadow:1px 0 blue;
  top:0;
}
.text:after{
  animation:noise-anim 2s infinite linear alternate-reverse;
  clip:rect(0,900px,0,0);
  color:black;
  content:attr(data-text);
  left:2px;
  position:absolute;
  text-shadow:-1px 0 red;
  top:0;
  overflow:hidden;
}
.error{
  align-items:center;
  border:1px solid #ccc;
  display:flex;
  flex-direction:column;
  height:80%;
  justify-content:space-around;
  max-height:300px;
  text-align:center;
  width:80%;
  max-width:500px;
}
.error .errorHeader{
  display:flex;
  justify-content:center;
}
.error h1{
  font-size:72px;
  color:#20aaff;
  font-weight:700;
  text-transform:uppercase;
}
.error p{
  color:white;
}
.arrow-up {
  width: 0px;
  height: 0px;
  border-left: 40px solid transparent;
  border-right: 40px solid transparent;
  border-bottom: 70px solid white;
  position: relative;
  transform: translateY(15px);
}
.arrow-up:before{
  border-left:35px solid transparent;
  border-right:35px solid transparent;
  border-bottom:65px solid #20aaff;
  content:"";
  height:0px;
  position:absolute;
  transform:translate(-50%,5%);
  width:0px;
}
.arrow-up:after{
  content:"!";
  color:white;
  display:block;
  font-size:50px;
  position:absolute;
  transform:translate(-50%,15%);
}
.hide{display:none;}
@keyframes noise-anim{0%{clip:rect(23px,9999px,17px,0);}5%{clip:rect(34px,9999px,24px,0);}10%{clip:rect(34px,9999px,9px,0);}15%{clip:rect(20px,9999px,22px,0);}20%{clip:rect(5px,9999px,18px,0);}25%{clip:rect(15px,9999px,35px,0);}30%{clip:rect(26px,9999px,36px,0);}35%{clip:rect(26px,9999px,33px, 0);}40%{clip:rect(26px,9999px,5px,0);}45%{clip:rect(13px,9999px,28px,0);}50%{clip:rect(29px,9999px,38px,0);}55%{clip:rect(30px,9999px,13px,0);}60%{clip:rect(7px,9999px,36px,0);}65%{clip:rect(28px,9999px,14px,0);}70%{clip:rect(15px,9999px,16px,0);}75%{clip:rect(8px,9999px,8px,0);}80%{clip:rect(39px,9999px,2px,0);}85%{clip:rect(20px,9999px,18px,0);}90%{clip:rect(27px,9999px,8px,0);}95%{clip:rect(33px,9999px,14px,0);}100%{clip:rect(23px,9999px,25px,0);}}
@keyframes noise-anim-2{0%{clip:rect(5px, 9999px, 21px, 0);}5%{clip:rect(38px,9999px,11px,0);}10%{clip:rect(37px,9999px,18px,0);}15%{clip:rect(11px,9999px,38px,0);}20%{clip:rect(24px,9999px,13px,0);}25%{clip:rect(37px,9999px,25px,0);}30%{clip:rect(28px,9999px,40px,0);}35%{clip:rect(14px,9999px,33px,0);}40%{clip:rect(35px,9999px,3px,0);}45%{clip:rect(23px,9999px,19px,0);}50%{clip:rect(7px,9999px,18px,0);}55%{clip:rect(18px,9999px,15px,0);}60%{clip:rect(14px,9999px,31px,0);}65%{clip:rect(29px,9999px,4px,0);}70%{clip:rect(12px,9999px,2px,0);}75%{clip:rect(3px,9999px,38px,0);}80%{clip:rect(24px,9999px,39px,0);}85%{clip:rect(34px,9999px,12px,0);}90%{clip:rect(15px,9999px,11px,0);}95%{clip:rect(10px,9999px,14px,0);}100%{clip:rect(38px,9999px,21px,0);}}
&#13;
<div class="container">
  <p id="id" class="text"></p>
  <div id="errorId" class="error hide">
    <div class="errorHeader">
      <div class="arrow-up"></div>
      <h1>End</h1>
      <div class="arrow-up"></div>
    </div>
  </div>
</div>
&#13;
&#13;
&#13;

如果您希望保留当前的实施,请在第二个for循环之前添加以下行:

setTimeout(function(){document.getElementById("id").dataset.text=""},time);

在第二个for循环后立即添加以下行:

setTimeout(function(word){document.getElementById("id").dataset.text=word},time,words[x]);

给你以下内容:

setTimeout(function(){document.getElementById("id").dataset.text=""},time);
for(y=0;y<=words[x].length;y++){
    var word=words[x].substr(0,y)
    time=time+50;
    typeWord(word,time);
}
setTimeout(function(word){document.getElementById("id").dataset.text=word},time,words[x]);