【发布时间】:2019-01-29 00:55:14
【问题描述】:
我有一些元素我想在页面较小时自动隐藏(显示:无),并在页面较大时自动显示(显示:块)。我有这个与 bootstrap4 一起使用的,它看起来像这样:
<section id="categories">
<p data-toggle="categories-list">Categories</p>
<ul id="categories-list" class="d-none d-lg-block">
</ul>
</section>
但是,我还希望用户能够在列表隐藏时重新打开它,或者在它显示时隐藏它。我正在尝试使用以下代码添加切换功能:
$('[data-toggle]').each(function () {
$(this)[0].addEventListener('click', function() {
var target = $(this)[0].dataset.toggle;
$('#' + target).toggle('slow');
});
});
这几乎可行。如果我在 ul 隐藏(小页面)时单击,它会慢慢扩展为可见,但随后又立即消失。或者如果它已经可见(在大页面上),它会慢慢消失,但在动画完成后立即重新出现。
尽管我正在尝试进行更改,即使页面大小没有改变,boostrap 样式是否会强制执行这些显示规则?
(总的来说,我对前端开发还很陌生,尤其是引导程序。)
编辑:我知道引导程序具有某种“折叠”功能。我应该尝试使用它吗?也许它会玩得更好,而不是尝试做 jquery。
Edit2:再看一下崩溃,我看到他们使用“数据切换”,这正是我所说的。这可能是问题的一部分吗?
Edit3:我尝试完全删除我的 javascript 代码,而是使用 bootstrap4 文档中的 data-toggle 和 data-target 。我得到了与我的 javascript 代码完全相同的功能。
在 JasonB 提出解决方案后更新:
新的html:
<section id="categories">
<p data-toggle="#categories-list">Categories</p>
<ul id="categories-list" class="custom-none custom-lg-block">
</ul>
</section>
新的 CSS:
.custom-none {
display: none;
}
@media (min-width: 992px) {
.custom-lg-block {
display: block;
}
}
新的javascript:
$('[data-toggle]').each(function () {
$(this)[0].addEventListener('click', function() {
var target = $(this)[0].dataset.toggle;
if ($(target).css('display') == 'none') {
$(target).css('display', 'block');
} else {
$(target).css('display', 'none');
}
});
});
这非常接近工作。页面加载正确,菜单 display:none 在小页面上, display:block 在大页面上。一旦达到 992px 目标,我可以调整浏览器窗口的大小,并且菜单会根据需要展开或折叠。我可以点击菜单来切换它们,它可以按预期工作。
唯一剩下的问题是,一旦我单击菜单并手动设置它们的 .css('display'),该值就会被锁定。调整页面大小不再导致它们折叠或展开。这并不完全是一个交易破坏者,因为它的主要目的是处理移动设备(他们不会突然使页面变大),但如果他们在拥有所有菜单的同时缩小窗口,它在桌面上可能看起来很奇怪展开。
更新:
添加了这个javascript并删除了@media min-width,它正在工作:
window.addEventListener('resize', function(){
if ($(window).width() < 992) {
$('[data-toggle]').each(function () {
var target = $(this)[0].dataset.toggle;
$(target).css('display', 'none');
});
} else {
$('[data-toggle]').each(function () {
var target = $(this)[0].dataset.toggle;
$(target).css('display', 'block');
});
}
}, true);
【问题讨论】:
-
$(target).css('display', ''); // 将其设置为继承
-
不过,这并不是我真正想要的。我确实想更改显示值。但是如果页面调整大小,我希望它再次更改。感觉就像我需要某种 javascript 来检测宽度变化,而不是依赖 @media min-width。因为我认为仅靠 CSS 无法真正回应这一点。实际上,我希望显示值是最后的值(根据点击进行切换,或者根据屏幕调整大小进行更改,以最后发生的为准。)
-
刚刚添加了检查宽度是否发生变化然后更新显示值的javascript。这似乎行得通。不确定这是最好的方法,尤其是在性能方面。将更新问题的详细信息。
标签: jquery bootstrap-4 web-frontend