display
через медиа запросы. Например одна кнопка находится в одном месте страницы и отображается по дефолту на десктопах, а вторая кнопка находится совсем в другом месте страницы и "активируется" соответственно на планшетах и мобильниках. .target {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.target {
overflow: hidden;
display: -webkit-box;
-webkit-line-clamp: 5;
-webkit-box-orient: vertical;
}
[[min-width, max-width], wordsLimit]
. const fn = (..args) => {
// выходим из функции если элемент не найден
if(!document.querySelector(".target-element-selector")) return;
// код функции
};
if (window.location.href === "https://you-site.com/blog"){
// код который нужно выполнить на странице blog
}
.is-active {
animation-name: shake;
animation-direction: alternate;
animation-duration: 1s;
animation-iteration-count: 4;
}
@keyframes shake {
from {
transform: translateX(0px);
}
to {
transform: translateX(150px);
}
}
const button = document.querySelector(".button");
button.classList.add("is-active");
button.addEventListener("animationend", (event) => {
event.stopPropagation();
button.classList.remove("is-active");
}, { once: true });
Создаю с нуля инпуты и кнопку для добавления новых элементов массива, добавляю, но цикл их не видит и не выводит в окно.
let li = document.createElement("li");
let content = `${elem.item}, цена ${elem.price}, номер ${elem.index}`;
li.textContent = content;
ul.appendChild(li);
but.addEventListener("click", () => {
goods.push({
item: input1.value,
price: input2.value,
index: input3.value,
});
ul.innerHTML = goods.map(({ item, price, index }) => {
return `<li>${item}, цена ${price}, номер ${index}</li>`
}).join("");
});
but.addEventListener("click", () => {
goods.push({
item: input1.value,
price: input2.value,
index: input3.value,
});
const { item, price, index } = goods[goods.length - 1];
let li = document.createElement("li");
let content = `${item}, цена ${price}, номер ${index}`;
li.textContent = content;
ul.append(li);
});
Почему не работает for внутри append?
const getSetOfElements = () => {
let arr = [];
for (let i = 1; i <= 6; i++) {
arr.push(`<div class="test">${i}</div>`);
}
return arr;
}
const setOfElements = getSetOfElements();
$('.second').append(`<p>hello</p> ${setOfElements.join("")}`);
const setOfElements = [...Array(6)].map((_, i) => (`<div class="test">${i + 1}</div>`)).join("");
$('.second').append(`<p>hello</p> ${setOfElements}`);
slider("#target-element-id-1");
slider("#target-element-id-2");
document.querySelectorAll(".element").forEach(n => slider(n));
const targetElement = document.querySelector(".player-selector");
const observer = new MutationObserver((mutations) => {
mutations.forEach(({ target: t }) => {
t.classList.contains("is-finished") ?
alert("element contains class") :
alert("element does not contain a class");
})
});
observer.observe(targetElement, {
attributes: true,
attributeFilter: ['class']
});
- console.log(e.target.parentElement.classList.contains["valide"]);
+ console.log(e.target.parentElement.classList.contains("valide"));
- if (e.target.parentElement.classList.contains["valide"]);
+ if (e.target.parentElement.classList.contains("valide"));
const accordions = document.querySelectorAll('.accordion');
const accordionsButtons = document.querySelectorAll(".accordion__tittle")
const accordionsDataboxes = document.querySelectorAll(".accordion__content");
accordions.forEach(n => {
const currentButton = n.querySelector(".accordion__tittle");
const currentDatabox = n.querySelector(".accordion__content");
const toggleActiveElements = () => {
accordionsButtons.forEach(v => {
if (v !== currentButton) {
v.classList.remove("open");
}
});
accordionsDataboxes.forEach(v => {
if (v !== currentDatabox) {
v.classList.remove("open");
v.style.setProperty("--height", "0px");
}
});
currentButton.classList.toggle("open");
currentDatabox.classList.toggle("open");
currentDatabox.classList.contains("open")
? currentDatabox.style.setProperty("--height", `${currentDatabox.scrollHeight}px`)
: currentDatabox.style.setProperty("--height", "0px");
};
currentButton.addEventListener("click", toggleActiveElements);
});
.accordion__content.open {
max-height: var(--height, 0);
}
const slider = $(".slider").slick({
centerMode: true,
slidesToShow: 4
});
const breakpoint = window.matchMedia("(max-width: 992px)");
const breakpointChecker = () => {
if (breakpoint.matches) {
slider.slick('init');
} else {
slider.slick('destroy');
}
};
breakpoint.addEventListener("change", breakpointChecker);
breakpointChecker();
<button class="trigger" data-text="Hello">Скопировать</button>
const button = document.querySelector(".trigger");
const dataText = button.dataset.text.trim();
button.addEventListener('click', e => {
if(!dataText.length) return;
navigator.clipboard.writeText(dataText)
.then(() => console.log("Done!"))
.catch(err => console.error(err))
})
var parent = this.closest('div').className;
const parent = this.closest('.parent-selector');
const child = parent.querySelector(".b24-form-control-label");
const debounce = (fn, ms = 300) => {
let timer;
return (...args) => {
clearTimeout(timer);
timer = setTimeout(() => {
fn.apply(this, args);
}, ms);
};
}
const inputbox = document.querySelector(".input");
const checkForEmpty = ({ value: v }) => v === "" && console.log("Empty");
const processChanges = debounce(() => checkForEmpty(inputbox), 500);
inputbox.addEventListener("input", processChanges);