mix-blend-mode: overlay
. Возможно существует более простое/красивое/элегантное решение, но я сейчас не придумаю такое. Можно сделать намного проще, если не будет следующего условия:чтобы линии начинались с конца второй строки и примыкали ко второй строке
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 }));
<form>
<div class="form-group">
<input type="text" name="name" class="form-control" placeholder="Your Name">
</div>
<button type="submit"><span>Submit</span></button>
</form>
* {
box-sizing: border-box;
}
.form-group {
position: relative;
background: #fff;
}
.form-control {
width: 100%;
height: 2.5rem;
background: transparent;
border: none;
}
button {
border:none;
background: transparent;
position: relative;
padding: 1rem 2rem;
}
button span {
position: relative;
z-index: 3;
}
button:after,
.form-group:after {
content: '';
position: absolute;
top: -2px;
left: -2px;
bottom: -2px;
right: -2px;
background: linear-gradient(0deg, rgb(255, 174, 0) 0px, rgb(249, 232, 102) 100%);
z-index: -1;
-webkit-animation: animatedgradient 1s ease alternate infinite;
animation: animatedgradient 1s ease alternate infinite;
background-size: 100% 200%;
background-position: 0 100%;
}
@-webkit-keyframes animatedgradient {
100% {
background-position: 0 0;
}
}
@keyframes animatedgradient {
100% {
background-position: 0 0;
}
}
const element = document.querySelector(`.js-filter-wrap a[data-filter="${конкретноеЗначение}"]`);
if (element) {
...
const element = [...elements].find(n => n.dataset.filter === конкретноеЗначение);
if (element) {
...