我有一组可折叠/可展开的元素,并且我想以display:grid
格式布置内部内容。
在当前设置中,我使用$().slideToggle()
方法中的钩子调用匿名函数,该函数检查元素是否可见并强制将显示网格化。
这不是一个好方法,因为在第一次显示内容时,在扩展动画期间内容不是网格格式。仅在动画完成后才应用正确的格式。 See jsfiddle here。
在css / jquery中进行此设置以使内部可扩展内容即使在第一个动画期间也显示为网格的适当方法是什么?
HTML
<div class="user-products main">
<div class="user-product">
<div class ="collapsible-header">
<span class="user-product-expand-toggle"><h4>▶ Product 1 - 2020-02-03 1:58pm</h4></span>
</div>
<div class="user-product-details hide">
<div class="user-product-left">
<p>Download All Files as Zip</p>
<p>View Preview</p>
<p>Details</p>
<p>Details</p>
<p>Details</p>
</div>
<div class="user-product-mid">
<p>Details</p>
<p>Details</p>
<p>Details</p>
<p>Details</p>
<p>Details</p>
</div>
<div class="user-product-right">
<div class="unpurchased-product"><button class="purchase-product">Purchase</button></div>
</div>
</div>
</div>
<div class="user-product">
<div class ="collapsible-header">
<span class="user-product-expand-toggle"><h4>▶ Product 2 - 2020-02-07 5:01pm</h4></span>
</div>
<div class="user-product-details hide">
<div class="user-product-left">
<p>Download All Files as Zip</p>
<p>View Preview</p>
<p>Details</p>
<p>Details</p>
<p>Details</p>
</div>
<div class="user-product-mid">
<p>Details</p>
<p>Details</p>
<p>Details</p>
<p>Details</p>
<p>Details</p>
</div>
<div class="user-product-right">
<div class="unpurchased-product"><button class="purchase-product">Purchase</button></div>
</div>
</div>
</div>
</div>
jQuery
$(".user-product-expand-toggle").click(function(){
parentDiv = $(this).closest(".collapsible-header");
$(parentDiv.siblings(".user-product-details")[0]).slideToggle('slow', function() {
if ($(this).is(':visible'))
$(this).css('display','grid');
});
});
CSS
.hide.hide {
display: none;
}
.user-products.main {
overflow-y:auto;
}
.user-product-details {
margin-left:50px;
display: grid;
grid-template-columns: repeat(3, 1fr);
}
.collapsible-header{
margin-left:50px;
text-align: left;
cursor: pointer;
}
简单来说,就是用隐藏容器包装网格容器。
$(".user-product-expand-toggle").click(function() {
parentDiv = $(this).closest(".collapsible-header");
$(parentDiv.siblings(".hide")[0]).slideToggle('slow');
});
.hide.hide {
display: none;
}
.user-products.main {
overflow-y: auto;
}
.user-product-details {
margin-left: 50px;
display: grid;
grid-template-columns: repeat(3, 1fr);
}
.collapsible-header {
margin-left: 50px;
text-align: left;
cursor: pointer;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="user-products main">
<div class="user-product">
<div class="collapsible-header">
<span class="user-product-expand-toggle">
<h4>▶ Product 1 - 2020-02-03 1:58pm</h4>
</span>
</div>
<div class="hide">
<div class="user-product-details">
<div class="user-product-left">
<p>Download All Files as Zip</p>
<p>View Preview</p>
<p>Details</p>
<p>Details</p>
<p>Details</p>
</div>
<div class="user-product-mid">
<p>Details</p>
<p>Details</p>
<p>Details</p>
<p>Details</p>
<p>Details</p>
</div>
<div class="user-product-right">
<div class="unpurchased-product"><button class="purchase-product">Purchase</button></div>
</div>
</div>
</div>
</div>
<div class="user-product">
<div class="collapsible-header">
<span class="user-product-expand-toggle">
<h4>▶ Product 2 - 2020-02-07 5:01pm</h4>
</span>
</div>
<div class="hide">
<div class="user-product-details ">
<div class="user-product-left">
<p>Download All Files as Zip</p>
<p>View Preview</p>
<p>Details</p>
<p>Details</p>
<p>Details</p>
</div>
<div class="user-product-mid">
<p>Details</p>
<p>Details</p>
<p>Details</p>
<p>Details</p>
<p>Details</p>
</div>
<div class="user-product-right">
<div class="unpurchased-product"><button class="purchase-product">Purchase</button></div>
</div>
</div>
</div>
</div>
</div>
而不是使用slideToggle,而是使用slideUp和slideDown。
示例:
$(".user-product-expand-toggle").click(function(){
parentDiv = $(this).closest(".collapsible-header");
let $element = $(parentDiv.siblings(".user-product-details")[0]);
if ($element.is(':visible')) {
$element.slideUp();
}
else {
$element.slideDown({
start: function() {
$(this).css('display','grid');
}
});
}
});