Добавление случайного фонового изображения в CSS с помощью Javascript

#javascript #html #css #dom

#javascript #HTML #css #dom

Вопрос:

Итак, у меня есть папка, полная кучи GIF-файлов, которые я хочу использовать в качестве фона для нескольких элементов на моей странице. У меня есть анимация двери для всех этих элементов, и я хочу, чтобы один из случайных GIF-файлов отображался, когда дверь открыта. Раньше я просто использовал одно изображение для всех элементов, подобных этому:

HTML

 <div class="door-position d1">
   <div class="door-back">
      <button class="door" data-date="11/01/2020">1</button>
   </div>
</div>
 

CSS

 .door-back {
  height: 65px;
  width: 65px;
  border-radius: 50px;
  background-image: url("https://media4.giphy.com/media/8AdyAfsTMKi9QMaQ6n/giphy.gif");
  background-position: center;
  background-repeat: no-repeat;
  background-size: cover;
}
 

Но мне было интересно, есть ли innerHTML для вашей страницы css или я должен просто подключить их непосредственно к моему HTML?
Если это так, будет ли мой приведенный выше стиль по-прежнему влиять на это изображение? (высота, ширина, размер и т.д.)

ПРИМЕЧАНИЕ: дверь преобразуется (открывается), чтобы показать изображение в свойстве door-back.

Это был JS, который я пытался реализовать, чего бы он ни стоил. В этой версии я просто попытался указать адреса изображений в файле JS прямо:

HTML

 <div class="door-position d1">
            <div class="door-back" >
              <button class="door" onClick="displayImg()" data-date="11/01/2020">1</button>
            </div>
          </div>
 

JS

 const doorBackImg = document.querySelectorAll(".door-back");
const imgArr = [
  "https://media0.giphy.com/media/r3jTnU6iEwpbO/200w.webp?cid=ecf05e47gf4jebecm9mhvyym9jgx01lmfl6xd3gesmmmhi6iamp;rid=200w.webp",
  "https://media4.giphy.com/media/phmwMLY1kkkMg/200w.webp?cid=ecf05e47gf4jebecm9mhvyym9jgx01lmfl6xd3gesmmmhi6iamp;rid=200w.webp",
  "https://media0.giphy.com/media/bnH2hkYp97rGM/200.webp?cid=ecf05e478lhuvbydmjxp51r50rufqjcxj2x1v0g6kug4o86samp;rid=200.webp",
];

function displayImg() {
  let randNum = Math.floor(Math.random() * imgArr.length);
  doorBackImg.innerHTML = `${imgArr[randNum]}`;
}
 

Если вам нужен еще какой-либо код или информация, пожалуйста, дайте мне знать! Я пока не совсем нашел то, что искал, и ничего из того, что я пробовал, не сработало.

Приветствия!

Комментарии:

1. Что вы имеете в виду, говоря «если для вашей страницы css есть innerHTML или я должен просто подключить их непосредственно к моему HTML»

2. В настоящее время у меня есть адрес изображения в моем файле CSS, в свойстве background-image. Есть ли какой-либо способ получить доступ к этому свойству фонового изображения в CSS или я должен просто отправить изображение в HTML-файл вместо этого? Прошу прощения за отсутствие у меня здесь правильного языка; не уверен, как еще это сформулировать. Спасибо!

3. Вы можете напрямую управлять свойством. Это включено element.style.backgroundImage . Вы это имеете в виду?

4. Проверьте это w3schools.com/jsref/prop_style_backgroundimage.asp

5. Да! Это выглядит примерно так. Итак, из нее я предполагаю, что это что-то вроде « function myFunction() { document.getElementById(«myDiv»).style.BackgroundImage = «url(‘ media0.giphy.com/media/r3jTnU6iEwpbO /… )»; } «Будет ли это изменяться настройками, которые у меня есть для этого класса в CSS? Похоже, они делают большинство встроенных вещей, чего я бы хотел избежать, если это возможно. В любом случае, я еще немного повозлюсь с этим, но пока спасибо за комментарии!

Ответ №1:

Я не уверен, что правильно вас понял, но вот одно из моих решений. Это работает для одной двери.

 const doorBackImg = document.querySelector("#door-back");
const imgArr = [
  "https://media0.giphy.com/media/r3jTnU6iEwpbO/200w.webp?cid=ecf05e47gf4jebecm9mhvyym9jgx01lmfl6xd3gesmmmhi6iamp;rid=200w.webp",
  "https://media4.giphy.com/media/phmwMLY1kkkMg/200w.webp?cid=ecf05e47gf4jebecm9mhvyym9jgx01lmfl6xd3gesmmmhi6iamp;rid=200w.webp",
  "https://media0.giphy.com/media/bnH2hkYp97rGM/200.webp?cid=ecf05e478lhuvbydmjxp51r50rufqjcxj2x1v0g6kug4o86samp;rid=200.webp",
];

function displayImg() {
  let randNum = Math.floor(Math.random() * imgArr.length);
  doorBackImg.style.backgroundImage = `url(${imgArr[randNum]})`;
} 
 .door-back {
  height: 65px;
  width: 65px;
  border-radius: 50px;
  background-image: url("https://media4.giphy.com/media/8AdyAfsTMKi9QMaQ6n/giphy.gif");
  background-position: center;
  background-repeat: no-repeat;
  background-size: cover;
} 
 <div class="door-position d1">
   <div id="door-back" class="door-back">
      <button onClick="displayImg()" class="door" data-date="11/01/2020">1</button>
   </div>
</div> 

Комментарии:

1. Спасибо за ваш комментарий! Это работает очень хорошо! У меня есть 25 дверей, которые открываются на основе реквизита даты, который у меня есть в JS, и эти GIF-файлы должны быть фоном каждой двери. Идея в том, что они будут заполняться либо при загрузке страницы, ЛИБО при запуске события DoorOpen (я могу это понять). Я просто не был уверен, как заставить все 25 дверей размещать на них случайное изображение каждый раз. То, как вы это написали, может просто сработать! Я просто помещу все 25 случайных gif-файлов в массив в JS; поскольку я понятия не имею, как извлекать из своих собственных документов, еще раз спасибо!

2. Рад вам помочь

3. Спасибо! Я попробовал это, не создавая ID для doorback, так как я хотел, чтобы это касалось всех элементов door (давая всем индивидуальное случайное изображение bg). Это ОТЛИЧНО работает для первой двери. Происходит событие DoorOpen, и gif отображается прямо за ним. Однако, если вы нажмете на вторую дверь, после события DoorOpen ничего не заполняется, а первый отображаемый gif затем рандомизируется. Есть идеи, как я могу это исправить и добавить это свойство к каждой двери не повторять рандомизацию? ПРИМЕЧАНИЕ: для событий указателя установлено значение «нет», поэтому, как только дверь открыта, она больше не может взаимодействовать. Это так близко!

4. Конечно! Извините, там много кода, и у меня есть только случайное изображение, отображаемое на первых двух дверях для записи. Кроме того, JS также находится прямо вверху страницы! Я знаю, что это спагетти, так что, надеюсь, со всем, что находится вверху, его будет легко найти. Дайте мне знать, если вы заблудились, лол jsfiddle.net/37wavfkL

5. Это фантастика! Я не слишком много работал с циклами for (думаю, я буду использовать forEach для большинства вещей), но это удобно, чтобы увидеть, как все это работает. У меня осталось меньше недели, чтобы это сделать, и это было последним большим препятствием для меня. Еще раз спасибо за вашу помощь; Я действительно очень ценю это!