const buttons = document.querySelector('.content');
const blocks = document.querySelector('.wrap');
const key = 'block';
const attr = `data-${key}`;
const attrSelector = `[${attr}]`;
buttons.addEventListener('click', e => {
const button = e.target.closest(attrSelector);
if (button) {
const value = button.dataset[key];
console.log(blocks.querySelectorAll(`[${attr}="${value}"]`).length);
}
});
const onClick = ({ currentTarget: { attributes: { [attr]: { value } } } }) =>
console.log(Array.prototype.reduce.call(
blocks.children,
(acc, n) => acc + (n.getAttribute(attr) === value),
0
));
for (const n of buttons.children) {
n.addEventListener('click', onClick);
}
const listTag = 'ul';
const listClass = 'list';
const itemTag = 'li';
const itemClass = 'item';
const activeClass = 'active';
const list = document.createElement(listTag);
const items = arr.map(function(n) {
const item = document.createElement(itemTag);
item.textContent = n.text;
item.classList.add(itemClass);
item.addEventListener('click', this);
return item;
}, function() {
list.style.setProperty('background-image', `url(${arr[items.indexOf(this)].url})`);
items.forEach(n => n.classList.toggle(activeClass, n === this));
});
list.classList.add(listClass);
list.append(...items);
document.body.append(list);
items[0].click();
document.body.insertAdjacentHTML('beforeend', `
<${listTag} class="${listClass}">${arr.map(({ url, text }) => `
<${itemTag} class="${itemClass}" data-url="${url}">${text}</${itemTag}>`).join``}
</${listTag}>
`);
const list = document.body.lastElementChild;
list.addEventListener('click', ({ target: t }) => {
if (t = t.closest(`${itemTag}.${itemClass}`)) {
list.style.backgroundImage = `url(${t.dataset.url})`;
list.querySelector(`.${activeClass}`)?.classList.remove(activeClass);
t.classList.add(activeClass);
}
});
list.children[0].dispatchEvent(new Event('click', { bubbles: true }));
const buttonOpenSelector = '.project__zoom';
const buttonCloseSelector = '.overlay--close';
const contentSelector = '.overlay--gallery';
const key = 'gallery';
const attr = `data-${key}`;
const activeClass = 'overlay--active';
$(document)
.on('click', buttonOpenSelector, function() {
$(`${contentSelector}[${attr}="${$(this).data(key)}"]`).addClass(activeClass);
})
.on('click', buttonCloseSelector, function(){
$(this).closest(contentSelector).removeClass(activeClass);
});
document.addEventListener('click', ({ target: t }) => {
t
.closest(buttonCloseSelector)
?.closest(contentSelector)
.classList
.remove(activeClass);
(t = t.closest(buttonOpenSelector)) && document
.querySelector(`${contentSelector}[${attr}="${t.dataset[key]}"]`)
.classList
.add(activeClass);
});
top
.window.top
, который запрещён из-за кроссдоменности.#ball {
display: block;
position: absolute;
width: 80px;
height: 80px;
top: 50%;
left: 50%;
margin-top: -40px;
margin-left: -40px;
}
const processNonEmptyObjectOnly = (f, defaultResult) =>
data => (
data = data instanceof Object ? Object.entries(data) : [],
data.length ? f(data) : defaultResult
);
const createTreeHTML = processNonEmptyObjectOnly(data => `
<ul>${data.map(n => `
<li>
${n[0]}
${createTreeHTML(n[1])}
</li>`).join('')}
</ul>`
, '');
document.body.insertAdjacentHTML('beforeend', createTreeHTML(data));
const createTreeElement = processNonEmptyObjectOnly(data =>
data.reduce((ul, n) => (
ul.append(document.createElement('li')),
ul.lastChild.append(n[0], createTreeElement(n[1])),
ul
), document.createElement('ul'))
, '');
document.body.append(createTreeElement(data));