Dos divs, uno de ancho fijo, el otro, el resto

97

Tengo dos contenedores div.

Si bien uno debe tener un ancho específico, necesito ajustarlo, de modo que el otro div ocupe el resto del espacio. ¿Hay alguna forma de que pueda hacer esto?

.left {
    float: left;
    width: 83%;
    display: table-cell;
    vertical-align: middle;
    min-height: 50px;
    margin-right: 10px;
    overflow: auto;
}

.right {
    float: right;
    width: 16%;
    text-align: right;
    display: table-cell;
    vertical-align: middle;
    min-height: 50px;
    height: 100%;
    overflow: auto;
}
<div class="left"></div>
<div class="right"></div> <!-- needs to be 250px -->

oso
fuente
4
No use hacks de hace una década para navegadores antiguos. Desplácese hacia abajo para ver una solución moderna de caja flexible.
Evgeny
1
Antes de seguir el enlace de Evgeny, considere los navegadores que realmente usan sus usuarios, en lugar de los navegadores que deseaba que usaran. Flexbox no se renderizará bien en el IE 9 de su profesor: caniuse.com/#feat=flexbox
duhaime
@duhaime IE9 tiene un uso global del 0,13%
Evgeny
Entonces 1 de cada 1000 usuarios ...
duhaime

Respuestas:

127

Ver: http://jsfiddle.net/SpSjL/ (ajustar el ancho del navegador)

HTML:

<div class="right"></div>
<div class="left"></div>

CSS:

.left {
    overflow: hidden;
    min-height: 50px;
    border: 2px dashed #f0f;
}

.right {
    float: right;
    width: 250px;
    min-height: 50px;
    margin-left: 10px;
    border: 2px dashed #00f;
}

También puede hacerlo con display: table, que suele ser un enfoque mejor: ¿Cómo puedo poner un elemento de entrada en la misma línea que su etiqueta?

treinta y dos
fuente
4
No funciona conmigo. La izquierda va al 100% de ancho y la derecha 250px. Dos líneas :(
oso
19
Debe cambiar el orden de las divs, como en mi respuesta y mi demostración. rightentonces left.
thirtydot
1
En general, esto funciona para mí, pero a veces cuando tengo texto en el div izquierdo en lugar de pasar a la siguiente línea (y hay espacio), simplemente se corta a la derecha (donde comienza el div derecho). ¿Cómo puedo hacer que el texto se ajuste al div de la izquierda?
Guy
1
DIV no flotante ocupa todo el ancho. Mala idea cuando el contenido es más alto que DIV flotante o el texto es demasiado largo.
netAction
47

Es 2017 y la mejor manera de hacerlo es usando flexbox, que es compatible con IE10 + .

.box {
  display: flex;
}

.left {
  flex: 1;  /* grow */
  border: 1px dashed #f0f;
}

.right {
  flex: 0 0 250px; /* do not grow, do not shrink, start at 250px */
  border: 1px dashed #00f;
}
<div class="box">
  <div class="left">Left</div>
  <div class="right">Right 250px</div>
</div>

Evgeny
fuente
1
su comentario sobre la pregunta me salvó de intentar admitir IE6. ¡Gracias!
Mike Davlantes
Esto también es bueno, pero calc () es mucho mejor que flex debido a la compatibilidad con IE9 y Chrome 26.
Don Dilanga
Esto funcionó bien para mí. Ni siquiera necesitaba definir el ancho .right.
rotaercz
1
Me mata que en 2017/2018/2019 todavía recibamos comentarios en la línea de BEWARE OF IE 9.
Mike Devenney
43

Puede utilizar la función calc () de CSS.

Demostración: http://jsfiddle.net/A8zLY/543/

<div class="left"></div>
<div class="right"></div>

.left {
height:200px;
width:calc(100% - 200px);
background:blue;
float:left;
}

.right {
width:200px;
height:200px;
background:red;
float:right;   
}

¡¡Espero que esto te ayudará!!

Shivali Patel
fuente
gracias por el consejo. Verifiqué la compatibilidad entre los navegadores, y es algo alto para un uso estable
Farside
1
Esta debe seleccionarse como la mejor respuesta, porque en esta respuesta las etiquetas DIV no se intercambian como en la mejor respuesta.
Don Dilanga
14

Si puede cambiar el orden en el código fuente, puede hacerlo así:

HTML:

<div class="right"></div> // needs to be 250px    
<div class="left"></div>

CSS:

.right {
  width: 250px;
  float: right;
}   

Un ejemplo: http://jsfiddle.net/blineberry/VHcPT/

Agregue un contenedor y puede hacerlo con su orden de código fuente actual y posicionamiento absoluto:

HTML:

<div id="container">
  <div class="left"></div>
  <div class="right"></div>
</div>

CSS:

#container {
  /* set a width %, ems, px, whatever */
  position: relative;
}

.left {
  position: absolute;
  top: 0;
  left: 0;
  right: 250px;
}

.right {
  position: absolute;
  background: red;
  width: 250px;
  top: 0;
  right: 0;
}

Aquí, el .leftdiv obtiene un ancho establecido implícitamente de los top, lefty rightestilos que le permite llenar el espacio restante en #container.

Ejemplo: http://jsfiddle.net/blineberry/VHcPT/3/

Brent
fuente
El primer ejemplo no parece funcionar realmente. El .left div en jsFiddle es en realidad el ancho completo de la pantalla. Si ambos divs tienen la misma altura, entonces genial, pero en este caso solo agregue un relleno de 5px a .left y verá.
user3413723
1
Sin embargo, la segunda solución funcionó muy bien para mí. ¡Genio!
user3413723
6

Si puede envolverlos en un contenedor en el <div>que podría usar el posicionamiento para <div>anclar el lado izquierdo left:0;right:250px, vea esta demostración . Diré ahora que esto no funcionará en IE6 ya que solo una esquina de a <div>puede posicionarse absolutamente en una página ( vea aquí para una explicación completa).

andyb
fuente
3

1- Tenga un div de envoltura, configure el relleno y el margen como desee
2- Haga que el div del lado izquierdo tenga el ancho que necesita y hágalo flotar hacia la izquierda
3- Establezca el margen del div del lado derecho igual al ancho del lado izquierdo

.left
{
    ***width:300px;***
    float: left;
    overflow:hidden;

}

.right
{
    overflow: visible;
    ***margin-left:300px;***
}



<div class="wrapper">
    <div class="left">
        ...
    </div>

    <div class="right" >
        ...
    </div>

</div>

¡Espero que esto funcione para usted!

Oscar
fuente
1

establezca su derecha en el ancho específico y flote, a su izquierda simplemente establezca el margen derecho en 250px

.left {
vertical-align: middle;
min-height: 50px;
margin-right: 250px;
overflow: auto

}

.right {
width:250px;
text-align: right;
display: table-cell;
vertical-align: middle;
min-height: 50px;
height: 100%;
overflow: auto
}
meteorainer
fuente
elimine el tipo de pantalla en .right y asegúrese de no tener una configuración clara en ningún lugar que afecte a .left
meteorainer
¿tienes algún tipo de envoltorio div? ¿Hay algo en línea que pueda inspeccionar o es totalmente local?
meteorainer
Es completamente local, sin embargo, déjame intentar ponerlo en jsfiddle.
oso
jaja, te quitaste el flotador: correcto. Además, no olvide tener en cuenta los anchos de los bordes, por lo que si va a dejarlos reste los anchos de uno de los anchos div.
meteorainer
0

Si necesita una solución de navegador cruzado, puede utilizar mi enfoque, claro y fácil.

.left{
        position: absolute;
        height: 150px;
        width:150px;
        background: red;
        overflow: hidden;
        float:left;
}
.right{
        position:relative;
        height: 150px;
        width:100%;
        background: red;
        margin-left:150px;
        background: green;
        float:right;
}

fuente
-1

Usa lo simple que esto puede ayudarte

<table width="100%">
    <tr>
         <td width="200">fix width</td>
         <td><div>ha ha, this is the rest!</div></td>
    </tr>
</table>
Huỳnh Hữu Ân
fuente