Je veux avoir une rangée de divs (cellules) qui ne s'enroulent pas si le navigateur est trop étroit pour les adapter.
J'ai cherché dans Stack et je n'ai pas trouvé de réponse fonctionnelle à ce que je pense devrait être une simple question CSS.
Les cellules ont une largeur spécifiée. Cependant, je ne veux pas spécifier la largeur de la ligne, la largeur doit être automatiquement la largeur de ses cellules enfants.
Si la fenêtre est trop étroite pour accueillir les lignes, le div doit déborder de barres de défilement.
Veuillez fournir votre réponse sous forme d'extrait de code fonctionnel, car j'ai essayé beaucoup de solutions que j'ai vues ailleurs (comme spécifier la largeur: 100% et elles ne semblent pas fonctionner).
Je recherche une solution uniquement HTML / CSS, pas de JavaScript.
.row {
float: left;
border: 1px solid yellow;
width: 100%;
overflow: auto;
}
.cell {
float: left;
border: 1px solid red;
width: 200px;
height: 100px;
}
<div class="row">
<div class="cell">a</div>
<div class="cell">b</div>
<div class="cell">c</div>
</div>
Pour le moment, je codifie en dur la largeur de la ligne en un très grand nombre.
Réponses:
La propriété CSS a
display: inline-block
été conçue pour répondre à ce besoin. Vous pouvez en lire un peu ici: http://robertnyman.com/2010/02/24/css-display-inline-block-why-it-rocks-and-why-it-sucks/Voici un exemple de son utilisation. Les éléments clés sont que l'
row
élément awhite-space: nowrap
et lescell
éléments ontdisplay: inline-block
. Cet exemple devrait fonctionner sur la plupart des principaux navigateurs; un tableau de compatibilité est disponible ici: http://caniuse.com/#feat=inline-block<html> <body> <style> .row { float:left; border: 1px solid yellow; width: 100%; overflow: auto; white-space: nowrap; } .cell { display: inline-block; border: 1px solid red; width: 200px; height: 100px; } </style> <div class="row"> <div class="cell">a</div> <div class="cell">b</div> <div class="cell">c</div> </div> </body> </html>
la source
<!DOCTYPE html>
ou<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
en haut du HTML pour que IE ne passe pas par défaut en mode bizarreries.float: right
, n'est-ce pas?Vous voulez définir
min-width
sur la ligne afin que lorsque le navigateur est redimensionné, il ne passe pas en dessous et ne s'enroule pas.la source
Après avoir lu la réponse de John, j'ai découvert que ce qui suit semblait fonctionner pour nous (ne nécessitait pas de spécifier la largeur):
<style> .row { float:left; border: 1px solid yellow; overflow: visible; white-space: nowrap; } .cell { display: inline-block; border: 1px solid red; height: 100px; } </style> <div class="row"> <div class="cell">hello hello hello hello hello hello hello hello hello hello hello hello hello hello hello hello </div> <div class="cell">hello hello hello hello hello hello hello hello hello hello hello hello hello hello hello hello </div> <div class="cell">hello hello hello hello hello hello hello hello hello hello hello hello hello hello hello hello </div> </div>
la source
overflow: visible; white-space: nowrap;
fait l'affaire pour moi. Merci!La seule façon dont j'ai réussi à faire cela est d'utiliser
overflow: visible;
etwidth: 20000px;
sur l'élément parent. Il n'y a aucun moyen de faire cela avec CSS niveau 1 que je connaisse et j'ai refusé de penser que je devrais aller complètement avec CSS niveau 3. L'exemple ci-dessous contient 18 menus qui s'étendent au-delà de mon écran LCD de résolution 1920x1200 , si votre écran est plus grand, dupliquez simplement les éléments de menu du premier niveau ou redimensionnez simplement le navigateur. Alternativement et avec des niveaux légèrement inférieurs de compatibilité du navigateur, vous pouvez utiliser des requêtes multimédias CSS3.Voici un exemple de démonstration complète de copier / coller ...
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <title>XHTML5 Menu Demonstration</title> <style type="text/css"> * {border: 0; box-sizing: content-box; color: #f0f; font-size: 10px; margin: 0; padding: 0; transition-property: background-color, background-image, border, box-shadow, color, float, opacity, text-align, text-shadow; transition-duration: 0.5s; white-space: nowrap;} a:link {color: #79b; text-decoration: none;} a:visited {color: #579;} a:focus, a:hover {color: #fff; text-decoration: underline;} body {background-color: #444; overflow-x: hidden;} body > header {background-color: #000; height: 64px; left: 0; position: absolute; right: 0; z-index: 2;} body > header > nav {height: 32px; margin-left: 16px;} body > header > nav a {font-size: 24px;} main {border-color: transparent; border-style: solid; border-width: 64px 0 0; bottom: 0px; left: 0; overflow-x: hidden !important; overflow-y: auto; position: absolute; right: 0; top: 0; z-index: 1;} main > * > * {background-color: #000;} main > section {float: left; margin-top: 16px; width: 100%;} nav[id='menu'] {overflow: visible; width: 20000px;} nav[id='menu'] > ul {height: 32px;} nav[id='menu'] > ul > li {float: left; width: 140px;} nav[id='menu'] > ul > li > ul {background-color: rgba(0, 0, 0, 0.8); display: none; margin-left: -50px; width: 240px;} nav[id='menu'] a {display: block; height: 32px; line-height: 32px; text-align: center; white-space: nowrap;} nav[id='menu'] > ul {float: left; list-style:none;} nav[id='menu'] ul li:hover ul {display: block;} p, p *, span, span * {color: #fff;} p {font-size: 20px; margin: 0 14px 0 14px; padding-bottom: 14px; text-indent: 1.5em;} .hidden {display: none;} .width_100 {width: 100%;} </style> </head> <body> <main> <section style="height: 2000px;"><p>Hover the first menu at the top-left.</p></section> </main> <header> <nav id="location"><a href="">Example</a><span> - </span><a href="">Blog</a><span> - </span><a href="">Browser Market Share</a></nav> <nav id="menu"> <ul> <li><a href="" tabindex="2">Menu 1 - Hover</a> <ul> <li><a href="" tabindex="2">Menu 1 B</a></li> <li><a href="" tabindex="2">Menu 1 B</a></li> <li><a href="" tabindex="2">Menu 1 B</a></li> <li><a href="" tabindex="2">Menu 1 B</a></li> <li><a href="" tabindex="2">Menu 1 B</a></li> <li><a href="" tabindex="2">Menu 1 B</a></li> <li><a href="" tabindex="2">Menu 1 B</a></li> <li><a href="" tabindex="2">Menu 1 B</a></li> </ul> </li> <li><a href="" tabindex="2">Menu 2</a></li> <li><a href="" tabindex="2">Menu 3</a></li> <li><a href="" tabindex="2">Menu 4</a></li> <li><a href="" tabindex="2">Menu 5</a></li> <li><a href="" tabindex="2">Menu 6</a></li> <li><a href="" tabindex="2">Menu 7</a></li> <li><a href="" tabindex="2">Menu 8</a></li> <li><a href="" tabindex="2">Menu 9</a></li> <li><a href="" tabindex="2">Menu 10</a></li> <li><a href="" tabindex="2">Menu 11</a></li> <li><a href="" tabindex="2">Menu 12</a></li> <li><a href="" tabindex="2">Menu 13</a></li> <li><a href="" tabindex="2">Menu 14</a></li> <li><a href="" tabindex="2">Menu 15</a></li> <li><a href="" tabindex="2">Menu 16</a></li> <li><a href="" tabindex="2">Menu 17</a></li> <li><a href="" tabindex="2">Menu 18</a></li> </ul> </nav> </header> </body> </html>
la source
width:100%
parwidth:1000px
elle fonctionne pour moiwhite-space: nowrap;
et les enfants surdisplay: inline-block;
comme déjà dit dans d'autres réponses (ou revenez àdisplay: table;
etdisplay: table-cell;
).main > * > * {background-color: #000;}
O_oPour moi (en utilisant bootstrap), la seule chose qui fonctionnait était de définir
display:absolute;z-index:1
la dernière cellule.la source
display:absolute
n'est pas valide CSSJ'ai eu un problème un peu similaire où une zone délimitée se composait d'une image dans un flottant: bloc gauche et un bloc de texte non flottant. La zone a une largeur fluide. Le texte serait, de par sa conception, enveloppé le long du côté droit de l'image. Le problème était que le texte commençait par une balise <h2>, dont le premier mot est le petit mot "From". Lorsque j'ai redimensionné la fenêtre à une largeur plus petite, le texte non flottant, pour une certaine plage de largeurs, ne laisserait que le mot "De" en haut de la zone d'habillage, le reste du texte ayant été pressé sous le flottant bloquer. Ma solution a été d'agrandir le premier mot de la balise, en remplaçant l'espace qui le suivait par ce code, <span style = "opacity: 0;"> x </span>. L'effet était de créer le premier mot, au lieu de "From", "FromxNextWord", où le "x", étant invisible, ressemblait à un espace. Maintenant, mon premier mot était assez gros pour ne pas être abandonné par le reste du bloc de texte.
la source