My design process, and the one the handful of us advocating the concept of ‘MSM’ are advocating, is that you markup your content first using semantic markup with NO CONCERN for what the final page is going to look like. Certainly you might include some DIV containers to group various ‘sections’ like content and sidebar together, and a master #container div is always a good idea, but apart from that when making your HTML the last thing you should be thinking is ‘appearance’. What you should be thinking about is WHAT IS IT I am marking up. Is this a heading, is this heading a subsection of the previous heading or kin to it? If it’s kin, is the previous heading a h1? If so then it shouldn’t be. Is this a content paragraph? These italics I’m seeing in my copy, is it because of a book title like Moby Dick or text that is getting special emphasis – if you know what I mean. These images I’m adding, are they actually part of the page content warranting an image tag, or are they strictly presentational belonging in the CSS?
Once you have ALL of the content that is going on the page marked up, you start making your layout in CSS, bending that HTML to your will. Wherever possible adding to the html any sort of presentation or extra hangers should be avoided – though inevitably things like image sandbags may be required for things like glider-levin image replaceemnts or sliding doors. Most importantly TEST every major ‘section’ change in EVERY browser you can lay your hands on AS YOU GO. Time and time again you see on forums people asking “I have this layout completed in FF, and it’s broken in IE” – Their biggest mistake was completing the layout before even THINKING about testing it!
Then and ONLY then should you start up the goof assed paint program to hang graphics on your layout, or try to slice up that PSD made by the ‘designer’ who wouldn’t know accessability from the hole in their tuchas. ———————————————-
The second rule is one people have gotten incredibly LAZY about. Over-reliance on tools like htmlTidy, and rubbish like code completion and the ‘acid trip’ colour syntax highlighting have gotten programmers out of the habit of bothering to JUST WRITE CODE CORRECTLY IN THE FIRST DAMNED PLACE! If you master the tab key, don’t go nuts trying to compress everything to a single wrapping line (that **** really torques my nuts) and learn what tags are deprecated in your doctype – guess what? The only thing validation is likely to be needed for is checking to typo’s.
Another part of rule 2 is commenting – These days bad commenting is WAY more prevalant than a lack of commenting, and in a lot of cases the comments people use are pointless, silly and in the case of some of them, likely to trip rendering bugs in IE. (the much feared “Double Render” and “Dissapearing Content” quirks) Take this example: (apologies to the forum who’s deployed code I took this from!)
Code:
No, really? It’s the start of the navigation? I never would have guessed that a DIV would be the start of a block, or that the block would be a ‘nav’ given that it’s it’s class name is Navigation. This is the PINNACLE of piss poor commenting. On the flip side we have:
Code:
You don’t need to say ‘end’, we know what means. Likewise wouldn’t it be more meaningful to list the classname and not some vague abbreviation? This also puts the comment after the DIV. If in some skin we decide to float that div, the placement of the comment could trip those two pesky IE rendering bugs I mentioned because it would end up between .navigation and the table after. (and tables are well known to do the double render next to floats). Now, saying the name of the close is a good idea if the two end up more than 8-10 lines apart, or for ‘major’ section blocks so we do want something there – solution? Move the comment BEFORE the – which is why my own style guide says to do it thus:
Code:
Proper meaningful helpful comments are important – commenting for commentings sake is not. A good writeup on the topic of clear comprehensable code is available on IBM’s linux website. It is extremely insightful and I believe should be read by anyone serious about writing code:
http://www.ibm.com/developerworks/linux/library/l-clear-code/
You’ll notice I said ‘style guide’ – I’m a firm believer in consistancy of code formatting. Every programmer should be able to work within a style guide, and for their own use either adopt an existing style guide, or develop their own distributing it with all of your works. It gives other programmers a clue what you are doing – though if you use verbose meaningful classnames with a consistant indentation format, with consistant use of carriage returns to make blocks clear, it is doubtful few will ever have problems with whatever else you do in your ‘style’ For reference, the most recent revision of my style guide for HTML/CSS/JS is here:
http://battletech.hopto.org/html_tutorials/styleGuide.txt
(ok, that’s actually out of date and missing a paragraph, but you get the idea)
I tend to also use the above for my own PHP code for consistancy instead of the ‘recommended’ which to me is a confusing jumble. God forbid you use the same indenting and formatting styles for HTML, CSS, JS and PHP. ———————————————- These first two rules combine well with the third rule, which EVERYBODY knows as the KISS theory. An excellent example of this would be a contact form I was rewriting for a client last month. It was built off a framework example from their goldmine application – and was one of the WORST train-wrecks of code I’ve seen since the last time I poked my head into a turdpress installation. First off before we even TALK overcomplicated code, it had major ‘logic flow’ and security issues. The goldmine template for a contact form passes the username, password and URL to the e-mail server in a simple subtractive hex hash in hidden inputs IN THE FORM SENT TO THE USERS BROWSER!!! Anyone who knows what algorythm is used to encode this data could simply view source on the contact form, then hijack the e-mail server for their own purposes. WHAT NIMROD THOUGHT THIS WAS A GOOD IDEA?!? Worse, the code they used to decode the hash was unbelievably overthought. Get a load of this PHP:
Code:
function Decode($strValueIn) { //Do not modify this function! $intX = 0; $intY = 0; $Temp = ""; $Mod = ""; $intMod =0; $intTemp = 0; $ValueOut = ""; $intY = 1; $strValueOut=""; for ($intX=1; $intX