Дві діви, одна фіксована ширина, інша, решта


97

У мене є два контейнери з дівами.

У той час як одна повинна мати конкретну ширину, мені потрібно відрегулювати її так, щоб інший дів займав решту місця. Чи я можу це зробити?

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


4
Не використовуйте десятилітні хаки для старовинних браузерів. Прокрутіть униз до сучасного рішення флексокса.
Євгеній

1
Перш ніж перейти за посиланням Evgeny, розгляньте веб-переглядачі, якими користувачі фактично користуються, а не браузери, яких ви хотіли використовувати. Flexbox не збирається красиво винести на ваш професора IE 9: caniuse.com/#feat=flexbox
duhaime

@duhaime IE9 має 0,13% глобального використання
Євгеній

Так 1 з 1000 користувачів ...
duhaime

Відповіді:


127

Дивіться: http://jsfiddle.net/SpSjL/ (регулюйте ширину браузера)

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;
}

Ви також можете це зробити display: table, що зазвичай є кращим підходом: як я можу ввести елемент введення в ту саму лінію, що і його мітка?


4
Зі мною це не працює. Зліва йде зі 100% шириною, а права - 250 пікселів. Два рядки :(
ведмідь

19
Вам потрібно поміняти порядок divs, як, наприклад, у моїй відповіді та моїй демонстрації. rightто left.
тридцятьдот

1
В цілому це для мене працює, але іноді, коли у мене є текст у лівій діві замість загортання до наступного рядка (і є пробіл), його просто відрізають праворуч (там, де починається правий div). Як можна змусити загортання тексту в лівій діві?
Хлопець

1
Не плаваючий DIV заповнює всю ширину. Погана ідея, коли вміст вище, ніж плаваючий DIV або текст занадто довгий.
netAction

47

Це 2017 рік, і найкращий спосіб зробити це за допомогою flexbox, який сумісний з 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>


1
ваш коментар до цього питання врятував мене від спроб підтримати IE6. Дякую!
Майк Давлантес

Це також добре, але calc () набагато краще, ніж flex завдяки сумісності з IE9 та Chrome 26.
Don Dilanga

Це добре спрацювало для мене. Навіть не потрібно було визначати правильну ширину.
rotaercz

1
Мене вбиває те, що в 2017/2018/2019 ми все ще отримуємо коментарі відповідно до ПОВЕРНЕННЯ IE 9.
Майк

43

Ви можете використовувати calc () функцію CSS.

Демонстрація: 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;   
}

Сподіваюся, це допоможе вам !!


Дякую за пораду. Я перевірив сумісність браузерів, і це настільки високо для стабільного використання
Farside

1
Це слід вибрати як найкращу відповідь, оскільки в цій відповіді теги DIV не змінюються, як у найкращій відповіді.
Дон Діланга

14

Якщо ви можете перевернути замовлення у вихідному коді, ви можете зробити це так:

HTML:

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

CSS:

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

Приклад: http://jsfiddle.net/blineberry/VHcPT/

Додайте контейнер, і ви можете це зробити за допомогою поточного замовлення вихідного коду та абсолютного позиціонування:

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;
}

Тут .leftДІВ отримує неявно встановлену ширину від top, leftі rightстилів , що дозволяє їй заповнити простір, що залишився #container.

Приклад: http://jsfiddle.net/blineberry/VHcPT/3/


Приклад FIrst, здається, насправді не працює. .Left div у jsFiddle - це фактично повна ширина екрана. Якщо обидві діви однакової висоти, то це чудово, але в цьому випадку просто додайте 5px накладки на .left, і ви побачите.
користувач3413723

1
Друге рішення для мене чудово працювало. Геніальність!
користувач3413723

6

Якщо ви можете загорнути їх у контейнер, <div>ви можете використати позиціонування, щоб зробити лівий <div>прикріплений left:0;right:250px, дивіться цю демонстрацію . Я зараз скажу, що це не буде працювати в IE6, оскільки лише один куточок <div>може бути абсолютно розміщений на сторінці ( див. Тут для повного пояснення).


3

1- Майте оболонку Div, встановіть підкладку та поле, як вам подобається.
2. Зробіть лівий бік Div потрібної ширини і змусьте плавати ліворуч.
Встановіть правий бік поля Div рівний ширині лівого боку

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

Сподіваюся, це працює для вас!



1

встановіть своє право на конкретну ширину і поплавте нею, зліва лише встановіть маржу праворуч на 250 пікс

.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

Це повністю, локально, проте, дозвольте спробувати поставити це на jsfiddle.
ведмідь

ха-ха, ти зняв свій поплавок: так. Крім того, не забудьте врахувати ширину меж, тому якщо ви збираєтесь залишити ширини від однієї з ширин поділки.
meteorainer

0

Якщо вам потрібно рішення між веб-переглядачем, ви можете використовувати мій підхід, зрозумілий і простий.

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

-1

Використовуйте просте, це може вам допомогти

<table width="100%">
    <tr>
         <td width="200">fix width</td>
         <td><div>ha ha, this is the rest!</div></td>
    </tr>
</table>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.