Tuesday, April 27, 2010

Top 8 Principles of Effective Website Designing

Everything is guided by certain set of standards, rules and regulations. If the task is not driven by some guidelines, then it could face difficulties for its successful completion. The same is applicable to the Web Designing. Website designing can be unexpectedly difficult as in the present time, we need a website which should not only have appealing and attractive look but also amazing usability, should deliver right information and establish the company as a brand in the market. To its guidance and successful achievement of the objectives of website designing, below we have listed 10 principles for effective web designing:

1) Don’t test users patience: When you are going to offer products/services/tool to your customers, always try to involve users in some kind of interaction but with minimum users requirements. Let them explore out the maximum of the information or try/test out your service/product with as less possible number of actions. Do not ask for registration every time, ya but if it is required then keep it very short, simple and less time consuming. Keeping a long and time consuming registration is a big barrier to cut down your number of registrations and traffic.

2) Manage Navigation: One of the most poor and frustrating experience users can have is being unable to make out where you are or where you want to go. First of all there should be effective call to action buttons placed in the area of visibility of the customers. Buttons to travel around the site should be easily available to find and should be well described. In the small site, a big heading may help to orient your users. But in the big site, you can make use of bread crumb trails.

3) Don’t make users think too much: Every website is made with some objectives and intentions. The website should be such that it should be self explanatory and should resolve all the queries of the readers coming there. Keep the design and layout simple so that it would be easy for the users to comprehend the whole system.

4) Typography: Since the text is the most common element present in the website. There should be importance given to the selection of font sizes, choices. Spacing between lines and away from other objects is important to consider. Line length should not be too long so that it becomes hard to read. There should be paragraphing where ever required. Always remember make selection of the color and font of text in a way that it should be well read by the readers.

5) Keep the feature of simplicity in your design: Keep it simple should be the main theme of the site design. Users are not present on a site to enjoy the design; furthermore, in most cases they are looking for the information. Do not be afraid of the white space or empty space also. It is not always that if you have a lot of design elements in your website, then only your website would become effective and attractive. In other cases, simple design let your users to focus on the main objective of the website.

6) Usability: Web designing is not just about making a beautiful site. Put yourself in the shoes of your users. Think what your users will do after coming to your site. How easy you can make for them to perform the required task. If possibility, perform the usability testing for your website. In our previous post, we have discussed the importance of Usability testing and how it can be carried out.

7) Consistency and Clarity: Heading sizes, font choices, coloring, button styles, spacing, design elements, illustration styles, photo choices , we mean almost everything should match with each other. The consistency in the design is a sign of being professional where as inconsistencies like spelling mistakes lower the perception of the users. Maintain clarity in what you write and even the images or the videos should be of high quality

8) Effective Communication: The users will enjoy only if there will also participate in some kind of interaction. Let them be a part of demo tour or any other video clipping. The two way interaction is actually very helpful to maintain the interest of the readers and users. Always leave an option to comment, trackback, pingback after the blog or even in the contact page of website.

Just making an attractive website is not enough for your business, If you want to boost up your business with your website presence, you have to keep the above things in your mind. So be ready to give amazing website experience to your users with these helpful and useful principles.

from PixelCrayons

Thursday, April 15, 2010

A Simple CSS Drop-Cap

You can’t have failed to notice the drop-cap effect we’re using in the new blogs design, as well as the first-line uppercasing that most browsers display (except Safari, for reasons I’ll explain in a moment).

There are quite a few hacky methods for implementing this effect, but the cleanest and most maintainable is pure CSS, using the :first-letter and :first-line pseudo-classes.

This approach means no additional markup, no images, and no need to know about the content — whatever the first letter and first line are, they’ll have the effect applied.

Here’s the CSS that makes it happen:


1#post-content > p:first-child:first-line,
2#post-content > .ad:first-child + p:first-line
3{
4 text-transform:uppercase;
5 position:relative;
6 font-size:0.95em;
7 letter-spacing:1px;
8}
9
10#post-content > p:first-child:first-letter,
11#post-content > .ad:first-child + p:first-letter
12{
13 letter-spacing:0;
14 text-transform:uppercase;
15 color:#628fbe;
16 font-family:times,serif;
17 font-size:3.5em;
18 float:left;
19 margin:0.13em 0.2em 0 0;
20 line-height:0.7;
21}

view plain | print
#post-content > p:first-child:first-line,  #post-content > .ad:first-child + p:first-line {     text-transform:uppercase;     position:relative;     font-size:0.95em;     letter-spacing:1px; }  #post-content > p:first-child:first-letter,  #post-content > .ad:first-child + p:first-letter {     letter-spacing:0;     text-transform:uppercase;     color:#628fbe;     font-family:times,serif;     font-size:3.5em;     float:left;     margin:0.13em 0.2em 0 0;     line-height:0.7; }

You’ll notice how there are two different selectors attempting to apply the effect, to the first paragraph inside the content area. It needed to be flexible enough to allow for the presence, or lack, of an ad immediately before the paragraph, marked-up as

. So ideally I would have used :first-of-type, which selects the first element of a specified type within its parent context:


1#post-content > p:first-of-type:first-line
2{
3}
4
5#post-content > p:first-of-type:first-letter
6{
7}

view plain | print
#post-content > p:first-of-type:first-line { }  #post-content > p:first-of-type:first-letter { }

But that’s not as widely supported; the selectors we’re using mean we get support for IE8 that we otherwise wouldn’t.

For the first-line uppercasing we unfortunately don’t get support for Safari. It’s not because of the selectors — it supports all the examples shown here, and does apply other properties within those rules — it just doesn’t apply the text-transform. This is something I’ve noticed in a number of different situations, where Safari doesn’t apply the transform, for no readily-apparent reason. I’ve seen it fail to apply to an tag in the SitePoint HTML Reference." href="http://reference.sitepoint.com/html/input"> element where it worked for a corresponding tag in the SitePoint HTML Reference." href="http://reference.sitepoint.com/html/button">

For the drop-cap itself, you can see that it’s pretty simple to implement. The notable thing in that rule is the combination of margin-top and line-height that brings the letter into position. If we omit those two properties, we get this:


The drop-cap before line-height is applied.

What you’re seeing there, from left to right, is Firefox, Opera and Safari. And in fact it’s Firefox that’s rendering that incorrectly, while Opera and Safari get it right — Firefox is still applying the parent paragraph’s line-height to the first letter, ignoring its much-larger font size, while the other browsers are correctly applying a line-height that corresponds with the letter’s font-size.

So we can take advantage of the difference to even-out the result between browsers — reducing the line-height progressively, which makes no difference to Firefox, until we get a similar result in Opera and Safari (and IE8):


The drop-cap after line-height is applied.

Then it’s simply a case of adding margin-top until the vertical position looks right.

It’s not the first time I’ve seen this rendering behavior in Firefox. And since we have no CSS hacks that can apply only to Firefox, differences like this are really the only way we can apply browser tweaks. And as browser tweaks go, this one is entirely future-proof — if Firefox ever fixes its implementation and applies the correct line-height, it will come-out like the others in the first place.

It’s ironic really, that we should end up fixing every browser except Firefox, when Firefox is the only browser that gets it wrong! But that’s just how our industry works — Firefox, like your missus, is “always right”.

from SitePoint.com

CSS Specificity And Inheritance

CSS’ barrier to entry is extremely low, mainly due to the nature of its syntax. Being clear and easy to understand, the syntax makes sense even to the inexperienced Web designer. It’s so simple, in fact, that you could style a simple CSS-based website within a few hours of learning it.

But this apparent simplicity is deceitful. If after a few hours of work, your perfectly crafted website looks great in Safari, all hell might break loose if you haven’t taken the necessary measures to make it work in Internet Explorer. In a panic, you add hacks and filters where only a few tweaks or a different approach might do. Knowing how to deal with these issues comes with experience, with trial and error and with failing massively and then learning the correct way.

Understanding a few often overlooked concepts is also important. The concepts may be hard to grasp and look boring at first, but understanding them and knowing how to take advantage of them is important.

Two of these concepts are specificity and inheritance. Not very common words among Web designers, are they? Talking about border-radius and text-shadow is a lot more fun; but specificity and inheritance are fundamental concepts that any person who wants to be good at CSS should understand. They will help you create clean, maintainable and flexible style sheets. Let’s look at what they mean and how they work.

The notion of a “cascade” is at the heart of CSS (just look at its name). It ultimately determines which properties will modify a given element. The cascade is tied to three main concepts: importance, specificity and source order. The cascade follows these three steps to determine which properties to assign to an element. By the end of this process, the cascade has assigned a weight to each rule, and this weight determines which rule takes precedence, when more than one applies.

Please consider reading our previous related article:

[By the way: The network tab (on the top of the page) is updated several times a day. It features manually selected articles from the best web design blogs!]

1. Importance

Style sheets can have a few different sources:

  1. User agent
    For example, the browser’s default style sheet.
  2. User
    Such as the user’s browser options.
  3. Author
    This is the CSS provided by the page (whether inline, embedded or external)

By default, this is the order in which the different sources are processed, so the author’s rules will override those of the user and user agent, and so on.

There is also the !important declaration to consider in the cascade. This declaration is used to balance the relative priority of user and author style sheets. While author style sheets take precedence over user ones, if a user rule has !important applied to it, it will override even an author rule that also has !important applied to it.

Knowing this, let’s look at the final order, in ascending order of importance:

  1. User agent declarations,
  2. User declarations,
  3. Author declarations,
  4. Author !important declarations,
  5. User !important declarations.

This flexibility in priority is key because it allows users to override styles that could hamper the accessibility of a website. (A user might want a larger font or a different color, for example.)

2. Specificity

Every CSS rule has a particular weight (as mentioned in the introduction), meaning it could be more or less important than the others or equally important. This weight defines which properties will be applied to an element when there are conflicting rules.

Upon assessing a rule’s importance, the cascade attributes a specificity to it; if one rule is more specific than another, it overrides it.

If two rules share the same weight, source and specificity, the later one is applied.

2.1 How to Calculate Specificity?

There are several ways to calculate a selector’s specificity.

The quickest way is to do the following. Add 1 for each element and pseudo-element (for example, :before and :after); add 10 for each attribute (for example, [type=”text”]), class and pseudo-class (for example, :link or :hover); add 100 for each ID; and add 1000 for an inline style.

Let’s calculate the specificity of the following selectors using this method:

  • p.note
    1 class + 1 element = 11
  • #sidebar p[lang="en"]
    1 ID + 1 attribute + 1 element = 111
  • body #main .post ul li:last-child
    1 ID + 1 class + 1 pseudo-class + 3 elements = 123

A similar method, described in the W3C’s specifications, is to start with a=0, b=0, c=0 and d=0 and replace the numbers accordingly:

  • a = 1 if the style is inline,
  • b = the number of IDs,
  • c = the number of attribute selectors, classes and pseudo-classes,
  • d = the number of element names and pseudo-elements.

Let’s calculate the specificity of another set of selectors:

  • p style="color: rgb(0, 0, 0);"
    a=1, b=0, c=0, d=0 → 1000
  • footer nav li:last-child
    a=0, b=0, c=1, d=3 → 0013
  • #sidebar input:not([type="submit"])
    a=0, b=1, c=1, d=1 → 0111
    (Note that the negation pseudo-class doesn’t count, but the selector inside it does.)

If you’d rather learn this in a more fun way, Andy Clarke drew a clever analogy between specificity and Star Wars back in 2005, which certainly made it easier for Star Wars fans to understand specificity. Another good explanation is “CSS Specificity for Poker Players,” though slightly more complicated.

Starwars in CSS Specificity And Inheritance
Andy Clarke’s CSS Specificity Wars chart.

Remember that non-CSS presentational markup is attributed with a specificity of 0, which would apply, for example, to the font tag.

Getting back to the !important declaration, keep in mind that using it on a shorthand property is the same as declaring all of its sub-properties as !important (even if that would revert them to the default values).

If you are using imported style sheets (@import) in your CSS, you have to declare them before all other rules. Thus, they would be considered as coming before all the other rules in the CSS file.

Finally, if two selectors turn out to have the same specificity, the last one will override the previous one(s).

2.2 Making Specificity Work For You

If not carefully considered, specificity can come back to haunt you and lead you to unwittingly transform your style sheets into a complex hierarchy of unnecessarily complicated rules.

You can follow a few guidelines to avoid major issues:

  • When starting work on the CSS, use generic selectors, and add specificity as you go along;
  • Using advanced selectors doesn’t mean using unnecessarily complicated ones;
  • Rely more on specificity than on the order of selectors, so that your style sheets are easier to edit and maintain (especially by others).

A good rule of thumb can be found in Jim Jeffers’ article, “The Art and Zen of Writing CSS”:

Refactoring CSS selectors to be less specific is exponentially more difficult than simply adding specific rules as situations arise.

3. Inheritance

A succinct and clear explanation of inheritance is in the CSS3 Cascading and Inheritance module specifications (still in “Working draft” mode):

Inheritance is a way of propagating property values from parent elements to their children.

Some CSS properties are inherited by the children of elements by default. For example, if you set the body tag of a page to a specific font, that font will be inherited by other elements, such as headings and paragraphs, without you having to specifically write as much. This is the magic of inheritance at work.

The CSS specification determines whether each property is inherited by default or not. Not all properties are inherited, but you can force ones to be by using the inherit value.

3.1 Object-Oriented Programming Inheritance

Though beyond the scope of this article, CSS inheritance shouldn’t be confused with object-oriented programming (OOP) inheritance. Here is the definition of OOP inheritance from Wikipedia, and it makes clear that we are not talking about the same thing:

In object-oriented programming (OOP), inheritance is a way to form new classes […] using classes that have already been defined. Inheritance is employed to help reuse existing code with little or no modification. The new classes […] inherit attributes and behavior of the pre-existing classes. …

3.2 How Inheritance Works

When an element inherits a value from its parent, it is inheriting its computed value. What does this mean? Every CSS property goes through a four-step process when its value is being determined. Here’s an excerpt from the W3C specification:

The final value of a property is the result of a four-step calculation: the value is determined through specification (the “specified value”), then resolved into a value that is used for inheritance (the “computed value”), then converted into an absolute value if necessary (the “used value”), and finally transformed according to the limitations of the local environment (the “actual value”).

In other words:

  1. Specified value
    The user agent determines whether the value of the property comes from a style sheet, is inherited or should take its initial value.
  2. Computed value
    The specified value is resolved to a computed value and exists even when a property doesn’t apply. The document doesn’t have to be laid out for the computed value to be determined.
  3. Used value
    The used value takes the computed value and resolves any dependencies that can only be calculated after the document has been laid out (like percentages).
  4. Actual value
    This is the value used for the final rendering, after any approximations have been applied (for example, converting a decimal to an integer).

If you look at any CSS property’s specification, you will see that it defines its initial (or default) value, the elements it applies to, its inheritance status and its computed value (among others). For example, the background-color specification states the following:

Name: background-color
Value:
Initial: transparent
Applies to: all elements
Inherited: no
Percentages: N/A
Media: visual
Computed value: the computed color(s)

Confusing? It can be. So, what do we need to understand from all this? And why is it relevant to inheritance?

Let’s go back to the first sentence of this section, which should make more sense now. When an element inherits a value from its parent, it inherits its computed value. Because the computed value exists even if it isn’t specified in the style sheet, a property can be inherited even then: the initial value will be used. So, you can make use of inheritance even if the parent doesn’t have a specified property.

3.3 Using Inheritance

The most important thing to know about inheritance is that it’s there and how it works. If you ignore the jargon, inheritance is actually very straightforward.

Imagine you had to specify the font-size or font-family of every element, instead of simply adding it to the body element? That would cumbersome, which is why inheritance is so helpful.

Don’t break it by using the universal selector (*) with properties that inherit by default. Bobby Jack wrote an interesting post about this on his Five-Minute Argument blog. You don’t have to remember all of the properties that inherit, but you will in time.

Rarely does a CSS-related article not bring some kind of bad news about Internet Explorer. This article is no exception. IE supports the inherit value only from version 8, except for the direction and visibility properties. Great.

4. Using Your Tools

If you use tools like Firebug or Safari’s Web Inspector, you can see how a given cascade works, which selectors have higher specificity and how inheritance is working on a particular element.

For example, here below is Firebug in action, inspecting an element on the page. You can see that some properties are overridden (i.e. crossed out) by other more specific rules:

Firebug in CSS Specificity And Inheritance
Firebug in action, informing you how specificity is working.

In the next shot, Safari’s Web Inspector shows the computed values of an element. This way, you can see the values even though they haven’t been explicitly added to the style sheet:

Safari in CSS Specificity And Inheritance
With Safari’s Web Inspector (and Firebug), you can view the computed values of a particular element.

5. Conclusion

Hopefully this article has opened your eyes to (or has refreshed your knowledge of) CSS inheritance and specificity.

Even if you don’t think about them, these issues are present in your daily work as a CSS author. Especially in the case of specificity, it’s important to know how they affect your style sheets and how to plan for them so that they cause only minimal (or no) problems.

from Smashing Magazine

Monday, April 12, 2010

The Crafty Coder’s CSS Toolbox

Someone once said, ‘Style is all that matters.’, and if they didn’t, they should have. Mainly, because it would help make my point a little better, but also because the style applied to a design is one of the most powerful tools of an effective website. People are drawn in by design. Something immediately catches their eye, although it may take time for them to fully appreciate the entire site.

Now, I know the old saying that you can’t judge a book by its cover, and our society pushes us away from the shallow assessments we make about a person based solely on their appearance and with good reason, but when it comes to design, we do judge the look. The style that attracts us. Moves us. Encouraging us to explore the full depth of the design with all it has to say. And it all starts, with a look. A look that on the web is more often than not, crafted and applied through CSS.

CSS is one of the main components that drive web designer’s work home in exciting and stylistically individual ways. Ensuring that you have a deep and well stocked kit of CSS tools and resources is vital for keeping you ahead of the styling curve. Below is an awesome array of various toolbox additives that you can sort through to start building your own toolbox, or to add to your existing one. So whether you are just getting started in the CSS arena, or you have been haninging your hat there for some time, you are sure to find a useful tool or two in the assemblage I have gathered here.

General Tools

To get things started, I thought we would dive right into the general, all purpose section of the toolbox. A solid foundation is always beneficial before you start building towards specifics.

Conditional CSS allows you to write maintainable CSS with conditional logic to target specific CSS statements at both individual browsers and groups of browsers.

CSS Frame Generator – If you need a frame for your CSS work in a hurry, don’t worry, just turn to the trusty CSS Frame Generator. It’s all right there in the title.

CSS Sprite Generator – CSS sprites are a way to reduce the number of HTTP requests made for image resources referenced by your site. Images are combined into one larger image at defined X and Y coordinates. Having assigned this generated image to relevant page elements the background-position CSS property can then be used to shift the visible area to the required component image.

CSS Menu Generator has a large selection of menus that you can customize and download the image, html & CSS.

CSS Menu Builder is another instant menu site with tons of options.

CSS Form Code Generator generates CSS layout code to spice up your forms.

Primer undercoats your CSS by pulling out all of your classes and id’s, and placing them into a starter stylesheet.

Listamatic shows the power of CSS when applied to one simple list. You can find out how to do pretty much anything to a list here.

Deploy is a free, open source, web application which allows users to quickly deploy a web project framework with valid XHTML and CSS in only a matter of seconds.

Typography

Typography is a large part of most web endeavors, and is certainly getting a lot more attention than it used to. Make sure that you keep your type tools stocked and tight so your style doesn’t fall flat in this critical stage.

CSS TypeSet allows you to quickly and easily scan through and decide on any number of typographical CSS options for your project, and view the selections and alterations you make in real-time. Then, once you have found the settings that work for your project, the CSS code is given to you.

TypeChart lets you flip through, preview and compare web typography while retrieving the CSS.

Em Calculator is a small JavaScript tool which helps you make scalable and accessible CSS design. It converts size in pixels to relative em units, which are based on text size.

CSS Font and Text Style Wizard uses dynamic HTML to change the style of the table in-situ, without loading another page. It is cross-browser compatible with Firefox, Netscape, Internet Explorer, and other modern browsers.

CSS Text Wrapper allows you to easily make HTML text wrap in shapes other than just a rectangle. You can make text wrap around curves, zig-zags, or whatever you want.

Optimization and Validation

Naturally when you are working on your coding projects, you are going to want to take the extra time and effort towards optimizing your code and making sure that it validates. It’s the little things that show how much you care.

MinifyMe is an Adobe Air application that will compress your CSS and Javascript into one file.

CSSTidy is an opensource CSS parser and optimizer. It is available as an executable file (available for Windows, Linux and OSX) which can be controlled per command line and as a PHP script (both with almost the same functionality).

CSS Analyser allows you to check the validity of your CSS against the W3C’s validation service, along with a color contrast test, and a test to ensure that relevant sizes are specified in relative units of measurement.

CSS Validator is the W3C official CSS validator.

CSS Sorter is a free online tool for sorting CSS files. It organizes CSS rules alphabetically so that it will be easier for you to maintain your CSS files.

Frameworks and Grids

It is hard to talk about CSS without talking about two very useful aids, frameworks and grids, and some would say it is impossible to do so. Since I didn’t try, it is hard for me to remain objective. But look, framework and grid related tools a plenty.

Typogridphy is a CSS framework constructed to allow web designers and front-end developers to quickly code typograhically pleasing grid layouts.

Bluetrip is a full featured and beautiful CSS framework which originally combined the best of Blueprint, Tripoli (hence the name), Hartija, 960.gs, and Elements, but has now found a life of its own.

Blueprint gives you a solid foundation to build your project, with an easy-to-use grid, sensible typography, useful plugins, and even a stylesheet for printing.

YUI 2: Grids CSS offers four preset page widths, six preset templates, and the ability to stack and nest subdivided regions of two, three, or four columns. The 4kb file provides over 1000 page layout combinations.

960 Grid System is an effort to streamline web development workflow by providing commonly used dimensions, based on a width of 960 pixels. There are two variants: 12 and 16 columns, which can be used separately or in tandem.

Grid Designer is just that, a fantastic site for designing your own custom grids to use in your CSS stylesheets.

Variable Grid System is a quick way to generate an underlying CSS grid for your site. The CSS generated file is based on the 960 Grid System.

Browser Tools

I thought I would wrap up with a little bit of toolage for transforming your web browser into a powerful developer tool in and of itself. Always a handy set of implements to optimize and trick out your web browsing and debugging experience.

Collection of Web Developer Tools, per Browser seeks to list the best tools available and quickly describe how to activate/install/use them.

That’s a Wrap

I hope that gets you started or moves you along a little farther in compiling and putting together your very own CSS toolbox. Feel free to add your favorite tools for CSS’ing in the comments below to help others build on from here.

from My Ink Blog

Thursday, April 1, 2010

Document Links Styled with CSS Attribute Selectors

Document Links Styled with CSS Attribute Selectors

With CSS3 gaining popularity so are CSS attribute selectors. CSS attribute selectors have been around for some time however CSS3 adds more selectors to the mix bringing new light to subject. Increased browser support, with nearly every major browser currently supporting attribute selectors (Internet Explorer 6 still struggles), has also added to the popularity.

So what benefit do CSS attribute selectors have to adding style to document links? CSS attribute selectors allow you to quickly and easily add styles to document links while keeping your code clean and clutter free. Ultimately, the more attractive looking your links are the more clicks they will receive.

PDF Hyperlink Example

HTML Code

<a href="#.pdf" title="PDF File Link">PDF File</a>

CSS Code

a[href$=".pdf"] {
background: url(acrobat.jpg) no-repeat left center;
padding-left: 20px;
}

Output

PDF File

Breaking Down the Attribute Selector

You start your CSS just as if your were to style any other hyperlink. Directly following the a element comes the attribute selector, in this case [href$=".pdf"]. The attribute selector will always be wrapped in [] brackets and will always sit right next to the element to which it applies to without any spaces in-between the two.

Within the [] brackets the href attribute is declared as we are specifically targeting hyperlinks. Next we insert the $= selector, which specifies that we only want to target hyperlinks ending with the file format value to follow. For this example we are using a PDF document making the value .pdf, which is wrapped in "" quotations.

To target any other type of document just change the value to what ever file extension you wish. As an example, to target Microsoft Word documents just change the .pdf value to .doc.

Taking It a Step Further

Chris Coyier from CSS-Tricks has put together and outstanding resource on CSS attribute selectors in his article “The Skinny on CSS Attribute Selectors”. To learn the full potential of CSS attribute selectors this article is a must read as it does a great job of breaking them down for you.

If you are worried about the lack of support for Internet Explorer 6 you can, with a some additional work, use CSS attribute selectors via jQuery. Zac Gordon has written a great tutorial, “Selecting and Styling External Links, PDFs, PPTs, and other links by file extension using jQuery”, on how to do so.

Adding an icon to your document links is a great way to quickly draw more attention to the link. InstantShift has put together an article packed full of icons. If you would like some to use on your website check out the article at “75 Free Useful Icon Sets for Web Designers and Developers”.

from letscountthedays