позиция фиксированный дисплей flex держать последний ребенок максимальная высота [дубликат]

У меня была аналогичная проблема, когда я пытался передать Timestamp в базу данных. В то время как getter работал, и мои данные были правильно настроены на базу данных в реальном времени с помощью push, чтение данных с помощью DataSnapshot из ChildEventListener разбило мое приложение с ошибкой, потому что также у класса Timestamp нет публичного cunstructor без каких-либо аргументов. Поэтому я создал свою собственную временную метку класса, которая расширила исходный класс timestamp java, добавив отсутствующий публичный конструктор без аргументов.

public class Timestamp extends java.sql.Timestamp {

public Timestamp(long time) {
    super(time);
}

public Timestamp(){
    super(System.currentTimeMillis());

}

Затем мне пришлось включить также необходимые сеттеры (как читать из предупреждений при использовании мой новый класс)

74
задан Community 23 May 2017 в 12:10
поделиться

7 ответов

Расширение дочернего элемента #down для заполнения оставшегося пространства #container может выполняться различными способами в зависимости от поддержки браузера, которую вы хотите достичь, и имеет ли #up определенную высоту.

Образцы

.container {
  width: 100px;
  height: 300px;
  border: 1px solid red;
  float: left;
}
.up {
  background: green;
}
.down {
  background: pink;
}
.grid.container {
  display: grid;
  grid-template-rows: 100px;
}
.flexbox.container {
  display: flex;
  flex-direction: column;
}
.flexbox.container .down {
  flex-grow: 1;
}
.calc .up {
  height: 100px;
}
.calc .down {
  height: calc(100% - 100px);
}
.overflow.container {
  overflow: hidden;
}
.overflow .down {
  height: 100%;
}
<div class="grid container">
  <div class="up">grid
    <br />grid
    <br />grid
    <br />
  </div>
  <div class="down">grid
    <br />grid
    <br />grid
    <br />
  </div>
</div>
<div class="flexbox container">
  <div class="up">flexbox
    <br />flexbox
    <br />flexbox
    <br />
  </div>
  <div class="down">flexbox
    <br />flexbox
    <br />flexbox
    <br />
  </div>
</div>
<div class="calc container">
  <div class="up">calc
    <br />calc
    <br />calc
    <br />
  </div>
  <div class="down">calc
    <br />calc
    <br />calc
    <br />
  </div>
</div>
<div class="overflow container">
  <div class="up">overflow
    <br />overflow
    <br />overflow
    <br />
  </div>
  <div class="down">overflow
    <br />overflow
    <br />overflow
    <br />
  </div>
</div>

Сетка

Макет grid CSS предлагает еще один вариант, хотя он может быть не такой простой, как модель Flexbox. Однако для этого требуется только стиль элемента контейнера:

.container { display: grid; grid-template-rows: 100px }

grid-template-rows определяет первую строку как фиксированную высоту 100 пикселей, а оставшиеся строки будут автоматически растягиваться, чтобы заполнить оставшееся пространство.

Я уверен, что для IE11 требуются префиксы -ms-, поэтому обязательно проверяйте функциональность в браузерах, которые вы хотите поддерживать.

Flexbox

CSS3's Модуль гибкого модульного модуля (flexbox) теперь хорошо поддерживается и может быть очень простым в реализации. Поскольку он является гибким, он работает даже тогда, когда #up не имеет определенной высоты.

#container { display: flex; flex-direction: column; }
#down { flex-grow: 1; }

Важно отметить, что IE10 & amp; Поддержка IE11 для некоторых свойств flexbox может быть ошибочной, а IE9 или ниже не имеет никакой поддержки.

Расчетная высота

Другим простым решением является использование CSS3 calc , , как указывает Альваро в своем ответе , но для того, чтобы высота первого ребенка была известна, значение:

#up { height: 100px; }
#down { height: calc( 100% - 100px ); }

широко поддерживается, причем единственными заметными исключениями являются & lt; = IE8 или Safari 5 (без поддержки) и IE9 (частичная поддержка). Некоторые другие проблемы включают использование calc в сочетании с transform или box-shadow , поэтому обязательно проверяйте в нескольких браузерах, если это вызывает озабоченность вы.

Другие альтернативы

Если требуется поддержка более старой версии, вы можете добавить height:100%; в #down, чтобы высота розового div была полной, с одной оговоркой. Это приведет к переполнению контейнера, потому что #up отжимает его.

Поэтому вы можете добавить overflow: hidden; в контейнер, чтобы исправить это.

Альтернативно, если высота #up фиксирована, вы можете установить ее абсолютно внутри контейнера и добавить верхнюю часть до #down.

И еще одним вариантом будет использование отображения таблицы:

#container { width: 300px; height: 300px; border: 1px solid red; display: table;}
#up { background: green; display: table-row; height: 0; }
#down { background: pink; display: table-row;}​
113
ответ дан Quantastical 19 August 2018 в 12:18
поделиться
  • 1
    Я хочу, чтобы #down имел # height height - #up height. Так что переполнение скрыто не то, что я ищу. А также не хотите использовать абсолютную позицию. Благодаря! – Alvaro 27 June 2012 в 13:22
  • 2
    @Alvaro, я добавил еще один вариант, используя табличные дисплеи. Недостатком здесь является совместимость. Постскриптум Элемент, расположенный абсолютно внутри контейнера с position: relative;, позиционирует его относительно контейнера, а не окна. Таким образом, это должен быть жизнеспособный вариант. – Quantastical 27 June 2012 в 13:25
  • 3
    Строка таблицы должна работать для вас, см. этот jsFiddle для доказательства. Абсолютный метод позиции не сможет дать те же результаты, что и эта скрипка, поэтому мы можем поцарапать это из списка (#down и #container будут иметь одинаковую высоту в этом сценарии). – Quantastical 27 June 2012 в 13:38
  • 4
    Вы много спрашиваете, @ Альваро. CSS не является языком сценариев; он не может рассчитать материал. Вы застряли с иллюзиями или js. – Jezen Thomas 27 June 2012 в 13:38
  • 5
    @Quantastical, спасибо за вашу помощь, но в вашем последнем правлении вы просто скопировали ответ, который я опубликовал. Некоторые упоминания об этом, по крайней мере, были бы хороши. – Alvaro 25 November 2014 в 12:47

Прошло почти два года с тех пор, как я задал этот вопрос. Я только что придумал css calc (), который решает эту проблему, и я подумал, что было бы неплохо добавить ее, если у кого-то будет такая же проблема. (Кстати, я в конечном итоге использовал положение абсолютное).

http://jsfiddle.net/S8g4E/955/

Вот css

#up { height:80px;}
#down {
    height: calc(100% - 80px);//The upper div needs to have a fixed height, 80px in this case.
}

И дополнительная информация об этом здесь: http://css-tricks.com/a-couple-of-use-cases-for-calc/

Поддержка браузера: http: //caniuse.com/#feat=calc

19
ответ дан Alvaro 19 August 2018 в 12:18
поделиться
  • 1
    Я также использовал CSS3 calc, где поддержка широкого браузера не так важна (IE8 и ниже, а Safari 5 не поддерживают его). – Quantastical 20 April 2014 в 17:53
  • 2
    Любой способ сделать подобный с динамической высотой #up? – Adam Waite 4 August 2014 в 14:49
  • 3
    @AdamWaite, с динамической высотой #up, вы захотите использовать решение переполнения, описанное в другом ответе. – Quantastical 24 November 2014 в 19:26

Вы можете использовать поплавки для нажатия вниз:

http://jsfiddle.net/S8g4E/5/

У вас есть фиксированный размер container:

#container {
    width: 300px; height: 300px;
}

Контент разрешен для потока рядом с поплавком. Если мы не установим float в полную ширину:

#up {
    float: left;
    width: 100%;
}

Пока #up и #down разделяют верхнюю позицию, содержимое #down может начинаться только после нижней части плавающего #up :

#down {
    height:100%;
}​
1
ответ дан biziclop 19 August 2018 в 12:18
поделиться
  • 1
    Обратите внимание, что #up фактически покрывает верхнюю часть #down: jsfiddle.net/thirtydot/S8g4E/9 – thirtydot 27 June 2012 в 13:24
  • 2
    Да, так оно и работает. Но если OP не нуждается в округленной границе или что-то другое причудливость на #up, то это, вероятно, приемлемо. – biziclop 27 June 2012 в 13:26
  • 3
    Это решение близко, но я хотел бы, чтобы #down имел # height height - #up height. (В вашем решении #down height = #container height). Благодаря' – Alvaro 27 June 2012 в 13:26
  • 4
    @ Альваро: Почему это должно быть так? В большинстве случаев это решение выглядит правильным, даже если это только иллюзия. – thirtydot 27 June 2012 в 13:27
  • 5
    Ну, этот вопрос является упрощенным примером из этого более "сложного" Например: jsfiddle.net/fyNX4 Там не будет работать, нет? – Alvaro 27 June 2012 в 13:36

Я не уверен, что это можно сделать исключительно с помощью CSS, если только вам не удобнее притворяться иллюзиями. Возможно, используйте ответ Джоша Маина и установите #container на overflow:hidden.

Для чего это стоит, вот решение jQuery:

var contH = $('#container').height(),
upH = $('#up').height();
$('#down').css('height' , contH - upH);
-3
ответ дан Jezen Thomas 19 August 2018 в 12:18
поделиться

Если я не понимаю, вы можете просто добавить height: 100%; и overflow:hidden; в #down.

#down { 
    background:pink; 
    height:100%; 
    overflow:hidden;
}​

Live DEMO

Изменить: поскольку вы не хотите использовать overflow:hidden;, вы можете использовать display: table; для этого сценария; однако он не поддерживается до IE 8. ( display: table; support )

#container { 
    width: 300px; 
    height: 300px; 
    border:1px solid red;
    display:table;
}

#up { 
    background: green;
    display:table-row;
    height:0; 
}

#down { 
    background:pink;
    display:table-row;
}​

Live DEMO

Примечание. Вы сказали, что хотите, чтобы высота #down была высотой #container минус #up. Решение display:table; делает именно это, и этот jsfiddle будет изображать это довольно четко.

1
ответ дан Josh Mein 19 August 2018 в 12:18
поделиться
  • 1
    Я не хочу, чтобы #down превышал # height контейнера – Alvaro 27 June 2012 в 13:20
  • 2
    Я только это заметил. Вы можете добавить overflow:hidden в скрыть дополнительный контент. – Josh Mein 27 June 2012 в 13:22
  • 3
    Я скопирую / вставлю то, что я сказал MrSlayer: я бы хотел, чтобы #down имел # height height - #up height. Так что переполнение скрыто не то, что я ищу. А также не хотите использовать абсолютную позицию. Благодаря! – Alvaro 27 June 2012 в 13:23
  • 4
    Проблема в том, что если вы вернете два div в вашем примере, то зеленый div будет снаружи. – Ced 8 September 2015 в 22:44
  • 5
    Это вообще не отвечает на вопрос. В нем указано «Занять всю оставшуюся высоту», событие, хотя это занимает всю оставшуюся высоту, произойдет переполнение. – Giridhar Karnik 25 May 2016 в 08:00

Мой ответ использует только CSS, и он не использует переполнение: hidden или display: table-row. Это требует, чтобы у первого ребенка действительно была определенная высота, но в вашем вопросе вы утверждаете, что только второй ребенок нуждается в его высоте, но я считаю, что вы должны признать это приемлемым.

html

<div id="container">
    <div id="up">Text<br />Text<br />Text<br /></div>
    <div id="down">Text<br />Text<br />Text<br /></div>
</div>

css

#container { width: 300px; height: 300px; border:1px solid red;}
#up { background: green; height: 63px; float:left; width: 100% }
#down { background:pink; padding-top: 63px; height: 100%; box-sizing: border-box; }

http://jsfiddle.net/S8g4E/288/

4
ответ дан T.W.R. Cole 19 August 2018 в 12:18
поделиться

проверить демо - http://jsfiddle.net/S8g4E/6/

использовать css -

#container { width: 300px; height: 300px; border:1px solid red; display: table;}
#up { background: green; display: table-row; }
#down { background:pink; display: table-row;}
2
ответ дан thirtydot 19 August 2018 в 12:18
поделиться
  • 1
    Вы должны добавить height: 1px в #up, чтобы обеспечить минимальный уровень высоты. Вот поддержка браузера для display: table: caniuse.com/css-table – thirtydot 27 June 2012 в 13:22
  • 2
    Не могли бы вы показать мне, как это решение может быть достигнуто в этом «более сложном»? Например, пожалуйста: jsfiddle.net/fyNX4 Большое спасибо – Alvaro 27 June 2012 в 13:44