59 votes

Pourquoi CSS2.1 définit-il des valeurs de dépassement autres que "visible" pour établir un nouveau contexte de formatage de bloc?

Le CSS2.1 spec mandats overflow autres qu' visible établir un nouveau "bloc de mise en forme de contexte". Cela me semble bizarre, que d'une propriété dont le but est évidemment de cacher débordement sans affecter la mise en page, fait réellement affecter la mise en page d'une manière importante.

Il semble que dépassement de valeurs autres que visible de combiner deux complètement indépendants caractéristiques: si une BFC est créé et si le dépassement est caché. Ce n'est pas comme "overflow:hidden" est complètement dénuée de sens sans une BFC, parce que les chars historiquement peuvent déborder de leur élément parent, se cachant le débordement sans changer la mise en page semble raisonnable.

Quelles sont les raisons de cette décision, en supposant qu'ils sont connus? Les personnes qui ont travaillé sur la spécification décrit pourquoi il a été décidé d'être le cas?

67voto

BoltClock Points 249668

J'ai demandé à ce sujet sur la liste de diffusion sur votre nom; le fil peut être trouvé ici. En résumé, cela a à voir avec le défilement de contenu pour la plupart:

Fondamentalement, parce que si la spec n'ai pas dit cela, puis d'avoir flotteurs se croisent avec quelque chose qui est de défilement serait nécessaire que le navigateur de renvoyer à la ligne (autour de l'intrusion des flotteurs) le contenu de l'élément déroulant à chaque fois qu'elle défile. C'est techniquement ce que CSS 2.0 requis, mais il n'a jamais été mis en œuvre, et il aurait été un énorme problème pour la vitesse de défilement.

-David

Très probablement, il fait référence à du contenu défilant dans une boîte qui peut se produire à l'extérieur de la flotte du parent mais intersection avec le flotteur. Je ne pense pas que ce soit lié à la conversion de contenu autour d'un flotteur à l'intérieur d'une zone déroulante contenant, comme c'est déjà le cas, naturellement, plus le radeau clip dans le récipient et faites défiler le long avec le reste de son contenu, de toute façon.

Enfin pour moi c'est logique. En fait, je vais vous donner un exemple, ici, alors j'espère qu'il fait sens pour vous et personne d'autre qui peut-être vous demandez-vous. Imaginez un scénario impliquant deux cases avec la même hauteur fixe et overflow: visible (valeur par défaut), dont la première contient un flotteur qui s'étend au-delà de son parent hauteur:

<div>
    <p>...</p>
</div>
<div>
    <p>...</p>
    <p>...</p>
</div>
/* Presentational properties omitted */
div {
    height: 80px;
}

div:first-child:before {
    float: left;
    height: 100px;
    margin: 10px;
    content: 'Float';
}

Remarque la similitude à l'un des exemples donnés dans la section 9.5. La deuxième zone est ici simplement montré débordant de contenu pour les besoins de cette réponse.

C'est bien car le contenu ne sera jamais défilé, mais quand overflow est réglé sur autre chose que de l' visible, qui entraîne le contenu non seulement d'être coupé par les limites de la zone, mais aussi à devenir de défilement. Si la deuxième zone a overflow: auto, c'est ce qu'il pourrait ressembler a un navigateur de mise en œuvre de l'original CSS2 spec:

En raison du flotteur, en essayant de faire défiler le contenu serait la cause de la navigateur pour avoir de la remballer afin de ne pas être masquées par le flotteur (et ce qui doit arriver à la partie qui permet de faire défiler de haut bord?). Il serait probablement ressembler à quelque chose comme ça quand défiler vers le bas:

Le hic ici est que le navigateur a pour remballer le contenu à chaque fois qu'il repeint pendant le défilement. Pour les navigateurs qui sont capables de pixels en fonction de défilement lisse - qui est-à-dire, tous d'entre eux - je ne vois pas pourquoi ce serait une performance catastrophe!

Mais c'est pour quand l'utilisateur peut faire défiler le contenu, non? Ce serait logique pour overflow: auto et overflow: scroll, mais que diriez - overflow: hidden?

Eh bien, une idée fausse commune est que l'un récipient avec de l' overflow: hidden cache simplement le contenu par clipsage et ne peuvent pas être affichés. Ce n'est pas tout à fait vrai:

Pendant le défilement de l'INTERFACE utilisateur n'est pas fourni, le contenu est toujours le défilement de la programmation, et un certain nombre de pages d'effectuer de tels défilement (par exemple en fixant scrollTop sur l'élément concerné).

-Boris

En effet, c'est ce qu'il regarde comme si la deuxième zone a été définie pour l' overflow: hidden , puis défile vers le bas avec le code JavaScript suivant:

var div = document.getElementsByTagName('div')[1];
div.scrollTop = div.scrollHeight;

De nouveau, notez que le contenu devrait être rewrapped pour éviter d'être obscurci par le flotteur.

Même si ce ne serait pas aussi douloureux pour la performance en avait défilement de l'INTERFACE utilisateur disponible, je crois qu'ils ont fait des boîtes avec tout overflow valeur autre que visible générer un nouveau BFC principalement par souci de cohérence.


Et donc, ce changement a été apporté dans CSS2.1, documentée ici. Maintenant, si vous appliquez un overflow valeur autre que visible seulement à la seconde zone de, ce qu'est un navigateur n'est de pousser l'ensemble de la zone de côté pour faire de la place pour le flotteur, parce que la boîte crée un nouveau bloc de mise en forme de contexte qui entoure son contenu, au lieu de s'écouler à travers le flotteur. Ce comportement particulier est spécifié dans le paragraphe:

La zone de bordure d'un tableau, d'un bloc remplacé élément ou un élément dans le flux normal, qui établit un nouveau bloc de mise en forme de contexte (par exemple un élément avec 'débordement' autre qu 'visible') ne doivent pas se superposer à la marge de la boîte de flotteurs dans le même bloc de mise en forme de contexte comme l'élément lui-même. Si nécessaire, des mises en œuvre de claire le dit élément en le plaçant au-dessous de ce qui précède, les chars, mais peut placer adjacentes à ces flotteurs si l'espace est suffisant. Ils peuvent même faire de la zone de bordure dudit élément plus étroit que défini par l'article 10.3.3. CSS2 ne permet pas de définir quand un UA peut mettre dit élément à côté du flotteur ou par la façon dont beaucoup dit élément peut devenir plus étroit.

Voici à quoi il ressemble avec overflow: auto par exemple:

Notez qu'il n'y a pas de jeu; si la deuxième zone a clear: left ou clear: both il serait poussé vers le bas, non pas sur le côté, qu'elle a créé son propre BFC.

Si vous appliquez overflow: auto à la première boîte au lieu de cela, le flotteur est coupé dans sa boîte contenant avec le reste du contenu, en raison de sa hauteur fixe, qui est fixé à l' 80px dans l'exemple de code donné ci-dessus:

Si vous revenez à la première zone de height: auto (la valeur par défaut), soit par la substitution ou de retrait de l' height: 80px déclaration à partir de ci-dessus, il s'étend à la hauteur du flotteur:

Cela arrive à être de nouveau dans CSS2.1 ainsi, en ce qu'un élément avec height: auto qui génère un nouveau bloc de mise en forme de contexte (c'est à dire un bloc de mise en forme racine de contexte) va s'étirer verticalement à la hauteur de sa flotte, et pas juste suffisante pour contenir ses flux de contenu à la différence d'une boite normale. Les modifications sont documentées ici et ici. Le changement de leader sur le côté-effet de la réduction de la boîte de sorte qu'il ne coupe pas le flotteur est documenté ici.

Dans ces deux cas, peu importe ce que vous faites pour la deuxième case, il ne sera jamais affecté par le flotteur, car il a été restreinte par les limites de son conteneur.

4voto

CBRRacer Points 2463

Je sais que ce sera un spéculative réponse, cependant après avoir lu le cahier des charges un peu de temps ici est mon point de vue sur ceci:

La section 9.4.1 est de parler de tout élément qui n'est pas entièrement contenir ou ne pas remplir le confinement de l'espace. Par exemple, lorsque vous flotter un élément qu'il n'est plus de remplissage de 100% de la société mère, comme dans les éléments de flux ne. Inline blocs, les cellules d'un tableau, et le tableau des légendes sont également des éléments que vous pouvez modifier la hauteur et la largeur, mais qui ne sont pas intrinsèquement 100% de la société mère (oui table>tr>td est une qui serait de remplissage de 100% de son parent, mais il est conçu pour permettre de multiples td est donc la td ne compte pas comme il va automatiquement réduire à accueillir d'autres td) cela s'applique également à tout débordement autres que visible parce qu'il rompt le confinement de l'élément de type block.

Donc, si je lis correctement la façon dont cela fonctionne est la section 9.4.1 est en se référant à des éléments de bloc qui s'affranchir des règles de confinement des éléments de bloc spécifié par la section 9.2.1

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X