Как изменить изображение с выцветанием - PullRequest
0 голосов
/ 22 октября 2019

Я довольно новичок в js и jquery, и я пытаюсь сделать что-то очень простое с моим приложением Rails: я хочу переключаться между 2 изображениями каждые 3 секунды с эффектом затухания. Конечно, этот вопрос уже задавался в StackOverflow, но я не смог заставить его работать, к сожалению.

Я основывал свои тщетные попытки на этих двух вопросах:

Изменить изображениена странице HTML каждые несколько секунд (автоматическое изменение без исчезновения)

постепенное изменение изображения каждые n секунд (автоматическое изменение с исчезновением)

Мне удалось сделать этоработать с автоматическим изменением, но без эффекта затухания. Вот мой код для этого:

HTML-код (находится на странице просмотра, скажем, index.html.erb)

<div class="container p-5">
    <div class="row">
        <div class="col">
            <h2 class="display-5 mb-4">Title here</h2>
            <p class="lead">Lead</p>
        </div>
        <div class="col">
            <img id="img" src="http://localhost:3000/images/pdf_template.png" />
        </div>
    </div>
</div>

jquery code (находится в начале моего файла application.html.erb)

<script type = "text/javascript">
    function displayNextImage() {
        x = (x === images.length - 1) ? 0 : x + 1;
        document.getElementById("img").src = images[x];
    }

    function startTimer() {
        setInterval(displayNextImage, 3000);
    }

    var images = [], x = -1;
    images[0] = "http://localhost:3000/images/pdf_template.png";
    images[1] = "http://localhost:3000/images/watermark_template.png";
</script>

Чтобы он работал, я изменил тег body с <body> на <body onload = "startTimer()">

В предыдущем коде у меня есть изображение, которое автоматически меняется каждые 3 секунды.

Затем я попытался использовать вторую ссылку, предоставленную мной, для реализации эффекта затухания, но безуспешно.

HTMLКод, конечно же, одинаков.

jquery code

<script type = "text/javascript">
    var images = [];
    images[0] = "http://localhost:3000/images/pdf_template.png";
    images[1] = "http://localhost:3000/images/watermark_template.png";

    var x = 0;
    setInterval(displayNextImage, 3000);

    function displayNextImage() {
        x = x < images.length - 1 ? x : 0;
        $("#img").fadeOut(300, function(){
          $(this).attr('src', images[x]).fadeIn(300);
        })
        x++;
    }
</script>

Это действительно странно, потому что я использовал jsfiddle во второй ссылке, которую я предоставил, чтобы проверить свой код jqueryтам прекрасно работаетЯ подозреваю, что что-то не так с моим приложением на Rails, может быть, я не разместил скрипт в нужном месте? На данный момент он находится в теге head, но, возможно, это неправильно.

Я использую Rails 5.2.3, jquery-rails 4.3.5, jquery 3.2.1

Любая помощь будетоценил, спасибо.

1 Ответ

0 голосов
/ 22 октября 2019

Я закончил тем, что использовал функцию JQuery .animate, и я думаю, что она также может работать для вас.

Вот пример того, как мне удалось добиться эффекта анимации и затухания при изменении атрибута src объектауправление изображением:

        //Refresh the thumbnail
        $(".photo-container").animate({
            opacity: 0.10,
        }, 200, function () {
            $(".photo-info").attr("src", photo);
            ReloadGallery(currentContext); // Just showing extra logic can be use here...
        }).animate({ opacity: 1 }, 200);

Выполняется 3 шага:

  1. Уменьшает div фотоконтейнера, уменьшая непрозрачность до 0,10.
  2. Выполняет функцию обратного вызовапосле 200 миллисекунд, которые длятся, действие по изменению непрозрачности первого шага. Эта функция предназначена для изменения атрибута src изображения и обновления галереи или любых других вещей, которые вам нужно сделать.
  3. Анимация снова включается, восстанавливая непрозрачность контейнера до1.

Надеюсь, это даст вам представление о том, как заставить вашу логику работать.

С уважением,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...