document.addEventListener("click", ({ target }) => {
if (target.classList.contains("lk-addapp-ajax-block")) {
const value = target.querySelector("input").value;
alert(value);
}
});
.lk-addapp-ajax-block * {
pointer-events: none;
}
let value = ' Illusion is the first of all pleasures. ';
value.split(" ").filter(n => n !== "");
['Illusion', 'is', 'the', 'first', 'of', 'all', 'pleasures.']
let value = ` Lorem ipsum dolor sit amet, consectetur adipiscing elit,
sed do eiusmod, tempor et dolore magna aliqua.
Amet facilisis magna!!!
Ornare quam viverra volutpat odio facilisis mauris. `;
value.split(" ").map(n => n.replace(/[\r\n.,!]/g, '')).filter(n => n !== "");
["Lorem", "ipsum", "dolor", "sit", "amet", "consectetur", "adipiscing",
"elit", "sed", "do", "eiusmod", "tempor", "et", "dolore",
"magna", "aliquaAmet", "facilisis", "magna", "Ornare", "quam",
"viverra", "volutpat", "odio", "facilisis", "mauris"]
let value = " Lorem ipsum. Dolor sit amet. Consectetur adipiscing elit. ";
value.split(".").map(n => n.trim()).filter(n => n!== "").map(n => `${n}.`):
['Lorem ipsum.', 'Dolor sit amet.', 'Consectetur adipiscing elit.']
let value = "Lorem ipsum, tempor magna aliqua. Dolor sit amet? Consectetur! Adipiscing elit.";
value.split(/[,.?!]/).map(n => n.trim()).filter(n => n!== "");
['Lorem ipsum', 'tempor et dolore magna aliqua', 'Dolor sit amet', 'Consectetur', 'Adipiscing elit']
</input type="file">
:--animation-duration
скорее всего содержится <число>ms
. Если указать только число, то всё будет работать.calc(var(--animation-duration) * 1ms)
сложности? Неужели не проще написать напрямую время анимации или пусть даже в переменной, но без calc()
и прочего? Для чего лишние вычисления и прочие операции? Не нужно ничего усложнять.--animation-duration: 500ms;
.add-panel_button.sending .svg{
animation: fly-out-in var(--animation-duration) ease-in-out;
}
addTodoButton.addEventListener("click", () => {
addTodoButton.classList.add("sending");
addTodoButton.addEventListener("animationend", e => {
addTodoButton.classList.remove("sending");
addItem();
}, { once: true }
);
});
const instance = tippy(".target");
const breakpoint = window.matchMedia("(max-width: 1200px)");
const breakpointChecker = () => {
if (breakpoint.matches) {
instance[0].setProps({
placement: "bottom-end"
});
} else {
instance[0].setProps({
placement: "left-start"
});
}
};
breakpoint.addEventListener("change", breakpointChecker);
breakpointChecker();
// коллекция тултипов
const triggers = document.querySelectorAll(".item__right, .item__prc");
triggers.forEach(element => {
const instance = tippy(element, {
// ваши настройки
});
// ширина экрана при достижении которой нужно изменить настройки
const breakpoint = window.matchMedia("(max-width: 1200px)");
const togglePlacement = status => {
// селекторы классов используемых тултипов
const triggerOne = "item__right";
const triggerTwo = "item__prc";
const { reference: target } = instance;
const isTargetElement = v => Boolean(target.classList.contains(v));
switch (status) {
case "update":
if (isTargetElement(triggerOne)) {
instance.setProps({
placement: "bottom-end"
});
} else if (isTargetElement(triggerTwo)) {
instance.setProps({
placement: "left-start"
});
}
break;
case "default":
if (isTargetElement(triggerOne)) {
instance.setProps({
placement: "left-start"
});
} else if (isTargetElement(triggerTwo)) {
instance.setProps({
placement: "bottom-end"
});
}
}
};
const breakpointChecker = () => {
if (breakpoint.matches) {
return togglePlacement("update");
} else {
return togglePlacement("default");
}
};
breakpoint.addEventListener("change", breakpointChecker);
breakpointChecker();
});
<span class="color-tabs__text"></span>
и добавив для этого элемента - псевдоэлемент, набросать для него дополнительные стили. <span class="color-tabs__text"></span>
, а также и внешний вид его псевдоэлемента, что собственно говоря очень удобно.const targetElement = document.querySelector(".target");
const breakpoint = window.matchMedia("(max-width: 700px)");
const breakpointChecker = () => {
if (breakpoint.matches) {
targetElement.textContent = "Apple";
} else {
targetElement.textContent = "Orange";
}
};
breakpoint.addEventListener("change", breakpointChecker);
breakpointChecker();
const elements = document.querySelectorAll(".value-item");
const stateClasses = ["value-active", "basic__shadow"];
document.addEventListener("click", ({ target }) => {
if (!target.classList.contains("value-item")) return;
elements.forEach(v => v.classList.remove(...stateClasses));
target.classList.add(...stateClasses);
});
const stateClasses = ["value-active", "basic__shadow"];
document.addEventListener("click", ({ target }) => {
if (!target.classList.contains("value-item")) return;
const activeItem = document.querySelector(".value-active");
activeItem && activeItem.classList.remove(...stateClasses);
target.classList.add(...stateClasses);
});
const elements = document.querySelectorAll(".value-item");
const stateClasses = ["value-active", "basic__shadow"];
const toggleActiveElement = element => {
element.addEventListener("click", () => {
elements.forEach(n => n.classList.remove(...stateClasses));
element.classList.add(...stateClasses);
});
};
elements.forEach(v => toggleActiveElement(v));
const elements = document.querySelectorAll(".value-item");
const stateClasses = ["value-active", "basic__shadow"];
const toggleActiveElement = element => {
element.addEventListener("click", () => {
document.querySelector(".value-active")?.classList.remove(...stateClasses);
element.classList.add(...stateClasses);
});
};
elements.forEach(v => toggleActiveElement(v));
const truncateString = (s, w) => s.length > w ? s.slice(0, w) + "..." : s;
const truncateString = (s, w) => s.length > w ? s.substring(0, w) + "..." : s;
console.log(truncateString("123456789", 5));
"123456 789"
, то выглядеть результат будет так: "123456 ..."
.trim()
и в итоге, выше описанные функции, будут выглядеть так:const truncateString = (s, w) => s.length > w ? s.slice(0, w).trim() + "..." : s;
const truncateString = (s, w) => s.length > w ? s.substring(0, w).trim() + "..." : s;
const truncateStringByLimitChars = ({ target, limit, pattern, useREGEx = true }) => {
const ignoredChars = new RegExp(`[${pattern}]+$`, "g");
const truncateString = () => {
return useREGEx === false
? target.substring(0, limit).trim() + "..."
: target.substring(0, limit).replace(ignoredChars, "").trim() + "...";
};
return target.length >= limit ? truncateString() : target;
};
console.log(
truncateStringByLimitChars({
target: "1234_______",
limit: 8,
pattern: [",", ".", "_"]
})
);
let string = "Hello__World",
console.log(string.length > 7 ? string.slice(0, 7).trim() + "..." : string)
Hello-World.loooooooong.image.name.sss.123456789.jpg
BackgroundImage_for__container.with.blog-news.cards.jpg
<div>Файл "BackgroundImageForContainerWithBlogNewsCards.jpg" успешно загружен</div>
const truncateString = configuration => {
const {
targetString: target,
limitWords: limit,
pattern = [",", ".", "_"],
useREGEx = true,
suffix = "...",
addFileExtension = false
} = configuration;
const ignoredChars = new RegExp(`[${pattern}]+$`, "g");
const reduceContentByLimitCharset = () => {
return useREGEx === false ?
target.substring(0, limit).trim() :
target.substring(0, limit).replace(ignoredChars, "").trim();
};
const updatedContent = () => {
const croppedString = reduceContentByLimitCharset();
const fileExtension = target.slice(target.lastIndexOf(".") + 1);
return addFileExtension === false ?
`${croppedString}${suffix}` :
`${croppedString}${suffix} .${fileExtension}`;
};
return target.length >= limit ? updatedContent() : target;
};
console.log(
truncateString({
targetString: "BackgroundImageForContainerWithBlogNewsCards.jpg",
limitWords: 15,
addFileExtension: true
})
);
</button>
. При использовании данного тега есть свои плюсы и одним из них является поддержка фокуса по дефолту, т.е если юзать например </div>
, то тогда придётся делать дополнительные телодвижения чтобы кнопка слепленная из тега </div>
- корректно принимала на себя фокус, например, с клавиатуры. Да и к тому же более семантично использовать </button>
для подобных целей. Хотя можно использовать и тег <input>
, но в данной ситуации, он совершенно не к месту. Как поменять цвет активного буллита
.swiper-pagination-bullets .swiper-pagination-bullet-active {
// стили для активного буллета
}
и как их все вместе немного сдвинуть вниз
.swiper-pagination-bullets
. Например margin-top или если блок с буллетами имеет абсолютное позиционирование, тогда использовать свойство top.