Simple pure JavaScript plugin to rotate text snippets as if they were being typed.
A Pen by Secret Sam on CodePen.
Simple pure JavaScript plugin to rotate text snippets as if they were being typed.
A Pen by Secret Sam on CodePen.
<link href="http://fonts.googleapis.com/css?family=Raleway:200,100,400" rel="stylesheet" type="text/css" /> | |
<h1>This pen is | |
<span | |
class="txt-rotate" | |
data-period="2000" | |
data-rotate='[ "nerdy.", "simple.", "vanilla JS.", "pretty.", "fun!" ]'></span> | |
</h1> | |
<h2>A single <span> is all you need.</h2> |
var TxtRotate = function(el, toRotate, period) { | |
this.toRotate = toRotate; | |
this.el = el; | |
this.loopNum = 0; | |
this.period = parseInt(period, 10) || 2000; | |
this.txt = ''; | |
this.tick(); | |
this.isDeleting = false; | |
}; | |
TxtRotate.prototype.tick = function() { | |
var i = this.loopNum % this.toRotate.length; | |
var fullTxt = this.toRotate[i]; | |
if (this.isDeleting) { | |
this.txt = fullTxt.substring(0, this.txt.length - 1); | |
} else { | |
this.txt = fullTxt.substring(0, this.txt.length + 1); | |
} | |
this.el.innerHTML = '<span class="wrap">'+this.txt+'</span>'; | |
var that = this; | |
var delta = 300 - Math.random() * 100; | |
if (this.isDeleting) { delta /= 2; } | |
if (!this.isDeleting && this.txt === fullTxt) { | |
delta = this.period; | |
this.isDeleting = true; | |
} else if (this.isDeleting && this.txt === '') { | |
this.isDeleting = false; | |
this.loopNum++; | |
} | |
setTimeout(function() { | |
that.tick(); | |
}, delta); | |
}; | |
window.onload = function() { | |
var elements = document.getElementsByClassName('txt-rotate'); | |
for (var i=0; i<elements.length; i++) { | |
var toRotate = elements[i].getAttribute('data-rotate'); | |
var period = elements[i].getAttribute('data-period'); | |
if (toRotate) { | |
new TxtRotate(elements[i], JSON.parse(toRotate), period); | |
} | |
} | |
}; |
html,body { | |
font-family: 'Raleway', sans-serif; | |
padding: 3em; | |
font-size: 18px; | |
background: #222; | |
color: #aaa | |
} | |
h1,h2 { | |
font-weight: 200; | |
margin: 0.4em 0; | |
} | |
h1 { font-size: 3.5em; } | |
h2 { | |
color: #888; | |
font-size: 2em; | |
} | |
/** IMPORTANT STUFF **/ | |
.txt-rotate { | |
display: inline-block; | |
text-align: left; | |
} | |
.txt-rotate > .wrap { | |
/** this is the cursor **/ | |
border-right: 0.1em solid #666; | |
} |