jquery - 为通过 ajax 加载的元素添加淡入淡出过渡

标签 jquery html css ajax transition

我正在加载包含来自与我单击的类别对应的一些 json 文件的信息的元素。

下面是一些简化的代码:

var $grid = $('.grid'),
	  $cat_link = $('.cat-list a');

// on loading the page for the first time, I define the category to display as the first one
$cat = 'cat-1';

function getCardsList() {
	$.ajax({
		url: 'js/' + $cat + '.json',
		dataType: 'json'
	}).done(listSuccess);

	function listSuccess(data) {
    var $card_items = [];
		
		for (var i = 0; i < data.length; i++) {
			var	card_item = '<div class="col">' + /*stuff from the json file*/ + '</div>';				
			$card_items.push( card_item[0] );
		}

		$grid.append( $card_items ).addClass('is-loaded');
	}
}

// execute immediately the function on the first load
getCardsList();

$cat_link.on( 'click', function(e) {
	e.preventDefault();

	$cat = $(this).data('cat');

	getCardsList();
});
.col {
  float:left;
  width:25%;
  transform: scale(0.85);
  opacity: 0;
  transition: transform 0.2s, opacity 0.2s;
}
.is-loaded .col {
  transform: scale(1);
  opacity: 1;
}
<ul class="cat-list">
	<li><a href="" data-cat="cat-1">Category 1</a></li>
	<li><a href="" data-cat="cat-2">Category 2</a></li>
	<li><a href="" data-cat="cat-3">Category 3</a></li>
</ul>

<div class="grid"></div>

现在我想向附加到网格的 div 添加过渡。我尝试通过 CSS 隐藏元素,然后将 .is-loaded 类添加到网格以在成功函数中淡入,但由于它们立即附加到网格,因此过渡不会工作。还尝试将 beforeSend 参数添加到 ajax 调用以预先隐藏元素,但没有成功。

如果我在附加元素后使用基本的 $('.grid .col').show().fadeIn(),它会起作用,但它不是我想要的动画。也不能使用 .animate(),因为它只是为数值设置动画。

我尝试在调用该函数后的点击事件中添加 .is-loaded 类,但它仍然不起作用。

我觉得自己很愚蠢,但就是不知道该怎么做,尽管它看起来很明显。感谢您的帮助。

编辑:这里是一个link到(未完成的)在线版本。看着我的脚本你会完全笑,我是一个自学成才的 JS 菜鸟。

最佳答案

无需处理其他类即可实现所需内容的方法之一是 css 动画。 CSS 示例:

.col {
    float:left;
    width:25%;
    animation: popIn .2s;
}
@keyframes popIn {
    from {transform: scale(0.85); opacity: 0;}
    to {transform: scale(1); opacity: 1;}
}

在这里阅读更多:https://www.w3schools.com/css/css3_animations.asp

另一种方式,有点老套,但可以让您坚持使用类和转换:

首先,修改你的 css 如下所示:

.col {
  float:left;
  width:25%;
  transform: scale(0.85);
  opacity: 0;
  transition: transform 0.2s, opacity 0.2s;
}
.col.is-loaded {
  transform: scale(1);
  opacity: 1;
}

然后通过在追加元素和向其添加类之间添加延迟来修改您的追加。这是进行转换所必需的。

$("<div class='col'>One</div>").appendTo('.container').delay(1).queue(function (next) { 
    $(this).addClass('is-loaded'); 
    next(); 
  });

关于jquery - 为通过 ajax 加载的元素添加淡入淡出过渡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47005964/

相关文章:

javascript - jquery.ajax 到底什么时候运行失败回调?

jquery - 使用 jQuery 在 HTML 中应用 css 样式?

html - UIKit Toggle 元素默认隐藏

javascript - 无法向 3d slider 添加更多图像

javascript - ajax内容的内联缓存&lt;script&gt;

html - 如何创建一个从输入框顶部开始的占位符?

html - 从可访问性的 Angular 来看,我应该更喜欢 <nav><ul><li><a-or-other-tag> 还是 <nav><a-or-other-tag> ?

python - 运行各种 Flask/Python 脚本时,本地主机已停止更新,如何修复此问题?

html - 按下按钮后如何更改按钮颜色?

javascript - Bootstrap 导航栏不显示 CSS