Кратко
Скопированоbackground обрезает фон по границам блочной модели. Самое интересное значение — text: тогда фон просвечивает сквозь буквы.
Пример
СкопированоТри блока с одинаковым пунктирным бордером, но разными значениями background. Видно, как фон каждый раз занимает разную площадь:
<div class="box border-box">border-box</div><div class="box padding-box">padding-box</div><div class="box content-box">content-box</div>
<div class="box border-box">border-box</div>
<div class="box padding-box">padding-box</div>
<div class="box content-box">content-box</div>
.box { padding: 20px; border: 10px dashed rgb(255 255 255 / 0.4); background-color: #2E9AFF;}.border-box { background-clip: border-box; }.padding-box { background-clip: padding-box; }.content-box { background-clip: content-box; }
.box {
padding: 20px;
border: 10px dashed rgb(255 255 255 / 0.4);
background-color: #2E9AFF;
}
.border-box { background-clip: border-box; }
.padding-box { background-clip: padding-box; }
.content-box { background-clip: content-box; }
Как понять
СкопированоКаждый элемент в CSS состоит из нескольких слоёв: контент, padding, border и margin. background задаёт, до какого из этих слоёв распространяется фон — дальше фон не рисуется, обрезается.
По умолчанию фон занимает весь элемент вплоть до внешнего края рамки (border). Это кажется логичным: хочешь зелёный блок — получаешь зелёный блок целиком. Но иногда нужно иначе, например, сделать прозрачную зону под рамкой или показать фон только там, где находится текст.
Разница между значениями хорошо видна, когда у элемента есть пунктирный или прозрачный border и заметный padding.
Как пишется
Скопировано
.element { background-clip: border-box; /* значение по умолчанию */ background-clip: padding-box; background-clip: content-box; background-clip: text;}
.element {
background-clip: border-box; /* значение по умолчанию */
background-clip: padding-box;
background-clip: content-box;
background-clip: text;
}
border-box
СкопированоЗначение по умолчанию. Фон занимает всю площадь элемента, включая область под рамкой. Если рамка непрозрачная, фон под ней всё равно есть — он просто не виден.
padding-box
СкопированоФон не заходит под рамку — он останавливается у её внутреннего края. При прозрачной или пунктирной рамке сквозь неё будет виден фон страницы или родительского элемента, а не фон самого блока.
Популярный приём — полупрозрачная рамка поверх цветного фона. Сквозь рамку просвечивает фон страницы, а не фон самого элемента — получается эффект двойной границы без лишних элементов:
.card { background-color: #F498AD; border: 6px solid rgb(255 255 255 / 0.4); background-clip: padding-box;}
.card {
background-color: #F498AD;
border: 6px solid rgb(255 255 255 / 0.4);
background-clip: padding-box;
}
С border зазор будет полностью прозрачным — виден только родитель.
content-box
СкопированоФон ограничен только контентной областью. Ни рамка, ни внутренние отступы не закрашиваются. При заметном padding и border вокруг фонового блока будет широкая прозрачная рамка.
text
СкопированоСамое необычное значение: фон обрезается по форме текста. Чтобы это было видно, нужно сделать текст прозрачным через color — без этого непрозрачный текст просто перекроет фон. В результате буквы как будто «наполнены» фоновым изображением или градиентом. Популярный приём для заголовков.
Если текст переносится на несколько строк, градиент пересчитывается для каждого элемента отдельно, исходя из его background-блока. Результат может быть неожиданным: вместо одного плавного перехода получится несколько коротких.
.gradient-text { background-image: linear-gradient(to right, #2E9AFF, #F498AD); background-clip: text; color: transparent;}
.gradient-text {
background-image: linear-gradient(to right, #2E9AFF, #F498AD);
background-clip: text;
color: transparent;
}
Несколько фонов
СкопированоЕсли у элемента несколько фоновых изображений, можно задать разное background для каждого через запятую, в том же порядке, что и в background:
.element { background-image: url("pattern.png"), linear-gradient(#2E9AFF, #F498AD); background-clip: content-box, border-box;}
.element {
background-image: url("pattern.png"), linear-gradient(#2E9AFF, #F498AD);
background-clip: content-box, border-box;
}
Подсказки
Скопировано💡 background влияет только на то, где фон отрисовывается. Откуда фон начинается — это зона ответственности background. Эти два свойства часто используют вместе, чтобы получить точный контроль над фоном.
💡 Сокращённое свойство background тоже принимает background, но писать его там неудобно из-за длинного синтаксиса. Лучше задавать background отдельно.
/* в шорткате: последние два <box>-значения — это background-origin и background-clip*/.card { background: url("texture.png") center / cover no-repeat padding-box content-box;}/* отдельными свойствами, сразу видно что за что отвечает */.card { background-image: url("texture.png"); background-position: center; background-size: cover; background-repeat: no-repeat; background-origin: padding-box; background-clip: content-box;}
/* в шорткате:
последние два <box>-значения —
это background-origin и background-clip
*/
.card {
background:
url("texture.png") center / cover no-repeat padding-box content-box;
}
/* отдельными свойствами, сразу видно что за что отвечает */
.card {
background-image: url("texture.png");
background-position: center;
background-size: cover;
background-repeat: no-repeat;
background-origin: padding-box;
background-clip: content-box;
}
- Chrome 21, поддерживается
- Edge 12, поддерживается
- Firefox 22, поддерживается
- Safari 5.1, поддерживается
На практике
Скопированосоветует
Скопировано🛠 background удобно комбинировать с несколькими фонами. Например, один фон зафиксирован на всю ширину элемента (border), а второй обрезан по контенту (content). Так можно создать декоративный «ободок» из первого фона, который будет виден только в области padding и border.
.element { padding: 20px; border: 4px solid transparent; background-image: linear-gradient(#282A2E, #282A2E), linear-gradient(135deg, #2E9AFF, #F498AD); background-origin: padding-box, border-box; background-clip: padding-box, border-box;}
.element {
padding: 20px;
border: 4px solid transparent;
background-image:
linear-gradient(#282A2E, #282A2E),
linear-gradient(135deg, #2E9AFF, #F498AD);
background-origin: padding-box, border-box;
background-clip: padding-box, border-box;
}
В этом примере второй градиент занимает область рамки, а первый закрывает контент и отступы. В результате рамка выглядит градиентной при border.