CSS маска на элементе без изображения?
Эта проблема:
У меня есть набор "вкладок" для навигации, в который я хочу добавить класс "маски" к активной вкладке. Моя цель - показать цвет фона и / или фоновое изображение ТЕЛА, но только с этим "активная" вкладка. Поскольку фоновая страница тела динамична и постоянно меняется, я не могу просто добавить цвет фона на "активную вкладку" и назвать его днем. Я должен использовать другую технику (javascript - последнее средство, я хочу сделать это только с CSS).
ТРЕБОВАНИЯ:
- Я не могу использовать изображение для маски, потому что ширины "табуляции" отображаются css с flexbox и растягиваются по всей странице.
- Я должен использовать решение, которое маскирует только элементы... В этом случае:
<div class="mask"></div>
- Я не могу изменить структуру HTML ниже... Я должен работать с этим макетом.
Это возможно с маской CSS или есть лучший способ добиться этого с помощью другой техники CSS?
Скрипка: https://jsfiddle.net/oneeezy/7mj8voL8/
КОД:
* { margin: 0; padding: 0; box-sizing: border-box; }
/* Body */
body { background-color: rgb(0, 121, 191); }
/* Header */
h1 { color: white; }
header { background-color: rgba(0,0,0, .15); padding: 20px 20px 0; }
header nav { display: flex; }
header nav div { flex: 1; color: white; background: rgba(0,0,0, .1); margin: 10px 10px 0; padding: 10px; border-radius: 10px 10px 0 0; }
/* Mask (without image?) */
header nav div.mask { background: rgba(0,0,0, .1); } /* Can mask reveal background color? */
/* Main */
main { padding: 20px 20px 0; }
h2 { color: rgba(0,0,0, .54); }
<header>
<h1>Logo</h1>
<nav>
<div class="mask">Link (mask)</div>
<div class="">Link</div>
<div class="">Link</div>
</nav>
</header>
<main>
<h2>CSS Masking</h2>
<p>Possible to css mask without an image? Hmmmmmm.......</p>
<p>I want to reveal the color of the BODY's background on the DIV that has the class "mask"</p>
</main>
1 ответ
Если всегда есть активный элемент и только один активный элемент, вы можете установить на него тень, которая получит желаемый эффект (вместо фона в заголовке).
* { margin: 0; padding: 0; box-sizing: border-box; }
/* Body */
body { background: repeating-linear-gradient(90deg, lightblue 0px, lightgreen 100px); }
/* Header */
h1 { color: white; }
header { padding: 20px 20px 0; }
header nav { display: flex; }
header nav div { flex: 1; color: white; background: rgba(0,0,0, .1); margin: 10px 10px 0; padding: 10px; border-radius: 10px 10px 0 0; }
/* create a shdow on the underlying element, reset the default bkg */
header nav div.mask {
box-shadow: 0px -1000px 0px 1000px rgba(0,0,0, .1);
background-color: transparent;
}
/* Main */
main { padding: 20px 20px 0; }
h2 { color: rgba(0,0,0, .54); }
<header>
<h1>Logo</h1>
<nav>
<div class="mask">Link (mask)</div>
<div class="">Link</div>
<div class="">Link</div>
</nav>
</header>
<main>
<h2>CSS Masking</h2>
<p>Possible to css mask without an image? Hmmmmmm.......</p>
<p>I want to reveal the color of the BODY's background on the DIV that has the class "mask"</p>
</main>