Фоны для блочной модели (и чем она может быть полезна)

Источник: «Backgrounds for the Box Model (and why it can be useful)»
Можно ограничить распространение background-image элемента с помощью background-clip. Это означает, что можно применить различные фоны, скажем, к padding и border.

На днях мне написали, что пытаются визуализировать различные части блочной модели. Они сказали, что напишут код для примера сами, но нет способа, скажем, задать цвет фона только для области padding элемента.

Они говорили о чем-то подобном — диаграмме блочной модели, доступной в DevTools:

Блочная модель в Chrome DevTools
Блочная модель в Chrome DevTools

Я сказал, думаю, что вы… можете! Вообще-то!

Хитрость заключается в использовании CSS свойства background-clip, позволяющего останавливать свойство background-image в разных точках блочной модели. Вот простой пример, как это сделать, используя те же цвета, что и в модели выше:

See the Pen

Единственное, что я подделываю, — это внешняя форма (margin), которая нарисована с помощью outline. Тем не менее она соответствует значению margin, так что в принципе она настоящая!

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

See the Pen

Разместив вокруг него грид с контентом, я сделал так, чтобы было видно, как этот элемент отталкивает другие, как это делает настоящая блочная модель.

Действительно ли это полезно? Иногда!

Буквально на днях Wes Bos опубликовал очень красивый эффект кнопки, а затем воссоздал его в HTML и CSS:

В том, как Wes сделал это, нет никакой серьёзной проблемы, но он использовал дополнительный элемент, а также псевдоэлементы. Вот его демо.

See the Pen

Ana Tudor ответила, что можно сделать и без дополнительных элементов, и угадайте как? Обрезка фона!

Я попробовал, и, если не считать неудобной необходимости задать background-size, думаю, у меня всё получилось:

See the Pen

Иногда это действительно может быть полезно. Например, CMS, которая рада выплюнуть элемент <button>, но не предлагает внутреннего HTML контроля над ним. Если вам это не нужно и вы можете полностью реализовать эффект в CSS, то вы в деле.

Я также решил попробовать использовать border-image, который, несмотря на то, что является самым критикуемым CSS свойством всех времён, кажется, по крайней мере, концептуально, правильным. Мне удалось заставить его работать!

See the Pen

Но по какой-то причине border-image несовместим с border-radius, так что, как ни крути, это отстой.

Дополнительные материалы

Предыдущая Статья

AggregateError в JavaScript

Следующая Статья

Руководство по User Agent