Dois divs, um de largura fixa, o outro, o resto

97

Eu tenho dois contêineres div.

Embora um precise ter uma largura específica, preciso ajustá-lo para que o outro div ocupe o resto do espaço. Existe alguma maneira de fazer isso?

.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 -->

Urso
fonte
4
Não use hacks de uma década para navegadores antigos. Role para baixo para uma solução flexbox moderna.
Evgeny,
1
Antes de seguir o link do Evgeny, considere os navegadores que seus usuários realmente usam, em vez dos navegadores que você gostaria que eles usassem. O Flexbox não vai renderizar bem no IE 9 do seu professor: caniuse.com/#feat=flexbox
duhaime
@duhaime IE9 tem 0,13% de uso global
Evgeny
Portanto, 1 em cada 1000 usuários ...
duhaime

Respostas:

127

Veja: http://jsfiddle.net/SpSjL/ (ajuste a largura do 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;
}

Você também pode fazer isso com display: table, que geralmente é uma abordagem melhor: Como posso colocar um elemento de entrada na mesma linha de seu rótulo?

trinta pontos
fonte
4
Não está funcionando comigo. A esquerda terá 100% de largura e a direita 250 px. Duas linhas :(
urso
19
Você precisa trocar a ordem dos divs, como na minha resposta e na minha demonstração. rightentão left.
thirtydot
1
De modo geral, isso funciona para mim, mas às vezes quando tenho texto no div esquerdo em vez de quebrar para a próxima linha (e há espaço), ele é apenas cortado à direita (onde começa o div direito). Como faço o texto quebrar na div esquerda?
Guy
1
O DIV não flutuante preenche toda a largura. Má ideia quando o conteúdo é mais alto do que DIV flutuante ou texto muito longo.
netAction de
47

Estamos em 2017 e a melhor maneira de fazer isso é usando o flexbox, que é compatível com o 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
fonte
1
Seu comentário sobre a pergunta me salvou de tentar oferecer suporte ao IE6. obrigado!
Mike Davlantes
Isso também é bom, mas calc () é muito melhor do que flex devido à compatibilidade com IE9 e Chrome 26.
Don Dilanga
Isto funcionou bem para mim. Nem precisava definir a largura direita.
rotaercz
1
Me mata que em 2017/2018/2019 ainda recebamos comentários na linha de BEWARE OF IE 9.
Mike Devenney
43

Você pode usar a função calc () do CSS.

Demonstração: 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 isso ajude você !!

Shivali Patel
fonte
Obrigado pelo conselho. Eu verifiquei a compatibilidade entre os navegadores, e é meio alto para uso estável
Farside
1
Esta deve ser selecionada como a melhor resposta, pois nesta resposta as tags DIV não são trocadas como na melhor resposta.
Don Dilanga
14

Se você puder inverter o pedido no código-fonte, poderá fazer assim:

HTML:

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

CSS:

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

Um exemplo: http://jsfiddle.net/blineberry/VHcPT/

Adicione um contêiner e você pode fazer isso com sua ordem de código-fonte atual e posicionamento 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;
}

Aqui, o .leftdiv recebe uma largura definida implicitamente dos top, lefte rightestilos que lhe permite preencher o espaço restante no #container.

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

Brent
fonte
O primeiro exemplo parece não funcionar de verdade. A div. Esquerda no jsFiddle é, na verdade, a largura total da tela. Se os dois divs tiverem a mesma altura, ótimo, mas, neste caso, basta adicionar 5px padding a .left e você verá.
user3413723
1
A segunda solução funcionou muito bem para mim. Gênio!
user3413723
6

Se você puder embrulhá-los em um contêiner, <div>poderá usar o posicionamento para deixar o esquerdo <div>ancorado left:0;right:250px, veja esta demonstração . Direi agora que isso não funcionará no IE6, pois apenas um canto de um <div>pode ser posicionado absolutamente em uma página ( veja aqui a explicação completa).

andyb
fonte
3

1- Tenha um div de invólucro, defina o preenchimento e a margem como desejar
2- Faça o div do lado esquerdo da largura que você precisa e faça-o flutuar para a esquerda
3- Defina a margem div do lado direito igual à largura do lado esquerdo

.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 funcione para voce!

Oscar
fonte
1

defina sua direita para a largura específica e flutue-a, à sua esquerda apenas defina a margem direita para 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
}
meteoro
fonte
elimine o tipo de exibição .right e certifique-se de não ter uma configuração clara em qualquer lugar que possa afetar
.left
você tem algum tipo de wrapper div? Existe algo online que eu possa inspecionar ou isso é totalmente local?
meteorainer
É completamente local, no entanto, deixe-me tentar colocá-lo no jsfiddle.
urso
haha, você removeu seu flutuador: certo. Além disso, não se esqueça de levar em conta as larguras das bordas, portanto, se você for deixá-las in, subtraia as larguras de uma das larguras div.
meteorainer
0

Se você precisa de uma solução para vários navegadores, pode usar minha abordagem, de forma clara e 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;
}

fonte
-1

Use o simples, isso pode ajudá-lo

<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
fonte