Первый экран для сайта поставщика промышленного оборудования
Главный экран поставщика: оффер про подбор и отгрузку со склада, ссылка на подбор по параметрам, три цифры со счётчиком и панель с лентой отгрузок за день.
<section class="vbpp">
<div class="vbpp-wrap">
<div class="vbpp-main">
<span class="vbpp-tag">Поставки промышленного оборудования с 2011 года</span>
<h1 class="vbpp-h1">Подберём оборудование под задачу и <span>отгрузим со склада в день оплаты</span></h1>
<p class="vbpp-lead">Компрессорное, насосное, подъёмное и складское оборудование, запасные части и расходные материалы. Работаем по договору и счёту, собираем партию с одного склада и передаём перевозчику в тот же день.</p>
<div class="vbpp-acts">
<a class="vbpp-btn" href="#podbor">Подобрать по параметрам</a>
<a class="vbpp-link" href="#usloviya">Условия отгрузки и оплаты</a>
</div>
<ul class="vbpp-nums">
<li><b data-num="12400">0</b><span>позиций на складе: оборудование, запчасти, расходные материалы</span></li>
<li><b data-num="860">0</b><span>отгрузок в месяц по России и Казахстану</span></li>
<li><b data-num="14">0</b><span>лет поставляем оборудование для производств и складов</span></li>
</ul>
</div>
<aside class="vbpp-board">
<div class="vbpp-board__top">
<h2 class="vbpp-board__ttl">Отгрузки за сегодня</h2>
<span class="vbpp-board__live"><i aria-hidden="true"></i>склад на связи</span>
</div>
<div class="vbpp-cols"><span>Позиция</span><span>Партия</span><span>Куда</span></div>
<ul class="vbpp-feed" id="vbpp-feed"></ul>
<p class="vbpp-note">Счёт закрыт до 15:00 по московскому времени, партия уезжает в этот же день. Оплата позже - отгрузка утром следующего рабочего дня.</p>
</aside>
</div>
</section>
<style>
.vbpp, .vbpp *, .vbpp *::before, .vbpp *::after { box-sizing: border-box; }
.vbpp {
--acc: #e0721f; --acc-dark: #bd5c13; --bg: #12171c; --panel: #1a2128; --line: #2b343d;
--ink: #eef2f5; --muted: #93a1ad; --ok: #6fbf73;
--f: var(--t-text-font, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif);
--fh: var(--t-headline-font, var(--f));
background: var(--bg); color: var(--ink); font-family: var(--f); padding: clamp(36px, 5vw, 84px) 20px;
}
.vbpp-wrap { max-width: 1240px; margin: 0 auto; padding: 0 clamp(0px, 2vw, 40px);
display: grid; grid-template-columns: minmax(0, 1.08fr) minmax(0, .92fr); gap: clamp(26px, 4vw, 54px); align-items: start; }
.vbpp-tag { display: inline-block; font-size: 12.5px; letter-spacing: .04em; text-transform: uppercase;
color: var(--acc); border: 1px solid var(--line); border-radius: 999px; padding: 7px 15px; margin-bottom: 20px; }
.vbpp-h1 { font-family: var(--fh); font-size: clamp(29px, 4.1vw, 52px); line-height: 1.08; font-weight: 700; letter-spacing: -.022em; margin: 0 0 18px; }
.vbpp-h1 span { color: var(--acc); }
.vbpp-lead { font-size: clamp(15.5px, 1.3vw, 18px); line-height: 1.62; color: var(--muted); margin: 0 0 28px; max-width: 33em; }
.vbpp-acts { display: flex; flex-wrap: wrap; align-items: center; gap: 12px 22px; margin-bottom: 34px; }
.vbpp-btn, .vbpp-btn:link, .vbpp-btn:visited, .vbpp-btn:active, .vbpp-btn:focus { display: inline-flex; align-items: center; justify-content: center;
min-height: 56px; padding: 0 30px; border-radius: 10px; font-size: 16px; font-weight: 600;
background: var(--acc); color: #14181c !important; text-decoration: none !important; transition: background .2s ease; }
.vbpp-btn:hover { background: var(--acc-dark); color: #fff !important; }
.vbpp-link, .vbpp-link:link, .vbpp-link:visited, .vbpp-link:active, .vbpp-link:focus { font-size: 15px; color: var(--ink) !important;
text-decoration: none !important; border-bottom: 1px solid var(--line); padding-bottom: 2px; }
.vbpp-link:hover { border-bottom-color: var(--acc); }
.vbpp-nums { list-style: none; margin: 0; padding: 0; display: grid; grid-template-columns: repeat(auto-fit, minmax(170px, 1fr)); gap: 20px; }
.vbpp-nums li { border-top: 2px solid var(--acc); padding-top: 14px; }
.vbpp-nums b { display: block; font-family: var(--fh); font-size: clamp(27px, 3.2vw, 38px); line-height: 1; font-weight: 700; letter-spacing: -.02em; }
.vbpp-nums span { display: block; font-size: 13px; line-height: 1.5; color: var(--muted); margin-top: 8px; }
.vbpp-board { background: var(--panel); border: 1px solid var(--line); border-radius: 18px; padding: clamp(20px, 2.4vw, 28px); }
.vbpp-board__top { display: flex; align-items: center; gap: 12px; margin-bottom: 18px; }
.vbpp-board__ttl { font-family: var(--fh); font-size: 19px; line-height: 1.25; font-weight: 700; margin: 0; }
.vbpp-board__live { margin-left: auto; display: inline-flex; align-items: center; gap: 7px; font-size: 12px; color: var(--muted); }
.vbpp-board__live i { width: 8px; height: 8px; border-radius: 50%; background: var(--ok); animation: vbpp-blink 2.2s ease-in-out infinite; }
@keyframes vbpp-blink { 0%, 100% { opacity: 1; } 50% { opacity: .25; } }
.vbpp-cols, .vbpp-row { display: grid; grid-template-columns: minmax(0, 1fr) 74px 96px; gap: 10px; align-items: center; }
.vbpp-cols { font-size: 11px; letter-spacing: .05em; text-transform: uppercase; color: #6d7b88; padding: 0 0 9px; border-bottom: 1px solid var(--line); }
.vbpp-cols span:nth-child(2), .vbpp-cols span:nth-child(3) { text-align: right; }
.vbpp-feed { list-style: none; margin: 0; padding: 0; min-height: 244px; }
.vbpp-row { padding: 13px 0; border-bottom: 1px solid var(--line); font-size: 14px; animation: vbpp-in .4s cubic-bezier(.22,1,.36,1); }
.vbpp-row__d { display: block; font-size: 11.5px; color: #6d7b88; margin-top: 3px; }
.vbpp-row__q, .vbpp-row__c { text-align: right; font-size: 13px; color: var(--muted); }
.vbpp-row__s { display: block; font-weight: 600; font-size: 11px; letter-spacing: .03em; color: var(--acc); margin-top: 3px; }
.vbpp-row--done .vbpp-row__s { color: var(--ok); }
@keyframes vbpp-in { from { opacity: 0; transform: translateY(-10px); } to { opacity: 1; transform: none; } }
.vbpp-note { margin: 16px 0 0; font-size: 12px; line-height: 1.55; color: #6d7b88; }
@media (max-width: 940px) { .vbpp-wrap { grid-template-columns: minmax(0, 1fr); } }
@media (max-width: 560px) {
.vbpp-h1 { font-size: clamp(25px, 7vw, 33px); }
.vbpp-cols, .vbpp-row { grid-template-columns: minmax(0, 1fr) 62px 84px; }
}
@media (prefers-reduced-motion: reduce) { .vbpp *, .vbpp *::before { animation: none !important; transition: none !important; } }
</style>
<script>
(function () {
/* ЛЕНТА ОТГРУЗОК: наименование, партия, город, состояние */
var FEED = [
{ n: 'Компрессор винтовой 7,5 кВт', d: 'с ресивером 500 л', q: '2 шт', c: 'Казань', s: 'отгружено' },
{ n: 'Насос консольный 45 куб. м/ч', d: 'с рамой и муфтой', q: '4 шт', c: 'Пермь', s: 'в сборке' },
{ n: 'Стеллаж паллетный', d: 'секция 3 яруса', q: '40 сек', c: 'Тверь', s: 'отгружено' },
{ n: 'Полуавтомат сварочный 350 А', d: 'с горелкой 3 м', q: '6 шт', c: 'Ростов', s: 'отгружено' },
{ n: 'Подшипники по каталогу', d: 'сборная партия', q: '320 шт', c: 'Липецк', s: 'в сборке' },
{ n: 'Таль электрическая 3 т', d: 'высота подъёма 12 м', q: '1 шт', c: 'Омск', s: 'отгружено' },
{ n: 'Тележка гидравлическая 2,5 т', d: 'вилы 1150 мм', q: '12 шт', c: 'Иваново', s: 'отгружено' },
{ n: 'Фильтроэлементы к компрессорам', d: 'годовой запас', q: '96 шт', c: 'Уфа', s: 'в сборке' }
];
var VISIBLE = 5, PAUSE = 2800;
var roots = document.querySelectorAll('.vbpp');
for (var i = 0; i < roots.length; i++) init(roots[i]);
function init(root) {
if (root.__vb) return; root.__vb = 1;
var feed = root.querySelector('#vbpp-feed');
var nums = root.querySelectorAll('.vbpp-nums b');
var pos = 0, timer = null;
var calm = window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches;
function fmt(n) { return String(n).replace(/\B(?=(\d{3})+(?!\d))/g, ' '); }
function rowHtml(it) {
var done = it.s === 'отгружено';
return '<li class="vbpp-row' + (done ? ' vbpp-row--done' : '') + '">' +
'<span class="vbpp-row__n">' + it.n + '<span class="vbpp-row__d">' + it.d + '<\/span><\/span>' +
'<span class="vbpp-row__q">' + it.q + '<\/span>' +
'<span class="vbpp-row__c">' + it.c + '<span class="vbpp-row__s">' + it.s + '<\/span><\/span><\/li>';
}
function paint() {
var html = '';
for (var k = 0; k < VISIBLE; k++) html += rowHtml(FEED[(pos + k) % FEED.length]);
feed.innerHTML = html;
}
function step() { pos = (pos + 1) % FEED.length; paint(); }
function start() { if (!timer && !calm) timer = setInterval(step, PAUSE); }
function stop() { if (timer) { clearInterval(timer); timer = null; } }
paint();
feed.addEventListener('mouseenter', stop);
feed.addEventListener('mouseleave', start);
start();
function count(el) {
var to = +el.getAttribute('data-num') || 0, t0 = 0;
if (calm) { el.textContent = fmt(to); return; }
function tick(ts) {
if (!t0) t0 = ts;
var p = Math.min(1, (ts - t0) / 1100);
el.textContent = fmt(Math.round(to * (1 - Math.pow(1 - p, 3))));
if (p < 1) requestAnimationFrame(tick);
}
requestAnimationFrame(tick);
}
function all() { for (var j = 0; j < nums.length; j++) count(nums[j]); }
if (!('IntersectionObserver' in window)) { all(); return; }
var io = new IntersectionObserver(function (es) {
for (var j = 0; j < es.length; j++) if (es[j].isIntersecting) { all(); io.disconnect(); return; }
}, { rootMargin: '0px 0px -12% 0px' });
io.observe(root);
setTimeout(all, 2600);
}
})();
</script> Вставляется целиком в блок T123 «HTML-код». Внутри уже есть стили и скрипт, подключать ничего не нужно.
Как вставить блок в Tilda
- Скопируйте кодКнопка «Скопировать код» выше кладёт всё содержимое в буфер обмена.
- Добавьте блок T123В редакторе страницы: «Библиотека блоков» → «Другое» → T123 «HTML-код».
- Вставьте и сохранитеНажмите «Контент», вставьте код в поле, сохраните и обновите страницу.
- ОпубликуйтеВ превью скрипты Tilda работают не всегда — проверяйте на опубликованной странице.
Подробная инструкция с граблями — как вставить вайб-блок в Tilda.
Что менять под себя
| Где в коде | За что отвечает |
|---|---|
текст h1 и абзац под ним | оффер и перечень того, что вы поставляете |
data-num у трёх цифр | числа, до которых доходят счётчики |
массив FEED в начале скрипта | позиции, размеры партий, города и состояния в ленте |
переменные VISIBLE и PAUSE | сколько строк видно и как часто лента сменяется |
href у кнопки и ссылки | адреса страницы подбора и раздела с условиями |
текст vbpp-note | правило отсечки по времени оплаты |
Первый экран поставщика оборудования: зачем он нужен
Закупщик заходит на сайт поставщика с двумя вопросами: есть ли нужная позиция на складе и когда она уедет. Блок отвечает на оба в первом же экране. Слева стоит заголовок, абзац про то, что именно поставляется, две ссылки на подбор и на условия отгрузки. Ниже идут три цифры: позиций на складе, отгрузок в месяц и лет работы. Значения набегают от нуля, когда полоса попадает в экран.
Справа лежит панель с лентой отгрузок: наименование, размер партии, город и состояние заказа. Строки сменяются раз в несколько секунд, при наведении лента останавливается, чтобы можно было дочитать. Данные лежат в массиве FEED в начале скрипта, туда подставляются свои позиции и города. Палитра тёмная, графит с сигнальным оранжевым, форм внутри нет, целевое действие сделано ссылкой.
Вопросы по этому блоку
-
Задайте PAUSE большое значение или удалите вызов start в конце функции инициализации. Первые пять строк отрисуются один раз и останутся на месте.
-
Да. На корне блока поменяйте --bg и --panel на светлые оттенки, --ink на тёмный, --line на светло-серый. Оранжевый акцент читается и на белом фоне.
-
В скрипте есть запасной путь: если IntersectionObserver недоступен, цифры проставляются сразу. Через 2,6 секунды они выставляются в любом случае.
-
Да. Код на этой странице копируется целиком, без регистрации и подписки. Указывать авторство не нужно, использовать можно в коммерческих проектах.
-
Нет. Все классы внутри имеют собственный префикс vbpp, поэтому не пересекаются ни со стилями Tilda, ни с другими блоками. Скрипт привязан к своему элементу и запускается один раз, даже если блок вставлен дважды.
-
Раскладка перестраивается под узкие экраны, размеры заданы через clamp, поля ввода имеют шрифт 16 пикселей — iOS не будет зумить страницу при фокусе. Отдельной мобильной версии подключать не нужно.
Другие главные экраны
Ещё блоки для поставок оборудования
Собрать сайт целиком, а не по блокам
Дровосеки делают сайты на Tilda под ключ: структура, тексты, дизайн, вёрстка и вайб-блоки под задачи бизнеса.