Cómo colocar div lado a lado

241

Tengo un div de contenedor principal que se establece al 100% de ancho. Dentro de eso, me gustaría tener dos divisiones, una de ancho fijo y la otra que ocupa el resto del espacio. ¿Cómo floto el segundo div para llenar el resto del espacio? Gracias por cualquier ayuda.

Markt
fuente
2
La próxima vez también coloque su código de ejemplo, por lo que la pregunta se hace más clara para los desarrolladores aquí ..
Rob
1
¿Es position: absoluta una opción? puede establecer la posición a los lados del contenedor, y el div tomará el nuevo tamaño.
AlexanderMP

Respuestas:

363

Hay muchas formas de hacer lo que está pidiendo:

  1. Usando la propiedad CSSfloat :

    <div style="width: 100%; overflow: hidden;">
        <div style="width: 600px; float: left;"> Left </div>
        <div style="margin-left: 620px;"> Right </div>
    </div>
  2. Uso de la propiedad CSSdisplay , que se puede utilizar para hacer que divs actúe como un table:

    <div style="width: 100%; display: table;">
        <div style="display: table-row">
            <div style="width: 600px; display: table-cell;"> Left </div>
            <div style="display: table-cell;"> Right </div>
        </div>
    </div>

Hay más métodos, pero esos dos son los más populares.

Crozin
fuente
17
Solución HTML 5 de @filoxo, úsela en su lugar
TheMcMurder
1
Lo que dijo el comentarista anterior: considere agregar una solución HTML5 por filoxo como # 3.
Ahmed Fasih
2
@TheMcMurder: para nosotros que necesitamos admitir navegadores antiguos (por ejemplo, IE <11), esa no es una opción.
Oyvind
@Oyvind, tienes toda la razón. Depende de su caso de uso. Si es compatible con IE 8, 9 o 10, tendría que ser compatible con polyfill. Recomendaría un servicio como polyfill.io cdn.polyfill.io/v2/docs o github.com/10up/flexibility, pero puede ser muy estricto. requisitos que impiden el uso de polyfills.
TheMcMurder
1
¿Qué hace overflow: hidden hacer? ¿No es esto para elementos con una altura especificada?
michael
176

CSS3 introdujo cajas flexibles (también conocido como caja flexible) que también pueden lograr este comportamiento.

Simplemente defina el ancho del primer div y luego asigne al segundo un flex-growvalor 1que le permita llenar el ancho restante del padre.

.container{
    display: flex;
}
.fixed{
    width: 200px;
}
.flex-item{
    flex-grow: 1;
}
<div class="container">
  <div class="fixed"></div>
  <div class="flex-item"></div>
</div>

jsFiddle demo

Tenga en cuenta que los cuadros flexibles no son compatibles con los navegadores antiguos, pero es una excelente opción para apuntar a los navegadores modernos (consulte también Caniuse y MDN ). Una gran guía completa sobre cómo usar las cajas flexibles está disponible en CSS Tricks .

filoxo
fuente
55
¡Tomó todo el día encontrar una solución y esta respuesta la resolvió! Tengo 4 paneles uno al lado del otro, y los paneles 3 y 4 a veces no tienen nada en ellos. Todos viven en un div que contiene con un borde alrededor de ellos. El flotador completo: a la izquierda en la primera situación div me dejó con un div pasando el borde en la parte inferior porque las etiquetas generadas son dinámicas. Las etiquetas se extienden porque así es como las representa ASP. No tener el flotador: izquierda hizo solo 3 de los divs en la misma fila. Y el uso de una mesa está fuera de discusión. ¡Gracias!
Luminous
¿Existe un método compatible con versiones anteriores para usar algo como esto, es decir, para nosotros, los pobres tontos que todavía tenemos que admitir IE 8-10
Ben A. Hilleli
@ BenA.Hilleli que podría depender de sus requisitos (p. Ej., Mejora progresiva o degradación elegante ) pero una búsqueda rápida arrojó esta guía (un poco desactualizada) "Cómo usar flexbox en el mundo real" , así como Flexie.js que soporta IE6-9. Alternativamente, pruebe cualquiera de las otras respuestas para esta pregunta, ya que logran lo mismo.
filoxo
20

No sé mucho acerca de las estrategias de diseño de HTML y CSS, pero si está buscando algo simple y que se ajuste automáticamente a la pantalla (como soy), creo que la solución más directa es hacer que los divs se comporten como palabras en un párrafo. Intenta especificardisplay: inline-block

<div style="display: inline-block">
   Content in column A
</div>
<div style="display: inline-block">
   Content in column B
</div>

Puede que necesite o no especificar el ancho de los DIV

Guillermo Ruffino
fuente
55
Probablemente display:flexsea ​​la mejor solución, pero creo que inline-blocktambién es excelente porque funciona en más navegadores. Por cierto, es posible que deba envolver ambos divs con un <div style="white-space:nowrap">para evitar la ruptura en el cambio de tamaño.
John Henckel
Esta es una buena solución para crear plantillas. El único problema es que empuja un div con menor contenido al fondo. ¿Cómo empujarlo a la cima?
Casi un principiante
1
nvm, solo necesito buscarlo, la solución es: vertical-align: top;
Casi un principiante
@JohnHenckel eso significa que no es para todos los navegadores, ¿no podría funcionar para todos los navegadores de la misma manera? inline-blockcódigo.
Kavindu Gayantha
@guillermo no funciona bien. todos los divs no se colocan uno al lado del otro. porqué es eso. no está claro.
Kavindu Gayantha
14

Puede usar la cuadrícula CSS para lograr esto, esta es la versión de mano larga con fines ilustrativos:

div.container {
    display: grid;
    grid-template-columns: 220px 20px auto;
    grid-template-rows: auto;
}

div.left {
    grid-column-start: 1;
    grid-column-end: 2;
    grid-row-start: row1-start
    grid-row-end: 3;
    background-color: Aqua;
}

div.right {
    grid-column-start: 3;
    grid-column-end: 4;
    grid-row-start: 1;
    grid-row-end; 1;
    background-color: Silver;
}

div.below {
    grid-column-start: 1;
    grid-column-end: 4;
    grid-row-start: 2;
    grid-row-end; 2;
}
<div class="container">
    <div class="left">Left</div>
    <div class="right">Right</div>
    <div class="below">Below</div>
</div>

O el método más tradicional que utiliza flotante y margen.

He incluido un color de fondo en este ejemplo para ayudar a mostrar dónde están las cosas, y también qué hacer con el contenido debajo del área flotante.

No ponga sus estilos en línea en la vida real, extráigalos en una hoja de estilos.

div.left {
    width: 200px;
    float: left;
    background-color: Aqua;
}

div.right {
    margin-left: 220px;
    background-color: Silver;
}

div.clear {
    clear: both;
}
    <div class="left"> Left </div>
    <div class="right"> Right </div>
    <div class="clear">Below</div>

<div style="width: 200px; float: left; background-color: Aqua;"> Left </div>
<div style="margin-left: 220px; background-color: Silver;"> Right </div>
<div style="clear: both;">Below</div>
Fenton
fuente
2

Dale al primer div un flotador hacia la izquierda y fija con, el segundo div 100% de ancho un flotador hacia la izquierda Eso debería hacer el truco. Si desea colocar elementos debajo de él, necesita un claro: ambos en el elemento que desea colocar debajo

Robar
fuente
2
<div class="container" style="width: 100%;">
    <div class="sidebar" style="width: 200px; float: left;">
        Sidebar
    </div>
    <div class="content" style="margin-left: 202px;">
        content 
    </div>
</div>

Esto será compatible con el navegador cruzado. Sin el margen izquierdo, se encontrará con problemas con el contenido que se ejecuta completamente hacia la izquierda si su contenido es más largo que su barra lateral.

RDL
fuente
1

Si no está tagetizando IE6, entonces flote el segundo <div>y dele un margen igual (o tal vez un poco más grande) al <div>ancho fijo del primero .

HTML:

<div id="main-wrapper">
    <div id="fixed-width"> lorem ipsum </div>
    <div id="rest-of-space"> dolor sit amet </div>
</div>

CSS:

#main-wrapper {
    100%;
    background:red;
}
#fixed-width {
    width:100px;
    float:left
}
#rest-of-space {
    margin-left:101px;
        /* May have to increase depending on borders and margin of the fixd width div*/
    background:blue;
}

El margen explica la posibilidad de que el 'resto del espacio' <div>pueda contener más contenido que el 'ancho fijo' <div>.

No le dé al ancho fijo un fondo; si necesita verlos visiblemente como 'columnas' diferentes, use el truco Faux Columns .

Richard JP Le Guen
fuente