- From: Ian Hickson <py8ieh@bath.ac.uk>
- Date: Wed, 26 Jan 2000 00:02:25 +0000 (GMT)
- To: Erik van der Poel <erik@netscape.com>
- cc: www-style <www-style@w3.org>, Karlsson Kent - keka <keka@im.se>
On Tue, 25 Jan 2000, Erik van der Poel wrote: >> # * em: the 'font-size' of the relevant font >> The only minor vagueness is whether one should use the specified, >> computed, or actual value of font-size. I tend to believe we should >> use the actual value of font-size for the first available font in >> the font-family list, but this is not (AFAIK) specified in the >> spec. > The actual value of font-size can be quite different from the > computed value. For example, some font families on Unix only support > bitmap fonts. Some X servers can be asked to scale the bitmaps, but > that is generally ugly. CSS allows the implementation to select a > different font size, which may even be as high as 20% off (or > higher). So, one wonders whether "em" was supposed to refer to the > computed or actual value. Right. Actual makes a lot of sense. Imagine a <span> with an inline background, and an image in it. span { font: 100px "Some Bitmapped Font"; } img { height: 1em; } The result the author is looking for is: -------------------------------------------- <- top of background TTT EEE \ / TTT TTT EEE \ / TTT image T E- X T T E- X T image T EEE / \ T T EEE / \ T image -------------------------------------------- <- bottom of background The image could be a vector, maybe a vector of some fancy glyph that is not in UNICODE. Now, if the span's text is _actually_ 10px high, but we use the computed value, the net result would be: ____________image__________ _TEXT_TEXT__image__________<- background image ...whereas if we use the _actual_ value for 1em, then it looks like: ___________________________ _TEXT_TEXT_#_______________<- background ...which is much closer to the author's expectations. >> I think 'em' is implemented pretty well and consistently. Maybe >> font-size, and certainly line-height and vertical-align, but the >> 'em' unit is generally well supported. (I have a test case >> somewhere...) > But if the style sheet author expects the UA to use the actual value > of font-size for "em", and if the UAs don't currently do this, then > we still have a problem. Yes, but not a big one. There are not many CSS-enabled browsers for X, are there? (Or are there?) If not, then we can decide the actual/computed thing without causing too many problems, since on Windows and Mac, TrueType fonts mean that this issue rarely becomes noticeable. > Kent claims that some European fonts fit more of the glyphs into the > em square (i.e. the accents above capital letters go inside), while > many American fonts appear to place the accents outside the em > square. I have a way around this problem. :-D I agree that setting the font's _ex_ height rather than _em_ height (in CSS terms) is a good idea. We can't invent a new property, due to that messing up inheritance. (See previous posts this month.) So why not make CSS3's font-size take on an additional "flag", namely "ex-size" or something, which indicates that the font-size value is setting the height of the font-size and not the height of the em-square? Then finding the _computed_ value of font-size, for the font in question, would involve (a) finding the ratio of em-height to ex-height for the font, (b) multiply the given height by the ratio. (I assume font-size-adjust becomes involved at some point here, but I'm not sure where!) What would be inherited? The _computed_ value of the font-size length given, and the presence of the "ex-size" flag. Examples are probably in order (!). Assume that the root element has :root { font-size: 100px; } ...in the following examples. This means that the font-size of the root element will be 100px, 1em will equal 100px if the first available font doesn't need scaling. The value that is inherited is "100px". Next, imagine a child of the root element, <a>. a { font-size: 200%; } No surprises here, the font size (em height) of <a> will be 200px. Children of <a> will inherit font-size as 200px (not 200%!). 1em will equal 200px if a scalable font is available. Now. A sibling of <a> is the element <b>, and element <b> will contain many subelements <b1>, <b2>, ... <bn> all with different fonts. But the author wants them to all have the same ex-height. So. b { font-size: ex-size 100px; } Assuming that the first font in font-family of element <b> is available and has an ex height of half the em square height (for a simple life -- I doubt it is actually realistic!) and is fully scalable, this means that the em height font size of element <b> is 200px. So 1em = 200px for element <b>. However, the font-size that is inherited is not 200px. It is 100px, with the ex-size flag. Now assume element <b1> (a child of element <b>) has a first font-family which is available, has an ex height of a quarter the em square height and is fully scalable. b1 { font-size: inherit; /* initial value */ } Its font-size will be inherited from <b>. Thus it will have a font-size of "ex-size 100px". Which means that the height of its em square is 400px! (1:1/4 * 100px = 400px). So 1em = 400px inside the <b1> element. Another child of the <b> element, <b2>, has this style: b2 { font-size: 1em; } This 1em is relative to the parent (<b>)'s font-size, and we said above that this was 200px. So regardless of the font-family, the font-size of element <b2> (and thus assuming ideal fonts the value of 1em for b2 as well) will be 200px. If the font of <b2> has an em:ex ratio different from <b>'s, then it will look wrong. Another child of <b>, <b3>: b3 { font-size: ex-size 1ex; } This is more logical, it means that the ex-height of element <b3> must equal the ex-height of element <b>. The ex-height of <b> is 100px, since the font in <b> is ideal. (Note that if the first font in <b> had not been scalable, then the ex height in <b> would not have been 100px!) Thus 1ex in <b3> equals 100px. 1em in <b3> equals the em:ex ratio for <b3>'s font times the ex height. If we say that the ex height is a third of <b3>'s font's em height, then 1em = 300px. A great advantage of this is that it is fully backwards compatible -- you can specify: { font-size: 100px; font-size: ex-size 80px; } ...and CSS1 and 2 browsers will set 1em to 100px, and work out 1ex, and CSS3 browsers will set 1ex to 80px, and work out 1em. I haven't worked out how this interacts with font-size-adjust. Nor have I worked out how this interacts with the absolute font sizes, xx-small to xx-large. Finally: I'm not sure I like this. It seems incredibly complicated if all we are trying to do is make sure that ex-heights are aligned... especially if that then makes something else look silly (like the width). Maybe it's just a lost cause? It is rather simpler than most other proposals I've seen, though, certainly from a using-it point of view. (Not necessarily from an understanding point of view, though...) -- Ian Hickson ("`-''-/").___..--''"`-._ http://www.bath.ac.uk/%7Epy8ieh/ `6_ 6 ) `-. ( ).`-.__.`) (_Y_.)' ._ ) `._ `. ``-..-' fL Member, Mozilla Quality Assurance _..`--'_..-_/ /--'_.' ,' Browser Standards Compliance Team (il).-'' (li).' ((!.-'
Received on Tuesday, 25 January 2000 19:02:31 UTC