#css
#css
Вопрос:
Есть ли способ использовать линейный градиент для установки двухцветной нижней границы, чтобы ее можно было использовать в качестве индикатора выполнения? Подумайте о том, как Safari показывает вам индикатор выполнения при загрузке веб-сайта.
Мы можем сделать это с помощью фона:
background-image: linear-gradient(90deg, green 10%, red 0%, red 100%);
Это приведет к созданию div, который на 10% зеленый и на 90% красный. Можно ли использовать аналогичный метод для нижней границы div? Кроме того, можно ли регулировать ширину этой нижней границы так, чтобы она составляла 3 пикселя?
Ответ №1:
Я бы предпочел создать для него элемент, но вы можете сделать что-то вроде этого:
Пожалуйста, не используйте зеленый и красный цвета из-за проблем с дальтонизмом.
body {
margin: 0;
padding: 0;
}
header {
--progress: 10%;
background-color: khaki;
height: 3rem;
border-bottom: 3px solid;
border-image: linear-gradient(90deg, green var(--progress), red 0%, red 100%) 1;
}
<header></header>
[РЕДАКТИРОВАТЬ] Я могу добавить, как я бы настроил индикатор выполнения с псевдоэлементами. Я бы предпочел использовать два (один в качестве фона, другой в качестве прогресса), чтобы было проще анимировать прогресс.
Добавлен ввод диапазона, чтобы сделать его немного более интерактивным.
let headerElements = document.querySelectorAll('header');
function updateHeaders(value) {
headerElements.forEach((header) => {
header.style.setProperty('--progress', value "%");
});
}
body {
--primary-color: lightblue;
margin: 0;
padding: 0;
}
header {
--progress: 30%;
background-color: var(--primary-color);
display: flex;
align-items: center;
/* RELEVANT CSS */
position: relative;
}
/* RELEVANT CSS */
header.progressbar::before,
header.two.pseudo-elements.progressbar::after {
content: '';
position: absolute;
bottom: 0px;
left: 0px;
right: 0px;
height: 3px;
}
header.one.pseudo-element.progressbar::before {
background-image: linear-gradient(90deg, green var(--progress), red 0%, red 100%);
}
header.two.pseudo-elements.progressbar::before {
z-index: 2;
right: initial;
width: var(--progress);
background-color: green;
transition: width 300ms linear;
}
header.two.pseudo-elements.progressbar::after {
z-index: 1;
background-color: red;
}
/* PLACEHOLDER CSS BELOW */
input[type="range"] {
margin: 1rem 0px;
width: 100%;
}
div[title="Logotype"] {
width: 35px;
height: 35px;
display: flex;
justify-content: center;
align-items: center;
font-family: "Verdana";
font-size: 36px;
padding: 0.25rem;
margin: 0.5rem;
background-color: white;
border-radius: 50%;
}
header > a {
padding: 0px 0.5rem;
color: #121212;
}
<h3>One pseudo-element</h3>
<header class="one pseudo-element progressbar">
<div title="Logotype">L</div>
<a href="#">Link 1</a>
<a href="#">Link 2</a>
</header>
<h3>Two pseudo-elements</h3>
<header class="two pseudo-elements animate progressbar">
<div title="Logotype">L</div>
<a href="#">Link 1</a>
<a href="#">Link 2</a>
</header>
<input type="range" oninput="updateHeaders(this.value)" value="30" />
Комментарии:
1. Интересно, что вы предпочли бы использовать для этого отдельный элемент. Есть ли причина доступности или что-то еще?
2. Это скорее соглашение о программировании. Пусть каждый элемент выполняет одно действие, а не несколько. Как в моем примере:
header
должны отображаться элементы в заголовке (как контейнер), а не также отображать прогресс. Я бы предпочел добавить div или псевдоэлемент с абсолютным позиционированием внутриheader
. Это имеет еще больший смысл, когда вы используете пользовательские элементы с функциональностью (CSS, javascript), содержащейся в них.3. Спасибо, я действительно не думал об этом раньше.
4. Спасибо. Хороший момент в том, что нельзя использовать красный и зеленый цвета из-за дальтонизма. Как мы можем использовать псевдоэлемент с абсолютным позиционированием в заголовке, чтобы сделать то же самое? Причина, по которой я пытаюсь избежать создания нового элемента для индикатора выполнения, заключается в том, что заголовок вверху липкий, а я не эксперт по CSS, поэтому введение новых элементов может испортить существующий макет.
5. Не беспокойтесь. Я отредактировал сообщение с двумя примерами того, как это может выглядеть.