Как постепенно обновлять изображения в таблице

#javascript #html

#javascript #HTML

Вопрос:

Я пытаюсь создать веб-страницу, которая представляет собой таблицу с 2 ячейками в одной строке.

В ячейках должно отображаться изображение, которое постепенно переходит в другое изображение (одно из трех для каждой ячейки).

Хотя это работает для одной ячейки, в обеих ячейках изображения отображаются друг над другом.

Это из https://www.geeksforgeeks.org/image-transition-with-fading-effect-using-javascript /

 <!DOCTYPE html> 
<html>  
<head> 
<meta charset="utf-8" /> b
 
<style> 
    body { 
        text-align: center; 
    }   
.center {
  margin-left: auto;
  margin-right: auto;
}
table {border-collapse: separate;  border-spacing: 10px 20px;}

table, 
table td;}
</style>  
</head>   
<body> 
 <table class="center" style="max-width:100%"> 
    <tr><td>
        <div id="1"> 
            <img src= "image1.jpg" 
                 class="test2" /> 
           <img src="image2.jpg"  
                 class="test2" /> 
            <img src="image3.jpg" 
                 class="test2" /> 
        </div> 
      </td></tr>
      <tr><td>
      <div id="2">
      <img src= "image4.jpg"
         class="test" /> 
       <img src="image5.jpg" 
         class="test" />  
      <img src="image6.jpg"
         class="test" />  
    </div>
  </td></tr></table>
<script> 
    startImageTransition1(); 
    startImageTransition2(); 
    function startImageTransition1() { 
        var images = document.getElementsByClassName("test"); 

        for (var i = 0; i < images.length;   i) { 
            images[i].style.opacity = 1; 
        } 

        var top = 1; 

        var cur = images.length - 1; 

        setInterval(changeImage, 3000); 

        async function changeImage() { 

            var nextImage = (1   cur) % images.length; 

            images[cur].style.zIndex = top   1; 
            images[nextImage].style.zIndex = top; 

            await transition(); 

            images[cur].style.zIndex = top; 

            images[nextImage].style.zIndex = top   1; 

            top = top   1; 

            images[cur].style.opacity = 1; 
            
            cur = nextImage; 

        } 

        function transition() { 
            return new Promise(function(resolve, reject) { 
                var del = 0.01; 

                var id = setInterval(changeOpacity, 10); 

                function changeOpacity() { 
                    images[cur].style.opacity -= del; 
                    if (images[cur].style.opacity <= 0) { 
                        clearInterval(id); 
                        resolve(); 
                    } 
                } 

            }) 
        } 
    } 
    
     function startImageTransition2() { 
        var images = document.getElementsByClassName("test2"); 

        for (var i = 0; i < images.length;   i) { 
            images[i].style.opacity = 1; 
        } 

        var top = 1; 

        var cur = images.length - 1; 

        setInterval(changeImage, 3000); 

        async function changeImage() { 

            var nextImage = (1   cur) % images.length; 

            images[cur].style.zIndex = top   1; 
            images[nextImage].style.zIndex = top; 

            await transition(); 

            images[cur].style.zIndex = top; 

            images[nextImage].style.zIndex = top   1; 

            top = top   1; 

            images[cur].style.opacity = 1; 
            
            cur = nextImage; 

        } 

        function transition() { 
            return new Promise(function(resolve, reject) { 
                var del = 0.01; 

                var id = setInterval(changeOpacity, 10); 

                function changeOpacity() { 
                    images[cur].style.opacity -= del; 
                    if (images[cur].style.opacity <= 0) { 
                        clearInterval(id); 
                        resolve(); 
                    } 
                } 

            }) 
        } 
    } 
</script> 
 

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

1. Можете ли вы разместить здесь свои HTML, CSS и Javascript? jsfiddle.net/Sapphion/nU477 или здесь? jsfiddle.net/crazyrohila/tczsC или здесь? jsfiddle.net/Guffa/GMfSB Можно ли использовать что-либо из этого кода?

2. Я сделаю это завтра. Спасибо.

3. Рассматривали ли вы возможность использования CSS-анимации вместо решения JS / setInterval?

Ответ №1:

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

 @keyframes rotateimgs {
  0% {
    opacity: 0;
  }
  33.33% {
    opacity: 1;
  }
  66.66% {
    opacity: 0;
  }
  100% {
    opacity: 0;
    }
}

td {
  position: relative;
  --interval: 5s;/* set this to what you want the fade-in time to be */
}

img.fadeinout {
  position: absolute;
  top: 0;
  left: 0;
  animation-name: rotateimgs;
  animation-duration: calc(var(--interval) * 3);
  animation-iteration-count: infinite;
  opacity: 0;
}

img.fadeinout:nth-child(1) {
  animation-delay: 0s;
  position: relative;/* if your images are of different sizes, put this on the tallest */
}
img.fadeinout:nth-child(2) {
  animation-delay: var(--interval);
  }
img.fadeinout:nth-child(3) {
  animation-delay: calc(var(--interval) * 2);
  } 
 <table>
  <tr>
    <td>
        <img class="fadeinout" src= "https://media.geeksforgeeks.org/wp-content/uploads/20200318142245/CSS8.png" /> 
        <img class="fadeinout" src= "https://media.geeksforgeeks.org/wp-content/uploads/20200318142309/php7.png" /> 
        <img class="fadeinout" src= "https://media.geeksforgeeks.org/wp-content/uploads/20200318142254/html9.png" /> 
    </td>
    <td>class="fadeinout" 
        <img class="fadeinout" src= "https://media.geeksforgeeks.org/wp-content/uploads/20200318142254/html9.png" /> 
        <img class="fadeinout" src= "https://media.geeksforgeeks.org/wp-content/uploads/20200318142245/CSS8.png" /> 
        <img class="fadeinout" src= "https://media.geeksforgeeks.org/wp-content/uploads/20200318142309/php7.png"  /> 
    </td>
  </tr>
</table> 

Это кажется проще, чем метод JS, и имеет то преимущество, что должно быть меньше основной загрузки ЦП, хотя я не полностью исследовал, будет ли он автоматически использовать графический процессор.

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

1. ЭТО СРАБОТАЛО!!!!!!!!!!!!!!!!!!!!!! БОЛЬШОЕ СПАСИБО. МНОГО!!!!!!

2. НО: код добавляет стиль к img в css. Этот стиль применяется ко всем изображениям на этой странице. Таким образом, другое изображение на странице теперь невидимо. Есть ли способ защитить (или иммунизировать) изображение от этого стиля? Если я создам таблицу, подобную этой table {border-spacing 10px 20px}, но на той же странице мне нужна обычная таблица, как мне это сделать?

3. Извините, да, я был ленив. Используйте класс, а не тег img.

4. Итак, простите мое невежество: будет ли это работать (это не работает, но не уверен, почему): .rotating { position: absolute; top: 0; left: 0; animation-name: rotateimgs; animation-duration: calc(var(—interval) * 3); animation-количество итераций: бесконечно; непрозрачность: 0; } img.rotating: n-й дочерний элемент (1) { анимация-задержка: 0 секунд; позиция: относительная; } img.rotating: n-й дочерний элемент(2) { анимация-задержка: var(—интервал); } img.rotating: n-й дочерний элемент (3) { animation-delay: calc(var(—interval)* 2); } но это не работает

5. Я думаю, что хочу применить .rotating к изображениям, которые вращаются, а не к тем, которые этого не делают. Но тогда как мне справиться с проблемой n-го дочернего элемента?