javascript - 如何解决图像先显示然后淡入慢慢开始的问题

标签 javascript jquery

图像在 fadeOut 之前首先出现,因此它会产生闪烁效果。我希望在调用 fadeOut 之后和调用 fadeIn 之前更改图像。有人可以帮忙吗?

JSFiddel: https://jsfiddle.net/t20ozdvn/1/

HTML:

<div class="output" id="output">
  <h1 class="cursor"></h1>
</div>
<div class="images">
  <img src="https://i.postimg.cc/4Y054xz3/video-1.jpg">
</div>

JS:

// values to keep track of the number of letters typed, which quote to use. etc. Don't change these values.
var i = 0,
  a = 0,
  isBackspacing = false,
  isParagraph = false;

// Typerwrite text content. Use a pipe to indicate the start of the second line "|".  
var textArray = [
  "This is the line one text.",
  "Another line goes here that is awesome."
];

var images = {
  0: { 
  "urls": [
     "https://i.postimg.cc/4Y054xz3/video-1.jpg"
  ]},
  1: {
  "urls": [
     "https://i.postimg.cc/8jt43HcM/video-2.jpg"
  ]}
}

// Speed (in milliseconds) of typing.
var speedForward = 100, //Typing Speed
  speedWait = 1000, // Wait between typing and backspacing
  speedBetweenLines = 1000, //Wait between first and second lines
  speedBackspace = 25; //Backspace Speed

//Run the loop
typeWriter("output", textArray);

function changeImage(number) {
  var imagesArr = [];
  images[number].urls.forEach(function(url){
    imagesArr.push('<img src="'+ url +'">');
  });
  $('.images').html(imagesArr)
  .fadeOut(400, function() {
    $(".images").attr('src',imagesArr);
  })
  .fadeIn(400);
}

function typeWriter(id, ar, callback) {
  var element = $("#" + id),
    aString = ar[a],
    eHeader = element.children("h1"), //Header element
    eParagraph = element.children("p")
    count = 0; //Subheader element

  // Determine if animation should be typing or backspacing
  if (!isBackspacing) {

    // If full string hasn't yet been typed out, continue typing
    if (i < aString.length) {

      // If character about to be typed is a pipe, switch to second line and continue.
      if (aString.charAt(i) == "|") {
        isParagraph = true;
        eHeader.removeClass("cursor");
        eParagraph.addClass("cursor");
        i++;
        setTimeout(function() {
          typeWriter(id, ar);
        }, speedBetweenLines);



        // If character isn't a pipe, continue typing.
      } else {
        // Type header or subheader depending on whether pipe has been detected
        if (!isParagraph) {
          eHeader.text(eHeader.text() + aString.charAt(i));
        } else {
          eParagraph.text(eParagraph.text() + aString.charAt(i));
        }
        i++;
        setTimeout(function() {
          typeWriter(id, ar);
        }, speedForward);
      }

      count++;

      // If full string has been typed, switch to backspace mode.
    } else if (i == aString.length) {

      isBackspacing = true;
      setTimeout(function() {
        typeWriter(id, ar);
      }, speedWait);
    }

    // If backspacing is enabled
  } else {

    // If either the header or the paragraph still has text, continue backspacing
    if (eHeader.text().length > 0 || eParagraph.text().length > 0) {

      // If paragraph still has text, continue erasing, otherwise switch to the header.
      if (eParagraph.text().length > 0) {
        eParagraph.text(eParagraph.text().substring(0, eParagraph.text().length - 1));
      } else if (eHeader.text().length > 0) {
        eParagraph.removeClass("cursor");
        eHeader.addClass("cursor");
        eHeader.text(eHeader.text().substring(0, eHeader.text().length - 1));
      }
      setTimeout(function() {
        typeWriter(id, ar);
      }, speedBackspace);

      // If neither head or paragraph still has text, switch to next quote in array and start typing.
      } else {

        isBackspacing = false;
        i = 0;
        isParagraph = false;
        a = (a + 1) % ar.length; //Moves to next position in array, always looping back to 0
        setTimeout(function() {
          typeWriter(id, ar);
        }, 50);

        changeImage(a);
      }
    }  
  }

最佳答案

这就是你想要的,不要重新附加整个图像 html 只需控制 url 的 src 属性,然后使用淡入淡出效果进行操作。

fiddle 证明:https://jsfiddle.net/uLzprfa7/

解释:图片淡出后,将新的url推送到src属性,最后淡入。

function changeImage(number) {
  var imagesArr = [];
  images[number].urls.forEach(function(url) {
    imagesArr.push(url);
  })
  $('#my-image').fadeOut(400, function() {
    $(".images").children().attr('src', imagesArr).fadeIn(400);
  })
}

关于javascript - 如何解决图像先显示然后淡入慢慢开始的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58028920/

相关文章:

javascript - 在JavaScript中的replace()方法中循环一个字符串

javascript - 如何在 Angular 中重现 Angular JS .broadcast()/.on() 行为?

javascript - jQuery Datatables 根据条件更改列的值

php - 表格提交失败

javascript - 有什么方法可以改变 Slick 轮播中从左到右的方向吗?默认它从右到左方向

asp.net - 如何仅在单击按钮或输入时触发验证 :Submit

javascript - AngularJS 与 jQuery 有何不同

javascript - 如何处理键名中带有冒号的 JavaScript 对象?

javascript - 如何使用另一个 JS 数组替换 JS 数组属性值

php - 使用 jQuery 发送很长的字符串 PHP