Зацикливание изображений в элементе div

#javascript #html

#javascript #HTML

Вопрос:

Я новичок, начинающий изучать кодирование. Я разработал эксперимент, связанный с нейробиологией, на веб-странице с 4 слоями веб-страницы. мой первый слой будет постоянным. Второй слой показывает разные изображения во время каждого раунда опроса. Третий и четвертый уровни — это вопросы, отображаемые через определенные промежутки времени и / или при нажатии кнопки отправить. Я хотел бы знать, как мне каждый раз отображать разные изображения. Точно, могу ли я сделать это с помощью цикла for !?

 <html>

<head>
<Title> Experiment </title>
<link rel="stylesheet" type="text/css" href="displayfieldset.css">
</head>
<body>

<!-- Layer 1 of cross hair image -->
<div id="crosshair" style="background-color:black; position:absolute;     width:100%; height:100%; z-index:1; align:center">
<img src="crosshair.jpg" width="1350px" height="750px" >
</div> <!-- Layer 1 closed -->

<!-- Layer 2 of Images -->
<div id="piclayer" style="position:absolute ;width:98%; height:98%; z-    index:2; align:center; margin-left:0.5%; margin-top:0.5%">
    <img id="images" src="image1.jpg" style="width:1325px; height:720px; display:none">
</div> <!-- Layer 2 closed -->


<!-- Layer 3 Question 1 -->
<div id="questionone" style="z-index:3; position:absolute; display:none; margin-left: 180px">
<fieldset name="field1_1" id="field1_1">
<form name ="problem1_1" id="problem1_1"  >
  <b> Identify the problem shown in this image. </b>
  <br> 
  <br>
  <input type="text" name="answer1_1" id="answer1_1" maxlength="30" style="width: 400px">
  <br>
  <br>
  <input type="button" value="Submit" onclick="showdiv()"  >
</form>
</fieldset>
</div>

<!-- Layer 4 Question 2 -->
<div id="questiontwo" style=" position: absolute; z-index:5; align:center; display:none; margin-left: 180px">
<fieldset name="field1_2" id="field1_2" style="position:relative; align:center">
<form name ="problem1_2" id="problem1_2" >
  <b> Propose a solution to the problem. </b>
  <br> 
  <br>
  <input type="text" name="solution1_2" id="solution1_2" maxlength="30" style="height: 200px; width: 400px">
  <br>
  <br> 
  <br>
  <input type="button" value="Submit" onclick="hidediv()" >
  </form>
</fieldset>
</div>

<script>
  function showdiv()
  {
    document.getElementById('questiontwo').style.display = "block";
    document.getElementById('questionone').style.display = "none";
  }

  function hidediv()
  {
   document.getElementById('piclayer').style.display = 'none';
   document.getElementById('questionone').style.display = 'none';
   document.getElementById('questiontwo').style.display = 'none';
  }

  <!-- Time out for image -->
  setTimeout 
  ( function()
    {
      document.getElementById('images').style.display = 'block';
    }
    ,6000
  );

  <!-- Timeout for first question -->
  setTimeout 
  ( function()
   {
    document.getElementById('questionone').style.display = 'block';
   }
   ,12000
  );
</script>



</body>
</html>
  

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

1. Да, сначала присвойте им одинаковое имя класса, а затем получите их все по document.getElementsByClassName . Этот метод дает вам список всех этих изображений, по которым вы можете перебирать и делать все, что захотите.

2. Вы пробовали размещать разные теги <img> внутри разных тегов <div>?

Ответ №1:

Основываясь на вашем кодировании,
изображение «перекрестия», layer-1 всегда отображается с z-индексом: 1.
Изображения уровня 2 будут отображаться через 6 секунд после загрузки страницы с z-индексом: 2.
div уровня 3 отобразится через 12 секунд после загрузки страницы с z-индексом: 3.
На уровне 3 есть кнопка отправки. Если пользователь нажмет на кнопку отправки,
слой-4 будет отображен, а слой-3 будет скрыт.
Внутри Layer-4 снова есть кнопка отправки, если пользователь нажмет на эту кнопку, все изображения будут скрыты.
Итак, что вы хотите сделать?

Вы хотите отображать изображения из Layer-2 с помощью цикла? Если да, то вот примеры кодов:

 var x = 0;
function myFunction(){  
   
   var Layer2Images = document.querySelectorAll("img.images"); 
   if (x == Layer2Images.length)
      x=0;
   for (i = 0; i < Layer2Images.length; i  ) {
    Layer2Images[i].style.display = 'none';
   }
   Layer2Images[x].style.display = 'block';
   x  ;
}

setInterval(myFunction, 1000)  
 <!-- Layer 2 of Images -->
<div id="piclayer" style="position:absolute ;width:98%; height:98%; z-index:2; align:center; margin-left:0.5%; margin-top:0.5%">
   <img class="images" src="https://pixabay.com/static/uploads/photo/2012/05/29/00/43/car-49278_1280.jpg" style="width:400px;height:300px; display:none;">
   <img class="images" src="https://static.pexels.com/photos/24353/pexels-photo-large.jpg" style="width:400px; height:300px; display:none;">
   <img class="images" src="https://static.pexels.com/photos/16155/pexels-photo-large.jpg" style="width:400px; height:300px; display:none;">
</div> <!-- Layer 2 closed -->  

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

1. Ваше понимание совершенно верно. Итак, на уровне 4 (z-индекс 4) снова есть кнопка отправки. Нажатие на это приведет к повторению события из слоев 2, 3 и 4, как это произошло ранее, но с другим изображением на уровне 2.

2. Я хотел бы знать назначение документа. querySelectorAll(«img.images»)

3. документ. querySelectorAll(«img.images») предназначен для получения всех html-элементов <img> с именем класса «images». Мы присвоили классу всех тегов images <img> имя «images». [<img class=»изображения ….» …..>]

4. Хорошо! И здесь изображения отображаются с интервалом в 1 секунду, если я не ошибаюсь. Не могли бы вы, пожалуйста, помочь в том, как сделать то же самое при нажатии кнопки «Отправить» в layer 4?

5. Если быть точным, изображение на уровне 2 должно изменяться только при нажатии кнопки отправки на уровне 4. Это не рассчитано по времени. Рассмотрим следующие шаги -> Черный экран слоя 1 отображается в течение 6 секунд -> Слой 2 с изображением 1 отображается в течение 6 секунд -> Вопрос 1 появляется в слое 3

Ответ №2:

Проверьте document.querySelector и document.querySelectorAll . С их помощью вы можете настроить таргетинг на один узел DOM с помощью селектора запросов CSS или вы можете настроить таргетинг на несколько DOM одновременно, а затем выполнить цикл над ними в цикле for of, преобразовав узлы в массив с помощью Array.from .

Полный рабочий пример

 let i = 0

// Grab all the layers and read them into an array so we can iterate them.
let layers = Array.from(document.querySelectorAll('img.layer'))
const nextLayer = () => {
  // increment i and compare incremented value, if greater than 3, reset to first layer.
  if(  i > 3)
    i = 1
  // iterate all layers and set their CSS display property to none.
  layers.forEach((x) => { x.style.display = 'none' })
  // select the single layer we are currently on and set its css display to block.
  document.querySelector(`img.layer_${i}`).style.display = 'block'
}

// show first layer
nextLayer()
// show next layer every 2 seconds
setInterval(nextLayer, 2000)  
 <img class="layer layer_1" src="http://www.jqueryscript.net/images/Simplest-Responsive-jQuery-Image-Lightbox-Plugin-simple-lightbox.jpg" />
<img class="layer layer_2" src="http://cdn.theatlantic.com/assets/media/img/photo/2015/11/images-from-the-2016-sony-world-pho/s01_130921474920553591/main_900.jpg" />
<img class="layer layer_3" src="http://livewallpaper.info/wp-content/uploads/2015/12/Desktop-Cute-Wallpapers-HD-1920x1080-1.jpg" />