Published on 2002-05-04 by John Collins. Socials: YouTube - X - Spotify - Amazon Music - Apple Podcast |
In the previous part of this series on dynamic layers, I discussed the basic concepts behind clipping layers using Cascading Style Sheets (CSS). While CSS styles form the basis of the animated demo you see on the right, CSS in itself is incapable of producing such an effect. In order to make the effect dynamic, we must employ a combination of JavaScript and the Document Object Model (DOM). Lets begin by looking at the script used in the demonstration.
<script language="JavaScript"> // animated clipping layer effect clipTop = 0; clipRight = 200; clipLeft = 200; clipBottom = 200; timer = null; function setClip() { clipLayer = document.getElementById('clipLay').style; clipLayer.clip.top = clipTop; clipLayer.clip.right = clipRight; clipLayer.clip.left = clipLeft; clipLayer.clip.bottom = clipBottom; if(clipRight < 400) { clipRight += 5; //set the increment values here... clipLeft -= 5; //...and here for horizontal clipping! clipLayer.clip = 'rect('+clipTop+','+clipRight+','+clipBottom+','+clipLeft+')'; setTimeout('setClip()', 10); } } </script>
This script can clip a layer on the horizontal axis or the vertical axis, or even both (although I've yet to try that!). The four variables at the top of the script, clipTop, clipRight etc., set the initial values for the layer's clipping plane. Once again with clipping, the difficulty lies in conceptualizing what is going on; the layer is effectively being split vertically in the middle (200 is the center of the 400px layer), and gradually being displayed outwards towards it's left edge (a clip value of 0px) and it's right edge (a clip value of 400px).
if(clipRight < 400) {
The if-statement begins by asking "is the right-clip value less than 400?", and if it is then both it and the left-clip value are incremented by 5 pixels towards the layers edges at 0px and 400px. This pixel increment value can be increased to speed up the animation, or vice versa to slow it down.
To switch the script to vertical clipping, change the above if-statement to look at the clipBottom value, which would start at half the height of the layer and increment to the layer's full height, and set the four initial values as follows:
clipTop = 100; clipRight = 400; clipLeft = 0; clipBottom = 100;
And the if-statement would now look like this:
if(clipBottom < 200) { clipTop -= 5; clipBottom += 5; clipLayer.clip = 'rect('+clipTop+','+clipRight+','+clipBottom+','+clipLeft+')'; setTimeout('setClip()', 10); }
Try it and see what difference it makes!
Updated 2020 : note that the above post is out-of-date, given this post was originally published in 2002, but is left here for archival purposes.