Javascript 侧边栏折叠一秒钟并在页面加载时展开
我有一个侧边栏,它可以在点击按钮时展开或折叠。现在,我已经成功地将它的状态存储在Javascript 侧边栏折叠一秒钟并在页面加载时展开,javascript,html,jquery,css,Javascript,Html,Jquery,Css,我有一个侧边栏,它可以在点击按钮时展开或折叠。现在,我已经成功地将它的状态存储在localStorage中,它工作正常,只是有一个小问题 当页面加载且localStorage中没有保存状态时,侧边栏会在瞬间折叠,然后展开Expand应该是默认状态。我不希望它先折叠,然后展开。我只想用扩展的边栏加载页面 我一直试图用自己的代码解决这个问题。但它不起作用,然后我将我的代码与SO的帖子结合起来。它仍然不起作用 完整代码: 下面是代码(请注意,localStorage在SO中不起作用): $('doc
localStorage
中,它工作正常,只是有一个小问题
当页面加载且localStorage
中没有保存状态时,侧边栏会在瞬间折叠
,然后展开
<当localStorage
中没有存储状态时,code>Expand应该是默认状态。我不希望它先折叠
,然后展开
。我只想用扩展的边栏加载页面
我一直试图用自己的代码解决这个问题。但它不起作用,然后我将我的代码与SO的帖子结合起来。它仍然不起作用
完整代码:
下面是代码(请注意,localStorage
在SO中不起作用):
$('document').ready(函数(){
if(typeof window.isMinified==“undefined”){
window.isMinified=false;
}
常量体=$(“#体”);
$(“#侧边栏切换器”)。在(“单击”,函数(){
如果(window.isMinified==false){
//setItem('menu-closed',!$(body).hasClass(“侧边栏缩小”);
body.removeClass(“侧边栏缩小”).addClass(“侧边栏缩小”);
window.isMinified=true;
}否则{
//setItem('menu-closed',!$(body).hasClass(“侧边栏缩小”);
body.removeClass(“侧边栏缩小”).addClass(“侧边栏缩小”);
window.isMinified=false;
}
});
const state=//localStorage.getItem('menu-closed');
如果(状态===null){
$(body.removeClass('sidebar-minified');
}否则{
const closed=state==“真”?真:假;
如果(!关闭){
$(body.removeClass('sidebar-minified');
}
}
});代码>
#主体{
背景:#fff;
过渡:均为0.3秒;
}
靠边,左边边栏{
背景色:#2c0963;
高度:100vh;
}
.侧边栏缩小。左侧侧边栏{
宽度:180px;
过渡段:宽度。3英寸宽;
}
.侧边栏缩小。左侧侧边栏{
宽度:75px;
过渡段:宽度。3英寸宽;
}
.侧边栏切换{
字体大小:300;
字体大小:15px;
光标:指针;
高度:30px;
位置:绝对位置;
左:20%;
排名:0;
}
折叠/扩展
侧边栏是从css开始扩展的。如果删除transition,您将看到侧栏在页面加载时立即展开。因此,您第一次应该设置没有转换的CSS类。您可以通过Javascript禁用转换,并在单击事件中再次启用转换:
首先删除body标记中的类:
<body id="body" class="">
<aside class="left-sidebar"></aside>
<button id="sidebar-toggler" class="sidebar-toggle">Collapse/Expand</button>
</body>
上述代码中的重要更改有两个:
// in the clickevent section: change the transistion to default behaviour
document.querySelector('.left-sidebar').style.transition = 'inherit';
根据状态设置正确的类并禁用转换:
// ...
if (state === null) {
body.addClass('sidebar-minified');
} else {
// ...
if (!closed) {
body.addClass('sidebar-minified-out');
document.querySelector('.left-sidebar').style.transition = 'none';
}
else {
body.addClass('sidebar-minified');
}
}
***更新***
我重构了代码并对其进行了一些优化。
HTML:
JS:
将动画移动到单独的类怎么样
.sidebar-animated{
transition: width: 0.3s ease-in;
}
然后从其他任何地方删除它,然后通过超时添加该类,这样在转换完成后就可以添加它,您可以在0秒内使用useTimeout,就像这样
setTimeout(() => {
$('aside').addClass('sidebar-animated')
},0)
加上CSS使用特殊性来达到它的元素,所以
.sidebar-minified-out .left-sidebar {
width: 180px;
}
.sidebar-minified .left-sidebar {
width: 75px;
}
应该改成这个
.sidebar-minified .left-sidebar {
width: 75px;
}
.sidebar-minified-out .left-sidebar {
width: 180px;
}
因为当两个元素都在同一个元素上时,就需要后者,因为它们有相同的特殊性规则,给它最后的机会,这是我最后的选择:D
这足以使它发挥作用
这是一个有效的例子,
注意:当边栏开始崩溃时,您在管理状态方面有问题,但这与您如何处理状态有关
为什么对0使用超时?因为它将执行推到所谓的“事件循环”中,确保它在所有javascript正常代码执行后执行。您可以通过告诉浏览器一次只重新绘制一次来最小化闪烁效果。但是,侧栏总是有一个初始大小:标记中定义的大小
在我的示例中,我使用两个观察者来跟踪样式和大小的更改。请注意初始的侧栏
宽度。您可以将初始边栏宽度设置为0,或者不指定,或者可以将其样式设置为与展开的边栏相同的大小,但始终会有初始重新绘制
最后,我坚信您需要从主体
中删除这两个初始类
$(函数(){
/*避免如此不安全的操作错误*/
变量存储=(函数(){
返回{
setItem:function(k,v){try{returnlocalstorage.setItem(k,v)}catch(e){return!1},
getItem:function(k){try{returnlocalstorage.getItem(k)}catch(e){returnnull}}
};
})();
日志(“jquerydom就绪”);
$(“#侧边栏切换器”)。打开(“单击”,函数(){
var isMinified=!$(“主体”).hasClass(“侧边栏缩小”);
$(“正文”)
.toggleClass(“侧边栏缩小”!isMinified)
.toggleClass(“侧边栏缩小”,isMinified);
storage.setItem('menu-closed',+!isMinified);
});
var closed=+storage.getItem('menu-closed');
日志('关闭:'+!!关闭);
$(“正文”)
.addClass(关闭?“侧栏缩小”:“侧栏缩小”)
.css({“可见性”:“可见”});
});代码>
正文{
背景:#fff;
过渡:均为0.3秒;
}
靠边,左边边栏{
背景色:#2c0963;
高度:100vh;
}
.侧边栏缩小。左侧侧边栏{
宽度:180px;
过渡段:宽度。3英寸宽;
}
.侧边栏缩小。左侧侧边栏{
宽度:75px;
过渡段:宽度。3英寸宽;
}
.侧边栏切换{
字体大小:300;
字体大小:15px;
光标:指针;
高度:30px;
位置:绝对位置;
左:20%;
排名:0;
}
边栏状态
.sidebar-animated{
transition: width: 0.3s ease-in;
}
setTimeout(() => {
$('aside').addClass('sidebar-animated')
},0)
.sidebar-minified-out .left-sidebar {
width: 180px;
}
.sidebar-minified .left-sidebar {
width: 75px;
}
.sidebar-minified .left-sidebar {
width: 75px;
}
.sidebar-minified-out .left-sidebar {
width: 180px;
}