how to create a Typing Effect, an Eraser Effect and a Blinking Cursor using jQuery

First have a look at the demo page (opens in a new tab) to understand what we’re trying to accomplish. You can also download the tutorial’s source code.
For the blinking cursor effect, we’re going to simulate a DOS prompt. The CSS code of the tutorial is very simple. We just have to align all the paragraphs that will include the text parts in one line:
p
{
float: left;
}
The HTML code includes one paragraph that contains the characters “C:\” (the DOS prompt) and another paragraph named cursor that contains the “|” character, our cursor:
<p>C:\</p><p class="cursor">|</p>
To make the cursor blink, we will create a Javascript function named cursorAnimation(). Using jQuery’s animate() function we first make the cursor disappear setting its opacity setting to 0% and then appear again setting its opacity setting to 100%:
function cursorAnimation()
{
$("p.cursor").animate(
{
opacity: 0
}, "fast", "swing").animate(
{
opacity: 1
}, "fast", "swing");
}
We want this function to run continuously from the loading of the page, so we’re going to use the jQuery’s $(document).ready() function along with the setInterval() method that calls a function at specified intervals (in milliseconds):
$(document).ready(function()
{
setInterval ( "cursorAnimation()", 600 );
});
Now that we have the blinking cursor we’re going to create the typing effect (based on this tutorial). First, we have to alter our HTML code. We will include a paragraph called caption, a textbox so we can write our preferred caption in there and a button to test the typing effect:
<input type="text" id="userCaption" value="Type something here!" /> <input type="submit" name="submit" value="Test Typing Effect" onclick="testTypingEffect()"/> <p>C:\</p><p class="caption"></p><p class="cursor">|</p>
First, we define the variables captionLength and caption. When pressed, the button calls the testTypingEffect() function, that sets the textbox’s value to the caption variable and then calls the type() function. The type() function uses the substr() method to cut our preferred caption one letter forward each time it’s called and type it inside the paragraph named caption. Until all the letters of the caption are typed, the type() function calls itself with a delay of 50 milliseconds using the setTimeout() method.
var captionLength = 0;
var caption = "";
function testTypingEffect()
{
caption = $("input#userCaption").val();
type();
}
function type()
{
$('p.caption').html(caption.substr(0, captionLength++));
if(captionLength < caption.length+1)
{
setTimeout("type()", 50);
}
else
{
captionLength = 0;
caption = "";
}
}
For the eraser effect, we will alter again the html code adding another button which when pressed will call the testErasingEffect() function:
<input type="submit" name="submit" value="Test Erasing Effect" onclick="testErasingEffect()"/>
To create the eraser effect, we’ll create the reversed process. The testErasingEffect() function sets the caption paragraph’s content to the caption variable and then computes its length. If there isn’t any content, it types automatically sample content (just for testing reasons) and calls itself. Now that it has a content, it calls the erase() function which cuts letter-by-letter the caption until it’s all gone with a delay of 50 milliseconds.
function testErasingEffect()
{
caption = $("p.caption").html();
captionLength = caption.length;
if (captionLength>0)
{
erase();
}
else
{
$('p.caption').html("You didn't write anything to erase, but ok!");
setTimeout("testErasingEffect()", 1000);
}
}
function erase()
{
$('p.caption').html(caption.substr(0, captionLength--));
if(captionLength >= 0)
{
setTimeout("erase()", 50);
}
else
{
captionLength = 0;
caption = "";
}
}
If you haven’t done it already, have a look at the demo page (opens in a new tab) to test the effects. You can also download the tutorial’s source code.
Photo by ~Lily-D-Ray on deviantART

there are 23 comments:
Is it possibly to modify the script to loop in a cycle. With each separate text line, it first types it, then erases it, and then types the next text line, etc….
Many thanks.
Erik
I’m also interested to know if what Erik asked is possible?
Any help would be much appreciated.
Thank you,
Michael
Hello Eric & Michael. I didn’t read Erik’s comment until now.
Off the top of my head, you could place each separate line into an array and then modify the typing and erasing functions so they can work together (for example, when the typing is finished, the typing function itself calls the erasing function). Then, you can iterate through the array and for each line you can call the typing function, wait for it to finish etc.
I’ll try to work on an example when I find the time, most likely during the weekend.
Hello again,
You can find an example for what I described in the previous comment here. (source code)
Let me know of any issues/suggestions/questions.
Very nice. This is exactly what I was looking for (with the multiple lines effect). Thanks to Erik and Michael for the asking…and Burnmind (author) for the doing. Wondering now how to go about having this run automatically when a page finishes loading (instead of having to click a button)?
@Ryan: Just add type(); in the $(document).ready function.
Thank you. Worked perfectly. I’ve also been trying to make it continue to display the last line when it’s completed (instead erasing it)? Is that an easy change as well?
In the type() function, wrap the call to the erase() function in an if statement like this:
if(index < lines.length-1)
{
setTimeout(“erase()”, 500);
}
Uh oh. You lost me. I tried that in a few different places and just keep breaking the function (sorry…bit of a jquery noob here). Could I bother you for the full source code for that?
Replace the type() function with the following:
function type()
{
if(index < lines.length)
{
caption = lines[index];
$(‘p.caption’).html(caption.substr(0, captionLength++));
if(captionLength < caption.length+1)
{
setTimeout(“type()”, 50);
}
else
{
captionLength = caption.length;
if(index < lines.length-1)
{
setTimeout(“erase()”, 500);
}
index++;
}
}
}
That seems to break it as well. Could I possibly PM/email you for some help? so I don’t fill up the comments :(
I didn’t notice that the “<” character made the if condition to be treated as an html tag. I fixed it, so try again using the code in the previous comments. Now it should work properly.
Perfect. Thank you very much! Very impressive respond times too. I’ll have to peruse your site now and see what other helpful information you’re sharing. Thanks again.
Hmmm…just an afterthought – would it be easily doable to have the TypeWriter effect display multiple lines at the same time (and cursor blink only at the end of the last line)? Or is that going too far?
You’re welcome.
Try to do it as a homework. ;-)
Some ideas:
- The line is being written in the “caption” paragraph. You could have multiple paragraphs (with different IDs instead of the same class) acting as the multiple lines.
- Duplicate some of the typing/erasing effect code to make it work for all the paragraphs simultaneously. It might not be the pest practice, but it will get you going.
- The cursor is irrelevant of the typing effect, and it blinks wherever you place the paragraph with the class “cursor”.
Nice coding, very useful. Thanks
very cool. I’m about to dig in and make it repeat on finishing the last string in the array.
Hey, just wanted to express my thanks for this helpful tip/tutorial.
To expand on the comments, you can loop/repeat the array by adding the code below:
if(index==lines.length)
{
index = 0;
}
(put it in the type() function directly below the “index++;” line)
Pingback: 10 Best jQuery Tutorials For Text Effect - Design Freebies
I need help with the auto typing portion. Where does the type(); go?
nevermind i got it :P
Building on the code you gave for looping through the array of text, how would I go about deleting say the first two words of the first line, then simply typing some extra content. So:
Line 1 : Hello Line One
Delete to: Hello Line
Line 2: Hello Line Two
Delete to: Hello Line
Line 3: Hello Line Three
etc etc
Thanks in advance
@Dan, is this what you want?
It is quite possible that there is a more efficient way to accomplish it, but I believe it does what you described. :)
Thanks,
That was perfect ;)