- From: Alexandre Elias <aelias@chromium.org>
- Date: Wed, 27 Jun 2012 11:48:16 -0700
- To: Ojan Vafai <ojan@chromium.org>
- Cc: "Edward O'Connor" <eoconnor@apple.com>, www-style@w3.org, James Robinson <jamesr@chromium.org>
- Message-ID: <CADeTeo5S2RN2CFv7kbUYZ4Xbwq030x+=G-7TJ7vEaF9Ozk=HRA@mail.gmail.com>
I was also discussing this with jamesr just last week, we definitely agree the problem needs addressing. Like Ojan, I prefer a "position-contain" type approach as it's more general. For an example of a site that would benefit, if you visit http://google.com/ on a phone and tap "Restaurants", you'll get to a search results view with a fixed-positioned map with the "sticky"-style behavior (simulated in JS). Observe that the map drops out of view when you reach the bottom of the page, which I don't think is expressible by "sticky". There is another use case prominent in our minds, which is to start addressing the broken/undefined behavior of fixed-position in the presence of pinch zoom gestures. "position-contain" could allow webmasters to restrict fixed-position elements so they don't spill over important areas of the page when pinch zoom comes into play. For example, when there is a fixed-pos box meant to live in the left margin of a text paragraph, it could be restricted explicitly to that margin. (There is a wider discussion to be had around pinch zoom/fixed-pos, but I mainly want to emphasize that it will be an increasing problem as touchscreens get more common, and we should make sure new fixed-pos-related features build towards a framework that addresses it.) On Tue, Jun 26, 2012 at 9:30 PM, Ojan Vafai <ojan@chromium.org> wrote: > On Tue, Jun 26, 2012 at 4:50 PM, Edward O'Connor <eoconnor@apple.com>wrote: > >> Hi, >> >> Many web sites have elements that alternate between being in-flow and >> being position:fixed, depending on the user's scroll position. This is >> often done for elements in a sidebar that the page author desires to be >> always available as the user scrolls, but which slot into a space on the >> page when scrolled to the top. It can also be done for table headers >> which remain visible after the top of the table has been scrolled off- >> screen. >> >> Lots of sites, such as news.google.com (the "Top Stories" sidebar) and >> yelp.com (the search results map), use scroll event listeners in >> JavaScript to achive this effect. However, browsers are increasingly >> moving towards scrolling implementations that make use of hardware >> acceleration to improve performance, for example by leveraging the GPU, >> and doing scrolling on a thread other than the main UI thread. >> >> In this situation, browsers may use fast scrolling but fire scroll >> events asynchronously, which will result in rendering glitches on pages >> that update element positions from JavaScript via scroll events. >> Alternatively, the browser may fall into a slow scrolling mode when >> scroll events are listened for; this impacts the perceived quality of >> the browser's scrolling. To address this problem, common scrolling >> behaviors like this should be exposed declaratively, through CSS. >> >> A feature like this has been a long time coming. It was first proposed >> (for table headers) by the OEBPS (EPUB) folks on www-style in 2002[1]: >> >> > One of the examples of the desired layout\formatting behavior would be >> > that the header column would stay frozen if horizontal scrolling is >> > required to view additional columns of the table (similar to the >> > "Freeze Panes" option in Excel). >> >> Mikko Rantalainen proposed generalizing such a feature to elements other >> than table headers[2]: >> >> > Perhaps a new position value (e.g. "fixed-relative") that is a mix of >> > "relative" and "fixed": the content still reserves space in the flow >> > similar to relative but it would be displayed as fixed if the element >> > would not fit in the viewport but its containing block is visible. In >> > that case, the element would be "moved" within its containing block >> > until it would fully fit in the viewport. >> >> Mikko's proposal is very close to what we have in mind: a new value for >> the 'position' property, similar to relpos, but with a new method of >> calculating the element's offset. >> >> You'd use it like this: >> >> h1 { >> position: sticky; >> top: 10px; >> } >> >> This means that every <h1> in the document will "stick" 10 pixels from >> the viewport top when things scroll such that the <h1> would have been >> partially off-screen. When the viewport has scrolled such that the >> visible portion of the <h1>'s containing box is too small to fit the >> <h1>, it should stop at the containing box's edge and only be partially >> displayed. >> >> There are a lot of details to work out, of course. Doug raised several >> questions about such a feature in [3]; here are some preliminary >> thoughts on them. >> >> Doug wrote: >> > * should sticky content accumulate? >> >> No. In some future level of this feature, it might be worth >> investigating a new property or set of properties which could cause such >> accumulation. We should avoid this problem in the first level of this >> feature by having the sticky elements simply overlap, just as other >> positioned elements do. >> >> Doug wrote: >> > * what should be the behavior when a user jumps to the middle of a >> > containing block that would otherwise have a sticky header/footer >> > when scrolled (e.g. a row in the middle of a very long table, a >> > paragraph under a sticky <h2> itself under a sticky <h1>)? (I think >> > it the sticky content effect should be applied, though I suspect >> > this will make implementation rather more difficult.) >> >> The sticky effect should be applied, just like any other positioning >> scheme. >> >> Doug wrote: >> > * should there be an event that is thrown when content sticks, so >> > that the author can choose to enhance the effect via script or >> > declarative animation? >> >> No. A big advantage of this feature over emulations of it in JS is the >> lack of events. >> > > Great use-case. Something long-overdue for CSS to address. Some other > related use-cases: > 1. positioning an element with respect to another element (e.g. a rich > tooltip or formatting bar) without exceeding the bounds of the viewport. > 2. sticking an element to a boundary other than the viewport > > I think http://www.xanthir.com/blog/b48H0 addresses the same problem more > generally. The proposed solution to your use-case is hidden in the last > paragraph, i.e. add the position-contain/position-restrict property instead > of adding a new position value. This proposal also gives added flexibility > of whether you want the element to take part in layout. You can get sticky > behavior with absolute or relative positioning. > > For now, in order to address your use-case, we could just spec and > implement position-contain/position-restrict. position-root is only needed > for use-case 1 above and is a bit orthogonal I think. > > Ojan > > >> >> >> Thanks, >> Ted >> >> 1. http://lists.w3.org/Archives/Public/www-style/2002May/0153.html >> 2. http://lists.w3.org/Archives/Public/www-style/2009Dec/0165.html >> 3. http://lists.w3.org/Archives/Public/www-style/2009Dec/0204.html >> >> >
Received on Thursday, 28 June 2012 09:51:17 UTC