#css
#css
Вопрос:
Я хотел бы изменить стиль выбранного элемента меню. Здесь у меня есть 3 ссылки меню, и у каждой из них разный фон изображения и один и тот же линейный градиент.
#items-category-link{
background: url("assets/user-panel/items-category.png") no-repeat 9px center, linear-gradient(90deg, rgba(229,217,187,1) 0%, rgba(214,195,138,1) 100%);
}
#logout-link{
background: url("assets/user-panel/logout.png") no-repeat 9px center, linear-gradient(90deg, rgba(229,217,187,1) 0%, rgba(214,195,138,1) 100%);
}
#wheel-link{
background: url("assets/user-panel/wheel.png") no-repeat 9px center, linear-gradient(90deg, rgba(214,195,138,1) 0%, rgba(229,217,187,1) 50%, rgba(214,195,138,1) 100%);
}
Дело в том, что я хотел бы изменить только линейный градиент при нажатии.
Таким образом, в Javascript при нажатии на ссылку user-panel-item-selected
добавляется класс.
Как я могу заменить старый градиент новым градиентом, не удаляя фоновое изображение? Я попробовал это :
.user-panel-item-selected{
background: linear-gradient(90deg, rgba(213,180,92,1) 0%, rgba(228,209,156,1) 50%, rgba(213,180,92,1) 100%) !important;
}
Большое спасибо!
Комментарии:
1. Даже если вы укажете только
background-image
, CSS недостаточно выразителен, чтобы позволить вам добавить или вычесть одинbackground-image
слой: вам нужно повторить все значение свойства.2. Вы путаете сокращенные свойства (например
background:
) со свойствами коллекции (многозначными свойствами) (напримерbackground-image
). Несмотря наbackground-image
то, что это свойство longhand включеноbackground
, тот факт, что вы можете переопределять отдельные свойства longhand, не связан с тем фактом, что вы не можете переопределить один элемент в свойстве collection. Мы не можем ожидать, что это ограничение CSS будет исправлено в течение как минимум десятилетия с такой скоростью…3. Хорошо, спасибо и извините за мое замешательство! Я полагаю, это то же самое, если я попытаюсь изменить градиентный слой с помощью Javascript?
4. Правильно. CSSOM JavaScript предоставляет
backgroundImage
свойство как одноstring
значение, но, по крайней мере, с помощью JavaScript вы можете использовать строковые операции для преобразования значения свойства, а не слепо перезаписывать его.5. Решением может быть использование псевдоэлемента ::after или ::before для части вашего фона
Ответ №1:
Этот фрагмент здесь может помочь. Сохраняет URL-адрес с помощью регулярного выражения, а затем добавляет ваш новый градиент и, наконец, задает стиль.
function changeGrad() {
let div = document.getElementById("logout-link");
let backgroundImageUrl = getComputedStyle(div).backgroundImage.match(/url(([^)] ))/i);
if (backgroundImageUrl.length > 0) {
div.style.backgroundImage = backgroundImageUrl[0] ", linear-gradient(90deg, rgba(213,180,92,1) 0%, rgba(228,209,156,1) 50%, rgba(213,180,92,1) 100%)"
}
}
#items-category-link{
background: url("assets/user-panel/items-category.png") no-repeat 9px center, linear-gradient(90deg, rgba(229,217,187,1) 0%, rgba(214,195,138,1) 100%);
}
#logout-link{
background: url("assets/user-panel/logout.png") no-repeat 9px center, linear-gradient(90deg, rgba(229,217,187,1) 0%, rgba(214,195,138,1) 100%);
}
#wheel-link{
background: url("assets/user-panel/wheel.png") no-repeat 9px center, linear-gradient(90deg, rgba(214,195,138,1) 0%, rgba(229,217,187,1) 50%, rgba(214,195,138,1) 100%);
}
div {
width: 50px;
height: 50px;
}
<html>
<div id="items-category-link"></div>
<div id="logout-link"></div>
<div id="wheel-link"></div>
<button onclick="changeGrad()">Change LG of Logout Link</button>
</html>
Комментарии:
1. Приятно, рад, что я смог помочь — не могли бы вы отметить это как принятый ответ? Спасибо 🙂
Ответ №2:
Вы можете использовать псевдоэлемент after или before для имитации нескольких фонов и упростить изменение только одного из них.
nav > a{
display: block;
float: left;
width: 100px;
height: 50px;
background-image: linear-gradient(red, green);
}
nav > a:hover{
background-image: linear-gradient(red, yellow);
}
nav > a::after{
content: '';
position: absolute;
display: block;
width: 100px;
height: 50px;
background: url('https://via.placeholder.com/40') center no-repeat;
}
<nav>
<a href='#'></a>
<a href='#'></a>
<a href='#'></a>
</nav>
Комментарии:
1. Спасибо, что поделились знаниями!
Ответ №3:
Используйте переменные CSS:
#items-category-link {
background:
url("assets/user-panel/items-category.png") no-repeat 9px center,
var(--c, linear-gradient(90deg, rgba(229, 217, 187, 1) 0%, rgba(214, 195, 138, 1) 100%));
}
#logout-link {
background:
url("assets/user-panel/logout.png") no-repeat 9px center,
var(--c, linear-gradient(90deg, rgba(229, 217, 187, 1) 0%, rgba(214, 195, 138, 1) 100%));
}
#wheel-link {
background:
url("assets/user-panel/wheel.png") no-repeat 9px center,
var(--c, linear-gradient(90deg, rgba(229, 217, 187, 1) 0%, rgba(214, 195, 138, 1) 100%));
}
.user-panel-item-selected {
--c: linear-gradient(90deg, rgba(213, 180, 92, 1) 0%, rgba(228, 209, 156, 1) 50%, rgba(213, 180, 92, 1) 100%);
}