Блок отзывов о дизайн-проекте для Tilda
Плитки отзывов владельцев квартир и домов: объект и площадь, стиль, срок проекта, отметка о бюджете комплектации и текст, с фильтром по стилю.
<section class="vbodp2">
<div class="vbodp2-wrap">
<div class="vbodp2-head">
<h2 class="vbodp2-h2">Владельцы про работу над проектом</h2>
<p class="vbodp2-lead">Отзывы собираем через месяц после того, как альбом передан и начался ремонт. Рядом с каждым указан объект, стиль и как сошёлся бюджет комплектации.</p>
<div class="vbodp2-filter" id="vbodp2-filter" role="group" aria-label="Отбор отзывов по стилю"></div>
</div>
<div class="vbodp2-grid" id="vbodp2-grid"></div>
<p class="vbodp2-empty" id="vbodp2-empty" hidden>По этому стилю отзывов пока нет.</p>
</div>
</section>
<style>
.vbodp2, .vbodp2 *, .vbodp2 *::before, .vbodp2 *::after { box-sizing: border-box; }
.vbodp2 {
--acc: #9a7b53; --ink: #26231e; --muted: #7a736a; --line: #e6e0d6; --soft: #f7f4ef; --ok: #5f7d5a;
--f: var(--t-text-font, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif);
--fh: var(--t-headline-font, var(--f));
background: #fff; color: var(--ink); font-family: var(--f); padding: clamp(38px, 5.4vw, 88px) 20px;
}
.vbodp2-wrap { max-width: 1220px; margin: 0 auto; padding: 0 clamp(0px, 2vw, 36px); }
.vbodp2-head { margin-bottom: clamp(22px, 3vw, 34px); }
.vbodp2-h2 { font-family: var(--fh); font-size: clamp(26px, 3.4vw, 40px); line-height: 1.1; font-weight: 600; letter-spacing: -.02em; margin: 0 0 12px; max-width: 20em; }
.vbodp2-lead { font-size: 16px; line-height: 1.62; color: var(--muted); margin: 0 0 22px; max-width: 44em; }
.vbodp2-filter { display: flex; flex-wrap: wrap; gap: 8px; }
.vbodp2-chip { border: 1px solid var(--line); margin: 0; padding: 10px 18px; -webkit-appearance: none; appearance: none;
font: inherit; font-size: 14px; cursor: pointer; border-radius: 999px; background: #fff !important; color: var(--muted) !important;
transition: border-color .18s ease, color .18s ease; }
.vbodp2-chip:hover { border-color: var(--acc); color: var(--ink) !important; }
.vbodp2-chip--on { border-color: var(--acc) !important; background: var(--acc) !important; color: #fff !important; }
.vbodp2-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(290px, 1fr)); gap: 14px; }
.vbodp2-card { border: 1px solid var(--line); border-radius: 8px; padding: 24px 26px; display: flex; flex-direction: column; }
.vbodp2-top { display: flex; align-items: center; gap: 12px; margin-bottom: 16px; }
.vbodp2-ava { flex: 0 0 42px; width: 42px; height: 42px; border-radius: 50%; background: var(--soft); display: flex; align-items: center;
justify-content: center; font-family: var(--fh); font-size: 16px; font-weight: 600; color: var(--acc); }
.vbodp2-nm { display: block; font-size: 15.5px; font-weight: 600; }
.vbodp2-ob { display: block; font-size: 12.5px; color: var(--muted); margin-top: 3px; }
.vbodp2-tags { display: flex; flex-wrap: wrap; gap: 7px; margin-bottom: 14px; }
.vbodp2-tags i { font-style: normal; font-size: 12px; color: var(--muted); background: var(--soft); border-radius: 4px; padding: 6px 11px; }
.vbodp2-tags i.vbodp2-ok { color: var(--ok); background: rgba(95,125,90,.1); }
.vbodp2-tags i.vbodp2-over { color: #97643f; background: rgba(151,100,63,.1); }
.vbodp2-txt { margin: 0; font-size: 15px; line-height: 1.65; color: var(--muted); }
.vbodp2-empty { margin: 20px 0 0; font-size: 15px; color: var(--muted); }
@media (prefers-reduced-motion: reduce) { .vbodp2 * { transition: none !important; } }
</style>
<script>
(function () {
var STYLES = ['Минимализм', 'Сканди', 'Современная классика', 'Мягкий лофт'];
var REVIEWS = [
{ name: 'Ирина Л.', obj: 'Двушка 62 м², вторичка', style: 'Сканди', term: 'проект 5 недель', budget: 0,
txt: 'Больше всего боялась, что нам нарисуют красивую картинку, а жить в ней будет неудобно. Планировку переделывали четыре раза, пока не сошлись на варианте с гардеробной вместо кладовки. Комплектацию собрали в таблицу с ценами, и по итогу вышли ровно в ту сумму, которую обсуждали в начале.' },
{ name: 'Павел и Анна', obj: 'Дом 180 м², два этажа', style: 'Мягкий лофт', term: 'проект 9 недель', budget: 7,
txt: 'Дом со вторым светом и лестницей посередине, поэтому проект делали дольше обычного. Отдельно ценю развёртки: плиточник работал по ним и не задал ни одного вопроса. Бюджет комплектации подрос на семь процентов, но из-за нашей же замены дивана на более дорогой.' },
{ name: 'Марина К.', obj: 'Студия 34 м², новостройка', style: 'Минимализм', term: 'проект 4 недели', budget: 0,
txt: 'На 34 метрах важен каждый сантиметр. Хранение спрятали в подиум и высокие шкафы до потолка, визуально квартира осталась пустой. Приятно, что дизайнер сразу отговорил от острова на кухне и объяснил, почему проход станет узким.' },
{ name: 'Сергей В.', obj: 'Трёшка 88 м², вторичка', style: 'Современная классика', term: 'проект 8 недель', budget: 4,
txt: 'Заказывали проект с авторским надзором. Выезды были каждую неделю, замечания приходили списком с фотографиями, бригада их закрывала. Один раз спорили из-за высоты подвесного потолка, решили в нашу пользу после расчёта по вентиляции.' },
{ name: 'Ольга Т.', obj: 'Двушка 54 м², новостройка', style: 'Сканди', term: 'проект 5 недель', budget: 0,
txt: 'Визуализацию правили три круга, и никто не намекал, что пора остановиться. Дуб в отделке заменили на более светлый оттенок уже после согласования, переделали спокойно. Ремонт идёт по чертежам, расхождений пока не нашли.' },
{ name: 'Дмитрий Н.', obj: 'Дом 145 м², каркасный', style: 'Мягкий лофт', term: 'проект 7 недель', budget: 12,
txt: 'Проект получился сильный, но комплектация вышла дороже плана: кирпич ручной формовки подорожал, пока мы согласовывали остальное. Студия предложила два аналога дешевле, мы отказались сами. Претензий к работе нет, сроки выдержали до дня.' },
{ name: 'Екатерина Ж.', obj: 'Квартира 96 м², апартаменты', style: 'Современная классика', term: 'проект 8 недель', budget: 0,
txt: 'Хотели классику без золота и лепнины. Дизайнер показал референсы, договорились на молдинги и латунь в фурнитуре. Ведомость мебели оказалась удобнее всего: с ней в салонах разговор занимал десять минут вместо двух часов.' },
{ name: 'Артём Б.', obj: 'Однушка 41 м², вторичка', style: 'Минимализм', term: 'проект 4 недели', budget: 3,
txt: 'Брал только планировочное решение, без визуализации. Получил обмерный план, три расстановки и финальный вариант с размерами. Для моего случая этого хватило, а чертежи по электрике докупил отдельно уже в процессе ремонта.' }
];
var roots = document.querySelectorAll('.vbodp2');
for (var i = 0; i < roots.length; i++) init(roots[i]);
function init(root) {
if (root.__vb) return; root.__vb = 1;
var grid = root.querySelector('#vbodp2-grid'), filter = root.querySelector('#vbodp2-filter');
var empty = root.querySelector('#vbodp2-empty');
var cur = 'all', h = '<button type="button" class="vbodp2-chip vbodp2-chip--on" data-s="all">Все объекты<\/button>';
for (var j = 0; j < STYLES.length; j++) {
h += '<button type="button" class="vbodp2-chip" data-s="' + STYLES[j] + '">' + STYLES[j] + '<\/button>';
}
filter.innerHTML = h;
var chips = filter.querySelectorAll('.vbodp2-chip');
for (var k = 0; k < chips.length; k++) {
chips[k].onclick = function () { cur = this.getAttribute('data-s'); draw(); };
}
function badge(r) {
if (!r.budget) return '<i class="vbodp2-ok">в бюджет комплектации уложились<\/i>';
return '<i class="vbodp2-over">комплектация дороже плана на ' + r.budget + '%<\/i>';
}
function draw() {
var out = '', shown = 0;
for (var m = 0; m < REVIEWS.length; m++) {
var r = REVIEWS[m];
if (cur !== 'all' && r.style !== cur) continue;
shown++;
out += '<article class="vbodp2-card"><div class="vbodp2-top">' +
'<span class="vbodp2-ava">' + r.name.charAt(0) + '<\/span>' +
'<span><b class="vbodp2-nm">' + r.name + '<\/b><span class="vbodp2-ob">' + r.obj + '<\/span><\/span><\/div>' +
'<div class="vbodp2-tags"><i>' + r.style + '<\/i><i>' + r.term + '<\/i>' + badge(r) + '<\/div>' +
'<p class="vbodp2-txt">' + r.txt + '<\/p><\/article>';
}
grid.innerHTML = out;
empty.hidden = shown > 0;
for (var n = 0; n < chips.length; n++) {
var on = chips[n].getAttribute('data-s') === cur;
chips[n].className = on ? 'vbodp2-chip vbodp2-chip--on' : 'vbodp2-chip';
}
}
draw();
}
})();
</script> Вставляется целиком в блок T123 «HTML-код». Внутри уже есть стили и скрипт, подключать ничего не нужно.
Как вставить блок в Tilda
- Скопируйте кодКнопка «Скопировать код» выше кладёт всё содержимое в буфер обмена.
- Добавьте блок T123В редакторе страницы: «Библиотека блоков» → «Другое» → T123 «HTML-код».
- Вставьте и сохранитеНажмите «Контент», вставьте код в поле, сохраните и обновите страницу.
- ОпубликуйтеВ превью скрипты Tilda работают не всегда — проверяйте на опубликованной странице.
Подробная инструкция с граблями — как вставить вайб-блок в Tilda.
Что менять под себя
| Где в коде | За что отвечает |
|---|---|
массив REVIEWS в начале скрипта | имя, объект с площадью, стиль, срок проекта, бюджет и текст отзыва |
массив STYLES | набор кнопок отбора над плитками |
поле budget у отзыва | ноль означает попадание в бюджет, число процент превышения |
--acc, --ok и --soft в стилях | цвет активной кнопки отбора, отметки о бюджете и фона плашек |
Отзывы о дизайн-проекте: зачем он нужен
Отзыв о дизайн-проекте убеждает, когда рядом с текстом стоят параметры объекта. В каждой плитке указаны имя, тип жилья с площадью, стиль, срок работы над проектом и отдельная отметка о бюджете комплектации: уложились или вышли дороже плана и на сколько процентов. Такая отметка работает лучше общих слов, потому что показывает и удачные случаи, и превышения с объяснением причины.
Над плитками стоит строка отбора по стилю: минимализм, сканди, современная классика и мягкий лофт. При выборе стиля сетка перерисовывается, а если подходящих отзывов нет, показывается короткая подпись вместо пустого места. Отзывы лежат в массиве REVIEWS, стили для фильтра в массиве STYLES, поле budget с нулём означает попадание в бюджет. Плитки выстраиваются по три в ряд на широком экране и в одну колонку на телефоне.
Вопросы по этому блоку
-
Поставьте в поле budget значение ноль, тогда в плитке появится зелёная отметка. Любое другое число выводится как процент превышения и красится в тёплый оттенок.
-
Да, удалите из разметки элемент с идентификатором vbodp2-filter, а в скрипте закомментируйте сборку кнопок. Все отзывы будут показаны сразу, остальная логика продолжит работать.
-
Ограничения нет, сетка растёт вниз. Восемь плиток выглядят уместно, при большем количестве лучше оставить часть на отдельной странице и увести туда ссылкой.
-
Да. Код на этой странице копируется целиком, без регистрации и подписки. Указывать авторство не нужно, использовать можно в коммерческих проектах.
-
Нет. Все классы внутри имеют собственный префикс vbodp2, поэтому не пересекаются ни со стилями Tilda, ни с другими блоками. Скрипт привязан к своему элементу и запускается один раз, даже если блок вставлен дважды.
-
Раскладка перестраивается под узкие экраны, размеры заданы через clamp, поля ввода имеют шрифт 16 пикселей — iOS не будет зумить страницу при фокусе. Отдельной мобильной версии подключать не нужно.
Другие блоки отзывов
Ещё блоки для студий дизайна интерьера
Собрать сайт целиком
Дровосеки делают сайты на Tilda под ключ: структура, тексты, дизайн, вёрстка и вайб-блоки под задачи бизнеса. Как это выглядит для ниши «Дизайн интерьера», видно на отдельной странице.