У меня есть контактная форма, созданная с помощью Contact Form 7 для WordPress, которая содержит флажки. Я хотел бы оформить их в виде флажков изображений, чтобы они выделялись немного больше. На самом деле я нашел красивый стиль флажка, который уже создал на странице. Мне просто нужна помощь с интеграцией его в контактную форму 7.
Вот конкретная страница: https://www.mattrittman.com/animation-licensing-v2/
По сути, просто хочу, чтобы то, что находится в белом поле, заменило стандартные флажки в форме ниже на этой странице.
Вот фрагмент кода для флажков моих пользовательских изображений:
* {
font-family: Lato;
margin: 0;
padding: 0;
--transition: 0.15s;
--border-radius: 0.5rem;
--background: #0077ef;
--box-shadow: #0077ef;
}
.cont-main {
display: flex;
flex-wrap: wrap;
align-content: left;
justify-content: left;
}
.cont-checkbox {
width: 150px;
height: 100px;
border-radius: var(--border-radius);
box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);
background: white;
transition: transform var(--transition);
margin: 0 8px;
}
.cont-checkbox:first-of-type {
margin-bottom: 0.75rem;
/*margin-right: 0.75rem;*/
}
.cont-checkbox:active {
transform: scale(0.9);
}
.cont-checkbox input {
display: none;
}
.cont-checkbox input:checked + label {
opacity: 1;
box-shadow: 0 0 0 3px var(--background);
}
.cont-checkbox input:checked + label img {
-webkit-filter: none; /* Safari 6.0 - 9.0 */
filter: none;
}
.cont-checkbox input:checked + label .cover-checkbox {
opacity: 1;
transform: scale(1);
}
.cont-checkbox input:checked + label .cover-checkbox svg {
stroke-dashoffset: 0;
}
.cont-checkbox label {
display: inline-block;
cursor: pointer;
border-radius: var(--border-radius);
overflow: hidden;
width: 100%;
height: 100%;
position: relative;
opacity: 0.6;
}
.cont-checkbox label img {
width: 100%;
height: 70%;
object-fit: cover;
clip-path: polygon(0% 0%, 100% 0, 100% 81%, 50% 100%, 0 81%);
-webkit-filter: grayscale(100%); /* Safari 6.0 - 9.0 */
filter: grayscale(100%);
}
.cont-checkbox label .cover-checkbox {
position: absolute;
right: 4px;
top: 3px;
z-index: 1;
width: 20px;
height: 20px;
border-radius: 50%;
background: var(--box-shadow);
border: 2px solid #fff;
transition: transform var(--transition),
opacity calc(var(--transition) * 1.2) linear;
opacity: 0;
transform: scale(0);
}
.cont-checkbox label .cover-checkbox svg {
width: 11px;
height: 10px;
display: inline-block;
vertical-align: top;
fill: none;
margin: 4px 0 0 3px;
stroke: #fff;
stroke-width: 2;
stroke-linecap: round;
stroke-linejoin: round;
stroke-dasharray: 16px;
transition: stroke-dashoffset 0.4s ease var(--transition);
stroke-dashoffset: 16px;
}
.cont-checkbox label .info {
text-align: center;
margin-top: -1.6rem;
font-weight: 600;
font-size: 0.8rem;
color: #000;
}
<div class = "cont-main">
<div class = "cont-checkbox">
<input type = "checkbox" id = "myCheckbox-1" />
<label for = "myCheckbox-1">
<img
src = "https://www.mattrittman.com/wp-content/uploads/2024/08/glock-thumb.jpg"
/>
<span class = "cover-checkbox">
<svg viewBox = "0 0 12 10">
<polyline points = "1.5 6 4.5 9 10.5 1"></polyline>
</svg>
</span>
<div class = "info">How a Glock Works</div>
</label>
</div>
<div class = "cont-checkbox">
<input type = "checkbox" id = "myCheckbox-2" />
<label for = "myCheckbox-2">
<img
src = "https://www.mattrittman.com/wp-content/uploads/2024/08/ar15-thumb.jpg"
/>
<span class = "cover-checkbox">
<svg viewBox = "0 0 12 10">
<polyline points = "1.5 6 4.5 9 10.5 1"></polyline>
</svg>
</span>
<div class = "info">How an AR-15 Works</div>
</label>
</div>
<div class = "cont-checkbox">
<input type = "checkbox" id = "myCheckbox-3" />
<label for = "myCheckbox-3">
<img
src = "https://www.mattrittman.com/wp-content/uploads/2024/08/gas-system-thumb.jpg"
/>
<span class = "cover-checkbox">
<svg viewBox = "0 0 12 10">
<polyline points = "1.5 6 4.5 9 10.5 1"></polyline>
</svg>
</span>
<div class = "info">AR-15 Gas System</div>
</label>
</div>
<div class = "cont-checkbox">
<input type = "checkbox" id = "myCheckbox-4" />
<label for = "myCheckbox-4">
<img
src = "https://www.mattrittman.com/wp-content/uploads/2024/08/revolver-thumb.jpg"
/>
<span class = "cover-checkbox">
<svg viewBox = "0 0 12 10">
<polyline points = "1.5 6 4.5 9 10.5 1"></polyline>
</svg>
</span>
<div class = "info">How a Revolver Works</div>
</label>
</div>
<div class = "cont-checkbox">
<input type = "checkbox" id = "myCheckbox-5" />
<label for = "myCheckbox-5">
<img
src = "https://www.mattrittman.com/wp-content/uploads/2024/08/shotgun-thumb.jpg"
/>
<span class = "cover-checkbox">
<svg viewBox = "0 0 12 10">
<polyline points = "1.5 6 4.5 9 10.5 1"></polyline>
</svg>
</span>
<div class = "info">How a Shotgun Works</div>
</label>
</div>
<div class = "cont-checkbox">
<input type = "checkbox" id = "myCheckbox-6" />
<label for = "myCheckbox-6">
<img
src = "https://www.mattrittman.com/wp-content/uploads/2024/08/kar98k-thumb.jpg"
/>
<span class = "cover-checkbox">
<svg viewBox = "0 0 12 10">
<polyline points = "1.5 6 4.5 9 10.5 1"></polyline>
</svg>
</span>
<div class = "info">How a Kar98k Works</div>
</label>
</div>
<div class = "cont-checkbox">
<input type = "checkbox" id = "myCheckbox-7" />
<label for = "myCheckbox-7">
<img
src = "https://www.mattrittman.com/wp-content/uploads/2024/08/ak47-thumb.jpg"
/>
<span class = "cover-checkbox">
<svg viewBox = "0 0 12 10">
<polyline points = "1.5 6 4.5 9 10.5 1"></polyline>
</svg>
</span>
<div class = "info">How an AK-47 Works</div>
</label>
</div>
<div class = "cont-checkbox">
<input type = "checkbox" id = "myCheckbox-8" />
<label for = "myCheckbox-8">
<img
src = "https://www.mattrittman.com/wp-content/uploads/2024/08/ac-thumb.jpg"
/>
<span class = "cover-checkbox">
<svg viewBox = "0 0 12 10">
<polyline points = "1.5 6 4.5 9 10.5 1"></polyline>
</svg>
</span>
<div class = "info">How A/C Works</div>
</label>
</div>
</div>
</div>
Вот код, который генерирует CF7:
<span class = "wpcf7-form-control-wrap" data-name = "videos">
<span class = "wpcf7-form-control wpcf7-checkbox wpcf7-validates-as-required">
<span class = "wpcf7-list-item">
<label>
<input type = "checkbox" name = "videos[]" value = "How a Glock Works" />
<span class = "wpcf7-list-item-label">How a Glock Works</span>
</label>
</span>
<span class = "wpcf7-list-item">
<label>
<input type = "checkbox" name = "videos[]" value = "How an AR-15 Works" />
<span class = "wpcf7-list-item-label">How an AR-15 Works</span>
</label>
</span>
<span class = "wpcf7-list-item">
<label>
<input type = "checkbox" name = "videos[]" value = "AR-15 Gas System" />
<span class = "wpcf7-list-item-label">AR-15 Gas System</span>
</label>
</span>
<span class = "wpcf7-list-item">
<label>
<input type = "checkbox" name = "videos[]" value = "How a Revolver Works" />
<span class = "wpcf7-list-item-label">How a Revolver Works</span>
</label>
</span>
<span class = "wpcf7-list-item">
<label>
<input type = "checkbox" name = "videos[]" value = "How a Shotgun Works" />
<span class = "wpcf7-list-item-label">How a Shotgun Works</span>
</label>
</span>
<span class = "wpcf7-list-item">
<label>
<input type = "checkbox" name = "videos[]" value = "How a Kar98k Works" />
<span class = "wpcf7-list-item-label">How a Kar98k Works</span>
</label>
</span>
<span class = "wpcf7-list-item">
<label>
<input type = "checkbox" name = "videos[]" value = "How an AK-47 Works" />
<span class = "wpcf7-list-item-label">How an AK-47 Works</span>
</label>
</span>
<span class = "wpcf7-list-item">
<label>
<input type = "checkbox" name = "videos[]" value = "How Air Conditioning Works" />
<span class = "wpcf7-list-item-label">How Air Conditioning Works</span>
</label>
</span>
</span>
</span>
🤔 А знаете ли вы, что...
С помощью HTML можно встраивать виджеты социальных сетей и плагины для обмена контентом.
Помните, что это, по сути, упражнение по стилизации. Вы хотите оформить флажки CF7 так, чтобы они выглядели красиво. Но, конечно, правила стиля красивых флажков построены вокруг HTML-структуры этих флажков. Итак, первая задача — изменить структуру HTML формы CF7, чтобы она максимально соответствовала красивой структуре.
Если вы отключите опцию «Обернуть каждый элемент элементом метки» при создании флажков (или удалите опцию use_label_element
из сгенерированного тега флажка CF7), полученный HTML-код будет очень близок по структуре к коду, который представляет ваш красивый флажки. Изучите это сравнение:
Структура CF7
<span class = "wpcf7-form-control-wrap" data-name = "checkbox-889">
<span class = "wpcf7-form-control wpcf7-checkbox">
<span class = "wpcf7-list-item first">
<input type = "checkbox" name = "checkbox-889[]" value = "one">
<span class = "wpcf7-list-item-label">one</span>
</span>
<span class = "wpcf7-list-item">
<input type = "checkbox" name = "checkbox-889[]" value = "two">
<span class = "wpcf7-list-item-label">two</span>
</span>
<span class = "wpcf7-list-item last">
<input type = "checkbox" name = "checkbox-889[]" value = "three">
<span class = "wpcf7-list-item-label">three</span>
</span>
</span>
</span>
Красивая структура
<div class = "cont-main">
<div class = "cont-checkbox">
<input type = "checkbox" id = "myCheckbox-1" />
<label for = "myCheckbox-1"> ... </label>
</div>
<div class = "cont-checkbox">
<input type = "checkbox" id = "myCheckbox-2" />
<label for = "myCheckbox-2"> ... </label>
</div>
<div class = "cont-checkbox">
<input type = "checkbox" id = "myCheckbox-3" />
<label for = "myCheckbox-3"> ... </label>
</div>
</div>
Проблема в том, что CF7 в этом сценарии не генерирует элементы <label>
, а генерирует <span class = "wpcf7-list-item-label">
. Когда <label>
связан с флажком, щелчок по метке переключает флажок — это важно для правильной работы красивых флажков, но <span>
, сгенерированный CF7, этого не сделает. Я могу придумать два возможных решения, оба из которых требуют Javascript: либо (а) преобразовать <span>
в <label>
, либо (б) добавить прослушиватель событий щелчка к внешнему элементу-оболочке, который определяет, когда нажат один из <span class = "wpcf7-list-item-label">
. и переключает соответствующий флажок. Вот фрагмент, демонстрирующий первое из этих решений:
const checkboxes = document.querySelectorAll('[data-name=checkbox-889] .wpcf7-list-item')
checkboxes.forEach(cb => {
const i = cb.querySelector('input')
i.id = `cb889-${i.value}` /* assign the checkbox a unique id */
const l = cb.querySelector('.wpcf7-list-item-label')
const nl = [] /* array for the <label> markup */
nl.push(`<label for = "${i.id}" class = "wpcf7-list-item-label">`)
nl.push(l.innerHTML) /* copy the content from the <span> */
nl.push('</label>')
l.insertAdjacentHTML('afterend', nl.join('')) /* insert the <label> */
l.remove() /* remove the <span> */
})
label {
-webkit-user-select: none;
user-select: none;
}
<p>Click on the label to toggle the corresponding checkbox</p>
<span class = "wpcf7-form-control-wrap" data-name = "checkbox-889">
<span class = "wpcf7-form-control wpcf7-checkbox">
<span class = "wpcf7-list-item first">
<input type = "checkbox" name = "checkbox-889[]" value = "one">
<span class = "wpcf7-list-item-label">one</span>
</span>
<span class = "wpcf7-list-item">
<input type = "checkbox" name = "checkbox-889[]" value = "two">
<span class = "wpcf7-list-item-label">two</span>
</span>
<span class = "wpcf7-list-item last">
<input type = "checkbox" name = "checkbox-889[]" value = "three">
<span class = "wpcf7-list-item-label">three</span>
</span>
</span>
</span>
Как только все будет отсортировано, следующей задачей будет замена (с помощью редактора форм CF7) содержимого каждого из элементов .wpcf7-list-item-label
содержимым меток из красивых флажков — <img>
, <svg>
и <div>
(хотя вам придется замените <div>
на <span>
).
Тогда остается просто добавить несколько селекторов к уже имеющимся правилам стиля, чтобы они применялись и к структуре CF7. Так, например, возьмем следующее правило стиля:
.cont-checkbox label {
display: inline-block;
cursor: pointer;
border-radius: var(--border-radius);
overflow: hidden;
width: 100%;
height: 100%;
position: relative;
opacity: 0.6;
}
Эквивалентным селектором для структуры CF7 будет .wpcf7-list-item-label .wpcf7-list-item-label
, поэтому вам просто нужно изменить селектор в правиле стиля на:
.cont-checkbox label, .wpcf7-list-item-label .wpcf7-list-item-label {
...
}