Процент, связанный с родительской высотой css [duplicate]

Размерный «трюк» - это лучший способ, который я знаю, с одним маленьким, но (для меня это серьезный питомец) важное изменение в использовании круглых скобок.

Поскольку запись в Википедии делает clear, C sizeof не является функцией; это оператор. Таким образом, он не требует скобок вокруг своего аргумента, если аргумент не является именем типа. Это легко запомнить, так как он делает аргумент похожим на выражение cast, которое также использует скобки.

So: Если у вас есть следующее:

int myArray[10];

Вы можете найти количество элементов с таким кодом:

size_t n = sizeof myArray / sizeof *myArray;

Это, для меня, намного легче, чем альтернатива с круглыми скобками. Я также предпочитаю использовать звездочку в правой части деления, поскольку она более кратка, чем индексация.

Конечно, это тоже время компиляции, поэтому нет необходимости беспокоиться о том, разделение, влияющее на производительность программы. Поэтому используйте эту форму, где бы вы ни были.

Всегда лучше использовать sizeof для фактического объекта, если он у вас есть, а не на типе, поскольку вам не нужно беспокоиться о том, чтобы сделать ошибку и указать неверный тип.

Например, скажем, у вас есть функция, которая выводит некоторые данные в виде потока байтов, например, по сети. Назовем функцию send() и сделаем в качестве аргументов указатель на отправляемый объект и количество байтов в объекте. Итак, прототип становится:

void send(const void *object, size_t size);

И тогда вам нужно отправить целое число, поэтому вы его кодируете следующим образом:

int foo = 4711;
send(&foo, sizeof (int));

Теперь вы ввели тонкий способ стрельбы в ногу, указав тип foo в двух местах. Если кто-то меняет, а другой - нет, код прерывается. Таким образом, всегда делайте это так:

send(&foo, sizeof foo);

Теперь вы защищены. Конечно, вы дублируете имя переменной, но это имеет высокую вероятность взлома способом, который может обнаружить компилятор, если вы его измените.

181
задан TylerH 14 February 2018 в 23:21
поделиться

7 ответов

У меня также была эта проблема (+1).

Исправление состоит в том, что да, вертикальное заполнение и маржа относительно ширины, но top и bottom не являются.

Итак, просто поместите div внутри другого, а во внутреннем div используйте что-то вроде top:50% (помните, что position имеет значение, если он все еще не работает)

183
ответ дан Camilo Martin 15 August 2018 в 22:21
поделиться
  • 1
    top отлично подходит для изменения размера на основе высоты браузера / окна. Как насчет наличия div под этим div? Как вы можете clear, чтобы второй div находился под div, который сместился на top:50%? – Federico 19 November 2014 в 18:48
  • 2
    Изучите новый. Не знал, что вертикальная прокладка и маржа относительно ширины раньше. Спасибо. – shaosh 2 December 2014 в 00:00
  • 3
    Также можно добавить div-разделитель с установленной процентной высотой. Кажется немного грязным, но он работает. см. этот ответ . – WCByrne 29 July 2015 в 15:38
  • 4
    – Aerovistae 24 October 2018 в 02:01

Чтобы сделать дочерний элемент абсолютно неподвижным из его родительского элемента, вам необходимо установить относительное положение в исходном элементе И абсолютной позиции дочернего элемента.

Тогда в дочернем элементе «верх» находится относительно высоты родителя. Таким образом, вам также нужно «перевести» вверх ребенка на 50% от его собственной высоты.

.base{
    background-color: green;
    width: 200px;
    height: 200px;
    overflow: auto;
    position: relative;
}
    
.vert-align {
    position: absolute;
    top: 50%;
    transform: translate(0, -50%);
}
    <div class="base">
        <div class="vert-align">
            Content Here
        </div>
    </div>

Существует другое решение используя гибкую коробку.

.base{
    background-color:green;
    width: 200px;
    height: 200px;
    overflow: auto;
    display: flex;
    align-items: center;
}
<div class="base">
    <div class="vert-align">
        Content Here
    </div>
</div>

Вы найдете преимущества / недостатки для обоих.

5
ответ дан alain 15 August 2018 в 22:21
поделиться
  • 1
    Использование translate - единственный реальный способ перемещения элемента по вертикали относительно его собственного размера. – Eran Goldin 20 December 2017 в 13:31

Другой способ центрирования текста одной строки:

.parent{
  position: relative;
}

.child{
   position: absolute;
   top: 50%;
   line-height: 0;
}

или просто

.parent{
  overflow: hidden; /* if this ins't here the parent will adopt the 50% margin of the child */
}

.child{
   margin-top: 50%;
   line-height: 0;
}
3
ответ дан rawiro 15 August 2018 в 22:21
поделиться
  • 1
    Это «верх: 50%» получил это для меня. Благодаря! – Jack Connor 16 May 2017 в 00:42

50% отступов не будут центрировать вашего ребенка, он поместит его ниже центра. Я думаю, вы действительно хотите, чтобы набивка составляла 25%. Может быть, у вас просто не хватает места, поскольку ваш контент становится выше?

EDIT: Nevermind, сайт w3schools говорит, что

% Задает заполнение в процентах от ширины содержащий элемент

. Может быть, он всегда использует ширину? Я никогда не замечал.

То, что вы делаете, может быть достигнуто с помощью display: table (хотя бы для современных браузеров). Здесь объясняется методика .

1
ответ дан SpliFF 15 August 2018 в 22:21
поделиться
  • 1
    Спасибо. Я понимаю, что мои 50% не будут центрировать содержание div. У меня на самом деле есть только одна строка текста, которая должна быть центрирована по вертикали. Большое спасибо за ссылку, хотя! – Ryan 13 February 2011 в 12:31
  • 2
    Если это только одна строка текста, которую вы считали использующей смехотворно большой line-height, т. Е. Сделать высоту линии 200px? – SpliFF 14 February 2011 в 01:40
  • 3
    @Ryan для центрирования текста по вертикали, см. stackoverflow.com/questions/8865458/… – user 1 February 2014 в 23:21
  • 4
    ваша ссылка сломана – quemeful 30 November 2016 в 14:59

Вот два варианта эмуляции необходимого поведения. Не общее решение, но может помочь в некоторых случаях. Здесь вертикальный интервал рассчитывается на основе размера внешнего элемента, а не его родительского элемента, но сам этот размер может быть относительно родителя, и таким образом интервал будет относительным.

<div id="outer">
    <div id="inner">
        content
    </div>
</div>

Первый вариант: используйте псевдоэлементы, здесь вертикальное и горизонтальное расстояние относительно внешнего. Демо

#outer::before, #outer::after {
    display: block;
    content: "";
    height: 10%;
}
#inner {
    height: 80%;
    margin-left: 10%;
    margin-right: 10%;
}

Перемещение горизонтального интервала к внешнему элементу делает его относительно родителя внешнего. Демо

#outer {
    padding-left: 10%;
    padding-right: 10%;
}

Вторая опция: используйте абсолютное позиционирование. Демо

#outer {
    position: relative;
}
#inner {
    position: absolute;
    left: 10%;
    right: 10%;
    top: 10%;
    bottom: 10%;
}
28
ответ дан user 15 August 2018 в 22:21
поделиться

Ответ на несколько иной вопрос: вы можете использовать единицы vh для ввода элементов в центр видового экрана:

.centerme {
    margin-top: 50vh;
    background: red;
}

<div class="centerme">middle</div>
25
ответ дан willoller 15 August 2018 в 22:21
поделиться
  • 1
    Почему этот ответ не проголосовали выше? Что-то не так с использованием vh? – AlanH 20 December 2016 в 05:35
  • 2
    Это потому, что это не ответ, который соответствует оригинальному вопросу, это полезный трюк, который работает только в нескольких связанных случаях. – willoller 20 December 2016 в 07:34
  • 3
    использование vh почти совпадает с процентами ... в некоторых случаях еще хуже. Этот ответ не имеет отношения к вопросу – vsync 13 August 2018 в 15:14

Это очень интересная ошибка. (По-моему, это все равно ошибка) Ницца найти!

Что касается , как , чтобы установить его, я бы рекомендовал ответ Камило Мартина. Но что касается , почему , я хотел бы объяснить это немного, если вы, ребята, не возражаете.


В спецификации CSS Я нашел:

'padding' Процент: относится к ширине содержащего блока

... что странно, но все в порядке.

Итак, с родителем width: 210px и дочерним padding-top: 50%, я получаю вычисленное / вычисленное значение padding-top: 96.5px - которое не является ожидаемым 105px.

Это связано с тем, что в Windows (я не уверен в других ОС) размер общих полос прокрутки по умолчанию 17px × 100% (или 100% × 17px для горизонтальных баров). Те 17px вычитаются до , вычисляя 50%, следовательно 50% of 193px = 96.5px.

0
ответ дан WoodrowShigeru 15 August 2018 в 22:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: