Размерный «трюк» - это лучший способ, который я знаю, с одним маленьким, но (для меня это серьезный питомец) важное изменение в использовании круглых скобок.
Поскольку запись в Википедии делает 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);
Теперь вы защищены. Конечно, вы дублируете имя переменной, но это имеет высокую вероятность взлома способом, который может обнаружить компилятор, если вы его измените.
У меня также была эта проблема (+1).
Исправление состоит в том, что да, вертикальное заполнение и маржа относительно ширины, но top
и bottom
не являются.
Итак, просто поместите div внутри другого, а во внутреннем div используйте что-то вроде top:50%
(помните, что position
имеет значение, если он все еще не работает)
Чтобы сделать дочерний элемент абсолютно неподвижным из его родительского элемента, вам необходимо установить относительное положение в исходном элементе И абсолютной позиции дочернего элемента.
Тогда в дочернем элементе «верх» находится относительно высоты родителя. Таким образом, вам также нужно «перевести» вверх ребенка на 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>
Вы найдете преимущества / недостатки для обоих.
Другой способ центрирования текста одной строки:
.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;
}
50% отступов не будут центрировать вашего ребенка, он поместит его ниже центра. Я думаю, вы действительно хотите, чтобы набивка составляла 25%. Может быть, у вас просто не хватает места, поскольку ваш контент становится выше?
EDIT: Nevermind, сайт w3schools говорит, что
% Задает заполнение в процентах от ширины содержащий элемент
. Может быть, он всегда использует ширину? Я никогда не замечал.
То, что вы делаете, может быть достигнуто с помощью display: table (хотя бы для современных браузеров). Здесь объясняется методика .
line-height
, т. Е. Сделать высоту линии 200px?
– SpliFF
14 February 2011 в 01:40
Вот два варианта эмуляции необходимого поведения. Не общее решение, но может помочь в некоторых случаях. Здесь вертикальный интервал рассчитывается на основе размера внешнего элемента, а не его родительского элемента, но сам этот размер может быть относительно родителя, и таким образом интервал будет относительным.
<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%;
}
Ответ на несколько иной вопрос: вы можете использовать единицы vh
для ввода элементов в центр видового экрана:
.centerme {
margin-top: 50vh;
background: red;
}
<div class="centerme">middle</div>
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
.
top
отлично подходит для изменения размера на основе высоты браузера / окна. Как насчет наличия div под этим div? Как вы можетеclear
, чтобы второй div находился под div, который сместился наtop:50%
? – Federico 19 November 2014 в 18:48