CSS background-clip — область виведення тла


Властивість background-clip визначає, як колір чи картинка тла має виводитися під гранями. Ефект помітний при напівпрозорих (зі значенням transparent) або пунктирних гранях.

Властивість background-clip

Властивість background-clip була введена у CSS3, використовуй її разом з іншими, пов’язаними, властивостями, такими як background-color чи background-image.

Ця властивість може отримувати декілька значень (для кожного з декількох фонових малюнків), при цьому значення поділяються між собою комою.

Без задання застосовується background-clip: border-box, тло простягається до самого краю кордону елемента. Коли властивість приймає значення padding-box, фон зупиняється, коли закінчується внутрішні відступи (поля) елемента. За допомогою content-box, фон застосовується тільки до вмісту елемента.

Існує подібна властивість - background-origin, от тільки вона не ріже тло, тому якщо тло завелике для елемента, то воно просто пройде під його гранями. Дивись 3 приклад.

Ця властивість також можна використовувати в скороченому записі background (наприклад: background: url("background.png") 40% / 10em lightblue round border-box;).

автор: Svitlana

Загальний опис

автор: NagarD

Синтаксис

background-clip: border-box|padding-box|content-box|initial|inherit;

Властивість background-clip може отримувати 5 значень:

padding-box

Тло відображається до граней елемента.

автор: Svitlana

border-box

Тло відображається під гранями елемента. Без задання.

автор: Svitlana

content-box

Тло відображається тільки всередині контенту.

автор: Svitlana

initial

Встановлює властивість у значення без задання

автор: Svitlana

inherit

Вказує на спадковість властивості від свого батьківського елемента

автор: Svitlana

Значення без задання: border-box
Наслідує: Ні
Анімується: Ні
JavaScript синтаксис: object.style.backgroundClip="content-box"

Переглядачі

Підтримка: стаціонарні переглядачі
Переглядач Google Chrome Mozilla Firefox Apple Safari Opera Microsoft EDGE Microsoft Internet Explorer
1 4 5 10.5 12 9
Підтримка: мобільні переглядачі
Переглядач Mobile Google Android Mobile Google Chrome Mobile Mozilla Firefox Mobile Apple Safari
4.4 18 4 5

Приклади

+ запропонувати свій приклад у пісочниці

Три однакові блоки з золотим тлом і напівпрозорим пунктирним бордером — різниця лише в background-clip: тло сягає зовнішнього краю бордера, зупиняється на краю відступів або лежить тільки під вмістом.

HTML

<div class="box bb">border-box</div>
<div class="box pb">padding-box</div>
<div class="box cb">content-box</div>

CSS

.box {
    display: inline-block;
    width: 120px;
    padding: 12px;
    margin: 0 8px 8px 0;
    border: 6px dashed rgba(0, 0, 0, .4);
    background-color: gold;
}

.bb { background-clip: border-box; }
.pb { background-clip: padding-box; }
.cb { background-clip: content-box; }
автор: Svitlana

HTML

<h4>Властивість <code>background-clip</code></h4>

<div class="demo">
	<div class="block pad"><span>padding-box</span></div>
	<div class="block bor"><span>border-box</span></div>
	<div class="block con"><span>content-box</span></div>
</div>

CSS

* {
	box-sizing: border-box;
}
	
body {
	font-family: sans-serif;
	line-height: 1.45;
	font-size: 18px;
	padding: 16px 16px 0 16px;
	text-align: center;
}

h4 {
	color: #4f4f4f;
	font-weight: 400;
}

.demo {
	display: flex;
	align-items: center;
	justify-content: space-between;
}

.block {
	background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='175' height='175' viewBox='0 0 40 40' preserveAspectRatio='none'%3E%3Crect width='40' height='40' fill='%23264653'/%3E%3Cpath d='M0 40 12 18 22 30 30 22 40 40Z' fill='%232a9d8f'/%3E%3Ccircle cx='30' cy='9' r='5' fill='%23e9c46a'/%3E%3C/svg%3E");
	background-repeat: no-repeat;
	background-size: cover;
	width: 175px;
	height: 175px;
	border: 12px solid rgba(0, 0, 0, .15);
	margin-top: 46px;
	padding: 12px;
}

.block > span {
	position: relative;
	top: -55px;
	font-family: monospace;
	font-size: .9em;
	font-weight: 700;
	color: #4f4f4f;
}

.pad { background-clip: padding-box; }
.bor { 
	background-clip: border-box;
	background-origin: border-box;
}
.con { background-clip: content-box; }
автор: Svitlana

Демонстрація роботи властивості

HTML

<div class="padding-box"><p>padding-box</p></div>

<div class="border-box"><p>border-box</p></div>

<div class="content-box"><p>content-box</p></div>

CSS

div {
  border: 10px dotted rgba(0,0,0,.5);
  width: 25%;
  height: 250px;
  margin-bottom: 45px;
  background-color: yellow;
  background-size: cover;
  background-repeat: no-repeat;
  background-size: 100% 100%;
  display: inline-block;
  padding: 16px;
}

p {
  text-align: center;
  margin-top: 25%;
  font-size: 3em;
}

div.padding-box {
  background-clip: padding-box;
}

.border-box {
  background-clip: border-box;
}

.content-box {
  background-clip: content-box;
}
автор: Svitlana

Градієнтний текст: тло-градієнт обрізане по формі букв через background-clip: text, а сам текст зроблено прозорим. Приберіть color: transparent — і градієнт сховається під суцільним кольором тексту.

HTML

<h2 class="grad">Градієнт по буквах</h2>
<p class="note">background-image + background-clip: text + color: transparent</p>
<h2 class="plain">Звичайний текст для порівняння</h2>

CSS

body {
  font-family: sans-serif;
  padding: 22px;
  background-color: #14161a;
}

.grad {
  margin: 0;
  font-size: 42px;
  font-weight: 800;
  background-image: linear-gradient(90deg, #ff8a00, #e52e71, #4a90e2);
  -webkit-background-clip: text;
  background-clip: text;
  color: transparent;
}

.note {
  font-family: monospace;
  font-size: 13px;
  color: #8a93a0;
}

.plain {
  margin: 0;
  font-size: 42px;
  font-weight: 800;
  color: #8a93a0;
}
автор: NagarD

HTML

<p>Цей приклад показує як працює властивість <strong>background-clip</strong>. Спробуйте ввімкнуити різні перемикачі, щоб змінити відображення фонового зображення нище.</p>

<div class="inputs">
  <input id="padding-box" checked name="background-clip" type="radio"/>
  <label for="padding-box">padding-box</label>
  <message for="padding-box">Тло відображається до граней елемента.</message>
  
  <input id="border-box" name="background-clip" type="radio"/>
  <label for="border-box">border-box</label>
  <message for="border-box">Тло відображається під гранями елемента. Без задання.</message>
  
  <input id="content-box" name="background-clip" type="radio"/>
  <label for="content-box">content-box</label>
  <message for="content-box">Тло відображається тільки всередині контенту.</message>
 
</div>

<p id="message">Тло відображається під гранями елемента. Без задання.</p>

<div id="block"></div>

CSS

* {
  box-sizing: border-box;
}

body {
  font-family: sans-serif;
}

message {
  display: none;
}

#block {
  width: 200px;
  height: 200px;
  margin: 36px auto;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='200' height='200' viewBox='0 0 40 40' preserveAspectRatio='none'%3E%3Crect width='40' height='40' fill='%23264653'/%3E%3Cpath d='M0 40 12 18 22 30 30 22 40 40Z' fill='%232a9d8f'/%3E%3Ccircle cx='30' cy='9' r='5' fill='%23e9c46a'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-origin: border-box;
  background-size: cover;
  padding: 16px;
  border: 16px solid rgba(0, 0, 0, .15);
}

JS

const message = document.querySelector('#message');

document.querySelectorAll('.inputs input').forEach((el) => el.addEventListener('change', function () {

  var messageText = document.querySelector("message[for='" + this.id + "']");
  message.textContent = messageText?.textContent ?? '';

  document.querySelectorAll('#block').forEach((n) => n.style.setProperty('background-clip', this.id));

}));
автор: Svitlana

HTML

<div class="inputs">
  <input id="border-box" checked name="box_selectors" type="radio"/>
  <label for="border-box">border-box</label>
  <input id="padding-box" name="box_selectors" type="radio"/>
  <label for="padding-box">padding-box</label>
  <input id="content-box" name="box_selectors" type="radio"/> 
  <label for="content-box">content-box</label> 
</div>

<div class="box">
  <div class="little_box"></div>
</div>

CSS

.box {
  position: relative;
  background: #545454 url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='300' height='300' viewBox='0 0 40 40' preserveAspectRatio='none'%3E%3Crect width='40' height='40' fill='%23264653'/%3E%3Cpath d='M0 40 12 18 22 30 30 22 40 40Z' fill='%232a9d8f'/%3E%3Ccircle cx='30' cy='9' r='5' fill='%23e9c46a'/%3E%3C/svg%3E");
  height: 200px;
  width: 200px;
  margin: 0 auto;
  border: 18px solid rgba(0, 0, 0, 0.3);
  background-clip: border-box;
  background-origin: border-box;
  background-size: cover;
  background-repeat: no-repeat;
  padding: 30px;
}

.little_box {
  text-align: center;
  color: white;
  font-size: 1.5em;
  width: 100%;
  height: 100%;
  padding: 4px;
  box-sizing: border-box;
}

.inputs {
  text-align: center;
  margin: 16px;
  label {
    cursor: pointer;
    padding: 12px 0;
  }
  input {
    cursor: pointer;
    margin-left: 12px;
  }
}

JS

document.querySelectorAll('.inputs input').forEach((el) => el.addEventListener('change', function () {
  console.log(this);
  document.querySelectorAll('.box').forEach((n) => n.style.setProperty('background-clip', this.id));
}));
автор: Svitlana

HTML

<div class="inputs">
  <input checked id="background-origin" name="background" type="radio"/>
  <label for="background-origin">background-origin: padding-box</label>
  <br>
  <input id="background-clip" name="background" type="radio"/>
  <label for="background-clip">background-clip: padding-box</label>
</div>

<div class="result"></div>

CSS

.result {
  box-sizing: border-box;
  height: 300px;
  width: 300px;
  background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='400' height='400' viewBox='0 0 40 40' preserveAspectRatio='none'%3E%3Crect width='40' height='40' fill='%23264653'/%3E%3Cpath d='M0 40 12 18 22 30 30 22 40 40Z' fill='%232a9d8f'/%3E%3Ccircle cx='30' cy='9' r='5' fill='%23e9c46a'/%3E%3C/svg%3E") no-repeat;
  border: 16px solid rgba(23,23,23,0.5);
/*   background-size: cover; */
  padding: 16px;
  margin: 0 auto;
}

.inputs {
  margin:0 auto 8px;
	width:300px;

  label {
    cursor: pointer;
    padding: 12px 0;
  }
  input {
    cursor: pointer;
    margin-left: 12px;
  }
}

JS

document.querySelectorAll('.inputs input').forEach((el) => el.addEventListener('change', function () {
  document.querySelectorAll('.result').forEach((n) => n.style.setProperty('background-origin', 'initial'));
  document.querySelectorAll('.result').forEach((n) => n.style.setProperty('background-clip', 'initial'));
  document.querySelectorAll('.result').forEach((n) => n.style.setProperty(this.id, 'padding-box'));
}));
автор: Svitlana

Коментарі

Коментарів ще немає — будьте першим!

Відповідь для

Як форматувати текст?
Пишемо Виходить
**важливо**
*акцент*
~~застаріле~~
Виділення в тексті. Те саме роблять кнопки панелі, що спливає над виділеним.
## Як працює каскад
### Порядок оголошень
Заголовки всередині тексту. Найбільший не потрібен — він у сторінки вже є.
[[css/property/color]] Посилання на сторінку довідника. Наберіть [[ — поле веде сходинками (розділ → тип → сторінка), а хибний ключ підкреслить хвилею.
[[!sandbox/S0oh1hBm]] Живий приклад окремим рядком — саме вікно результату. Той самий ключ зі знаком !: наберіть [[! і дійдіть сходинками до потрібної сторінки, список покаже її приклади.
[MDN](https://developer.mozilla.org) Посилання на чужий сайт.
![Схема каскаду](https://site.com/схема.png) Картинка. Опис обов'язковий: його читають пошуковик і незрячі.
Задайте `display: grid` контейнеру Код усередині речення.
```css
.card { display: grid }
```
Код блоком. Мова після трьох лапок вмикає підсвітку.
- Походження
1. Походження
Перелік: маркований і нумерований.
- [ ] дописати приклади
- [x] перевірити в Firefox
Перелік завдань із галочками. Пробіл у порожніх дужках обов'язковий.
> Порядок важить лише за рівної ваги. Цитата на всю ширину абзацу.
Специфічність
: вага селектора; більша перемагає
Список означень: термін, а під ним пояснення з відступом. Пробіл після двокрапки обов'язковий.
Каскад має три критерії[^1]
[^1]: Походження, специфічність, порядок.
Виноска: номер у тексті, примітка внизу сторінки. Без згадки [^1] у тексті примітка не з'явиться.
Відповідь: ||сорок два|| Ховає те, що між рисками: читач бачить на цьому місці розмиту пляму, а решта речення лишається звичайною. Клац — і текст відкрито.
|| Показати рішення
Задайте контейнеру `display: grid`.
||
Ховає цілі абзаци. На сторінці видно лише підпис із першого рядка («Показати рішення»), решта розгортається клацанням по ньому. Закривні риски — окремим рядком.
Порожній рядок Новий абзац. Щоб перенести рядок усередині абзацу, поставте \ в його кінці.

Увійдіть — коментар з'явиться одразу, без капчі й очікування перевірки.

Правка
Зворотний зв'язок
Вхід