css-overflow/Overview.bs

Thu, 08 Jun 2017 13:17:28 +0900

author
Florian Rivoal <[email protected]>
date
Thu, 08 Jun 2017 13:17:28 +0900
changeset 19381
dbe1da284fb5
parent 19338
c45899621895
child 19383
68f652c3f1eb
permissions
-rw-r--r--

[css-contain][css-overflow-4] refactoring

Move interaction between contain and fragmentation of overflow to
the css-overflow-4 specification

Closes #1374

     1 <h1>CSS Overflow Module Level 4</h1>
     2 <pre class="metadata">
     3 Status: ED
     4 Work Status: Exploring
     5 ED: https://drafts.csswg.org/css-overflow-4/
     6 Shortname: css-overflow
     7 Group: csswg
     8 Level: 4
     9 TR: https://www.w3.org/TR/css-overflow-4/
    10 Previous version: https://www.w3.org/TR/css-overflow-3/
    11 Editor: L. David Baron, Mozilla https://www.mozilla.org/, https://dbaron.org/
    12 Editor: Florian Rivoal, On behalf of Bloomberg, http://florian.rivoal.net/
    13 Abstract: This module contains the features of CSS relating to new mechanisms of overflow handling in visual media (e.g., screen or paper).  In interactive media, it describes features that allow the overflow from a fixed size container to be handled by pagination (displaying one page at a time).  It also describes features, applying to all visual media, that allow the contents of an element to be spread across multiple fragments, allowing the contents to flow across multiple regions or to have different styles for different fragments.
    14 Ignored Terms: scroll
    15 </pre>
    16 <pre class="link-defaults">
    17 type: dfn; spec:css-multicol-1; text:overflow column
    18 spec:css-pseudo-4; type:selector; text:::first-letter
    19 spec:css-pseudo-4; type:selector; text:::first-line
    20 </pre>
    21 <pre class="anchors">
    22 url: https://drafts.csswg.org/selectors-3/#subject; type: dfn; text: subject;
    23 </pre>
    24 	<style>
    25 		table.source-demo-pair {
    26 			width: 100%;
    27 		}
    29 		.in-cards-demo {
    30 			width: 13em;
    31 			height: 8em;
    33 			padding: 4px;
    34 			border: medium solid blue;
    35 			margin: 6px;
    37 			font: medium/1.3 Times New Roman, Times, serif;
    38 			white-space: nowrap;
    39 		}
    41 		.bouncy-columns-demo {
    42 			width: 6em;
    43 			height: 10em;
    44 			float: left;
    45 			margin: 1em;
    46 			font: medium/1.25 Times New Roman, Times, serif;
    47 			white-space: nowrap;
    48 		}
    49 		.bouncy-columns-demo.one {
    50 			background: aqua; color: black;
    51 			transform: rotate(-3deg);
    52 		}
    53 		.bouncy-columns-demo.two {
    54 			background: yellow; color: black;
    55 			transform: rotate(3deg);
    56 		}
    58 		.article-font-inherit-demo {
    59 			font: 1em/1.25 Times New Roman, Times, serif;
    60 			white-space: nowrap;
    61 		}
    62 		.article-font-inherit-demo.one {
    63 			width: 12em;
    64 			font-size: 1.5em;
    65 			margin-bottom: 1em;
    66 			height: 4em;
    67 		}
    68 		.article-font-inherit-demo.two {
    69 			width: 11em;
    70 			margin-left: 5em;
    71 			margin-right: 2em;
    72 		}
    74 		.dark-columns-demo {
    75 			width: 6em;
    76 			height: 10em;
    77 			float: left;
    78 			margin-right: 1em;
    79 			font: medium/1.25 Times New Roman, Times, serif;
    80 			white-space: nowrap;
    81 		}
    82 		.dark-columns-demo.one {
    83 			background: aqua; color: black;
    84 		}
    85 		.dark-columns-demo.one :link {
    86 			color: blue;
    87 		}
    88 		.dark-columns-demo.one :visited {
    89 			color: purple;
    90 		}
    91 		.dark-columns-demo.two {
    92 			background: navy; color: white;
    93 		}
    94 		.dark-columns-demo.two :link {
    95 			color: aqua;
    96 		}
    97 		.dark-columns-demo.two :visited {
    98 			color: fuchsia;
    99 		}
   101 		.article-max-lines-demo {
   102 			font: 1em/1.25 Times New Roman, Times, serif;
   103 			white-space: nowrap;
   104 		}
   105 		.article-max-lines-demo.one::first-letter {
   106 			font-size: 2em;
   107 			line-height: 0.9;
   108 		}
   109 		.article-max-lines-demo.one {
   110 			font-size: 1.5em;
   111 			width: 16em;
   112 		}
   113 		.article-max-lines-demo.two {
   114 			width: 11.5em;
   115 			float: left; margin-right: 1em;
   116 		}
   117 		.article-max-lines-demo.three {
   118 			width: 11.5em;
   119 			float: left;
   120 		}
   121 	</style>
   123 <h2 id="intro">
   124 Introduction</h2>
   126 Note: At the time of writing, [[CSS-OVERFLOW-3]] is not completely finalized yet.
   127 To avoid accidental divergences and maintenance overhead,
   128 This specification is written as a delta specification over css-overflow Level 3.
   129 Once the level 3 specification is final,
   130 its content will be integrated into this specification,
   131 which will then replace it.
   132 Until then, this specification only contains additions and extensions to level 3.
   134 	<p>
   135 		In CSS Level 1 [[CSS1]], placing more content than would fit
   136 		inside an element with a specified size
   137 		was generally an authoring error.
   138 		Doing so caused the content to extend
   139 		outside the bounds of the element,
   140 		which would likely cause
   141 		that content to overlap with other elements.
   142 	</p>
   144 	<p>
   145 		CSS Level 2 [[CSS21]] introduced the 'overflow' property,
   146 		which allows authors to have overflow be handled by scrolling,
   147 		which means it is no longer an authoring error.
   148 		It also allows authors to specify
   149 		that overflow is handled by clipping,
   150 		which makes sense when the author's intent
   151 		is that the content not be shown.
   152 		This was further refined in the CSS Overflow Module Level 3 [[CSS-OVERFLOW-3]].
   153 	</p>
   155 	<p>
   156 		However, scrolling is not the only way
   157 		to present large amounts of content,
   158 		and may even not be the optimal way.
   159 		After all, the codex replaced the scroll
   160 		as the common format for large written works
   161 		because of its advantages.
   162 	</p>
   164 	<p>
   165 		This specification introduces
   166 		a mechanism for Web pages to specify
   167 		that an element of a page should handle overflow
   168 		through pagination rather than through scrolling.
   169 	</p>
   171 	<p>
   172 		This specification also extends the concept of overflow
   173 		in another direction.
   174 		Instead of requiring that authors specify a single area
   175 		into which the content of an element must flow,
   176 		this specification allows authors to specify multiple fragments,
   177 		each with their own dimensions and styles,
   178 		so that the content of the element can flow from one to the next,
   179 		using as many as needed to place the content without overflowing.
   180 	</p>
   182 	<p>
   183 		In both of these cases, implementations must
   184 		break the content in the block-progression dimension.
   185 		Implementations must do this is described
   186 		in the CSS Fragmentation Module [[!CSS3-BREAK]].
   187 	</p>
   189 <h2 id="overflow-concepts">Types of overflow</h2>
   191 	Issue: copy level 3 content when final
   194 <h2 id="overflow-properties">Overflow properties</h2>
   196 	Issue: copy level 3 content when final
   199 <h2 id="scollbar-gutter-property">
   200 Reserving space for the scrollbar: the 'scrollbar-gutter' property</h2>
   202 The space between the inner border edge and the outer padding edge
   203 which user agents may reserve to display the scrollbar
   204 is called the <dfn>scrollbar gutter</dfn>.
   206 The 'scrollbar-gutter' property gives control to the author
   207 over the presence of <a>scrollbar gutters</a>
   208 separately from the ability to control the presence of scrollbars
   209 provided by the 'overflow' property.
   211 <pre class="propdef">
   212 Name: scrollbar-gutter
   213 Value: ''auto'' | [ ''stable'' | ''always'' ] && ''both''? && ''force''?
   214 Initial: auto
   215 Inherited: yes
   216 Computed value: specified value
   217 </pre>
   219 This property affects the presence of <a>scrollbar gutters</a>
   220 placed at the <a>inline start</a> edge or <a>inline end</a> edge of the box.
   222 The presence of a <a>scrollbar gutter</a>
   223 at the <a>block start</a> edge and <a>block end</a> edge of the box
   224 cannot be controlled in this level,
   225 and is determined the same way as the presence of <a>scrollbar gutters</a>
   226 placed at the <a>inline start</a> edge or <a>inline end</a> edge of the box
   227 when 'scrollbar-gutter' is ''scrollbar-gutter/auto''.
   229 Scrollbars which by default are placed over the content box
   230 and do not cause <a>scrollbar gutters</a> to be created
   231 are called <dfn>overlay scrollbars</dfn>.
   232 Such scrollbars are usually partially transparent, revealing the content behind them if any.
   233 Their appearance and size may vary
   234 based on whether and how the user is interacting with them.
   236 Scrollbars which are always placed in a <a>scrollbar gutter</a>,
   237 consuming space when present,
   238 are called <dfn>classic scrollbars</dfn>.
   239 Such scrollbars are usually opaque.
   241 Whether <a>classic scrollbars</a> or <a>overlay scrollbars</a> are used is UA defined.
   243 The appearance and size of the scrollbar is UA defined.
   245 Whether scrollbars appear on the start or end edge of the box is UA defined.
   247 For <a>classic scrollbars</a>,
   248 the width of the <a>scrollbar gutter</a> is the same as the width of the scrollbar.
   249 For <a>overlay scrollbars</a>,
   250 the width of the <a>scrollbar gutter</a> is UA defined.
   251 However, it must not be 0,
   252 and it must not change based on user interactions with the page or the scrollbar
   253 even if the scrollbar itself changes.
   254 Also, it must be the same for all elements in the page.
   256 The values of this property have the following meaning:
   258 <dl dfn-for="scrollbar-gutter">
   259 	<dt><dfn>''scrollbar-gutter/auto''</dfn>
   260 	<dd><a>Classic scrollbars</a> consume space by creating a <a>scrollbar gutter</a>
   261 	when 'overflow' is ''overflow/scroll',
   262 	or when 'overflow' is ''overflow/auto'' and the box is overflowing.
   263 	<a>Overlay scrollbars</a> do not consume space.
   265 	<dt><dfn>''stable''</dfn>
   266 	<dd>The <a>scrollbar gutter</a> is present when
   267 	'overflow' is ''overflow/scroll'' or ''overflow/auto''
   268 	and the scrollbar is a <a>classic scrollbar</a>
   269 	even if the box is not overflowing,
   270 	but not when the scrollbar is an <a>overlay scrollbar</a>.
   272 	<dt><dfn>''always''</dfn>
   273 	<dd>The <a>scrollbar gutter</a> is always present when
   274 	'overflow' is ''overflow/scroll'' or ''overflow/auto'',
   275 	regardless of the type of scrollbar or
   276 	of whether the box is overflowing.
   278 	<dt><dfn>''both''</dfn>
   279 	<dd>If a <a>scrollbar gutter</a> would be present
   280 	on one of the inline start edge or the inline end edge of the box,
   281 	another <a>scrollbar gutter</a> must be present on the opposite edge as well.
   283 	<dt><dfn>''force''</dfn>
   284 	<dd>When the ''scrollbar-gutter/force'' keyword is present
   285 	''scrollbar-gutter/stable'' and ''scrollbar-gutter/always'' take effect
   286 	when 'overflow' is ''overflow/visible'', ''overflow/hidden'' or ''overflow/clip''
   287 	in addition ''overflow/auto'' or ''overflow/scroll''.
   288 	This does not cause a scrollbar to be displayed, only a <a>scrollbar gutter</a>.
   289 </dl>
   291 When the <a>scrollbar gutter</a> is present but the scrollbar is not,
   292 or the scrollbar is transparent or otherwise does not fully obscure the <a>scrollbar gutter</a>,
   293 the background of the <a>scrollbar gutter</a> must be painted as an extension of the padding.
   295 <div class=note>
   296 Note: The following table summarises the interaction of 'overflow' and 'scrollbar-gutter',
   297 showing in which case space is reserved for the <a>scrollbar gutter</a>.
   298 In this table, “G” represents cases where space is reserved for the <a>scrollbar gutter</a>,
   299 “f?” cases where space is reserved for the <a>scrollbar gutter</a>
   300 if ''scrollbar-gutter/force'' was specified,
   301 and empty cells cases where the no space is reserved.
   303 <table class=data>
   304 	<thead>
   305 	<tr>
   306 		<td>
   307 		<td>
   308 		<th colspan=2>Classic scrollbars
   309 		<th colspan=2>Overlay scrollbars
   310 	<tr>
   311 		<th>'overflow'
   312 		<th>'scrollbar-gutter'
   313 		<th>Overflowing
   314 		<th>Not overflowing
   315 		<th>Overflowing
   316 		<th>Not overflowing
   317 	</thead>
   318 	<tr>
   319 		<th rowspan=3>'overflow/scroll'
   320 		<th>''scrollbar-gutter/auto''
   321 		<td>G
   322 		<td>G
   323 		<td>
   324 		<td>
   325 	<tr>
   326 		<th>''scrollbar-gutter/stable''
   327 		<td>G
   328 		<td>G
   329 		<td>
   330 		<td>
   331 	<tr>
   332 		<th>''scrollbar-gutter/always''
   333 		<td>G
   334 		<td>G
   335 		<td>G
   336 		<td>G
   337 	<tr>
   338 		<th rowspan=3>''overflow/auto''
   339 		<th>''scrollbar-gutter/auto''
   340 		<td>G
   341 		<td>
   342 		<td>
   343 		<td>
   344 	<tr>
   345 		<th>''scrollbar-gutter/stable''
   346 		<td>G
   347 		<td>G
   348 		<td>
   349 		<td>
   350 	<tr>
   351 		<th>''scrollbar-gutter/always''
   352 		<td>G
   353 		<td>G
   354 		<td>G
   355 		<td>G
   356 	<tr>
   357 		<th rowspan=3>''overflow/visible'', ''overflow/hidden'', ''overflow/clip''
   358 		<th>''scrollbar-gutter/auto''
   359 		<td>
   360 		<td>
   361 		<td>
   362 		<td>
   363 	<tr>
   364 		<th>''scrollbar-gutter/stable''
   365 		<td>f?
   366 		<td>f?
   367 		<td>
   368 		<td>
   369 	<tr>
   370 		<th>''scrollbar-gutter/always''
   371 		<td>f?
   372 		<td>f?
   373 		<td>f?
   374 		<td>f?
   375 </table>
   376 </div>
   378 <h2 id="fragmentation">Fragmentation of overflow</h2>
   380 The 'continue' property gives authors the ability
   381 to request that content that does not fit inside an element
   382 be fragmented (in the sense of [[!CSS3-BREAK]]),
   383 and provides alternatives
   384 for where the remaining content should continue.
   386 Notably, this property explains traditional pagination,
   387 and extends it further.
   389 	<pre class=propdef>
   390 		Name: continue
   391 		Value: ''auto'' | ''overflow'' | ''paginate'' | ''fragments'' | ''discard''
   392 		Initial: auto
   393 		Applies to: block containers [[!CSS21]], flex containers [[!CSS3-FLEXBOX]], and grid containers [[!CSS3-GRID-LAYOUT]]
   394 		Inherited: no
   395 		Percentages: N/A
   396 		Media: visual
   397 		Computed value: see below
   398 		Animatable: no
   399 		Canonical order: <abbr title="follows order of property value definition">per grammar</abbr>
   400 	</pre>
   402 Issue: The naming of this property and its values is preliminary.
   403 This was initially proposed as
   404 "fragmentation: auto | none | break | clone | page"
   405 in <a href="https://lists.w3.org/Archives/Public/www-style/2015Jan/0357.html">https://lists.w3.org/Archives/Public/www-style/2015Jan/0357.html</a>,
   406 and there is not yet wide agreement as to which naming is better.
   408 Issue: This property is meant to generalize and replace 'region-fragment'.
   409 Once it is sufficiently stable in this specification,
   410 'region-fragment' should be removed from the regions specification in favor of this.
   412 Note: ''continue: fragments'' replaces "overflow:fragments"
   413 from earlier versions of this specification,
   414 while ''continue: paginate'' replaces "overflow: paged-x | paged-y | paged-x-controls | paged-y-controls"
   416 	<dl dfn-for="continue" dfn-type="value">
   417 		<dt><dfn>auto</dfn>
   418 		<dd>''continue/auto'' may only occur as a computed value
   419 		if the element is a <a spec="css-regions">CSS Region</a>
   420 		other than the last one in a <a spec="css-regions">region chain</a>.
   421 		Content that doesn't fit is pushed to the next region of the chain.
   423 		In all other cases, ''continue/auto'' computes to one of the other values.
   425 		<dt><dfn>overflow</dfn>
   426 		<dd>Content that doesn't fit overflows, according to the 'overflow' property
   428 		<dt><dfn>discard</dfn>
   429 		<dd>Content that doesn't fit is discarded at a fragmentation break
   431 		Note: generalized from region-fragment: break; on the last region of a region chain
   433 		Issue: When the element isn't a <a spec="css-break">fragmentation container</a> already,
   434 		should this work by turning it directly into one,
   435 		or by creating a <a>fragment box</a> inside it like ''continue/fragments'' does?
   437 		<dt><dfn>paginate</dfn>
   438 		<dd>Content that doesn't fit paginates.
   439 		This creates a paginated view inside the element
   440 		similar to the way that 'overflow: scroll' creates a scrollable view.
   442 		See <a href="#paginated-overflow">paginated overflow</a>
   444 		Note: Print is effectively "continue: paginate" on the root.
   445 		<dt><dfn>fragments</dfn>
   446 		<dd>content that doesn't fit causes the element to copy itself and continue laying out.
   448 		See <a href="#fragment-overflow">fragment overflow</a>.
   449 	</dl>
   451 The computed value of the 'continue' for a given element or pseudo element is determined as follow:
   452 <ol>
   453 	<li>On elements or pseudo elements with <a>layout containment</a> (see [[!CSS-CONTAIN-1]]),
   454 	if the specificied value is ''continue/auto'' or ''continue/fragments''
   455 	then the computed value is ''continue/overflow''.
   456 	<li>Otherwise, if the specified value is ''continue/auto''
   457 	<ol>
   458 		<li>On a <a spec="css-regions">CSS Region</a> other than the last one in a <a spec="css-regions">region chain</a>,
   459 		the computed value is ''continue/auto''
   460 		<li>On a page
   461 		the computed value is ''continue/paginate''
   462 		<li>On a <a>fragment box</a>
   463 		the computed value is ''continue/fragments''
   464 		<li>Otherwise, the computed value is ''continue/overflow''
   465 	</ol>
   466 	<li>Otherwise, if the specified value is ''continue/framgents''
   467 	<ol>
   468 		<li>On a page
   469 		the computed value is ''continue/paginate''
   470 		<li>Otherwise, the computed value is the specified value
   471 	</ol>
   472 	<li>In all other cases, the computed value is the specified value
   473 </ol>
   475 Issue: If we introduce a pseudo element that can select columns in a multicol,
   476 we would need to specify that auto computes to auto on it,
   477 or introduce a new value and have auto compute to that
   478 (but what would that value compute to on things that aren't columns?).
   480 Note: For background discussions leading to this property, see these threads:
   481 <a href="http://lists.w3.org/Archives/Public/www-style/2012May/1197.html">discussion of overflow, overflow-x, overflow-y and overflow-style</a> and
   482 <a href="https://lists.w3.org/Archives/Public/www-style/2015Jan/0357.html">proposal for a fragmentation property</a>
   484 <h2 id="paginated-overflow">Paginated overflow</h2>
   486 This section introduces and defines the meaning of the ''continue/paginate'' value of the 'continue' property.
   488 Issue: Write this section
   490 Issue: Pages should be possible to style with @page rules. How does that work for nested pages?
   492 <div class="issue">
   493 Should traditional pagination (e.g. when printing)
   494 be expressed through some magic in the computed value of ''continue/auto'',
   495 or by inserting this in the UA stylesheet:
   496 <pre><code class="lang-css">
   497 @media (overflow-block: paged), (overflow-block: optional-paged) {
   498 	:root {
   499 		continue: paginate;
   500 	}
   501 }
   502 </code></pre>
   503 </div>
   505 Issue: Traditional pagination (e.g. when printing) assumes that
   506 :root is contained in the page box,
   507 rather than having the page box be a pseudo element child of :root.
   508 Can we work around that using something similar to fragment boxes?
   509 Or maybe by having a fragment box (reproducing :root) inside a page box inside :root?
   511 Issue: How does the page box model work when it is a child of a regular css box?
   513 Issue: The initial proposal in [[CSS3GCPM]] and implemantation from Opera
   514 used 4 values instead of ''continue/paginate'':
   515 "paged-x | paged-y | paged-x-controls | paged-y-controls".
   516 Should this property also include these values,
   517 or are they better handled as separate properties?
   518 (e.g.: "pagination-layout: auto | horizontal | vertical", "pagination-controls: auto | none")
   520 Issue: Ability to display N pages at once
   521 rather than just one page at once?
   522 Could this be a value of "pagination-layout", such as:
   523 "pagination-layout: horizontal 2;"
   525 Issue: Brad Kemper has proposed a model for combining pagination and
   526 fragment overflow, which also deals with displaying multiple pages.
   527 <a href="http://www.w3.org/mid/[email protected]">http://www.w3.org/mid/[email protected]</a>
   529 	<p class="issue">
   530 		The current implementation of paginated overflow uses
   531 		the overflow/overflow-x/overflow-y properties
   532 		rather than the overflow-style property as proposed
   533 		in the [[CSS3GCPM]] draft
   534 		(which also matches the [[CSS3-MARQUEE]] proposal).
   535 		or the 'continue' property as described here.
   536 	</p>
   538 <h2 id="fragment-overflow">Fragment overflow</h2>
   540 This section introduces and defines the meaning of
   541 the ''continue/fragments'' value of the 'continue' property.
   543 	<p>
   544 		When the computed value of 'continue' for an element is ''continue/fragments'',
   545 		and implementations would otherwise have created a box for the element,
   546 		then implementations must create a sequence of <dfn>fragment box</dfn>es
   547 		for that element.
   548 		(It is possible for an element with ''continue: fragments''
   549 		to generate only one <a>fragment box</a>.
   550 		However, if an element's computed 'continue' is not ''continue/fragments'',
   551 		then its box is not a <a>fragment box</a>.)
   552 		Every <a>fragment box</a> is a fragmentation container,
   553 		and any overflow
   554 		that would cause that fragmentation container to fragment
   555 		causes another <a>fragment box</a> created as a next sibling
   556 		of the previous one.
   557 		<span class="issue">Or is it as though it's a next sibling of
   558 		the element?  Need to figure out exactly how this interacts with
   559 		other box-level fixup.</span>
   560 		Additionally, if the <a>fragment box</a> is also
   561 		a multi-column box (as defined in [[!CSS3COL]]
   562 		<span class="issue">though it defines <i>multi-column element</i></span>)
   563 		any content that would lead to the creation of <a>overflow columns</a> [[!CSS3COL]]
   564 		instead is flown into an additional fragment box.
   565 		However, fragment boxes may themselves be broken
   566 		(due to fragmentation in a fragmentation context outside of them,
   567 		such as pages, columns, or other fragment boxes);
   568 		such breaking leads to fragments of the same fragment box
   569 		rather than multiple fragment boxes.
   570 		(This matters because fragment boxes may be styled by their index;
   571 		such breaking leads to multiple fragments of a fragment box
   572 		with a single index.
   573 		This design choice is so that
   574 		breaking a fragment box across pages does not break
   575 		the association of indices to particular pieces of content.)
   576 		<span class="issue">Should a forced break that breaks to
   577 		an outer fragmentation context cause a new fragment of a single
   578 		fragment box or a new fragment box?</span>
   579 		<span class="issue">Should we find a term other than
   580 		<a>fragment box</a> here to make this a little less confusing?</span>
   581 	</p>
   583 	<p class="issue">
   584 		What if we want to be able to style the pieces of an element
   585 		split within another type of fragmentation context?
   586 		These rules prevent ever using ''::nth-fragment()'' for that,
   587 		despite that the name seems the most logical name for such a feature.
   588 	</p>
   590 	<div class="example">
   591 		<table class="source-demo-pair"><tr><td>
   592 <pre><code highlight="html">&lt;!DOCTYPE HTML&gt;
   593 &lt;title&gt;Breaking content into
   594   equal-sized cards&lt;/title&gt;
   595 &lt;style&gt;
   596   .in-cards {
   597     continue: fragments;
   599     width: 13em;
   600     height: 8em;
   602     padding: 4px;
   603     border: medium solid blue;
   604     margin: 6px;
   606     font: medium/1.3 Times New
   607       Roman, Times, serif;
   608   }
   609 &lt;/style&gt;
   610 &lt;div class="in-cards"&gt;
   611   In this example, the text in the div
   612   is broken into a series of cards.
   613   These cards all have the same style.
   614   The presence of enough content to
   615   overflow one of the cards causes
   616   another one to be created.  The second
   617   card is created just like it's the
   618   next sibling of the first.
   619 &lt;/div&gt;</code></pre></td><td>
   620 			<div class="in-cards-demo">In this example, the text in the<br>div is broken into a series of<br>cards.  These cards all have the<br>same style. The presence of<br>enough content to overflow<br>one of the cards causes another</div>
   621 			<div class="in-cards-demo">one to be created.  The second<br>card is created just like it's the<br>next sibling of the first.</div>
   622 		</td></tr></table>
   623 	</div>
   625 	<p class="issue">
   626 		We should specify that ''continue: fragments'' does not apply
   627 		to at least some table parts,
   628 		and perhaps other elements as well.
   629 		We need to determine exactly which ones.
   630 	</p>
   632 	<p class="issue">
   633 		This specification needs to say which type of
   634 		fragmentation context is created
   635 		so that it's clear which values of the 'break-*' properties
   636 		cause breaks within this context.
   637 		We probably want ''break-*: region'' to apply.
   638 	</p>
   640 	<p class="issue">
   641 		This specification needs a processing model
   642 		that will apply in cases where the layout containing the
   643 		fragments has characteristics that use the intrinsic size of the fragments
   644 		to change the amount of space available for them,
   645 		such as [[CSS3-GRID-LAYOUT]].
   646 		There has already been some work on such a processing model
   647 		in [[CSS3-REGIONS]],
   648 		and the work done on a model there,
   649 		and the editors of that specification,
   650 		should inform what happens in this specification.
   651 	</p>
   653 <h3 id="fragment-styling">Fragment styling</h3>
   655 <h4 id="fragment-pseudo-element">The ::nth-fragment() pseudo-element</h4>
   657 	<p>
   658 		The <dfn selector>::nth-fragment()</dfn> pseudo-element
   659 		is a pseudo-element
   660 		that describes some of the <a>fragment box</a>es generated by an element.
   661 		The argument to the pseudo-element takes the same syntax
   662 		as the argument to the :nth-child() pseudo-class
   663 		defined in [[!SELECT]], and has the same meaning
   664 		except that the number is relative to
   665 		<a>fragment box</a>es generated by the element
   666 		instead of siblings of the element.
   667 	</p>
   669 	<p class="note">
   670 		Selectors that allow addressing fragments
   671 		by counting from the end rather than the start
   672 		are intentionally not provided.
   673 		Such selectors would interfere with determining
   674 		the number of fragments.
   675 	</p>
   677 	<p class="issue">
   678 		Depending on future discussions,
   679 		this ''::nth-fragment(<var>an+b</var>)'' syntax
   680 		may be replaced with
   681 		the new ''::fragment:nth(<var>an+b</var>)'' syntax.
   682 	</p>
   684 <h4 id="style-of-fragments">Styling of fragments</h4>
   686 	<p class="issue">
   687 		Should this apply to continue:fragments only,
   688 		or also to continue:paginate?
   689 		(If it applies,
   690 		then stricter property restrictions would be needed
   691 		for continue:paginate.)
   692 	</p>
   694 	<p>
   695 		In the absence of rules with ''::nth-fragment()'' pseudo-elements,
   696 		the computed style for each <a>fragment box</a>
   697 		is the computed style for the element
   698 		for which the <a>fragment box</a> was created.
   699 		However, the style for a <a>fragment box</a> is also influenced
   700 		by rules whose selector's <a>subject</a> [[!SELECT]]
   701 		has an ''::nth-fragment()'' pseudo-element,
   702 		if the 1-based number of the <a>fragment box</a> matches
   703 		that ''::nth-fragment()'' pseudo-element
   704 		and the selector (excluding the ''::nth-fragment()'' pseudo-element)
   705 		matches the element generating the fragments.
   706 	</p>
   708 	<p>
   709 		When determining the style of the <a>fragment box</a>,
   710 		these rules that match the fragment pseudo-element
   711 		cascade together with the rules that match the element,
   712 		with the fragment pseudo-element adding the specificity
   713 		of a pseudo-class to the specificity calculation.
   714 		<span class="issue">Does this need to be specified in
   715 		the cascading module as well?</span>
   716 	</p>
   718 	<div class="example">
   719 		<table class="source-demo-pair"><tr><td>
   720 <pre><code highlight="html">&lt;!DOCTYPE HTML&gt;
   721 &lt;style&gt;
   722   .bouncy-columns {
   723     continue: fragments;
   724     width: 6em;
   725     height: 10em;
   726     float: left;
   727     margin: 1em;
   728     font: medium/1.25 Times New
   729       Roman, Times, serif;
   730   }
   731   .bouncy-columns::nth-fragment(1) {
   732     background: aqua; color: black;
   733     transform: rotate(-3deg);
   734   }
   735   .bouncy-columns::nth-fragment(2) {
   736     background: yellow; color: black;
   737     transform: rotate(3deg);
   738   }
   739 &lt;/style&gt;
   740 &lt;div class="bouncy-columns"&gt;
   741   <i>...</i>
   742 &lt;/div&gt;</code></pre></td><td>
   743 			<div class="bouncy-columns-demo one">In this<br>example, the<br>text in the div<br>is broken into<br>a series of<br>columns.  The<br>author<br>probably</div>
   744 			<div class="bouncy-columns-demo two">intended the<br>text to fill two<br>columns.  But<br>if it happens to<br>fill three<br>columns, the<br>third column is<br>still created.  It</div>
   745 			<div class="bouncy-columns-demo">just doesn't<br>have any<br>fragment-specific<br>styling because<br>the author<br>didn't give it<br>any.</div>
   746 		</td></tr></table>
   747 	</div>
   749 	<p>
   750 		Styling an ''::nth-fragment()'' pseudo-element with the 'continue'
   751 		property does take effect;
   752 		if a <a>fragment box</a> has a
   753 		computed value of 'continue' other than ''fragments''
   754 		then that fragment box is the last fragment.
   755 		However, overriding 'continue' on the first fragment
   756 		does not cause the <a>fragment box</a> not to exist;
   757 		whether there are fragment boxes at all is determined by
   758 		the computed value of overflow for the element.
   759 	</p>
   761 	<p>
   762 		Styling an ''::nth-fragment()'' pseudo-element with the 'content'
   763 		property has no effect;
   764 		the computed value of 'content' for the fragment box
   765 		remains the same as the computed value of content for the element.
   766 	</p>
   768 	<p>
   769 		Specifying ''display: none'' for a <a>fragment box</a> causes
   770 		the fragment box with that index not to be generated.
   771 		However, in terms of the indices
   772 		used for matching ''::nth-fragment()'' pseudo-elements
   773 		of later fragment boxes,
   774 		it still counts as though it was generated.
   775 		However, since it is not generated, it does not contain any content.
   776 	</p>
   778 	<p>
   779 		Specifying other values of 'display', 'position',
   780 		or 'float' is permitted, but is not allowed to change
   781 		the <a>inner display type</a>.
   782 		(Since 'continue' only
   783 		applies to block containers, flex containers, and grid containers).
   784 		<span class="issue">Need to specify exactly how this works</span>
   785 	</p>
   787 	<p>
   788 		To match the model for other pseudo-elements
   789 		where the pseudo-elements live inside their corresponding element,
   790 		declarations in ''::nth-fragment()'' pseudo-elements override
   791 		declarations in rules without the pseudo-element.
   792 		The relative priority within such declarations is determined
   793 		by normal cascading order (see [[!CSS21]]).
   794 	</p>
   796 	<p>
   797 		Styles specified on ''::nth-fragment()'' pseudo-elements
   798 		do affect inheritance to content within the <a>fragment box</a>.
   799 		In other words, the content within the <a>fragment box</a> must
   800 		inherit from the fragment box's style (i.e., the pseudo-element style)
   801 		rather than directly from the element.
   802 		This means that elements split between fragment boxes may
   803 		have different styles for different parts of the element.
   804 	</p>
   806 	<p class="issue">
   807 		This inheritance rule allows specifying styles indirectly
   808 		(by using explicit ''inherit'' or using default inheritance
   809 		on properties that don't apply to ''::first-letter'')
   810 		that can't be specified directly
   811 		(based on the rules in the next section).
   812 		This is a problem.
   813 		The restrictions that apply to styling inside fragments
   814 		should also apply to inheritance from fragments.
   815 	</p>
   817 	<div class="example">
   818 		<table class="source-demo-pair"><tr><td>
   819 <pre><code highlight="html">&lt;!DOCTYPE HTML&gt;
   820 &lt;style&gt;
   821   .article {
   822     continue: fragments;
   823   }
   824   .article::nth-fragment(1) {
   825     font-size: 1.5em;
   826     margin-bottom: 1em;
   827     height: 4em;
   828   }
   829   .article::nth-fragment(2) {
   830     margin-left: 5em;
   831     margin-right: 2em;
   832   }
   833 &lt;/style&gt;
   834 &lt;div class="article"&gt;
   835   The &lt;code&gt;font-size&lt;/code&gt; property<i>...</i>
   836 &lt;/div&gt;</code></pre></td><td>
   837 			<div class="article-font-inherit-demo one">The <code>font-size</code> property<br>specified on the fragment<br>is inherited into the</div>
   838 			<div class="article-font-inherit-demo two">descendants of the fragment.<br>This means that inherited<br>properties can be used<br>reliably on a fragment, as in<br>this example.</div>
   839 		</td></tr></table>
   840 	</div>
   842 <h4 id="style-in-fragments">Styling inside fragments</h4>
   844 	<p class="issue">
   845 		Should this apply to continue:fragments only,
   846 		or also to continue:paginate?
   847 	</p>
   849 	<p>
   850 		The ''::nth-fragment()'' pseudo-element
   851 		can also be used to style
   852 		content inside of a <a>fragment box</a>.
   853 		Unlike the ''::first-line'' and ''::first-letter'' pseudo-elements,
   854 		the ''::nth-fragment()'' pseudo-element can be applied
   855 		to parts of the selector other than the subject:
   856 		in particular, it can match ancestors of the subject.
   857 		However, the only CSS properties applied
   858 		by rules with such selectors
   859 		are those that apply
   860 		to the ''::first-letter'' pseudo-element.
   861 	</p>
   863 	<p>
   864 		To be more precise,
   865 		when a rule's selector has ''::nth-fragment()'' pseudo-elements
   866 		attached to parts of the selector other than the subject,
   867 		the declarations in that rule apply to
   868 		a fragment (or pseudo-element thereof) when:
   869 	</p>
   870 	<ol>
   871 		<li>
   872 			the declarations are for properties that apply to the
   873 			''::first-letter'' pseudo-element,
   874 		</li>
   875 		<li>
   876 			the declarations would apply to
   877 			that fragment (or pseudo-element thereof)
   878 			had those ''::nth-fragment()'' pseudo-elements been removed,
   879 			with a particular association between
   880 			each sequence of simple selectors and the element it matched,
   881 			and
   882 		</li>
   883 		<li>
   884 			for each removed ''::nth-fragment()'' pseudo-element,
   885 			the fragment lives within a <a>fragment box</a>
   886 			of the element associated in that association
   887 			with the selector that the pseudo-element was attached to,
   888 			and whose index matches the pseudo-element.
   889 		</li>
   890 	</ol>
   892 	<div class="example">
   893 		<table class="source-demo-pair"><tr><td>
   894 <pre><code highlight="html">&lt;!DOCTYPE HTML&gt;
   895 &lt;style&gt;
   896   .dark-columns {
   897     continue: fragments;
   898     width: 6em;
   899     height: 10em;
   900     float: left;
   901     margin-right: 1em;
   902     font: medium/1.25 Times New
   903       Roman, Times, serif;
   904   }
   905   .dark-columns::nth-fragment(1) {
   906     background: aqua; color: black;
   907   }
   908   .dark-columns::nth-fragment(1) :link {
   909     color: blue;
   910   }
   911   .dark-columns::nth-fragment(1) :visited {
   912     color: purple;
   913   }
   914   .dark-columns::nth-fragment(2) {
   915     background: navy; color: white;
   916   }
   917   .dark-columns::nth-fragment(2) :link {
   918     color: aqua;
   919   }
   920   .dark-columns::nth-fragment(2) :visited {
   921     color: fuchsia;
   922   }
   923 &lt;/style&gt;
   924 &lt;div class="dark-columns"&gt;
   925   <i>...</i>
   926 &lt;/div&gt;</code></pre></td><td>
   927 			<div class="dark-columns-demo one">In this<br><a href="http://en.wiktionary.org/wiki/example">example</a>, the<br>text flows<br>from one<br>light-colored<br>fragment into<br>another<br>dark-colored</div>
   928 			<div class="dark-columns-demo two">fragment.  We<br>therefore want<br>different styles<br>for <a href="http://www.w3.org/Provider/Style/IntoContext.html">hyperlinks</a><br>in the different<br>fragments.</div>
   929 		</td></tr></table>
   930 	</div>
   933 <h3 id="max-lines">The 'max-lines' property</h3>
   935 	<p>
   936 		Authors may wish to style the opening lines of an element
   937 		with different styles
   938 		by putting those opening lines in a separate fragment.
   939 		However, since it may be difficult to predict the exact height
   940 		occupied by those lines
   941 		in order to restrict the first fragment to that height,
   942 		this specification introduces a 'max-lines' property
   943 		that forces a fragment to break
   944 		after a specified number of lines.
   945 		This forces a break after the given number of lines
   946 		contained within the element or its descendants,
   947 		as long as those lines are in the same block formatting context.
   948 	</p>
   950 	<pre class=propdef>
   951 		Name: max-lines
   952 		Value: none | <<integer>>
   953 		Initial: none
   954 		Applies to: fragment boxes
   955 		Inherited: no
   956 		Animatable: as <a href="https://www.w3.org/TR/css3-transitions/#animatable-types">integer</a>
   957 		Percentages: N/A
   958 		Media: visual
   959 		Computed value: specified value
   960 		Canonical order: <abbr title="follows order of property value definition">per grammar</abbr>
   961 	</pre>
   963 	<dl dfn-for="max-lines" dfn-type="value">
   964 		<dt><dfn>none</dfn>
   965 		<dd>
   966 			<p>
   967 				Breaks occur only as specified elsewhere.
   968 			</p>
   969 		</dd>
   971 		<dt><dfn><<integer>></dfn>
   972 		<dd>
   973 			<p>
   974 				In addition to any breaks specified elsewhere,
   975 				a break is forced before any line that would exceed
   976 				the given number of lines
   977 				being placed inside the element
   978 				(excluding lines that are in
   979 				a different block formatting context from
   980 				the block formatting context to which
   981 				an unstyled child of the element would belong).
   982 			</p>
   984 			<p class="issue">
   985 				If there are multiple boundaries between this line
   986 				and the previous, where exactly (in terms of element
   987 				boundaries) is the break forced?
   988 			</p>
   990 			<p>
   991 				Only positive integers are accepted.
   992 				Zero or negative integers are a parse error.
   993 			</p>
   994 		</dd>
   995 	</dl>
   997 <p class="issue">Should this apply to fragment overflow only, or also
   998 to pagination?
   999 Given what we're doing with the continue property,
  1000 it should actually apply to any fragmentainer.</p>
  1002 Issue: having max-lines do nothing on regular elements is not ideal.
  1003 When applied to non fragmentainers,
  1004 it should probably cause 'continue' to compute to ''continue/discard''
  1005 so that you only need to reach for one property rather than 2 to get
  1006 that effect.
  1008 	<div class="example">
  1009 		<table class="source-demo-pair"><tr><td>
  1010 <pre><code highlight="html">&lt;!DOCTYPE HTML&gt;
  1011 &lt;style&gt;
  1012   .article {
  1013     continue: fragments;
  1015   .article::first-letter {
  1016     font-size: 2em;
  1017     line-height: 0.9;
  1019   .article::nth-fragment(1) {
  1020     font-size: 1.5em;
  1021     max-lines: 3;
  1023   .article::nth-fragment(2) {
  1024     column-count: 2;
  1026 &lt;/style&gt;
  1027 &lt;div class="article"&gt;
  1028   <i>...</i>
  1029 &lt;/div&gt;</code></pre></td><td>
  1030 			<div class="article-max-lines-demo one">The max-lines property allows<br>authors to use a larger font for the first<br>few lines of an article.  Without the</div>
  1031 			<div class="article-max-lines-demo two">max-lines property, authors<br>might have to use the<br>'height' property instead, but<br>that would leave a slight gap<br>if the author miscalculated<br>how much height a given<br>number of lines would<br>occupy (which might be</div>
  1032 			<div class="article-max-lines-demo three">particularly hard if the author<br>didn't know what text would<br>be filling the space, exactly<br>what font would be used, or<br>exactly which platform's font<br>rendering would be used to<br>display the font).</div>
  1033 		</td></tr></table>
  1034 	</div>
  1036 Privacy and Security Considerations {#priv-sec}
  1037 ===============================================
  1039 This specification introduces no new security considerations.
  1041 The <a href="http://www.w3.org/2001/tag/">TAG</a> has developed a <a href="https://www.w3.org/TR/security-privacy-questionnaire/">self-review questionaire</a>
  1042 to help editors and Working Groups evaluate the risks introduced by their specifications.
  1043 Answers are provided below.
  1045 <dl>
  1046 <dt>Does this specification deal with personally-identifiable information?
  1047 <dd>No.
  1049 <dt>Does this specification deal with high-value data?
  1050 <dd>No.
  1052 <dt>Does this specification introduce new state for an origin that persists across browsing sessions?
  1053 <dd>No.
  1055 <dt>Does this specification expose persistent, cross-origin state to the web?
  1056 <dd>No.
  1058 <dt>Does this specification expose any other data to an origin that it doesn’t currently have access to?
  1059 <dd>No.
  1061 <dt>Does this specification enable new script execution/loading mechanisms?
  1062 <dd>No.
  1064 <dt>Does this specification allow an origin access to a user’s location?
  1065 <dd>No.
  1067 <dt>Does this specification allow an origin access to sensors on a user’s device?
  1068 <dd>No.
  1070 <dt>Does this specification allow an origin access to aspects of a user’s local computing environment?
  1071 <dd>No.
  1073 <dt>Does this specification allow an origin access to other devices?
  1074 <dd>No.
  1076 <dt>Does this specification allow an origin some measure of control over a user agent’s native UI?
  1077 <dd>No
  1079 <dt>Does this specification expose temporary identifiers to the web?
  1080 <dd>No.
  1082 <dt>Does this specification distinguish between behavior in first-party and third-party contexts?
  1083 <dd>No.
  1085 <dt>How should this specification work in the context of a user agent’s "incognito" mode?
  1086 <dd>No difference in behavior is needed.
  1088 <dt>Does this specification persist data to a user’s local device?
  1089 <dd>No.
  1091 <dt>Does this specification have a "Security Considerations" and "Privacy Considerations" section?
  1092 <dd>Yes, this is the section you are currently reading.
  1094 <dt>Does this specification allow downgrading default security characteristics?
  1095 <dd>No.
  1096 </dl>
  1098 <h2 id="changes" class="no-num">
  1099 Changes</h2>
  1100 <h3 id="changes-l3">
  1101 Changes Since Level 3</h3>
  1103 The following changes were made to this specification since the
  1104 <a href="https://drafts.csswg.org/css-overflow-3/">CSS Overflow Module Level 3</a>:
  1106 <ul>
  1107 	<li>The Fragmentation of overflow, Paginated overflow, and Fragment overflow sections and subsections have been removed form Level 3 and moved to Level 4.
  1108 	<li>The 'scrollbar-gutter' property has been added.
  1109 </ul>
  1111 <h2 class=no-num id="acknowledgments">
  1112 Acknowledgments</h2>
  1114 	<p>
  1115 		Thanks especially to the feedback from
  1116 		Rossen Atanassov,
  1117 		Bert Bos,
  1118 		Tantek Çelik,
  1119 		John Daggett,
  1120 		fantasai,
  1121 		Daniel Glazman,
  1122 		Vincent Hardy,
  1123 		H&aring;kon Wium Lie,
  1124 		Peter Linss,
  1125 		Robert O'Callahan,
  1126 		Florian Rivoal,
  1127 		Alan Stearns,
  1128 		Steve Zilles,
  1129 		and all the rest of the
  1130 		<a href="http://lists.w3.org/Archives/Public/www-style/">www-style</a> community.

mercurial