如何在用户单击时隐藏抽屉
How to hide drawer upon user click
如何在用户点击项目时隐藏抽屉?或者单击按钮时?
<div class="mdl-layout__drawer">
<span class="mdl-layout-title">Title</span>
<button class="mdl-button mdl-js-button mdl-button--fab mdl-button--mini-fab mdl-js-ripple-effect" id="clickme">
<i class="material-icons">add</i>
</button>
</div>
如何实现点击按钮后抽屉隐藏,就像点击抽屉外一样?我试过在抽屉外模拟点击事件还是没有隐藏
我相信您可以从 .mdl-layout__drawer
中删除 is-visible
class。我尝试从他们的站点修改代码笔示例:demo。我的纯 javascript 事件绑定已生锈,但正如我提到的,您只需从抽屉中取出 .is-visible
class。
更新
我提供的代码是针对 v1.0.0
的 mdl,不再是实际的了。 从 v1.1.0
开始,有一个 public API 用于切换抽屉,如 . If you're between v1.0.6
and v1.1.0
, have a look at 中所述。
显示和隐藏菜单就像添加和删除 .is-visible
class 一样简单 in the source:
MaterialLayout.prototype.drawerToggleHandler_ = function() {
'use strict';
this.drawer_.classList.toggle(this.CssClasses_.IS_DRAWER_OPEN);
};
所以你会得到这样的东西:
function toggle_drawer() {
var drawer = document.getElementsByClassName('mdl-layout__drawer')[0];
drawer.classList.toggle("is-visible");
}
我希望 MaterialLayout
小部件有一个更方便的方法,但我想到的最好方法是:
var layout = document.getElementsByClassName('mdl-layout')[0];
layout.MaterialLayout.drawerToggleHandler_();
虽然这恰好有效,但方法名称末尾的 _
表明此函数不应(误)用作 public API方法。
对于版本 1.0.6,您必须从两个元素中删除前面提到的 class:
$( '.mdl-layout__drawer, .mdl-layout__obfuscator' ).removeClass( 'is-visible' );
我正在使用这个 jquery 命令:
$( 'div[class^="mdl-layout__obfuscator"]' ).trigger( "click" );
toggleDrawer
现在是一个 public 函数,因为 @be54f78.
var layout = document.querySelector('.mdl-layout');
layout.MaterialLayout.toggleDrawer();
v1.0.6 当前不可用,因此您需要从源代码构建(截至今天)。
这样做:
HTML
<div class="mdl-layout__drawer" id="mobile-left-menu">
<span class="mdl-layout-title">Whatever</span>
<nav class="mdl-navigation inject-navigation">
<a class="mdl-navigation__link" href="#" page="home">Home</a>
<a class="mdl-navigation__link" href="#About" page="about">About</a>
</nav>
</div>
JS
$('.mdl-navigation__link').on('click', function () {
// close the drawer the button is clicked
$('.mdl-layout__drawer').toggleClass('is-visible')
});
CSS
/* prevent the dark transparent background over the page with the drawer is open */
.mdl-layout__obfuscator.is-visible{
background-color: transparent;
}
基于 GitHub discourse,我有几个可行的解决方案来解决单击 link 时关闭 MDL 抽屉的问题(希望很快就能解决)。目前我正在使用:
function close() {
var d = document.querySelector('.mdl-layout');
d.MaterialLayout.toggleDrawer();
}
document.querySelector('.mdl-layout__drawer').addEventListener('click', close);
其他变体是:
1.
document.querySelector('.mdl-layout__drawer').addEventListener('click', function () {
document.querySelector('.mdl-layout__obfuscator').classList.remove('is-visible');
this.classList.remove('is-visible');
}, false);
2.
function close() {
var d = document.querySelector('.mdl-layout');
d.MaterialLayout.toggleDrawer();
}
var drawer_container = document.getElementsByClassName('mdl-layout')[0];
drawer_container.querySelector('.mdl-layout__drawer').addEventListener('click', 'close');
讨论中有人提到了针对 querySelector
的想法,这样就不需要查看整个文档,我想出了以下两个变体:
3.
var drawer_container = document.getElementsByClassName('mdl-layout')[0];
# no IDs in the html code.
drawer_container.querySelector('.mdl-layout__drawer').addEventListener('click', function () {
var obfuscator = document.querySelector('.mdl-layout__obfuscator');
if (obfuscator.classList.contains('is-visible')) {
obfuscator.classList.remove('is-visible');
this.classList.remove('is-visible');
}
}, false);
4.
function close() {
var d = document.getElementsByClassName('mdl-layout__container')[0].querySelector('.mdl-layout');
d.MaterialLayout.toggleDrawer();
}
var drawer_container = document.getElementsByClassName('mdl-layout')[0];
drawer_container.querySelector('.mdl-layout__drawer').addEventListener('click', 'close');
在我的两个版本中,浏览器都必须 运行 document.getElementsByClassName
以及 targeted querySelector
调用。
在我的第一个版本中,还有检查:classList.contains('is-visible')
有人推荐过,但这似乎是不必要的,因为该函数是从一个只有 classList.contains('is-visible')
时才可见的项目调用的是的。
我在我的每个变体(#3 和 4)中添加了以下调用,在 函数中:
console.time("anonymous");
console.timeEnd("anonymous");
console.time("close function");
console.timeEnd("close function");
以及 .39ms
中带有 if
语句 运行 的那个。如果没有 if
语句,它们都 运行 in .19ms
。但我也没有测量 getElementsByClassName
和 querySelector
方法,如果我理解正确的话,它们 运行 会影响页面加载。
当我 运行 console.time("first");
和 console.timeEnd("first");
通过第一个对我来说最漂亮的代码时,时间是 23ms
.
好像是ie8,我要支持,doesn't support getElementsByClassName。
我希望有人可以提供并解释这个相对简单问题的最佳解决方案。
这是 CodePen(不是我的)。
在 Material Design Lite Framework 中自动隐藏导航抽屉。
只需将此代码包含在您网页的脚本标记中
必须包含 jQuery 才能得到这个 运行...:D
<script>
$(document).ready(function(){
$(".mdl-layout__drawer a").click(function(){
$(".mdl-layout__drawer,.mdl-layout__obfuscator").toggleClass("is-visible");
});
});
</script>
要关闭它,您需要先检查它是否打开,因为没有 "closeDrawer"。当您不能假设它已经打开时,这很有用,例如您在抽屉内、抽屉外或某些会话超时功能中都有注销按钮。您只需关闭它即可显示重新登录表单。
closeDrawer() {
let drawer = document.querySelector('.mdl-layout__drawer');
if (drawer && drawer.className.indexOf("is-visible")>-1) {
toggleDrawer();
}
}
toggleDrawer() {
let layout = document.querySelector('.mdl-layout');
if (layout && layout.MaterialLayout) {
layout.MaterialLayout.toggleDrawer();
}
}
在 Angular ^4.0.0 中,如果您在 MaterialLayout
像我一样未定义。
(
document
.querySelector('.mdl-layout__obfuscator') as HTMLDivElement
).click();
我不知道如何在我的 Angular 6 项目中获取 "MaterialLayout",但我使用了他们的原型函数并在我的组件中使用了它:
toggleDrawer = function () {
var is_drawer_open = 'is-visible'
var drawerButton = document.querySelector('.mdl-layout__drawer-button');
var drawer_ = document.querySelector('.mdl-layout__drawer');
var obfuscator_ = document.querySelector('.mdl-layout__obfuscator');
drawer_.classList.toggle(is_drawer_open);
obfuscator_.classList.toggle(is_drawer_open);
// Set accessibility properties.
if (drawer_.classList.contains(is_drawer_open)) {
drawer_.setAttribute('aria-hidden', 'false');
drawerButton.setAttribute('aria-expanded', 'true');
} else {
drawer_.setAttribute('aria-hidden', 'true');
drawerButton.setAttribute('aria-expanded', 'false');
}
};
将此代码添加到自定义按钮 'click' 事件
(在版本 1.3.0 上测试)
$(".mdl-layout__drawer, .mdl-layout__obfuscator").toggleClass("is-visible");
如何在用户点击项目时隐藏抽屉?或者单击按钮时?
<div class="mdl-layout__drawer">
<span class="mdl-layout-title">Title</span>
<button class="mdl-button mdl-js-button mdl-button--fab mdl-button--mini-fab mdl-js-ripple-effect" id="clickme">
<i class="material-icons">add</i>
</button>
</div>
如何实现点击按钮后抽屉隐藏,就像点击抽屉外一样?我试过在抽屉外模拟点击事件还是没有隐藏
我相信您可以从 .mdl-layout__drawer
中删除 is-visible
class。我尝试从他们的站点修改代码笔示例:demo。我的纯 javascript 事件绑定已生锈,但正如我提到的,您只需从抽屉中取出 .is-visible
class。
更新
我提供的代码是针对 v1.0.0
的 mdl,不再是实际的了。 从 v1.1.0
开始,有一个 public API 用于切换抽屉,如 v1.0.6
and v1.1.0
, have a look at
显示和隐藏菜单就像添加和删除 .is-visible
class 一样简单 in the source:
MaterialLayout.prototype.drawerToggleHandler_ = function() {
'use strict';
this.drawer_.classList.toggle(this.CssClasses_.IS_DRAWER_OPEN);
};
所以你会得到这样的东西:
function toggle_drawer() {
var drawer = document.getElementsByClassName('mdl-layout__drawer')[0];
drawer.classList.toggle("is-visible");
}
我希望 MaterialLayout
小部件有一个更方便的方法,但我想到的最好方法是:
var layout = document.getElementsByClassName('mdl-layout')[0];
layout.MaterialLayout.drawerToggleHandler_();
虽然这恰好有效,但方法名称末尾的 _
表明此函数不应(误)用作 public API方法。
对于版本 1.0.6,您必须从两个元素中删除前面提到的 class:
$( '.mdl-layout__drawer, .mdl-layout__obfuscator' ).removeClass( 'is-visible' );
我正在使用这个 jquery 命令:
$( 'div[class^="mdl-layout__obfuscator"]' ).trigger( "click" );
toggleDrawer
现在是一个 public 函数,因为 @be54f78.
var layout = document.querySelector('.mdl-layout');
layout.MaterialLayout.toggleDrawer();
v1.0.6 当前不可用,因此您需要从源代码构建(截至今天)。
这样做:
HTML
<div class="mdl-layout__drawer" id="mobile-left-menu">
<span class="mdl-layout-title">Whatever</span>
<nav class="mdl-navigation inject-navigation">
<a class="mdl-navigation__link" href="#" page="home">Home</a>
<a class="mdl-navigation__link" href="#About" page="about">About</a>
</nav>
</div>
JS
$('.mdl-navigation__link').on('click', function () {
// close the drawer the button is clicked
$('.mdl-layout__drawer').toggleClass('is-visible')
});
CSS
/* prevent the dark transparent background over the page with the drawer is open */
.mdl-layout__obfuscator.is-visible{
background-color: transparent;
}
基于 GitHub discourse,我有几个可行的解决方案来解决单击 link 时关闭 MDL 抽屉的问题(希望很快就能解决)。目前我正在使用:
function close() {
var d = document.querySelector('.mdl-layout');
d.MaterialLayout.toggleDrawer();
}
document.querySelector('.mdl-layout__drawer').addEventListener('click', close);
其他变体是:
1.
document.querySelector('.mdl-layout__drawer').addEventListener('click', function () {
document.querySelector('.mdl-layout__obfuscator').classList.remove('is-visible');
this.classList.remove('is-visible');
}, false);
2.
function close() {
var d = document.querySelector('.mdl-layout');
d.MaterialLayout.toggleDrawer();
}
var drawer_container = document.getElementsByClassName('mdl-layout')[0];
drawer_container.querySelector('.mdl-layout__drawer').addEventListener('click', 'close');
讨论中有人提到了针对 querySelector
的想法,这样就不需要查看整个文档,我想出了以下两个变体:
3.
var drawer_container = document.getElementsByClassName('mdl-layout')[0];
# no IDs in the html code.
drawer_container.querySelector('.mdl-layout__drawer').addEventListener('click', function () {
var obfuscator = document.querySelector('.mdl-layout__obfuscator');
if (obfuscator.classList.contains('is-visible')) {
obfuscator.classList.remove('is-visible');
this.classList.remove('is-visible');
}
}, false);
4.
function close() {
var d = document.getElementsByClassName('mdl-layout__container')[0].querySelector('.mdl-layout');
d.MaterialLayout.toggleDrawer();
}
var drawer_container = document.getElementsByClassName('mdl-layout')[0];
drawer_container.querySelector('.mdl-layout__drawer').addEventListener('click', 'close');
在我的两个版本中,浏览器都必须 运行 document.getElementsByClassName
以及 targeted querySelector
调用。
在我的第一个版本中,还有检查:classList.contains('is-visible')
有人推荐过,但这似乎是不必要的,因为该函数是从一个只有 classList.contains('is-visible')
时才可见的项目调用的是的。
我在我的每个变体(#3 和 4)中添加了以下调用,在 函数中:
console.time("anonymous");
console.timeEnd("anonymous");
console.time("close function");
console.timeEnd("close function");
以及 .39ms
中带有 if
语句 运行 的那个。如果没有 if
语句,它们都 运行 in .19ms
。但我也没有测量 getElementsByClassName
和 querySelector
方法,如果我理解正确的话,它们 运行 会影响页面加载。
当我 运行 console.time("first");
和 console.timeEnd("first");
通过第一个对我来说最漂亮的代码时,时间是 23ms
.
好像是ie8,我要支持,doesn't support getElementsByClassName。
我希望有人可以提供并解释这个相对简单问题的最佳解决方案。
这是 CodePen(不是我的)。
在 Material Design Lite Framework 中自动隐藏导航抽屉。
只需将此代码包含在您网页的脚本标记中
必须包含 jQuery 才能得到这个 运行...:D
<script>
$(document).ready(function(){
$(".mdl-layout__drawer a").click(function(){
$(".mdl-layout__drawer,.mdl-layout__obfuscator").toggleClass("is-visible");
});
});
</script>
要关闭它,您需要先检查它是否打开,因为没有 "closeDrawer"。当您不能假设它已经打开时,这很有用,例如您在抽屉内、抽屉外或某些会话超时功能中都有注销按钮。您只需关闭它即可显示重新登录表单。
closeDrawer() {
let drawer = document.querySelector('.mdl-layout__drawer');
if (drawer && drawer.className.indexOf("is-visible")>-1) {
toggleDrawer();
}
}
toggleDrawer() {
let layout = document.querySelector('.mdl-layout');
if (layout && layout.MaterialLayout) {
layout.MaterialLayout.toggleDrawer();
}
}
在 Angular ^4.0.0 中,如果您在 MaterialLayout
像我一样未定义。
(
document
.querySelector('.mdl-layout__obfuscator') as HTMLDivElement
).click();
我不知道如何在我的 Angular 6 项目中获取 "MaterialLayout",但我使用了他们的原型函数并在我的组件中使用了它:
toggleDrawer = function () {
var is_drawer_open = 'is-visible'
var drawerButton = document.querySelector('.mdl-layout__drawer-button');
var drawer_ = document.querySelector('.mdl-layout__drawer');
var obfuscator_ = document.querySelector('.mdl-layout__obfuscator');
drawer_.classList.toggle(is_drawer_open);
obfuscator_.classList.toggle(is_drawer_open);
// Set accessibility properties.
if (drawer_.classList.contains(is_drawer_open)) {
drawer_.setAttribute('aria-hidden', 'false');
drawerButton.setAttribute('aria-expanded', 'true');
} else {
drawer_.setAttribute('aria-hidden', 'true');
drawerButton.setAttribute('aria-expanded', 'false');
}
};
将此代码添加到自定义按钮 'click' 事件 (在版本 1.3.0 上测试)
$(".mdl-layout__drawer, .mdl-layout__obfuscator").toggleClass("is-visible");