I am currently reading Designing with Web Standards by Jeffrey Zeldman (New Riders, 2003). After reading part I of this book I feel fully justified in my long-held aversion to web programming. Even now it is apparently only possible to get reasonably consistent results across all browsers by resorting to ugly hacks.
The immaturity of the whole field reminds me of programming the half-baked microcomputer BASIC interpreters of the early 1980s: some things that you want to do are either impossible or else can only be done in an extremely inefficient way. Well known principles such as "Keep each item of information in one and only one place" and "Use symbolic names for numerical constants" are just ignored. However, I suppose this immaturity is only to be expected in a field that has gone through an exponential growth phase during which new people have been coming into the field faster than good programming principles spread.
Zeldman's book provides a good account of both the horrors and the W3C's proposed cures and gives lots of practical examples. However, it is not an introductory book: it assumes a familiarity with HTML, XHTML and CSS.