Почему CSS не поддерживает отрицательные отступы?

Я много раз видел, что перспектива отрицательного заполнения может помочь в разработке CSS определенных элементов страницы, которые становятся лучше и проще. Тем не менее, в CSS W3C нет положения об отрицательном заполнении. В чем причина этого? Есть ли какие-либо препятствия на пути к собственности, которые мешают ее использованию как таковой? Спасибо за ответы.

ОБНОВЛЕНИЕ

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


person ikartik90    schedule 11.02.2011    source источник
comment
потому что нет смысла иметь отрицательные отступы   -  person Petah    schedule 12.02.2011
comment
Можете ли вы предложить пример, в котором отрицательное заполнение принесет пользу результату? Я вижу отрицательные поля, но не могу придумать хороший пример, где мне нужно было бы увеличить маржу.   -  person Brad Christie    schedule 12.02.2011
comment
Это то же самое, что и в HTML-коде, созданном Frontpage. Это вроде как работает, но при проверке выдает кучу ошибок. Отрицательный отступ не является частью спецификации, но все же поддерживается браузерами.   -  person Linus Kleen    schedule 12.02.2011
comment
Какова была бы цель отрицательного заполнения? Padding используется для сжатия содержимого в его поле, оставляя пространство между границей и содержимым. Если только цель не состоит в том, чтобы вытащить контент из своего ящика за его границы, что я не считаю полезным. Может быть, у кого-то может быть другое мнение.   -  person Izhar    schedule 28.02.2011
comment
Многим нужен пример. Вот моя, и почему я бы предпочел отрицательную прокладку. Используя функцию border-image, вы можете захотеть, чтобы граница изображения немного перекрывала текст (например, если вы делаете выделенный глянцевый пузырь, очень популярный в Интернете в те дни;))   -  person Himmators    schedule 03.09.2011
comment
Как написано в исходном посте, одна из возможных целей - отменить влияние границы на размер элемента, превратив границу в контур. Свойство контура не может быть применено к уникальной стороне контейнера - граница может. Есть и другие случаи, и даже если их нет, CSS не идеален, и я уверен, что в некоторых ситуациях может пригодиться отрицательное заполнение. Новички не будут думать об его использовании, люди, которые пишут неподдерживаемый код, уже имеют в своем распоряжении достаточно инструментов и будут делать это в любом случае, а остальным, подходящим разработчикам, он может иногда понадобиться.   -  person Rolf    schedule 03.11.2011
comment
Если что-то не имеет для кого-то смысла, это не оправдание, чтобы мешать кому-то другому.   -  person Rolf    schedule 03.11.2011
comment
Я пытаюсь отобразить код в теге <span>, и при его анализе возникают дополнительные разрывы строк в начале блока кода. С помощью отрицательного отступа я мог бы убрать это лишнее пространство.   -  person Steven Lu    schedule 23.07.2012
comment
@Petah Нет смысла иметь отрицательную маржу, но она поддерживается. И точно так же, как есть ситуации, которые вы можете решить с помощью отрицательного поля, есть также ситуации, которые вы можете решить с помощью отрицательного заполнения, например, убедитесь, что ширина границы вычитается из ширины / высоты элемента и не расширяет эти значения.   -  person Mecki    schedule 20.04.2020
comment
@Mecki, разве box-sizing не для этого?   -  person Petah    schedule 21.04.2020


Ответы (7)


Недавно я ответил на другой вопрос, где я обсуждал почему коробочная модель такая, какая она есть.

У каждой части коробчатой ​​модели есть свои причины. Padding предназначен для расширения фона за пределы его содержимого. Если вам нужно сжать фон контейнера, вы должны сделать родительский контейнер правильного размера и дать дочернему элементу некоторые отрицательные поля. В этом случае содержимое не дополняется, а переполняется.

person zzzzBov    schedule 11.02.2011
comment
Спасибо, приятель. Это дает мне удовлетворительную причину. Ваше здоровье. :) - person ikartik90; 12.02.2011
comment
Что делать, если вы хотите уменьшить границу ближе к тексту, например, когда вы используете изображение границы. - person Himmators; 03.09.2011
comment
иногда нецелесообразно редактировать CSS всех дочерних элементов контейнера. У вас может быть общий CSS, который применяется к этим элементам в документе, и вы не хотите, например, изменять его для содержимого определенного контейнера. - person Rolf; 03.11.2011
comment
Однако у вас может не быть прямого контроля над дочерним элементом, например, если это встроенный виджет. - person Mike C; 15.02.2012
comment
Эх, причина, но я бы не назвал ее удовлетворительной. Это тот случай, когда спецификация выходит за рамки указания мне, как определить мою страницу, и начинает говорить мне, как я должен определить свою страницу. Если я хочу, чтобы мой контент перекрывал мои фоновые края, границы и / или поля, это должно быть моей прерогативой, несмотря на воображение разработчиков спецификации о том, почему я мог бы захотеть это сделать. Извините, меня немного раздражает то, что мне приходится добавлять синтаксический мусор или, что еще хуже, одноцветные изображения шириной в один пиксель, чтобы получить разделитель определенного размера, который меньше высоты текста и центрирован по вертикали. - person Jason; 04.09.2013
comment
@Jason, комментарии к этому ответу Stack Overflow, вероятно, не лучшее место для выражения вашей озабоченности. Если вы хотите внести конструктивную разницу в определение и (в конечном итоге) отрисовку CSS, я рекомендую принять участие в список рассылки w3c для CSS. - person zzzzBov; 04.09.2013
comment
@zzzzBov, я почувствовал, что это актуально из-за приведенного в конце примера того, почему я хотел бы сделать такую ​​вещь, что является частым вопросом в комментариях на этой странице. По общему признанию, моя лошадь была немного высока до этого момента. - person Jason; 04.09.2013
comment
Есть МНОГО вещей, которые не имеют смысла в HTML, если сравнивать его с реальными объектами. Обычные причины, по которым кто-то, использующий двойной стандарт, останавливается на таком небольшом исключении, создавая множество других, - это лень. Просто потому, что тогда он не был запрошен. Одна из веских причин для отрицательного заполнения заключается в том, что в вашем собственном примере вам нужно установить много других разных значений, а не только одно. Без отрицательного заполнения вы ПОТЕРЯЕТЕ один из 4 способов выталкивания содержимого в другой контейнер (padding-margin-margin-padding) и вынуждены добавлять элементы. - person sergio; 19.07.2015
comment
Спасибо, что открыли мне глаза после нескольких часов борьбы за решение. - person Vinicius Tavares; 04.02.2016
comment
Это ужасный ответ, он применяет логику физических элементов к абстрактным 2D-формам, которые не имеют таких ограничений. - person Walf; 08.02.2019

Я хотел бы описать очень хороший пример того, почему negative padding был бы полезным и замечательным.

Как все мы, разработчики CSS, знаем, что вертикальное выравнивание одного div с динамическим изменением размера внутри другого является проблемой и по большей части считается невозможным только с использованием CSS. Включение negative padding может изменить это.

Просмотрите следующий HTML-код:

<div style="height:600px; width:100%;">
    <div class="vertical-align" style="width:100%;height:auto;" >
        This DIV's height will change based the width of the screen.
    </div>
</div>

С помощью следующего CSS мы могли бы вертикально центрировать содержимое внутреннего div внутри внешнего div:

.vertical-align {
    position: absolute;
    top:50%;
    padding-top:-50%;
    overflow: visible;
}

Позвольте мне объяснить ...

Абсолютное позиционирование вершины внутреннего div на 50% помещает верхний край внутреннего div в центр внешнего div. Довольно просто. Это связано с тем, что позиционирование на основе процентов относится к внутренним размерам родительского элемента.

Наполнение на основе процентов, с другой стороны, основано на внутренних размерах целевого элемента. Итак, применив свойство padding-top: -50%;, мы сместили содержимое внутреннего div вверх на расстояние 50% от высоты содержимого внутреннего div, таким образом центрируя содержимое внутреннего div внутри внешнего div и по-прежнему позволяя высота внутреннего блока div должна быть динамической!

Если вы спросите меня OP, это будет лучший вариант использования, и я думаю, что его следует реализовать, чтобы я мог сделать этот хак. ржу не могу. Или они должны просто исправить функциональность vertical-align и предоставить нам версию vertical-align, которая работает со всеми элементами.

person WebWanderer    schedule 09.07.2015
comment
Да, но для этой цели я бы предпочел иметь новые атрибуты для элементов html, а не перехватывать поведение других атрибутов. В вашем примере требуется новый атрибут inner-top; как верхний атрибут относительно позиционированного элемента, но относительно себя, а не родителя. Еще одно хорошее использование отрицательного заполнения - это создание элемента, пропорционального его ширине, заполнение 100% -ным заполнением, но позволяющее элементу расти по вертикали, если его переполняет больше контента, что невозможно, если контент находится в дополнительном родственнике abs-pos. Отрицательное заполнение вернет элемент со свернутым заполнением к его размеру. - person sergio; 19.07.2015
comment
в 2018 центрирование так же просто, как использование гибкого дисплея с выравниванием содержимого и выравниванием элементов ... 3 строки кода для идеального центрирования div. - person kaiser; 04.11.2018

Заполнение по определению - это положительное целое число (включая 0).

Отрицательное заполнение приведет к сжатию границы в содержимое (см. блочную модель page на w3) - это сделало бы область содержимого меньше содержимого, что не имеет смысла.

person Oded    schedule 11.02.2011
comment
Граница, схлопывающаяся в контент, - это именно тот эффект, который нужен. Вы знаете какой-либо другой способ получить такой эффект? - person Rolf; 03.11.2011
comment
Согласился с Рольфом. Я вижу, вы, Одед, очевидно, не занимаетесь сложным экспериментальным дизайном. Используя отрицательный отступ и границу, не имея возможности использовать явные значения пикселей, практически невозможно получить аналогичные результаты. Насколько я знаю, вам понадобится несколько вложенных элементов, чтобы добиться того же, однако в некоторых случаях все становится немного сложнее. - person Yeti; 29.07.2013

Вы спросили ПОЧЕМУ, а не как обмануть:

Обычно из-за лени программистов начальной реализации, потому что они уже приложили больше усилий для других функций, предоставляя более странные побочные эффекты, такие как поплавки, потому что дизайнеры тогда больше просили их, но они не нашли времени чтобы разрешить это, чтобы мы могли использовать ЧЕТЫРЕ свойства, чтобы толкать / тянуть элемент против его соседей (теперь у нас есть только четыре элемента, которые нужно толкать, и только 2, чтобы тянуть).

Когда разрабатывался html, журналы любили переформатировать текст вокруг изображений, а теперь ненавидят, потому что сегодня у нас есть сенсорные тенденции, и любят скучные вещи с большим количеством места и не для чтения. Вот почему они оказывают большее давление на поплавки, чем на центрирование, или они могли бы разработать что-то вроде margin-top: fill; или margin: average 0;, чтобы просто выровнять контент по низу или распределить его дополнительное пространство вокруг.

В данном случае я думаю, что он не был реализован по той же причине, по которой в CSS отсутствует псевдоселектор :parent: для предотвращения циклических вычислений.

Не будучи инженером, я могу видеть, что CSS прямо сейчас предназначен для однократного рисования элементов, запоминания некоторых свойств для будущих элементов, которые будут окрашены, но НИКОГДА не возвращаться к уже нарисованным элементам.

Вот почему (я думаю) отступ рассчитывается по ширине, потому что это значение, которое было доступно на момент начала рисования.

Если бы у вас было отрицательное значение для заполнения, это повлияло бы на внешние пределы, которые УЖЕ были определены, когда маржа уже была установлена. Я знаю, что еще ничего не нарисовано, но когда вы читаете, как идет процесс рисования, созданного гениями с помощью технологий 90-х, мне кажется, что я задаю глупые вопросы и просто говорю «спасибо», хе-хе.

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

Если вы видите приложения со сложной перекомпоновкой и позиционированием, такие как InDesign, вы не можете прокручивать так быстро! Чтобы перейти к следующей странице, требуются большие усилия как со стороны процессора, так и со стороны графической карты!

Так что рисовать и просчитывать вперед и забывать об элементе, который когда-то был нарисован, на данный момент кажется ОБЯЗАТЕЛЬНЫМ.

person sergio    schedule 19.07.2015

Кстати, это могло бы помочь:

Свойство CSS box-sizing используется для изменения модели CSS по умолчанию, используемой для расчета ширины и высоты элементов.

http://www.w3.org/TR/css3-ui/#box-sizing
https://developer.mozilla.org/En/CSS/Box-sizing

person Rolf    schedule 03.11.2011

Установка iframe внутри контейнеров не будет соответствовать размеру контейнера. Он добавляет около 20 пикселей отступа. В настоящее время нет простого способа исправить это. Вам нужен javascript (http://css-tricks.com/snippets/jquery/fit-iframe-to-content/)

Отрицательные поля были бы простым решением.

person john ktejik    schedule 09.08.2013

Потому что у разработчиков CSS не хватило дальновидности представить, какую гибкость это принесет. Существует множество причин для расширения области содержимого блока, не влияя на его связь с соседними элементами. Если вы считаете, что это невозможно, поместите длинный текст nowrap'd в ​​поле, установите ширину поля и посмотрите, как переполненное содержимое ничего не делает с макетом.

Да, это все еще актуально для CSS3 в 2019 году; Показательный пример: макеты flexbox. Поля элементов Flexbox не сжимаются, поэтому для равномерного распределения и их выравнивания с визуальным краем контейнера необходимо вычесть поля элементов из заполнения их контейнера. Если какой-либо результат равен <0, вы должны использовать отрицательное поле для контейнера или суммировать это отрицательное значение с существующим запасом. Т.е. содержимое элемента влияет на то, как для него определяются поля, то есть наоборот. Суммирование не работает чисто, когда у содержимого гибких элементов поля определены в разных единицах или на них влияет другой размер шрифта и т. Д.

В приведенном ниже примере в идеале должны быть выровненные и равномерно расположенные серые поля, но, к сожалению, это не так.

body {
  font-family: sans-serif;
  margin: 2rem;
}
body > * {
  margin: 2rem 0 0;
}
body > :first-child {
  margin-top: 0;
}
h1,
li,
p {
  padding: 10px;
  background: lightgray;
}
ul {
  list-style: none;
  display: flex;
  flex-wrap: wrap;
  padding: 0;/* just to reset */
  padding: -5px;/* would allow correct alignment */
}
li {
  flex: 1 1 auto;
  margin: 5px;
}
<h1>Cras facilisis orci ligula</h1>

<ul>
  <li>a lacinia purus porttitor eget</li>
  <li>donec ut nunc lorem</li>
  <li>duis in est dictum</li>
  <li>tempor metus non</li>
  <li>dapibus sapien</li>
  <li>phasellus bibendum tincidunt</li>
  <li>quam vitae accumsan</li>
  <li>ut interdum eget nisl in eleifend</li>
  <li>maecenas sodales interdum quam sed accumsan</li>
</ul>

<p>Fusce convallis, arcu vel elementum pulvinar, diam arcu tempus dolor, nec venenatis sapien diam non dui. Nulla mollis velit dapibus magna pellentesque, at tempor sapien blandit. Sed consectetur nec orci ac lobortis.</p>

<p>Integer nibh purus, convallis eget tincidunt id, eleifend id lectus. Vivamus tristique orci finibus, feugiat eros id, semper augue.</p>

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

person Walf    schedule 08.02.2019