A Tutorial for rounded corners with drop shadows
There are many ways to do rounded corners on web pages. This tutorial describes a solution based on RUZEE.Borders. It shows how the web page has to be structured and how to add a drop shadow to an HTML element - everything without using any pre-rendered images.
Step 1 - HTML/CSS basics
We’ll start with a simple HTML page. The body of the page is pretty simple:
<div class="bordered"> <p>This is the paragraph</p> <p>This is another paragraph</p> </div>
The DIV, which has the class “bordered”, is used to define the width and the style - in our example for drawing a border around. There are two paragraphs in this inner DIV, basically to add some text so we’ve got something to read ;-).
The definition of the class, i.e. the definition of the style of the HTML elements on the page, takes place in an internal Cascading Style Sheet (CSS):
.bordered {
width:200px;
border:3px red solid;
padding:30px;
}
The DIV will get the width of 200 pixels by the class definition “.bordered” (which is a CSS selector). It will also get a solid red border with a width of 3 pixels and a padding of 30 pixels which lets the text inside have some spacing to the red border. This padding will be important later on, when we round the border. Ah, right - of course up to now, the border is not rounded and there’s no shadow. We’ve just used basic HTML/CSS methods to get our result.
See how the whole page looks like here (and view the source code, of course ;-)).
Step 2 - Let the script round it
To round the border, RUZEE.Borders and its dependencies have to be included. This is done with the following lines in the header of the HTML document:
<script type="text/javascript" src="cssquery2-p.js"></script> <script type="text/javascript" src="ruzeeborders.js"></script>
The first line includes cssQuery, a library by Dean Edwards that makes CSS selectors usable via JavaScript. The second line includes RUZEE.Borders.
Once the scripts have been included, they can be used via “self-made” JavaScript code. So, let’s round the border from “Step 1″ now:
RUZEE.Borders.add({
".bordered" : {
borderType:"shadow",
cornerRadius:15,
shadowWidth:10
}
});
As you can see, this looks similar to the CSS definition. We see the CSS selector “.bordered” again and the meaning is just the same as within CSS: all properties afterwards will be applied to the HTML elements matching the criteria. In our example, this is the one DIV in our page.
It will get a shadowed border (borderType:"shadow") with a corner radius of 15 pixels and a shadow width of 10 pixels.
The image on the right explains these terms. The corner radius is the number of pixels from the center of the corner to its border (inclusive): “c” in the image.
The shadow width is the number of pixels from the border (exclusive) till the shadow is completely faded out: “s” in the image.
The previous code snippet however doesn’t do the actual rendering of the round borders. It just defines how to do that. The rendering is done via RUZEE.Borders.render(), but before rendering can start, the web page has to be loaded completely.
JavaScript has an event for this: window.onload. Inside this event you can add your code. You have to do the following:
window.onload=function(){
RUZEE.Borders.render();
};
That’s it! You’ll now see a nice round border with a drop shadow on your site. Try it (and again have a look at the source code)!
As has been mentioned in “Step 1″, it is very important that you add some padding to the elements you want to round. This is because RUZEE.Borders draw themselves “into” the padding area and hence use some of the padding. As a rule of thumb the padding should be at least “corner radius + shadow width” pixels. But add some more pixels so the text will still have some spacing to the border, even when rounded.
Hi, the name's Steffen and I'm writing about the Web, programming
and all those things coming to my mind. Enjoy your stay.
July 31st, 2006 at 20:55
IE has a horizonal gap. How do I eliminate this?
August 3rd, 2006 at 21:15
Do you have a screenshot for this? Its an unknown problem to me…
August 9th, 2006 at 19:19
Hi,
I’ve got a problem with the heigth parameter is there any way to use % instead of pix, my table/cell is first loaded at a certain size (the content of this table is small), then the user in a left menu select something to update the content of this table/cell, this content is longer than the previous one, but it doesn’t change the size of my table/cell it just add a scroll bar ?
Thanks
David
August 9th, 2006 at 20:57
@David: Percentage heights are not possible. RUZEE.Borders have to add/subtract some pixels from the height you specify and adding/subtracting pixels from percentages is … well .. kind of hard
If you need “fluid, identical heights”, check out my posting on that issue.
August 21st, 2006 at 3:37
Great script. I applied it to a web site I maintain and did also notice a horizontal gap in IE as mentioned in the first post. See the box in the middle of the page of http://www.ledomedesprit.com/. The gap is just below the top corners of the box.
August 21st, 2006 at 4:03
PS, here’s a screen shot for the gap issue, using your own demo page. I’m on IE 6.0, windows XP SP2.
August 21st, 2006 at 18:27
Your screenshot looks extremely strange. It seems that your IE scales the pixels. It’s not just the gaps that worry me, it’s the whole rendering of the border. Do you have something like a “magnifying glass” IE extension installed? I know that Opera can do this, but my tests with Opera were ok…
August 21st, 2006 at 22:59
My IE install is just the out-of-the-box one; no extensions of any kind. I don’t normally use IE, but use FireFox and Opera in stead. There’s something strange in general with images on any webpage in IE on that particular notebook (Dell Inspiron): they look very pixelated. So I suspect it’s not something specific in your script. Anyway, your borders look great on every other browser/PC I tried.
December 11th, 2006 at 21:03
confused about step 2.
Where should add those codes?
thanks,
Kevin
December 28th, 2006 at 1:12
Looks great; THANKS!!
I have a few suggestions/complaints/requests (feel free to ignore, but …):
1. I need some docs! For example, can I round borders on only the top (or bottom)
of an element?
2. I’d rather see only a single global name; for the most part, you do this (RUZEE);
but there are a few stray functions (rzCC, rzGetStyle, etc.); couldn’t these be
properties of the RUZEE object?
3. Adding a method to a native object (Math.sqr) feels unfair. It’s just as well to
define the sqr method as a property of the RUZEE object, and then there’s no
pollution of anybody else’s namespace.
1 2 Next > Show All
Leave a Reply