Как скрыть ящик при нажатии пользователем
Как скрыть ящик, когда пользователь нажимает на элемент? Или при нажатии кнопки?
<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>
Как это сделать, когда при нажатии кнопки ящик будет скрыт, как если бы я щелкнул за пределами ящика? Я попытался имитировать событие щелчка за пределами ящика, но он все еще не скрывает.
Ответы
Ответ 1
Я считаю, что вы можете удалить класс is-visible
из .mdl-layout__drawer
. Я попытался изменить пример кодаза с их сайта: демонстрация. Мое чистое привязку к событиям javascript является ржавым, но, как я уже упоминал, вам просто нужно удалить класс .is-visible
из ящика.
Update
Код, который я предоставил, был для v1.0.0
mdl и больше не действителен. Начиная с v1.1.0
существует открытый API, предназначенный для переключения ящика, как описано в ответе Бенджамина. Если вы находитесь между v1.0.6
и v1.1.0
, посмотрите idleherb answer.
Ответ 2
toggleDrawer
теперь является публичной функцией, поскольку @be54f78.
var layout = document.querySelector('.mdl-layout');
layout.MaterialLayout.toggleDrawer();
В настоящее время нет версии v1.0.6, поэтому вам нужно будет создать исходный код (на сегодняшний день).
Ответ 3
Основываясь на дискурсе GitHub, у меня есть несколько рабочих решений для (можно надеяться, вскоре будет разрешено) вопрос о закрытии ящика 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
, а также целевой вызов 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");
И тот, у кого оператор if
работает в .39ms
. Без оператора if
они работают в .19ms
. Но я также не измеряю методы getElementsByClassName
и querySelector
, которые, если я правильно понимаю, работают на загрузке страницы.
Когда я запустил console.time("first");
и console.timeEnd("first");
через первый, а для меня - самый красивый код, время было 23ms
.
По-видимому, ie8, который я хочу поддержать, не поддерживает getElementsByClassName.
Я надеюсь, что кто-то сможет предоставить и объяснить оптимальное решение этой относительно простой проблемы.
Здесь CodePen (не мой).
Ответ 4
Для версии 1.0.6 вам нужно удалить предыдущий класс из двух элементов:
$( '.mdl-layout__drawer, .mdl-layout__obfuscator' ).removeClass( 'is-visible' );
Ответ 5
Я использую эту команду jquery:
$( 'div[class^="mdl-layout__obfuscator"]' ).trigger( "click" );
Ответ 6
Отображение и скрытие меню так же просто, как добавление и удаление класса .is-visible
, как можно видеть в источнике:
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_();
хотя это работает, что _
в конце имени метода показывает, что эта функция не должна быть (неверно) использована как общедоступный API-метод.
Ответ 7
Сделайте это:
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;
}
Ответ 8
Авто Скрыть ящик навигации в материальном дизайне Lite Framework.
Просто включите этот код в тег script вашей веб-страницы
Должен включать jQuery для запуска этого запуска...: D
<script>
$(document).ready(function(){
$(".mdl-layout__drawer a").click(function(){
$(".mdl-layout__drawer,.mdl-layout__obfuscator").toggleClass("is-visible");
});
});
</script>
Ответ 9
Чтобы закрыть его, вам нужно проверить, что он открыт первым, так как нет "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();
}
}
Ответ 10
В Angular ^ 4.0.0 вы можете использовать это обходное решение вместо использования toggleDrawer()
, если у вас возникли проблемы с наличием MaterialLayout
undefined, как я.
(
document
.querySelector('.mdl-layout__obfuscator') as HTMLDivElement
).click();