Установить / сменить второй фон (background-image) на CSS

209
11 ноября 2018, 18:10

Есть несколько блоков с разными фонами. Возможно ли добавлять им второй фон на CSS, например, по наведению?

.class:hover {
background-image: url(здесь как-то сохраняется оригинальный фон блока), 
url(добавляется второй фон);
}

Блоков многовато, поэтому вариант для каждого просто копировать оригинальный фон + приписывать второй не слишком подходит. Нужно решение для всех блоков разом.

Answer 1

Идеи иссякли...

function fAddBgImage(sClass, sImageAndPos) { 
  let aBlocks = document.querySelectorAll(sClass); 
  let aImageAndPos = sImageAndPos.split(' '); 
  aBlocks.forEach(function(element) { 
    sBgImage = getComputedStyle(element).backgroundImage; 
    sBgPos = getComputedStyle(element).backgroundPosition; 
    element.addEventListener('mouseenter', event => { 
      element.style.backgroundImage = 'url(' + aImageAndPos[0] + '), ' + sBgImage; 
      element.style.backgroundPosition = aImageAndPos[1] + ' ' + aImageAndPos[2] + ', ' + sBgPos; 
    }) 
    element.addEventListener('mouseleave', event => { 
      element.style.backgroundImage = ''; 
      element.style.backgroundPosition = ''; 
    }) 
  }); 
} 
fAddBgImage('.class_script', 'https://www.gravatar.com/avatar/3a0245702f6ce1969137e44750ca54a9?s=328&d=identicon&r=PG -20% -20%');
.wrap { 
  display: flex; 
  flex-flow: row nowrap; 
} 
 
.class_manual, 
.class_before, 
.class_after, 
.class_script { 
  height: 180px; 
  width: 100%; 
  font: 14px 'Arial'; 
  color: #ffdb00; 
  border: 1px solid #333; 
  background-repeat: no-repeat; 
  text-shadow: 1px 1px 4px black; 
} 
 
.class_manual { 
  background-image: url(https://i.stack.imgur.com/gJi51.jpg?s=328&g=1); 
  background-position: 0px 0px; 
} 
 
.class_manual:hover { 
  background-image: url(https://www.gravatar.com/avatar/3a0245702f6ce1969137e44750ca54a9?s=328&d=identicon&r=PG), url(https://i.stack.imgur.com/gJi51.jpg?s=328&g=1); 
  background-position: -20% -20%, 0px 0px; 
} 
 
.class_before { 
  background-image: url(https://i.stack.imgur.com/gJi51.jpg?s=328&g=1); 
  background-position: 0px 0px; 
  position: relative; 
  overflow: hidden; 
} 
 
.class_before:hover::before { 
  content: ''; 
  position: absolute; 
  width: 100%; 
  height: 100%; 
  display: block; 
  background-image: url(https://www.gravatar.com/avatar/3a0245702f6ce1969137e44750ca54a9?s=328&d=identicon&r=PG); 
  background-position: -20% -20%; 
  background-repeat: no-repeat; 
} 
 
.class_after { 
  background-image: url(https://i.stack.imgur.com/gJi51.jpg?s=328&g=1); 
  background-position: 0px 0px; 
  position: relative; 
  overflow: hidden; 
} 
 
.class_after:hover::after { 
  content: ''; 
  position: absolute; 
  width: 100%; 
  height: 100%; 
  display: block; 
  background-image: url(https://www.gravatar.com/avatar/3a0245702f6ce1969137e44750ca54a9?s=328&d=identicon&r=PG); 
  background-position: -20% -20%; 
  background-repeat: no-repeat; 
} 
 
.class_script { 
  background-image: url(https://i.stack.imgur.com/gJi51.jpg?s=328&g=1); 
  background-position: 0px 0px; 
}
<div class="wrap"> 
  <div class="class_manual"><strong>С использованием ручной правки</strong><br><em>Не подходит, в виду большого количества блоков с разными фонами. Здесь для образца.</em></div> 
  <div class="class_before"><strong>С использованием псевдоэлемента ::before</strong><br><em>Подходит не для всякой цели, т.к. перекрывает содержимое родительского блока.</em></div> 
  <div class="class_after"><strong>С использованием псевдоэлемента ::after</strong><br><em>Подходит не для всякой цели, т.к. вытесняется содержимым родительского блока.</em></div> 
  <div class="class_script"><strong>С использованием JavaScript</strong><br><em>Простой, надёжный и удобный способ, управлять фоновым изображением из скрипта.</em></div> 
</div>

Answer 2

@UModeL , чтобы псевдоэлемент не перекрывал содержимое блока, нужно его(содержимое) обернуть в элемент и задать position:relative.

*{ 
  box-sizing:border-box; 
} 
.block{ 
  max-width:300px; 
  margin:20px auto 0; 
  padding:20px; 
  background:linear-gradient(#cda,#acd); 
  position:relative; 
} 
.block__content{ 
  position:relative; 
  z-index:2; 
} 
.block:before{ 
  content:''; 
  display:block; 
  position:absolute; 
  top:0; 
  left:0; 
  width:100%; 
  height:100%; 
  z-index:0; 
  opacity:0; 
  background:radial-gradient(circle at center,#cda,#dac) no-repeat center/80%; 
  transition:all .2s ease; 
} 
.block:hover:before{ 
  opacity:1; 
}
<div class="block"> 
  <div class="block__content">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Laboriosam fugit obcaecati laborum natus ad odio inventore facere similique reprehenderit quod!</div> 
</div>

Answer 3

Поставьте им общий класс. Например:

.item_1 {
  background-image: url("../img/bg1.jpg");
}
.item_2 {
  background-image: url("../img/bg2.jpg");
}
.item:hover {
  background-image: url("../img/bg.jpg");
}
    <div class="list">
        <div class="item item_1"></div>
        <div class="item item_2"></div>
        <div class="item item_3"></div>
        <div class="item item_4"></div>
    </div>
READ ALSO
как сформировать URL запрос с json обьекта в URLSearchParams?

как сформировать URL запрос с json обьекта в URLSearchParams?

Angular 6 - Есть форма с данными запроса:

211
Сортировка в картах

Сортировка в картах

не могу решить проблему следующего характераНа картах fusiontablaes сделал карту, теперь нужно добавить виды сортировок

161
Модификация циферблата часов на canvas

Модификация циферблата часов на canvas

Есть часы, подскажите как можно вместо линий показывающих деления часов, вставить цифры? Не до конца понимаю, как написать такую функцию

214