Задать вопрос директору
Telegram
VK
Звонок

Блок отзывов доверителей для сайта юриста

Шесть историй по одной схеме: обращение, итог на тёмной плашке и срок ведения. Первые четыре видны сразу, остальные открываются кнопкой.

Живое демо — блок работает прямо здесь

Код блока

<section class="vbodv">
  <div class="vbodv-wrap">
    <div class="vbodv-head">
      <h2 class="vbodv-h2">Что говорят доверители</h2>
      <p class="vbodv-lead">Каждая история описана по одной схеме: с чем человек пришёл, чем дело закончилось и сколько времени заняло. Имена сокращены по просьбе доверителей, замените карточки на свои.</p>
    </div>

    <div class="vbodv-grid" id="vbodv-grid"></div>

    <div class="vbodv-foot">
      <button type="button" class="vbodv-more" id="vbodv-more">Показать ещё истории</button>
      <p class="vbodv-warn">Каждое дело решается по своим обстоятельствам и доказательствам. Описанные исходы относятся к конкретным ситуациям и не означают такого же результата по другому делу.</p>
    </div>
  </div>
</section>

<style>
.vbodv, .vbodv *, .vbodv *::before, .vbodv *::after { box-sizing: border-box; }
.vbodv {
  --acc: #46586b; --acc-dark: #354554; --ink: #1f242a; --muted: #5c6673; --line: #dfe3e7; --soft: #f3f5f7; --deep: #262c33;
  --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(36px, 5vw, 82px) 20px;
}
.vbodv-wrap { max-width: 1180px; margin: 0 auto; padding: 0 clamp(0px, 2vw, 40px); }
.vbodv-head { max-width: 46em; margin-bottom: clamp(22px, 3vw, 36px); }
.vbodv-h2 { font-family: var(--fh); font-size: clamp(26px, 3.4vw, 40px); line-height: 1.12; font-weight: 600; letter-spacing: -.02em; margin: 0 0 12px; }
.vbodv-lead { font-size: 16px; line-height: 1.65; color: var(--muted); margin: 0; }

.vbodv-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(310px, 1fr)); gap: clamp(12px, 1.4vw, 18px); align-items: start; }
.vbodv-card { display: flex; flex-direction: column; border: 1px solid var(--line); border-radius: 4px; padding: clamp(20px, 2.2vw, 26px);
  opacity: 0; transform: translateY(12px); transition: opacity .45s ease, transform .45s cubic-bezier(.22,1,.36,1); }
.vbodv-card.is-in { opacity: 1; transform: none; }
.vbodv-card.is-hid { display: none; }

.vbodv-top { display: flex; align-items: center; gap: 12px; padding-bottom: 16px; border-bottom: 1px solid var(--line); margin-bottom: 16px; }
.vbodv-ini { flex: 0 0 44px; width: 44px; height: 44px; border-radius: 4px; display: flex; align-items: center; justify-content: center;
  font-family: var(--fh); font-size: 15px; font-weight: 600; letter-spacing: .02em; background: var(--soft); color: var(--acc); }
.vbodv-name { display: block; font-size: 15.5px; font-weight: 600; line-height: 1.25; }
.vbodv-cat { display: block; font-size: 12.5px; color: var(--muted); margin-top: 4px; }

.vbodv-lab { display: block; font-size: 10.5px; letter-spacing: .09em; text-transform: uppercase; color: #98a1ab; margin-bottom: 6px; }
.vbodv-in { margin: 0 0 16px; font-size: 14.5px; line-height: 1.62; color: var(--muted); }
.vbodv-out { margin: 0 0 16px; background: var(--deep); border-radius: 4px; padding: 15px 17px; flex: 1; }
.vbodv-out .vbodv-lab { color: #8d98a4; }
.vbodv-out p { margin: 0; font-size: 14.5px; line-height: 1.62; color: #eef1f4; }
.vbodv-meta { display: flex; flex-wrap: wrap; gap: 6px 18px; }
.vbodv-meta div { font-size: 12.5px; color: var(--muted); }
.vbodv-meta b { display: block; font-size: 14px; font-weight: 600; color: var(--ink); margin-top: 3px; }

.vbodv-foot { margin-top: clamp(20px, 2.4vw, 28px); }
.vbodv-more { -webkit-appearance: none; appearance: none; cursor: pointer; font: inherit; font-size: 15px; font-weight: 600;
  min-height: 50px; padding: 0 26px; border: 1px solid var(--line); border-radius: 4px;
  background: #fff !important; color: var(--ink) !important; transition: .18s ease; }
.vbodv-more:hover { border-color: var(--acc); color: var(--acc) !important; }
.vbodv-more[hidden] { display: none; }
.vbodv-warn { margin: 16px 0 0; font-size: 12.5px; line-height: 1.65; color: var(--muted); max-width: 62em; }

@media (prefers-reduced-motion: reduce) {
  .vbodv-card { opacity: 1 !important; transform: none !important; transition: none !important; }
  .vbodv-more { transition: none !important; }
}
</style>

<script>
(function () {
  var SHOWN = 4;   /* сколько карточек видно до нажатия кнопки */

  /* ── ИСТОРИИ ДЕЛ ── */
  var CASES = [
    { name: 'Николай Т.', cat: 'Трудовой спор', term: '4 месяца', end: 'октябрь',
      inp: 'Уволили по сокращению, выплатили оклад за месяц и отказались считать квартальную премию, которая была в положении об оплате.',
      out: 'После претензии и двух заседаний работодатель доплатил премию и компенсацию за задержку выплаты.' },
    { name: 'Мария К.', cat: 'Раздел имущества', term: '5 месяцев', end: 'июль',
      inp: 'Совместная квартира в ипотеке, бывший супруг перестал вносить платежи, договориться напрямую не выходило.',
      out: 'Стороны подписали соглашение о разделе до заседания по существу, ипотека переоформлена на одного собственника.' },
    { name: 'Семья Л.', cat: 'Жилищный спор', term: '3 месяца', end: 'март',
      inp: 'Залив квартиры сверху, управляющая компания и соседи перекладывали вину друг на друга, ремонт стоял.',
      out: 'Провели независимую оценку, виновник определён экспертизой, ущерб возмещён по мировому соглашению.' },
    { name: 'Производственная компания', cat: 'Спор по договору поставки', term: '7 месяцев', end: 'декабрь',
      inp: 'Поставщик сорвал сроки на два месяца и отказывался признавать неустойку, ссылаясь на формулировку в договоре.',
      out: 'Суд первой инстанции согласился с расчётом неустойки, решение устояло в апелляции.' },
    { name: 'Ирина В.', cat: 'Наследственное дело', term: '6 месяцев', end: 'май',
      inp: 'Срок принятия наследства пропущен из-за болезни, второй наследник уже оформил долю на себя.',
      out: 'Срок восстановлен через суд, доли перераспределены, запись в реестре изменена.' },
    { name: 'Артём Д.', cat: 'Взыскание по расписке', term: '4 месяца', end: 'сентябрь',
      inp: 'Заём под расписку без процентов, должник перестал отвечать через полгода после срока возврата.',
      out: 'Долг взыскан судебным приказом, деньги поступили на этапе исполнительного производства.' }
  ];

  var roots = document.querySelectorAll('.vbodv');
  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('#vbodv-grid'), more = root.querySelector('#vbodv-more');

    grid.innerHTML = CASES.map(function (c, n) {
      var w = c.name.split(' ');
      var ini = (w[0].charAt(0) + (w[1] ? w[1].charAt(0) : w[0].charAt(1))).toUpperCase();
      return '<article class="vbodv-card' + (n >= SHOWN ? ' is-hid' : '') + '">' +
        '<div class="vbodv-top"><span class="vbodv-ini">' + ini + '<\/span>' +
        '<span><b class="vbodv-name">' + c.name + '<\/b><span class="vbodv-cat">' + c.cat + '<\/span><\/span><\/div>' +
        '<p class="vbodv-in"><span class="vbodv-lab">С чем обратились<\/span>' + c.inp + '<\/p>' +
        '<div class="vbodv-out"><span class="vbodv-lab">Чем закончилось<\/span><p>' + c.out + '<\/p><\/div>' +
        '<div class="vbodv-meta"><div>Срок ведения<b>' + c.term + '<\/b><\/div>' +
        '<div>Дело завершено<b>' + c.end + '<\/b><\/div><\/div><\/article>';
    }).join('');

    var cards = Array.prototype.slice.call(grid.querySelectorAll('.vbodv-card'));
    var hidden = cards.length - SHOWN;
    if (hidden <= 0) more.hidden = true;
    else more.textContent = 'Показать ещё ' + hidden + (hidden === 1 ? ' историю' : hidden < 5 ? ' истории' : ' историй');

    more.addEventListener('click', function () {
      more.hidden = true;
      for (var n = SHOWN; n < cards.length; n++) {
        cards[n].classList.remove('is-hid');
        (function (el, d) { setTimeout(function () { el.classList.add('is-in'); }, d); })(cards[n], (n - SHOWN) * 70);
      }
    });

    function show(card, n) { card.style.transitionDelay = Math.min(n, 5) * 70 + 'ms'; card.classList.add('is-in'); }
    function showAll() { cards.forEach(show); }

    if (!('IntersectionObserver' in window)) { showAll(); return; }
    var io = new IntersectionObserver(function (es) {
      es.forEach(function (e) {
        if (!e.isIntersecting) return;
        show(e.target, cards.indexOf(e.target));
        io.unobserve(e.target);
      });
    }, { rootMargin: '0px 0px -8% 0px' });
    cards.forEach(function (c) { io.observe(c); });
    setTimeout(showAll, 2500);
  }
})();
</script>

Вставляется целиком в блок T123 «HTML-код». Внутри уже есть стили и скрипт, подключать ничего не нужно.

Как вставить блок в Tilda

  1. Скопируйте кодКнопка «Скопировать код» выше кладёт всё содержимое в буфер обмена.
  2. Добавьте блок T123В редакторе страницы: «Библиотека блоков» → «Другое» → T123 «HTML-код».
  3. Вставьте и сохранитеНажмите «Контент», вставьте код в поле, сохраните и обновите страницу.
  4. ОпубликуйтеВ превью скрипты Tilda работают не всегда — проверяйте на опубликованной странице.

Подробная инструкция с граблями — как вставить вайб-блок в Tilda.

Что менять под себя

Где в кодеЗа что отвечает
массив CASES в начале скриптаимена, категории дел, тексты и сроки
SHOWNсколько карточек видно до нажатия кнопки
--acc и --deepцвет монограммы и тёмной плашки с итогом
текст оговорки под сеткойформулировка про зависимость исхода от обстоятельств

Отзывы доверителей: зачем он нужен

Отзыв в юридической нише работает, когда из него понятна ситуация и её развитие. Общие слова про внимательность ничего не добавляют, а связка «с чем пришли и чем закончилось» показывает, с какими делами фирма работает на самом деле. Срок ведения закрывает ещё один частый вопрос: сколько это длится. Под сеткой стоит оговорка о том, что исход зависит от обстоятельств конкретного дела.

Истории лежат в массиве CASES: имя, категория, две реплики и срок ведения. Монограмма собирается из имени, отдельную картинку готовить не нужно. Число видимых карточек задаёт переменная SHOWN, остальные открываются кнопкой со склонением по числу. Палитра графитовая, углы почти прямые, поэтому блок читается строго и подходит юридическому сайту.

Вопросы по этому блоку

  • Поставьте в SHOWN число, равное длине массива CASES, и кнопка спрячется сама. Больше ничего править не нужно.

  • Так принято в юридической практике: доверители редко соглашаются на полное имя рядом с описанием дела. Поле name принимает любой вариант, включая название компании.

  • Категория берётся из поля cat и выводится под именем обычным текстом. Готового списка нет, поэтому достаточно вписать нужную формулировку.

  • Да. Код на этой странице копируется целиком, без регистрации и подписки. Указывать авторство не нужно, использовать можно в коммерческих проектах.

  • Нет. Все классы внутри имеют собственный префикс vbodv, поэтому не пересекаются ни со стилями Tilda, ни с другими блоками. Скрипт привязан к своему элементу и запускается один раз, даже если блок вставлен дважды.

  • Раскладка перестраивается под узкие экраны, размеры заданы через clamp, поля ввода имеют шрифт 16 пикселей — iOS не будет зумить страницу при фокусе. Отдельной мобильной версии подключать не нужно.

Другие блоки отзывов

Ещё блоки для юристов и финансов

Собрать сайт целиком, а не по блокам

Дровосеки делают сайты на Tilda под ключ: структура, тексты, дизайн, вёрстка и вайб-блоки под задачи бизнеса.