CSS Як встановити висоту div 100% мінус nPx


199

У мене є обгортковий дів, який містить 2 діви поруч. Над цим контейнером у мене є div, який містить мій заголовок. Обгортаючий div повинен бути на 100% мінус висоту заголовка. Заголовок - близько 60 пікс. Це виправлено. Отже, моє запитання таке: як я встановив, щоб висота мого оболонки була 100% мінус 60 пікс.

<div id="header"></div>
<div id="wrapper">
  <div id="left"></div>
  <div id="right"></div>
</div>

16
Я дуже хочу, щоб w3c розглядав можливість додавання деякого значення мінус константа властивості до ширини, вони забули включити межі в ширину, але вони повинні були змінити визначення, більшість CSS-хаків зникне, якби ці дві речі були доступні.
samarjit samanta

Відповіді:


79

Ось робочий css, перевірений у Firefox / IE7 / Safari / Chrome / Opera.

* {margin:0px;padding:0px;overflow:hidden}
div {position:absolute}
div#header {top:0px;left:0px;right:0px;height:60px}
div#wrapper {top:60px;left:0px;right:0px;bottom:0px;}
div#left {top:0px;bottom:0px;left:0px;width:50%;overflow-y:auto}
div#right {top:0px;bottom:0px;right:0px;width:50%;overflow-y:auto}

"overflow-y" не схвалено w3c, але кожен великий браузер підтримує це. Ваші два диви #left та #right відобразять вертикальну смугу прокрутки, якщо їх вміст занадто високий.

Щоб це працювало під IE7, потрібно запустити режим, сумісний зі стандартами, додавши DOCTYPE:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
            "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title></title>
<style type="text/css">
	*{margin:0px;padding:0px;overflow:hidden}
	div{position:absolute}
	div#header{top:0px;left:0px;right:0px;height:60px}
	div#wrapper{top:60px;left:0px;right:0px;bottom:0px;}
	div#left{top:0px;bottom:0px;left:0px;width:50%;overflow-y:auto}
	div#right{top:0px;bottom:0px;right:0px;width:50%;overflow-y:auto}
</style>
</head>
<body>
<div id="header"></div>
<div id="wrapper">
  <div id="left"><div style="height:1000px">high content</div></div>
  <div id="right"></div>
</div>
</body>


Він працює у FF, але я не хочу; не змушу його працювати під IE7. Я бачу лише код "Заголовок": <div id = "header"> Заголовок </div> <div id = "обгортка"> <div id = "зліва"> Зліва </div> <div id = "Право"> Вправо </div> </div>
Martijn

Ви запустили режим, сумісний зі стандартами? Я додам сторінку прикладу у свою відповідь.
Alsciende

1
Крім того, якщо вам потрібно розташувати ці діви в середині сторінки чи деінде, просто загорніть їх у контейнер і встановіть position: relativeна контейнер. Потім помістіть контейнер в будь-яке місце на сторінці.
Mrchief

що стосується внутрішнього div, наприклад, у #left, якщо я хочу 2 діви відповідної висоти 40% та 60%?
TecHunter

Чи є конкретна причина того, чому px були вказані за параметрами значення 0?
Кассандра

274

У CSS3 ви можете використовувати

height: calc(100% - 60px);

25
Переконайтеся, що у вас є пробіл до та після знаку "-". Firefox повинен мати пробіл перед знаком "-".
Codler

7
досконалий. я не знав, що CSS3 може це зробити.
Том Бук

Оце Так! саме те, що я хотів. Дякую.
Сандху

1
Це фантастично
Мірко

47

Якщо вам потрібно підтримувати IE6, використовуйте JavaScript, тому керуйте розміром оболонки div (встановіть положення елемента в пікселях після зчитування розміру вікна). Якщо ви не хочете використовувати JavaScript, цього робити не можна. Є обхідні шляхи, але очікуйте тиждень-два, щоб він працював у кожному випадку та в кожному браузері.

Для інших сучасних браузерів використовуйте цей css:

position: absolute;
top: 60px;
bottom: 0px;

Сайт сумісний лише з IE 7. Коли я використовую висоту: 100% і верх: 60 пікселів; Я все ще хет прокрутки. Я можу прокручувати 60px вниз.
Martijn

4
Не вказуйте висоту, використовуйте верхню та нижню частину та дозвольте браузеру обчислювати висоту.
Аарон Дігулла

Але я хочу, щоб моя сторінка мала максимальну висоту 100% мінус 60 пікселів; Якщо вміст більший, ніж цей вміст, я хочу прокрутки в діві, використовуючи переповнення: scroll;
Martijn

4
Для смуги прокрутки додайте всередину обгортки div, який повністю заповнює його, і зробіть цей перелив: прокрутка;
Аарон Дігулла

Зауважте, що через помилки в IE7 це може все-таки вийти з ладу. Якщо ви не можете змусити його працювати, використовуйте JavaScript. Я знаю, вам це не подобається, але важте його за тиждень роботи, що бореться з дивними помилками.
Аарон Дігулла

6

чудово ... зараз я перестав використовувати% he he he ... за винятком основного контейнера, як показано нижче:

<div id="divContainer">
    <div id="divHeader">
    </div>
    <div id="divContentArea">
        <div id="divContentLeft">
        </div>
        <div id="divContentRight">
        </div>
    </div>
    <div id="divFooter">
    </div>
</div>

і ось css:

#divContainer {
    width: 100%;
    height: 100%;
}
#divHeader {
    position: absolute;
    left: 0px;
    top: 0px;
    right: 0px;
    height: 28px;
}
#divContentArea {
    position: absolute;
    left: 0px;
    top: 30px;
    right: 0px;
    bottom: 30px;
}
#divContentLeft {
    position: absolute;
    top: 0px;
    left: 0px;
    width: 250px;
    bottom: 0px;
}
#divContentRight {
    position: absolute;
    top: 0px;
    left: 254px;
    right: 0px;
    bottom: 0px;
}
#divFooter {
    position: absolute;
    height: 28px;
    left: 0px;
    bottom: 0px;
    right: 0px;
}

Я перевірив це у всіх відомих браузерах і працює чудово. Чи є недоліки, використовувані таким чином?


4

Ви можете зробити щось на зразок висоти: calc (100% - nPx); наприклад висота: кальцій (100% - 70 пікс.);


2
div {
    height: 100%;
    height: -webkit-calc(100% - 60px);
    height: -moz-calc(100% - 60px);
    height: calc(100% - 60px);
}

Переконайтесь, що менше використовуєте

height: ~calc(100% - 60px);

Інакше менше не збирається правильно її складати


0

Це не відповідає точно на поставлене питання, але створює той же візуальний ефект, який ви намагаєтесь досягти.

<style>

body {
  border:0;
  padding:0;
  margin:0;
  padding-top:60px;
}

#header {
  position:absolute;
  top:0;
  height:60px;
  width:100%;
}

#wrapper {
  height:100%;
  width:100%;
}
</style>

0

У цьому прикладі ви можете визначити різні області:

<html>
<style>
#divContainer {
    width: 100%;
    height: 100%;
}
#divHeader {
    position: absolute;
    left: 0px;
    top: 0px;
    right: 0px;
    height: 28px;
    background-color:blue;
}
#divContentArea {
    position: absolute;
    left: 0px;
    top: 30px;
    right: 0px;
    bottom: 30px;
}
#divContentLeft {
    position: absolute;
    top: 0px;
    left: 0px;
    width: 200px;
    bottom: 0px;
    background-color:red;
}
#divContentCenter {
    position: absolute;
    top: 0px;
    left: 200px;
    bottom: 0px;
    right:200px;
    background-color:yellow;
}
#divContentRight {
    position: absolute;
    top: 0px;
    right: 0px;
    bottom: 0px;
    width:200px;
    background-color:red;
}
#divFooter {
    position: absolute;
    height: 28px;
    left: 0px;
    bottom: 0px;
    right: 0px;
    background-color:blue;
}
</style>
<body >

<div id="divContainer">
    <div id="divHeader"> top
    </div>
    <div id="divContentArea">
        <div id="divContentLeft">left
        </div>
        <div id="divContentCenter">center
        </div>
        <div id="divContentRight">right
        </div>
    </div>
    <div id="divFooter">bottom
    </div>
</div>

</body>
</html>

0

Я нічого подібного ще не бачив, але думав, що викладу його там.

<div class="main">
<header>Header</header>
<div class="content">Content</div>

Потім CSS:

body, html {
    height: 100%;
    margin: 0;
    padding: 0;
}

.main {
    height: 100%;
    padding-top: 50px;
    box-sizing: border-box;
}

header {
    height: 50px;
    margin-top: -50px;
    width: 100%;
    background-color: #5078a5;
}

.content {
    height: 100%;
    background-color: #999999;
}

Ось робоча jsfiddle

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


-1

Використовуйте зовнішню оболонку Div, встановлену на 100%, і тоді ваша внутрішня оболонка Div 100% повинна бути відносно цього.

Я думав точно, це працювало для мене, але, мабуть, ні:

<html>
<body>
<div id="outerwrapper" style="border : 1px solid red ; height : 100%">
<div id="header" style="border : 1px solid blue ; height : 60px"></div>
<div id="wrapper"  style="border : 1px solid green ; height : 100% ; overflow : scroll ;">
  <div id="left" style="height : 100% ; width : 50% ; overflow : scroll; float : left ; clear : left ;">Some text 

on the left</div>
  <div id="right" style="height : 100% ; width 50% ; overflow : scroll; float : left ;">Some Text on the 

right</div>
</div>
</div>
</body>
</html>

Можна навести приклад цього. Я не розумію
Martijn

Я розмістив те, про що думав, але не можу змусити його працювати це рано / пізно. Можливо, якщо я ще трохи сплю.
Кейд Ру

-1

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

ваш html:

<body>    
   <div id="header"></div>
   <div id="wrapper"></div>
</body>

ваш css:

body {
     height:100%;
     padding-top:60px;
}
#header {
     margin-top:60px;
     height:60px;
}
#wrapper {
     height:100%;
}

1
Я не думаю, що це працює так, як очікувалося. Спершу #headerмає бути margin-top:-60px;. По-друге, height:100%означає, що висота становитиме 100% від висоти батьківських елементів, не враховуючи поля, прокладки та межі. Залежно від налаштувань прокрутки, це спричинить появу смуг прокрутки або обрізання вашого вмісту.
Kylos
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.