CSS dos divs uno al lado del otro

230

Quiero poner dos <div>s uno al lado del otro. El derecho <div>es de unos 200 px; y la izquierda <div>debe llenar el resto del ancho de la pantalla? ¿Cómo puedo hacer esto?

Martijn
fuente

Respuestas:

421

Puede usar flexbox para diseñar sus artículos:

#parent {
  display: flex;
}
#narrow {
  width: 200px;
  background: lightblue;
  /* Just so it's visible */
}
#wide {
  flex: 1;
  /* Grow to rest of container */
  background: lightgreen;
  /* Just so it's visible */
}
<div id="parent">
  <div id="wide">Wide (rest of width)</div>
  <div id="narrow">Narrow (200px)</div>
</div>

Esto es básicamente solo raspar la superficie de flexbox. Flexbox puede hacer cosas bastante sorprendentes.


Para la compatibilidad con navegadores antiguos, puede usar CSS flotante y propiedades de ancho para resolverlo.

#narrow {
  float: right;
  width: 200px;
  background: lightblue;
}
#wide {
  float: left;
  width: calc(100% - 200px);
  background: lightgreen;
}
<div id="parent">
  <div id="wide">Wide (rest of width)</div>
  <div id="narrow">Narrow (200px)</div>
</div>

Minnesota
fuente
14
Esta es en realidad la respuesta correcta, es concisa y, a diferencia de las dos que se encuentran arriba, es completamente autónoma. Las mejores respuestas sobre SO deberían ser así, OMI. +1
Bobby Jack
¿Quieres explicar por qué la izquierda debe ser float:left? Su comentario a mi respuesta dice 'se requiere que el lft div abarque todo el área izquierda', pero float:lefthará que ajuste el contenido firmemente.
falstro
14
Esta respuesta no es del todo correcta y es bastante molesto ver que se vota tanto. Esto crea un diseño que es muy inestable. Aconsejaría poner los dos divs en un contenedor y usar la propiedad display: inline-block para que los divs se alineen, como han sugerido algunas de las otras respuestas. No estoy criticando a nadie, ya que todos estamos aquí para ayudarnos unos a otros, así que además de mi selección, gracias MN por sus contribuciones a esta comunidad.
Mussser
1
PERO una cosa a tener en cuenta es que el bloqueo en línea no funcionará en versiones anteriores de IE ...
Mussser
3
@Mussser Estoy de acuerdo con su comentario, pero tenga en cuenta que esta respuesta proviene de 2009 ... un momento en que lo que llama "versiones anteriores de Ie" (es decir: IE8 y menos) eran versiones "actuales" de IE ...
Laurent S.
139

No sé si esto sigue siendo un problema actual o no, pero acabo de encontrar el mismo problema y usé la display: inline-block;etiqueta CSS . Envolviendo estos en un div para que puedan colocarse adecuadamente.

<div>
    <div style="display: inline-block;">Content1</div>
    <div style="display: inline-block;">Content2</div>
</div>

Tenga en cuenta que el uso del atributo de estilo en línea solo se usó para la concisión de este ejemplo, por supuesto, estos se movieron a un archivo CSS externo.

russholio
fuente
1
Esta fue la solución para mí. Quería dos divs adyacentes como [] [] (hombre, ha pasado un tiempo desde que hice esto ...) =) felicitaciones.
Partack el
Este también funcionó para mí. Tuve algunos problemas con otro flotador: div derecho empujando mi columna de columna derecha hacia abajo debajo de la izquierda, así que también hice que el contenedor use display: inline-block, y eso lo resolvió.
Martin Carney
55
Esto no funciona cuando el contenido es grande en Content1 DIV. El resultado es que los DIV están en dos líneas separadas en lugar de lado a lado.
Richard Hollis
@ RichardHollis Pude establecer la widthpropiedad de todos mis 2 divs uno al lado del otro para evitar envolver el segundo en una nueva línea.
Trindaz
1
agregue el css vertical-align: top; a ambos también, de lo contrario se presionarán entre sí si la duración del contenido difiere
prospector
27

Desafortunadamente, esto no es algo trivial para resolver en el caso general. Lo más fácil sería agregar una propiedad de estilo CSS "float: right;" sin embargo, a su div 200px, esto también haría que su "main" -div sea realmente de ancho completo y cualquier texto allí flote alrededor del borde de la 200px-div, que a menudo se ve raro, dependiendo del contenido (más o menos en todos los casos excepto si es una imagen flotante).

EDITAR: Según lo sugerido por Dom, el problema de envoltura, por supuesto, podría resolverse con un margen. Tonto de mí.

falstro
fuente
1
'float: left' será más adecuado, el lft div se requiere para abarcar todo el área izquierda. Sin ofensas significadas, solo considere.
MN
19

El método sugerido por @roe y @MohitNanda funciona, pero si el div correcto está configurado como float:right;, entonces debe aparecer primero en la fuente HTML. Esto rompe el orden de lectura de izquierda a derecha, lo que podría ser confuso si la página se muestra con estilos desactivados. Si ese es el caso, podría ser mejor usar un contenedor envolvente y posicionamiento absoluto:

<div id="wrap" style="position:relative;">
    <div id="left" style="margin-right:201px;border:1px solid red;">left</div>
    <div id="right" style="position:absolute;width:200px;right:0;top:0;border:1px solid blue;">right</div>
</div>

Demostrado:

izquierda derecha

Editar: Hmm, interesante. La ventana de vista previa muestra los divs formateados correctamente, pero el elemento de publicación representado no. Lo siento, entonces tendrás que probarlo por ti mismo.

David Hanak
fuente
15

Me encontré con este problema hoy. Basado en las soluciones anteriores, esto funcionó para mí:

<div style="width:100%;"> 
    <div style="float:left;">Content left div</div> 
    <div style="float:right;">Content right div</div> 
</div> 

Simplemente haga que el div principal abarque todo el ancho y flote los divs contenidos dentro.

Wickyd
fuente
8

ACTUALIZAR

Si necesita colocar elementos en una fila, puede usar Flex Layout . Aquí tienes otro tutorial de Flex . Es una gran herramienta CSS y, aunque no es 100% compatible, cada día su soporte mejora. Esto funciona tan simple como:

HTML

<div class="container">
    <div class="contentA"></div>
    <div class="contentB"></div>
</div>

CSS

.container {
    display: flex;
    width: 100%;
    height: 200px;
}

.contentA {
    flex: 1;
}

.contentB {
    flex: 3;
}

Y lo que obtienes aquí es un contenedor con un tamaño total de 4 unidades, que comparte el espacio con sus hijos en una relación de 1/4 y 3/4.

He hecho un ejemplo en CodePen que resuelve su problema. Espero que ayude.

http://codepen.io/timbergus/pen/aOoQLR?editors=110

MUY VIEJO

Tal vez esto sea una tontería, pero ¿has probado con una mesa? No utiliza directamente CSS para posicionar los divs, pero funciona bien.

Puede crear una tabla 1x2 y poner su divsinterior, y luego formatear la tabla con CSS para colocarlos como desee:

<table>
  <tr>
    <td>
      <div></div>
    </td>
    <td>
      <div></div>
    </td>
  </tr>
</table>

Nota

Si desea evitar el uso de la tabla, como se dijo anteriormente, puede usar float: left;y float: right;en el siguiente elemento, no olvide agregar un clear: left;, clear: right;o clear: both;para que se limpie la posición.

Timbergus
fuente
Las tablas son una solución mucho más predecible que el "flotador" en constante cambio que siempre parece estropear algo cuando agrega o elimina elementos.
Kokodoko
Esta es una buena solución si está trabajando con correos electrónicos.
Zac Clancy
6
div1 {
    float: right;
} 
div2 {
    float: left;
}

Esto funcionará bien siempre que establezca clear: bothel elemento que separa este bloque de dos columnas.

ccpizza
fuente
3
Al usar flotantes, debe establecer la propiedad de ancho. Así que no creo que esto es una buena solución ..
Martijn
4

Me encontré con el mismo problema y la versión de Mohits funciona. Si desea mantener su orden izquierda-derecha en el html, intente esto. En mi caso, el div izquierdo está ajustando el tamaño, el div derecho permanece en el ancho 260px.

HTML

<div class="box">
<div class="left">Hello</div>
<div class="right">World</div>
</div>

CSS

.box {
    height: 200px;
    padding-right: 260px;
}    

.box .left {
    float: left;
    height: 200px;
    width: 100%;
}

.box .right {
    height: 200px;
    width: 260px;
    margin-right: -260px;
}

El truco es usar un relleno derecho en el cuadro principal, pero usar ese espacio nuevamente colocando el cuadro derecho nuevamente con margen derecho.

andreas
fuente
No hago que funcione sin flotador: justo en .right.
Jussi Palo
3

Yo uso una mezcla de flotador y overflow-x: oculto. Código mínimo, siempre funciona.

https://jsfiddle.net/9934sc4d/4/ - ¡ADEMÁS, no necesitas limpiar tu flotador!

.left-half{
    width:200px;
    float:left;
}
.right-half{
    overflow-x:hidden;
}
Tony Ray Tansley
fuente
1
Es útil cuando conoce la altura del div y sabe que el contenido no es más largo que esta altura. Sin embargo, cuando hay más contenido que la altura del div, está oculto, debido al desbordamiento ...
Martijn
1
Eso es realmente mejor :)
Martijn
1
¡Agradable! Es bueno ver a las personas retroalimentando con retroalimentación útil y positiva, en lugar de retroalimentación negativa no constructiva. Buen hombre @Martijn
Tony Ray Tansley
Gracias por esto. Hago la mayor parte de mi trabajo de interfaz de usuario en React Native y el cuadro flexible funciona mucho mejor allí que en HTML + CSS (en mi opinión). Esto me hizo la vida mucho más fácil.
Eric Wiener
2

Como todos han señalado, lo hará estableciendo un float:right;en el contenido de RHS y un margen negativo en el LHS.

Sin embargo, si no usa un float: left;en el LHS (como lo hace Mohit), obtendrá un efecto de escalonamiento porque el div LHS seguirá consumiendo el espacio marginal en el diseño.

Sin embargo ... el flotador LHS encogerá el contenido, por lo que necesitará insertar un nodo secundario de ancho definido si eso no es aceptable, en ese momento también podría haber definido el ancho en el elemento primario.

Sin embargo, como señala David, puede cambiar el orden de lectura del marcado para evitar el requisito de flotación de LHS, pero eso tiene problemas de legibilidad y posiblemente de accesibilidad.

Sin embargo, este problema se puede resolver con flotadores con un margen adicional

(advertencia: no apruebo el .clearing div en ese ejemplo, vea aquí para más detalles)

A fin de cuentas, creo que la mayoría de nosotros desearía que hubiera un ancho no codicioso: permanecer en CSS3 ...

annakata
fuente
2

Esta no será la respuesta para todos, ya que no es compatible con IE7-, pero podría usarla y luego usar una respuesta alternativa para IE7-. Es display: table, display: table-row y display: table-cell. Tenga en cuenta que esto no es usar tablas para el diseño, sino diseñar divs para que las cosas se alineen bien sin toda la molestia de arriba. La mía es una aplicación html5, por lo que funciona muy bien.

Este artículo muestra un ejemplo: http://www.sitepoint.com/table-based-layout-is-the-next-big-thing/

Así es como se verá su hoja de estilo:

 .container {
    display: table;
    width:100%;
 }

 .left-column {
    display: table-cell;
 }

 .right-column {
    display: table-cell;
    width: 200px;
 }
dwaz
fuente
-1

Parafraseando uno de mis sitios web que hace algo similar:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
 <head>
  <style TYPE="text/css"><!--

.section {
    _float: right; 
    margin-right: 210px;
    _margin-right: 10px;
    _width: expression( (document.body.clientWidth - 250) + "px");
}

.navbar {
    margin: 10px 0;
    float: right;
    width: 200px;
    padding: 9pt 0;
}

  --></style>
 </head>
 <body>
  <div class="navbar">
  This will take up the right hand side
  </div>
  <div class="section">
  This will fill go to the left of the "navbar" div
  </div>
 </body>
</html>
Rowland Shaw
fuente
44
Yo no, pero supongo que los hacks CSS, el doctype de transición o la falta de explicación.
annakata
Al menos tenía un doctype :) Supongo que podría ser gente a la que no le gustan los hacks del navegador por los márgenes en IE. Al menos lo había probado ...
Rowland Shaw
Es muy hacky. Hay muchas soluciones por ahí que son mucho más concisas.
John Bell
@JohnBell tal vez ese es el problema con el tiempo: era una solución razonable en ese momento (hace más de 8 años), pero la tecnología del navegador ha avanzado desde entonces. Curiosamente, algunas de las otras respuestas contemporáneas con la mía que proponen la misma idea obtuvieron mejores resultados (como la de David, dos minutos después de la mía)
Rowland Shaw
-7

solo use un índice z y todo se sentirá bien. asegúrese de tener posiciones marcadas como fijas o absolutas. entonces nada se moverá como con una etiqueta flotante.

Jengibre
fuente