- From: Brian Kardell <bkardell@gmail.com>
- Date: Tue, 28 Feb 2012 18:15:42 -0700
- To: "Edward O'Connor" <eoconnor@apple.com>
- Cc: www-style@w3.org
- Message-ID: <CADC=+je+y7mjBiDOxKF1_8YNNZVECP1z1Tej98Zvqj7EkVp64g@mail.gmail.com>
I am not commenting on the value of the specific proposal, just noting that
it feels like you really want a media() function.
On Feb 21, 2012 5:59 PM, "Edward O'Connor" <eoconnor@apple.com> wrote:
> Hi all,
>
> It's all too easy for authors to make mistakes when adapting their sites
> for high-resolution displays such as the iPhone's Retina display.
> Consider the following stylesheet:
>
> …
> selector {
> background: url(foo-lowres.png) center;
> }
> …
> @media mq {
> …
> selector {
> background: url(foo-highres.png) center / 100px 100px;
> }
> …
> }
> …
>
> The references to the low- and high-resolution variants of foo.png are
> far apart from one another in the stylesheet, and the (potentially
> complicated) selector has been duplicated. On a large site with many
> image assets, this causes stylesheets to become very large and less
> maintainable. Here are just a few of the problems with the current
> situation:
>
> * Bugs due to non-locality: One developer fixes a bug in the selector,
> but only in the low-resolution case. Another developer changes an
> image reference to refer to a different icon, but only in the
> high-resolution case.
>
> * Both assets may be loaded by the browser, which may degrade
> performance in a constrained bandwidth environment.
>
> * Authors can't specify both assets inside a style="" attribute.
>
> I'd like to propose a new function for the Images module. This function
> will allow developers to provide, in a compact manner, multiple variants
> of the same image at differing resolutions. Using @media pushes the two
> asset references apart from one another, whereas such a function keeps
> related asset references together. It also helps keep selectors DRY.
> We've called it image-set(), and it takes one or more image specifiers.
> Image specifiers consist of an asset reference and a scale factor:
>
> image-set( imagespec [ ',' imagespec ]* )
> imagespec ::= <image> S {num} 'x'
>
> The above example could be rewritten using image-set() like so:
>
> selector {
> background: image-set(url(foo-lowres.png) 1x,
> url(foo-highres.png) 2x) center;
> }
>
> By using image-set() here, the author is saying that foo-highres.png is
> twice the resolution of foo-lowres.png. UAs which support image-set()
> could then use the 2x image on a high-resolution display, and the 1x
> image on a low-resolution display. UAs aren't required to fetch the
> assets in order to determine which should be displayed, so we avoid
> redundant asset loading.
>
> Some Q&A:
>
> * What's the intrinsic size of an image-set()? Does it vary depending on
> which image is picked? Does the UA apply the scale factor to derive
> the intrinsic size of the image?
>
> The intrinsic size of the image-set() can be computed from the
> intrinsic size of the actual image asset chosen and that asset's
> associated scale factor.
>
> Suppose that foo-lowres.png is 100x100 and foo-highres.png is 200x200
> in the above example. If the UA chooses foo-lowres.png, it computes
> the intrisnic size as (100/1)x(100/1) = 100x100. If the UA chooses
> foo-highres.png, it computes the intrisnic size as (200/2)x(200/2) =
> 100x100.
>
> * Why a scale factor and not a full-blown media query?
>
> Media queries are a claim about the state of the UA, whereas here
> we're making a claim about (the relationship between) the image assets
> themselves. It would be confusing to use similar syntax for such
> different things. Also, UAs should have the ability to choose between
> the given variants based on a variety of factors. For instance, a UA
> could use the lower res asset when a user has zoomed out. No existing
> media query distinguishes between the page being zoomed-out and being
> zoomed in. And even if such a media query existed, UAs should be free
> to choose between variant assets regardless of which media queries
> happen to match.
>
> * The problem of stylesheet verbosity when using media queries isn't
> limited to image assets. Shouldn't we have a general mechanism for
> keeping media-specific property values together in rule sets?
>
> In talking with content producers here, we've found that the
> non-locality of asset references is a real source of Web author pain.
> I think a focused feature to help with that pain is sensible. That
> said, we should also explore how to help authors avoid selector
> repetition and the other pains of @media in general.
>
> * Why not enhance the image() function instead of inventing a new
> function?
>
> Unlike image(), these image specifiers are unordered. This isn't about
> fallback. There is no preferred variant. UAs are free to use whichever
> image it believes would be best. For instance, consider the page zoom
> example I mentioned earlier. Authors could even use image() and
> image-set() together to handle more exotic cases, e.g.:
>
> image(image-set(url(foo.png) 1x, url(foo@2x.png) 2x) rtl,
> image-set(url(bar.png) 1x, url(bar@2x.png) 2x) ltr);
>
> * What about other cases where authors would like to specify alternative
> image assets, such as when the UA is on a low- or high-bandwidth
> connection?
>
> This is definitely something worth exploring. In the future we could
> extend the asset descriptors to cover such cases. Something like this,
> maybe:
>
> selector {
> background: image-set(url(foo-lowres.png) 1x low-bandwidth,
> url(foo-highres.png) 2x high-bandwidth);
> }
>
> I don't have a proposal for how to describe bandwidth here, though,
> and I'd love to hear ideas. I don't think addressing the multiple-
> resolutions case needs to wait for a solution to the bandwidth case.
>
> * What about content images?
>
> First off, this is www-style, so the design of an HTML feature for
> responsive <img>es is out of scope. :) That said, I can imagine the
> image-set() microsyntax being used in an attribute like so:
>
> <img alt="A description of foo"
> src=foo-lowres.png
> set="foo-lowres.png 1x, foo-highres.png 2x">
>
> I'll post something to the whatwg thread referencing this proposal.
>
>
> Ted
>
>
Received on Wednesday, 29 February 2012 01:16:10 UTC