Я знаю, що це стара проблема, я стикався з нею вже багато разів. Проблема полягає в тому, що всі виправлення тут - хаки, які потенційно можуть мати наслідки.
По-перше, існує легке пояснення кореневої проблеми. Завдяки тому, як працює рубіж поля, якщо перший елемент всередині контейнера має верхній запас, цей верхній запас ефективно застосовується до самого батьківського контейнера. Ви можете перевірити це самостійно, виконавши наступне:
<div>
<h1>Test</h1>
</div>
У налагоджувачі відкрийте це вгору та наведіть на нього курсор. Ви помітите, що сам дів розміщується там, де зупиняється верхня межа елемента H1 . Така поведінка призначена браузером.
Так що це легко виправити, не вдаючись до дивних хак, як це робить більшість публікацій тут (жодних образливих дій не передбачається, це правда) - просто поверніться до початкового пояснення - ...if the first element inside a container has a top margin...
- Після цього вам знадобиться перший елемент у контейнері НЕ має верхнього поля. Гаразд, але як це зробити, не додаючи елементів, які семантично не втручаються у ваш документ?
Легко! Псевдоелементи! Це можна зробити через клас або заздалегідь визначений міксин. Додайте :before
псевдоелемент:
CSS через клас:
.top-margin-fix:before {
content: ' ';
display: block;
width: 100%;
height: .0000001em;
}
Цим, слідуючи наведеному вище прикладу розмітки, ви модифікуєте свій div як такий:
<div class="top-margin-fix">
<h1>Test</h1>
</div>
Чому це працює?
Перший елемент контейнера, якщо він не має верхньої межі, задає положення початку верхнього поля наступного елемента. Додаючи :before
псевдоелемент, браузер фактично додає несемантичний (іншими словами, хороший для SEO) елемент у батьківський контейнер перед першим елементом.
З. Чому висота: .0000001em?
A. Висота потрібна, щоб браузер відсунув елемент поля вниз. Ця висота фактично дорівнює нулю, але вона все одно дозволить додати прокладку до самого батьківського контейнера. Оскільки він фактично дорівнює нулю, це також не вплине на компонування контейнера. Гарний.
Тепер ви можете додати клас (а ще краще в SASS / LESS, міксин!), Щоб виправити цю проблему, замість того, щоб додавати дивні стилі відображення, які спричинить несподівані наслідки, коли ви хочете робити інші речі зі своїми елементами, цілеспрямовано усуваючи поля на елементах та / або замінити його накладкою або дивними стилями позиції / поплавця, які дійсно не призначені для вирішення цієї проблеми.
overflow:hidden
краще в 90% випадків.