- From: Brad Kemper <brkemper@comcast.net>
- Date: Sun, 18 Nov 2007 00:25:09 -0800
- To: W3C Emailing list for WWW Style <www-style@w3.org>
- Message-Id: <629BFDBD-B413-4B02-9D37-F9C79A372D15@comcast.net>
On Oct 19, 2007, at 9:25 AM, Brad Kemper wrote: >>> [1] http://meiert.com/en/blog/20070201/why-conditional-comments-are- >>> bad-repeat-bad/ >> >> The link gives good reason why conditional statements should be in >> the CSS (such as with @ua) instead of the HTML itself. It is why I >> often have to resort to CSS hacks in one CSS file, rather than adding >> conditional statements to every HTML file. I would much rather use a >> legitimate @ua rule (if it worked similarly to media queries) than >> the hacks I use now to get the job done. > > Sure, but as long as user-agents mean quite “differing” spec > implementations, those “hacks” – when really needed – are certainly > still more maintainable than having n style sheets polluting the > HTML (as with CCs) or having n “@ua” rules. The latter might be > slightly better, but it's still about having working, standards > compliant implementations, I fear :/ > > However, it will stay exciting ;) > > > Best regards, > Jens. > > -- > Jens Meiert > http://meiert.com/en/ Using a media query or @au would not necessitate extra files. They could be used to encapsulate rules within the same sheet. And they would be much, much more easily maintained than hacks that are based on changing support or interpretation of selector language. And I would be long dead if I held my breath waiting for all browsers to be exactly the same in the way they render CSS. I'm all for idealism in the concept of standards compliant implementations, but there is a more urgent need for something simple to handle lack of perfection in the real world. >> | min-build | max-build | min-version | max-version >> > > Getting people to update max-version retrospectively is the > problem. That's essentially why IE User-Agent strings spoof > Netscape, and why > everyone else, including Netscape(!) spoof IE, in the comment that > contains IE's real identity. > > Basically what happens is that the user agent gets updated to > remove a restriction, but the legacy web pages (and those cut and > paste coded from them) still effectively reject it. The result is > that the browser has to spoof the market leader to get round this. > > The original CSS concept was that unsupported properties were > simply ignored, so that they would automatically start working when > the browser starts supporting them. I know this makes pixel > perfect designs difficult. > -- > David Woolley I read something similar the interview with Bert Bos. It was a good interview, but that was the one thing he said that I completely disagree with (with all due respect, Mr. Bos). I think this group should try to recognize the lengths authors and designers have to go through in order to try to use features that are not universally supported. The hacks I discover and use are absolutely essential, yet they will inevitably break when the implementors change their support for some selector or another. Yet I use the hacks anyway, because I have no official way to deal with exceptions, and there will always be exceptions. Just hoping and campaigning for a perfect world in which all browsers support all aspects of CSS3 won't cut it. There will ALWAYS be varying levels of support, and the WG is failing us if they do nothing to recognize and help deal with that cold, hard fact. If there was a way to safely target different rendering engines and different versions of rendering engines, from within the style sheet, in a way that was officially supported by the browsers long term, then CSS authors around the world would stand up and cheer. The conditional statements in IE were the right idea, but in the wrong place (should be in the CSS, not the HTML, and that makes all the difference). I know there are several here that are afraid of repeating the situation with JavaScript in which new browsers had to spoof old browsers in order to be included, but the situation with CSS is completely different. You don't see Safari or FireFox or Opera trying to peer inside the IE conditional statements to get at the CSS there do you? Of course not, because they know that the only CSS they find there will be to work around the problems that IE has with rendering the CSS being served to all the other browsers. No other browser maker would spoof IE for that, unless their browser had the same rendering engine and the same problems to deal with. But it is not just IE that needs a few lines of its own CSS. FireFox is the only major browser (among the top 4) that doesn't support inline-block. They have inline-box ('box", not 'block"), but you can't do the same thing with its contents because things like margin and relative positioning don't seem to work the same within it. So in order to style an A tag just for FireFox (that at least SEEMS to look and behave similarly), I have to resort to relying on FireFox's different interpretation of what it means to negate the existence of an empty string as being a substring of another string. It looks like this: a.buttonlink:not([href*=""]) { /* FireFox-specific rules here */ } I can only hope that if FireFox changes their interpretation of this to match the other browsers, that at the same time they will start supporting inline-blocks the way the others do. If not, well, people using that browser are not going to get the same experience as they have now on the site I author. It won't be so nice for them until I can then find some other hack. If only I could do something like the following, I would sleep easier at night: @media all and (renderer: Gecko) { a.buttonlink { /* FireFox-specific rules here */ } } If a new version of Gecko comes out that changes what CSS I need to feed it, I am going to have to change my CSS regardless of whether I use hacks or something more officially supported. So lets say the new version doesn't need that bit any more because it now supports inline- block the same as everyone else. It would be really wonderful if I could then just change that line to something like this: @media all and (renderer: Gecko) and (max-build: 20071025) { a.buttonlink { /* "older" FireFox-specific rules here */ } } ...and be done with it. Instead, I have to worry about if it is still seeing that rule because it still believes it is right about what :not ([href*=""] means. In which case it would be picking up two sets of rules. and combining them in unexpected ways. That is but one example. I also use similar measures for other browser and for other situations: >> I use a background image on an input filed in order to simulate Safari's "placeholder" property for other browsers. It works out well, since Safari 2.x doesn't support background images on inputs. But the latest Webkits do, so I use a CSS hack to change the background for just Safari: @media all and (min-width: 0px) { body:not (:root:root) input#username { /* Just for latest Webkits */ } } Of course that will need updating once other browsers support media queries more, or the ones that do have a similar take on what body:not (:root:root) means. >> IE, including IE7, uses line-height differently than all the others, and the text always ends up shifted vertically compared to other browsers. So when I need it to be precise, I set line-height and padding for IE first, and then use a selector IE doesn't understand in order to "correct" it for other browsers: html>/**/body a.buttonlink { /* non-IE sees this */ } I could have used IE's conditional statements in the HTML instead, but I really don't want to add it to hundreds of HTML pages and then update them all when things change. It belongs in the CSS file. If IE8 had conditional statements in the CSS file that looked like CSS comments to other browsers, that would be OK, but something that is part of a standard would be much better. There are myriad other situations where IE- specific CSS is needed, but I won't get into that now. In the early days there were two browsers with very different feature sets. Authors built for one or the other and hung out a logo that said "best viewed in Netscape" or "best viewed in Internet Explorer", because their feature sets were pretty different, and designing for one meant rendering problems and JavaScript problems in the other. People used UA sniffing to minimize the errors the other browser would get. So new browsers would have to try to spoof an existing one. The CSS situation today is vastly different. There are 4 browsers that are pretty common, and 3 of them follow the specs closely (the other is playing catch-up). Most authors, therefore, design to the standards, and then use hacks or HTML conditional statements for that one with lots of market share. Or if it is a Web app for a corporate environment, they just design for that one and let their pages look horrible in everything else. If authors care about differences between the UA's (as I do) then they sprinkle in some hacks such as the ones I've described to deal with those differences, and try to make their pages look as good as possible in all common browsers. Those who would serve COMPLETELY different style sheets based on a white list of UA's that they sniff, well they are doing it already by sniffing on the server. Having better ways to serve up renderer-specific code is not going to make that any worse, and it will make the existing situation for designers much, much better. Even if you were to ignore everything else I have to say about CSS, I wish you could listen to me on this, and have this included in the standards and in the browsers. It is an absolutely real need that is frustrating a lot of designers today. I think media queries would be a great way to address the need.
Received on Sunday, 18 November 2007 08:25:28 UTC