ÐеÑвÑй и главнÑй Ñаг в наведении поÑÑдка â ÑÑо оÑоÑмиÑÑ ÐºÐ¾Ð´ в обÑекÑÑ, каждÑй из коÑоÑÑÑ Ð±ÑÐ´ÐµÑ ÑеÑаÑÑ ÑÐ²Ð¾Ñ Ð·Ð°Ð´Ð°ÑÑ.
ÐдеÑÑ Ð¼Ñ ÑоÑÑедоÑоÑимÑÑ Ð½Ð° гÑаÑиÑеÑÐºÐ¸Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½ÑÐ°Ñ , коÑоÑÑе Ñакже назÑваÑÑ Â«Ð²Ð¸Ð´Ð¶ÐµÑами».
РбÑаÑзеÑаÑ
еÑÑÑ Ð²ÑÑÑоеннÑе виджеÑÑ, напÑÐ¸Ð¼ÐµÑ <select>, <input> и дÑÑгие ÑлеменÑÑ, о коÑоÑÑÑ
Ð¼Ñ Ð´Ð°Ð¶Ðµ и не дÑмаем, «как они ÑабоÑаÑÑ». Ðни «пÑоÑÑо ÑабоÑаÑÑ»: показÑваÑÑ Ð·Ð½Ð°Ñение, вÑзÑваÑÑ ÑобÑÑиÑâ¦
ÐаÑа задаÑа â ÑделаÑÑ Ñо же Ñамое на ÑÑовне вÑÑе. ÐÑ Ð±Ñдем ÑоздаваÑÑ Ð¾Ð±ÑекÑÑ, коÑоÑÑе генеÑиÑÑÑÑ Ð¼ÐµÐ½Ñ, диалог или дÑÑгие компоненÑÑ Ð¸Ð½ÑеÑÑейÑа, и даÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ñдобно ÑабоÑаÑÑ Ñ Ð½Ð¸Ð¼Ð¸.
ÐÐ¸Ð´Ð¶ÐµÑ Menu
ÐÑ Ð½Ð°ÑнÑм ÑабоÑÑ Ñ Ð²Ð¸Ð´Ð¶ÐµÑа, коÑоÑÑй пÑедÑÑмаÑÑÐ¸Ð²Ð°ÐµÑ Ñже гоÑовÑÑ ÑазмеÑкÑ.
То еÑÑÑ, в нÑжном меÑÑе HTML Ð½Ð°Ñ Ð¾Ð´Ð¸ÑÑÑ DOM-ÑÑÑÑкÑÑÑа Ð´Ð»Ñ Ð¼ÐµÐ½Ñ â заголовок и ÑпиÑок опÑий:
<div class="menu" id="sweets-menu">
<span class="title">СладоÑÑи</span>
<ul>
<li>ТоÑÑ</li>
<li>ÐонÑик</li>
<li>...</li>
</ul>
</div>
Ðалее она Ð¼Ð¾Ð¶ÐµÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½ÑÑÑÑÑ, изменÑÑÑÑÑ, но в наÑале â она ÑакаÑ.
ÐбÑаÑим внимание на важнÑе ÑоглаÑÐµÐ½Ð¸Ñ Ð²Ð¸Ð´Ð¶ÐµÑа:
- ÐÑÑ ÑазмеÑка заклÑÑена в коÑневой ÑлеменÑ
<div class="menu" id="sweets-menu">. -
ÐÑо оÑÐµÐ½Ñ Ñдобно: вÑнÑл ÑÑÐ¾Ñ ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¸Ð· DOM â Ð½ÐµÑ Ð¼ÐµÐ½Ñ, вÑÑавил в дÑÑгое меÑÑо â пеÑемеÑÑил менÑ. ÐÑоме Ñого, можно Ñдобно иÑкаÑÑ Ð¿Ð¾Ð´ÑлеменÑÑ.
- ÐнÑÑÑи коÑневого ÑлеменÑа â ÑолÑко клаÑÑÑ, не
id. -
ÐокÑÐ¼ÐµÐ½Ñ Ð²Ð¿Ð¾Ð»Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ ÑодеÑжаÑÑ Ð¼Ð½Ð¾Ð³Ð¾ ÑазлиÑнÑÑ Ð¼ÐµÐ½Ñ. Ðни не Ð´Ð¾Ð»Ð¶Ð½Ñ ÐºÐ¾Ð½ÑликÑоваÑÑ Ð¼ÐµÐ¶Ð´Ñ Ñобой, поÑÑÐ¾Ð¼Ñ Ð´Ð»Ñ ÑазмеÑки везде иÑполÑзÑÑÑÑÑ ÐºÐ»Ð°ÑÑÑ.
ÐÑклÑÑение â коÑневой ÑлеменÑ. Рданном ÑлÑÑае Ð¼Ñ Ð¿Ñедполагаем, ÑÑо данное конкÑеÑное Â«Ð¼ÐµÐ½Ñ ÑладоÑÑей» в докÑменÑе ÑолÑко одно, поÑÑÐ¾Ð¼Ñ Ð´Ð°Ñм емÑ
id.
ÐлаÑÑ Ð²Ð¸Ð´Ð¶ÐµÑа
ÐÐ»Ñ ÑабоÑÑ Ñ ÑазмеÑкой бÑдем ÑоздаваÑÑ Ð¾Ð±ÑÐµÐºÑ new Menu и пеÑедаваÑÑ ÐµÐ¼Ñ ÐºÐ¾Ñневой ÑлеменÑ. РконÑÑÑÑкÑоÑе он поÑÑÐ°Ð²Ð¸Ñ Ð½ÐµÐ¾Ð±Ñ
одимÑе обÑабоÑÑики:
function Menu(options) {
var elem = options.elem;
elem.onmousedown = function() {
return false;
}
elem.onclick = function(event) {
if (event.target.closest('.title')) {
elem.classList.toggle('open');
}
};
}
// иÑполÑзование
var menu = new Menu({
elem: document.getElementById('sweets-menu')
});
ÐенÑ:
function Menu(options) {
var elem = options.elem;
elem.onmousedown = function() {
return false;
}
elem.onclick = function(event) {
if (event.target.closest('.title')) {
elem.classList.toggle('open');
}
};
}.menu ul {
display: none;
margin: 0;
}
.menu .title {
font-weight: bold;
cursor: pointer;
}
.menu .title:before {
content: 'â¶';
padding-right: 6px;
color: green;
}
.menu.open ul {
display: block;
}
.menu.open .title:before {
content: 'â¼';
}<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="style.css">
<script src="https://cdn.polyfill.io/v1/polyfill.js?features=Element.prototype.closest"></script>
<script src="menu.js"></script>
</head>
<body>
<div id="sweets-menu" class="menu">
<span class="title">СладоÑÑи</span>
<ul>
<li>ТоÑÑ</li>
<li>ÐонÑик</li>
<li>ÐиÑожное</li>
<li>Шоколадка</li>
<li>ÐоÑоженое</li>
</ul>
</div>
<script>
var menu = new Menu({
elem: document.getElementById('sweets-menu')
});
</script>
</body>
</html>ÐÑо, конеÑно, ÑолÑко пеÑвÑй Ñаг, но Ñже здеÑÑ Ð²Ð¸Ð´Ð½Ñ Ð½ÐµÐºÐ¾ÑоÑÑе важнÑе ÑоглаÑÐµÐ½Ð¸Ñ Ð² коде.
- У конÑÑÑÑкÑоÑа ÑолÑко один аÑгÑÐ¼ÐµÐ½Ñ â обÑекÑ
options. -
ÐÑо Ñдобно, Ñак как Ñ Ð³ÑаÑиÑеÑÐºÐ¸Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñов обÑÑно много наÑÑÑоек, болÑÑинÑÑво из коÑоÑÑÑ Ð¸Ð¼ÐµÑÑ ÑазÑмнÑе знаÑÐµÐ½Ð¸Ñ Â«Ð¿Ð¾ ÑмолÑаниÑ». ÐÑли пеÑедаваÑÑ Ð°ÑгÑменÑÑ ÑеÑез запÑÑÑÑ â Ð¸Ñ Ð±ÑÐ´ÐµÑ ÑлиÑком много.
- ÐбÑабоÑÑики назнаÑаÑÑÑÑ ÑеÑез делегиÑование.
-
ÐмеÑÑо Ñого, ÑÑÐ¾Ð±Ñ Ð½Ð°Ð¹Ñи ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¸ поÑÑавиÑÑ Ð¾Ð±ÑабоÑÑик на него:
var titleElem = elem.querySelector('.title'); titleElem.onclick = function() { elem.classList.toggle('open'); }â¦ÐÑ ÑÑавим обÑабоÑÑик на коÑневой
elemи иÑполÑзÑем делегиÑование:elem.onclick = function(event) { if (event.target.closest('.title')) { elem.classList.toggle('open'); } };ÐÑо ÑÑкоÑÑÐµÑ Ð¸Ð½Ð¸ÑиализаÑиÑ, Ñак как не надо иÑкаÑÑ ÑлеменÑÑ, и даÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð² лÑбой Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð¼ÐµÐ½ÑÑÑ DOM внÑÑÑи, в Ñом ÑиÑле ÑеÑез
innerHTML, без Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑи пеÑеÑÑавлÑÑÑ Ð¾Ð±ÑабоÑÑик.
Ð ÑÑÐ¾Ñ ÐºÐ¾Ð´ лÑÑÑе добавиÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑÑ Ð¿ÑовеÑÐºÑ Ð½Ð° Ñо, ÑÑо найденнÑй .title наÑ
одиÑÑÑ Ð²Ð½ÑÑÑи elem:
elem.onclick = function(event) {
var closestTitle = event.target.closest('.title');
if (closestTitle && elem.contains(closestTitle)) {
elem.classList.toggle('open');
}
};
ÐÑблиÑнÑе меÑодÑ
УважаÑÑий ÑÐµÐ±Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ Ð¾Ð±ÑÑно Ð¸Ð¼ÐµÐµÑ Ð¿ÑблиÑнÑе меÑодÑ, коÑоÑÑе позволÑÑÑ ÑпÑавлÑÑÑ Ð¸Ð¼ ÑнаÑÑжи.
РаÑÑмоÑÑим повнимаÑелÑнее ÑÑÐ¾Ñ ÑÑагменÑ:
if (event.target.closest('.title')) {
elem.classList.toggle('open');
}
ÐдеÑÑ Ð² обÑабоÑÑике ÑобÑÑÐ¸Ñ ÑÑÐ°Ð·Ñ ÐºÐ¾Ð´ ÑабоÑÑ Ñ ÑлеменÑом. Ðока одна ÑÑÑока â вÑÑ Ð¿Ð¾Ð½ÑÑно, но еÑли Ð¸Ñ Ð±ÑÐ´ÐµÑ Ð¼Ð½Ð¾Ð³Ð¾, Ñо пÑи ÑÑении понадобиÑÑÑ Ð´Ð¾Ð»Ð³Ð¾ и ÑпоÑно вникаÑÑ: «РÑÑо же, вÑÑ-Ñаки, Ñакое делаеÑÑÑ Ð¿Ñи клике?»
ÐÐ»Ñ ÑлÑÑÑÐµÐ½Ð¸Ñ ÑиÑаемоÑÑи вÑделим обÑабоÑÑик в оÑделÑнÑÑ ÑÑнкÑÐ¸Ñ toggle, коÑоÑÐ°Ñ Ðº ÑÐ¾Ð¼Ñ Ð¶Ðµ ÑÑÐ°Ð½ÐµÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ñм пÑблиÑнÑм меÑодом:
function Menu(options) {
var elem = options.elem;
elem.onmousedown = function() {
return false;
}
elem.onclick = function(event) {
if (event.target.closest('.title')) {
toggle();
}
};
function toggle() {
elem.classList.toggle('open');
}
this.toggle = toggle;
}
ТепеÑÑ Ð¼ÐµÑод toggle можно иÑполÑзоваÑÑ Ð¸ ÑнаÑÑжи:
var menu = new Menu(...);
menu.toggle();
ÐенеÑаÑÐ¸Ñ DOM-ÑлеменÑа
Ðо ÑÑого моменÑа Ð¼ÐµÐ½Ñ Â«Ð¾Ð¶Ð¸Ð²Ð»Ñло» Ñже ÑÑÑеÑÑвÑÑÑий HTML.
Ðо далеко не вÑегда в HTML Ñже еÑÑÑ Ð³Ð¾ÑÐ¾Ð²Ð°Ñ ÑазмеÑка. Ð ÑложнÑÑ Ð¸Ð½ÑеÑÑейÑÐ°Ñ Ð½Ð°Ð¼Ð½Ð¾Ð³Ð¾ ÑаÑе ÐµÑ Ð½ÐµÑ, а еÑÑÑ Ð´Ð°Ð½Ð½Ñе, на оÑнове коÑоÑÑÑ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ Ð³ÐµÐ½ÐµÑиÑÑÐµÑ ÑазмеÑкÑ.
Ð ÑлÑÑае менÑ, даннÑе â ÑÑо Ð½Ð°Ð±Ð¾Ñ Ð¿ÑнкÑов менÑ, коÑоÑÑе пеÑедаÑÑÑÑ ÐºÐ¾Ð½ÑÑÑÑкÑоÑÑ.
ÐÐ»Ñ Ð³ÐµÐ½ÐµÑаÑии DOM добавим Ð¼ÐµÐ½Ñ ÑÑи меÑода:
render()â генеÑиÑÑÐµÑ ÐºÐ¾Ñневой DOM-ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¸ заголовок менÑ.renderItems()â генеÑиÑÑÐµÑ DOM Ð´Ð»Ñ ÑпиÑка опÑийul/li.getElem()â возвÑаÑÐ°ÐµÑ DOM-ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¼ÐµÐ½Ñ, пÑи Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑи запÑÑÐºÐ°Ñ Ð³ÐµÐ½ÐµÑаÑиÑ, пÑблиÑнÑй меÑод.
ФÑнкÑÐ¸Ñ Ð³ÐµÐ½ÐµÑаÑии коÑневого ÑлеменÑа Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ¾Ð¼ render оÑделена Ð¾Ñ Ð³ÐµÐ½ÐµÑаÑии ÑпиÑка renderItems. ÐоÑÐµÐ¼Ñ â бÑÐ´ÐµÑ Ð²Ð¸Ð´Ð½Ð¾ ÑÑÑÑ Ð´Ð°Ð»ÐµÐµ.
ÐовÑй ÑпоÑоб иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¼ÐµÐ½Ñ:
// ÑоздаÑÑ Ð¾Ð±ÑÐµÐºÑ Ð¼ÐµÐ½Ñ Ñ Ð´Ð°Ð½Ð½Ñм заголовком и опÑиÑми
var menu = new Menu({
title: "СладоÑÑи",
items: [
"ТоÑÑ",
"ÐонÑик",
"ÐиÑожное",
"Шоколадка",
"ÐоÑоженое"
]
});
// полÑÑиÑÑ ÑгенеÑиÑованнÑй DOM-ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¼ÐµÐ½Ñ
var elem = menu.getElem();
// вÑÑавиÑÑ Ð¼ÐµÐ½Ñ Ð² нÑжное меÑÑо ÑÑÑаниÑÑ
document.body.appendChild(elem);
Ðод Menu Ñ Ð½Ð¾Ð²Ñми меÑодами:
function Menu(options) {
var elem;
function getElem() {
if (!elem) render();
return elem;
}
function render() {
elem = document.createElement('div');
elem.className = "menu";
var titleElem = document.createElement('span');
elem.appendChild(titleElem);
titleElem.className = "title";
titleElem.textContent = options.title;
elem.onmousedown = function() {
return false;
};
elem.onclick = function(event) {
if (event.target.closest('.title')) {
toggle();
}
}
}
function renderItems() {
var items = options.items || [];
var list = document.createElement('ul');
items.forEach(function(item) {
var li = document.createElement('li');
li.textContent = item;
list.appendChild(li);
});
elem.appendChild(list);
}
function open() {
if (!elem.querySelector('ul')) {
renderItems();
}
elem.classList.add('open');
};
function close() {
elem.classList.remove('open');
};
function toggle() {
if (elem.classList.contains('open')) close();
else open();
};
this.getElem = getElem;
this.toggle = toggle;
this.close = close;
this.open = open;
}
ÐÑмеÑим некоÑоÑÑе оÑобенноÑÑи ÑÑого кода.
- ÐбÑабоÑÑики оÑделÑÑÑÑÑ Ð¾Ñ ÑеалÑнÑÑ Ð´ÐµÐ¹ÑÑвий.
-
РобÑабоÑÑике
onclickÐ¼Ñ Â«Ð»Ð¾Ð²Ð¸Ð¼Â» ÑобÑÑие и вÑÑÑнÑем, ÑÑо именно пÑоизоÑло. Ðозможно, нÑжно пÑовеÑиÑÑevent.target, кооÑдинаÑÑ, клавиÑи-модиÑикаÑоÑÑ, и Ñ.п. ÐÑо вÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ делаÑÑ Ð·Ð´ÐµÑÑ Ð¶Ðµ.ÐÑÑÑнив, ÑÑо нÑжно ÑделаÑÑ, обÑабоÑÑик
onclickне Ð´ÐµÐ»Ð°ÐµÑ ÑÑо Ñам, а вÑзÑÐ²Ð°ÐµÑ Ð´Ð»Ñ ÑÑого ÑооÑвеÑÑÑвÑÑÑий меÑод. ÐÑÐ¾Ñ Ð¼ÐµÑод Ñже не Ð·Ð½Ð°ÐµÑ Ð½Ð¸Ñего о ÑобÑÑии, он пÑоÑÑо Ð´ÐµÐ»Ð°ÐµÑ ÑÑо-Ñо Ñ Ð²Ð¸Ð´Ð¶ÐµÑом. Ðго можно вÑзваÑÑ Ð¸ оÑделÑно, не из обÑабоÑÑика.ÐдеÑÑ ÐµÑÑÑ ÑÑд важнÑÑ Ð¿Ð»ÑÑов:
- ÐбÑабоÑÑик
onclickне «ÑаÑпÑÑ Ð°ÐµÑ» ÑÑезмеÑно. - Ðод гоÑаздо лÑÑÑе ÑиÑаеÑÑÑ.
- ÐеÑод можно повÑоÑно иÑполÑзоваÑÑ, в Ñом ÑиÑле и ÑделаÑÑ Ð¿ÑблиÑнÑм, как в коде вÑÑе.
- ÐенеÑаÑÐ¸Ñ DOM, по возможноÑÑи, должна бÑÑÑ Â«Ð»ÐµÐ½Ð¸Ð²Ð¾Ð¹Â».
-
ÐÑ ÑÑаÑаемÑÑ Ð¾ÑкладÑваÑÑ ÑабоÑÑ Ð´Ð¾ моменÑа, когда она ÑеалÑно нÑжна. ÐапÑимеÑ, когда
new MenuÑоздаÑÑÑÑ, Ñо пеÑеменнаÑelemлиÑÑ Ð¾Ð±ÑÑвлÑеÑÑÑ. DOM-деÑево бÑÐ´ÐµÑ ÑгенеÑиÑовано ÑолÑко пÑи вÑзовеgetElem()ÑÑнкÑиейrender().Ðолее Ñого! Ðока Ð¼ÐµÐ½Ñ Ð·Ð°ÐºÑÑÑо â доÑÑаÑоÑно заголовка. ÐÑоме Ñого, возможно, поÑеÑиÑÐµÐ»Ñ Ð²Ð¾Ð¾Ð±Ñе никогда не ÑаÑкÑÐ¾ÐµÑ ÑÑо менÑ, Ñак заÑем генеÑиÑоваÑÑ ÑпиÑок ÑанÑÑе вÑемени? РпÑи пеÑвом оÑкÑÑÑии
open()вÑÐ·Ð¾Ð²ÐµÑ ÑÑнкÑиÑrenderItems(), коÑоÑÐ°Ñ ÑпеÑиалÑно Ð´Ð»Ñ ÑÑого вÑделена оÑделÑно оÑrender().Фаза иниÑиализаÑии оÑÐµÐ½Ñ ÑÑвÑÑвиÑелÑна к пÑоизводиÑелÑноÑÑи, Ñак как обÑÑно в Ñложном инÑеÑÑейÑе ÑоздаÑÑÑÑ Ð¼Ð½Ð¾Ð³Ð¾ вÑего.
ÐÑли изнаÑалÑно Ð¿Ð¾Ð´Ñ Ð¾Ð´Ð¸ÑÑ Ðº опÑимизаÑии на ÑÑой Ñазе «ÑпÑÑÑÑ ÑÑкава», Ñо поÑом попÑавиÑÑ Ð´Ð¾Ð»Ð³Ð¸Ð¹ ÑÑаÑÑ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ñложно. Тем более, ÑÑо иниÑиализаÑÐ¸Ñ â ÑÑо ÑÑндаменÑ, наÑало ÑабоÑÑ Ð²Ð¸Ð´Ð¶ÐµÑа, ÐµÑ Ð¾Ð¿ÑимизаÑÐ¸Ñ Ð² бÑдÑÑем Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾ÑÑебоваÑÑ ÑилÑнÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ кода.
ÐонеÑно, здеÑÑ, как и везде в опÑимизаÑии â без ÑанаÑизма. ÐÑваÑÑ ÑиÑÑаÑии, когда гоÑаздо Ñдобнее ÑÑо-Ñо ÑделаÑÑ ÑÑазÑ. ÐÑли ÑÑо один ÑлеменÑ, Ñо опÑимизаÑÐ¸Ñ Ð·Ð´ÐµÑÑ Ð½Ð¸ к ÑемÑ. РеÑли болÑÑой ÑÑÐ°Ð³Ð¼ÐµÐ½Ñ DOM, коÑоÑÑй, как в ÑлÑÑае Ñ Ð¼ÐµÐ½Ñ, пÑÑмо ÑейÑÐ°Ñ Ð½Ðµ нÑжен â Ñо лÑÑÑе оÑложиÑÑ.
РдейÑÑвии:
function Menu(options) {
var elem;
function getElem() {
if (!elem) render();
return elem;
}
function render() {
elem = document.createElement('div');
elem.className = "menu";
var titleElem = document.createElement('span');
elem.appendChild(titleElem);
titleElem.className = "title";
titleElem.textContent = options.title;
elem.onmousedown = function() {
return false;
};
elem.onclick = function(event) {
if (event.target.closest('.title')) {
toggle();
}
}
}
function renderItems() {
var items = options.items || [];
var list = document.createElement('ul');
items.forEach(function(item) {
var li = document.createElement('li');
li.textContent = item;
list.appendChild(li);
});
elem.appendChild(list);
}
function open() {
if (!elem.querySelector('ul')) {
renderItems();
}
elem.classList.add('open');
};
function close() {
elem.classList.remove('open');
};
function toggle() {
if (elem.classList.contains('open')) close();
else open();
};
this.getElem = getElem;
this.toggle = toggle;
this.close = close;
this.open = open;
}.menu ul {
display: none;
margin: 0;
}
.menu .title {
font-weight: bold;
cursor: pointer;
}
.menu .title:before {
content: 'â¶';
padding-right: 6px;
color: green;
}
.menu.open ul {
display: block;
}
.menu.open .title:before {
content: 'â¼';
}<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="style.css">
<script src="https://cdn.polyfill.io/v1/polyfill.js?features=Element.prototype.closest"></script>
<script src="menu.js"></script>
</head>
<body>
<button onclick="menu.toggle()">menu.toggle()</button>
<button onclick="menu.open()">menu.open()</button>
<button onclick="menu.close()">menu.close()</button>
<script>
var menu = new Menu({
title: "СладоÑÑи",
items: [
"ТоÑÑ",
"ÐонÑик",
"ÐиÑожное",
"Шоколадка",
"ÐоÑоженое"
]
});
document.body.appendChild(menu.getElem());
</script>
</body>
</html>ÐÑого
ÐÑ Ð½Ð°Ñали ÑоздаваÑÑ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ Â«Ñ ÑиÑÑого лиÑÑа», пока без дополниÑелÑнÑÑ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñек.
ÐÑновнÑе пÑинÑипÑ:
- ÐÐ¸Ð´Ð¶ÐµÑ â ÑÑо обÑекÑ, коÑоÑÑй либо конÑÑолиÑÑÐµÑ Ð³Ð¾Ñовое деÑево DOM, либо ÑоздаÑÑ ÑвоÑ.
- РконÑÑÑÑкÑÐ¾Ñ Ð²Ð¸Ð´Ð¶ÐµÑа пеÑедаÑÑÑÑ Ð¾Ð±ÑÐµÐºÑ Ð°ÑгÑменÑов
options. - ÐÐ¸Ð´Ð¶ÐµÑ Ð¿Ñи необÑ
одимоÑÑи ÑоздаÑÑ ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¸Ð»Ð¸ «оживлÑеÑ» гоÑовÑй. ÐнÑÑÑи в ÑазмеÑке не иÑполÑзÑÑÑÑÑ
id. - ÐбÑабоÑÑики назнаÑаÑÑÑÑ ÑеÑез делегиÑование â Ð´Ð»Ñ Ð¿ÑоизводиÑелÑноÑÑи и ÑпÑоÑÐµÐ½Ð¸Ñ Ð²Ð¸Ð´Ð¶ÐµÑа.
- ÐбÑабоÑÑики ÑобÑÑий вÑзÑваÑÑ ÑооÑвеÑÑÑвÑÑÑий меÑод, не пÑÑаÑÑÑÑ Ð´ÐµÐ»Ð°ÑÑ Ð²ÑÑ Ñами.
- ÐÑи иниÑиализаÑии, еÑли ÑÑÑеÑÑвеннÑй ÑÑаÑÑок ÑабоÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ оÑложиÑÑ Ð´Ð¾ ÑеалÑного задейÑÑÐ²Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²Ð¸Ð´Ð¶ÐµÑа â оÑкладÑваем его.
ÐомменÑаÑии
<code>, Ð´Ð»Ñ Ð½ÐµÑколÑÐºÐ¸Ñ ÑÑÑок кода — Ñег<pre>, еÑли болÑÑе 10 ÑÑÑок — ÑÑÑÐ»ÐºÑ Ð½Ð° пеÑоÑниÑÑ (plnkr, JSBin, codepenâ¦)