I’ve written this code. It rotates two divs like a card flip using css transform every 1000ms and displays new text in the div, which is drawn from an array. It runs infinitely.
But once the array reaches its end I get an ‘undefined’ value because the i++ is incrementing on the final array item. I have been going crazy trying to figure out how to prevent that. Any help?
Codepen: https://codepen.io/warpigs666/pen/OJpBKdy
JavaScript
x
76
76
1
<style>
2
#flip-card {
3
width: 100px;
4
height: 50px;
5
}
6
#flip-card-inner {
7
position: relative;
8
width: 100%;
9
height: 100%;
10
transition: transform 0.6s;
11
transform-style: preserve-3d;
12
}
13
#textDiv1 {
14
background-color: lightblue;
15
position: absolute;
16
width: 100%;
17
height: 100%;
18
backface-visibility: hidden;
19
text-align: center;
20
}
21
22
#textDiv2 {
23
background-color: lightcoral;
24
position: absolute;
25
width: 100%;
26
height: 100%;
27
backface-visibility: hidden;
28
text-align: center;
29
transform: rotateX(180deg);
30
}
31
</style>
32
33
<body>
34
35
<div id="flip-card">
36
<div id="flip-card-inner">
37
<div id="textDiv1">
38
one
39
</div>
40
<div id="textDiv2">
41
set via script
42
</div>
43
</div>
44
</div>
45
46
<script>
47
var flipCard = document.getElementById('flip-card');
48
var flipCardInner = document.getElementById('flip-card-inner');
49
var textDiv1 = document.getElementById('textDiv1');
50
var textDiv2 = document.getElementById('textDiv2');
51
var wordArray = ["one", "two", "three", "four", "five"]
52
53
var i = 1;
54
55
function flipText(){
56
textDiv2.innerHTML = wordArray[i];
57
flipCardInner.style.transform = "rotateX(180deg)";
58
59
setTimeout(
60
function() {
61
textDiv1.innerHTML = wordArray[i++];
62
flipCardInner.style.transform = "rotateX(360deg)";
63
}, 1000
64
);
65
66
if (i<wordArray.length){
67
i++;
68
}
69
else {i=0;}
70
}
71
72
var flipIt = setInterval(flipText, 2000);
73
74
</script>
75
</body>
76
Advertisement
Answer
This is a job for setInterval
JavaScript
1
34
34
1
var flipCard = document.getElementById('flip-card');
2
let flipCardInner = document.getElementById('flip-card-inner');
3
let textDiv1 = document.getElementById('textDiv1');
4
let textDiv2 = document.getElementById('textDiv2');
5
let wordArray = ["one", "two", "three", "four", "five"];
6
7
let i = 0;
8
let timerVal = 1000;
9
10
function getI(i) {
11
if (i < wordArray.length - 1) return i + 1;
12
else return 0;
13
}
14
let ctr = 1,
15
useDiv; // ctr and useDiv will help to toggle between divs in our loop and also increment the transform number
16
17
textDiv1.innerHTML = wordArray[i]; // initialize
18
19
function flipText() {
20
i = getI(i);
21
useDiv = (useDiv == textDiv2) ? textDiv1 : textDiv2;
22
useDiv.innerHTML = wordArray[i];
23
flipCardInner.style.transform = "rotateX(" + (ctr * 180) + "deg)";
24
ctr++;
25
}
26
27
let interval
28
window.onload = function() {
29
// we'll still delay the beginning of the infinite loop, but then we set it to an interval, so it runs forever.
30
// if you need to stop it in your code, just use clearInterval(interval)
31
setTimeout(() => {
32
interval = setInterval(() => flipText(), timerVal);
33
}, timerVal);
34
}
JavaScript
1
32
32
1
#flip-card {
2
width: 100px;
3
height: 50px;
4
perspective: 100px;
5
}
6
7
#flip-card-inner {
8
position: relative;
9
width: 100%;
10
height: 100%;
11
transition: transform 0.6s;
12
transform-style: preserve-3d;
13
}
14
15
#textDiv1 {
16
background-color: lightblue;
17
position: absolute;
18
width: 100%;
19
height: 100%;
20
backface-visibility: hidden;
21
text-align: center;
22
}
23
24
#textDiv2 {
25
background-color: lightcoral;
26
position: absolute;
27
width: 100%;
28
height: 100%;
29
backface-visibility: hidden;
30
text-align: center;
31
transform: rotateX(180deg);
32
}
JavaScript
1
10
10
1
<div id="flip-card">
2
<div id="flip-card-inner">
3
<div id="textDiv1">
4
5
</div>
6
<div id="textDiv2">
7
8
</div>
9
</div>
10
</div>