Табы в Zero-блоке

Вы никогда не хотели сделать меню с табами самостоятельно? Именно в том стиле, в котором нужно именно вам, а не в том, который предлагают стандартные блоки Тильды «ME602: Вкладки с цветом фона» и «ME603: Вкладки с обводкой снизу». А ещё не ограничивать себя 8 вкладками. Или сколько там сейчас у Тильды? Раньше вообще было 5. Создавайте хоть 100 вкладок!

Посмотрите пример, чтобы убедиться, что это возможно, проверить, как это работает, а затем возвращайтесь и настраивайте модификацию под себя.

Инструкция:
  1. Создайте Zero-блок с кнопками в качестве вкладок.
  2. Задайте всем кнопкам один и тот же класс (например, tab).
  3. Задайте каждой кнопке собственную ссылку с одинаковым началом, но разными числами после (например, #tab1, #tab2, #tab3 и т. д.).
  4. Настройте в форме ниже дизайн активной вкладки.
  5. Напишите номер активной вкладки. Если нужно все скрыть и не выбирать активную, напишите «0» (ноль).
  6. Пропишите ID скрываемых блоков через запятую или задайте всем группам блоков одинаковые классы (например, для первой группы — .uc-hide-tab1, для второй группы — .uc-hide-tab2 и т. д.). Таким образом таб № 1 при нажатии покажет прописанные напротив него ID или классы (например, .uc-hide-tab1, если вы прописали его), таб № 2 покажет прописанные ему (тот же .uc-hide-tab2) и так далее.
  7. Вставьте соответствующую информацию в форму ниже.
  8. Скопируйте полученный код и поместите его в блок T123. Сам блок разместите под всеми задействованными в модификации блоками (а лучше вообще в самом низу).
<!-- Табы в Zero-блоке | https://necodim.ru/tilda/zero-tabs -->
<script>
document.addEventListener('DOMContentLoaded', function() {
    const blocks = [
        ['#tab1', '.uc-hide-tab1'],
        ['#tab2', '.uc-hide-tab2']
    ];
    
    function getBlock(link) {
        for (i in blocks) {
            if (link == blocks[i][0]) { return blocks[i][1] }
        }
    }

    for (i in blocks) {
        document.querySelectorAll(blocks[i][1]).forEach(block => { block.style.display = 'none' })
        document.querySelectorAll(`[href="${blocks[i][0]}"]`).forEach(tab => {
            tab.addEventListener('click', e => {
                e.preventDefault();
                document.querySelectorAll('.active').forEach(node => { node.classList.remove('active') });
                e.target.classList.add('active');
                for (i in blocks) {
                    document.querySelectorAll(blocks[i][1]).forEach(block => { block.style.display = 'none' });
                }
                document.querySelectorAll(getBlock(e.target.hash)).forEach(block => { block.style.display = 'block' });
                t_lazyload_update();
                window.dispatchEvent(new Event('resize'));
            });
        });
    }
    document.querySelectorAll(blocks[1][1]).forEach(block => { block.style.display = 'block' });
    document.querySelector('.tab [href="' + blocks[1][0] + '"]').classList.add('active');
});
</script>

<style>
.uc-hide-tab1,
.uc-hide-tab2 {display: none;}
.tab .active {
    color: #222222 !important;
    background-color: #ffcc00 !important;
    border: 2px solid #ffcc00 !important;
}
</style>

Кастомизация страницы списка групп (список ресурсов) личного кабинета

Как же давно мы все мечтали о возможности кастомизации страницы со списком групп в личном кабинете. Сейчас она называется «Список ресурсов». С недавних пор это стало возможным благодаря тому, что Тильда позволила добавлять хэдер и футер к этой странице.

Отныне вы можете:
  • добавлять фоновое изображение страницы;
  • выбирать цвет или фоновое изображение блока со списком групп;
  • изменять цвет текста, ссылок и иконок рядом с ними;
  • задавать размеры контейнера и окна с группами;
  • пропускать эту страницу при логине и вести на какую-то конкретную.

Инструкция:
  1. Создайте отдельную страницу для футера, если у вас её ещё нет. Мы будем использовать именно её для размещения кода. Также вы можете использовать свой стандартный футер сайта.
  2. Перейдите в Настройки → Личный кабинет → Управление пользователями (или просто ткните на странице дашборда в кнопку «ЛК») → Настройки личного кабинета → Настройки проекта → Выбрать шапку и подвал.
  3. Там в разделе «Выбрать подвал (Footer)» выберите футер сайта или созданный в п. 1.
  4. Выберите необходимые настройки в форме ниже.
  5. Скопируйте полученный код и вставьте в блок T123. Сам блок разместите в футере, который выбрали на предыдущем шаге.
  6. Опубликуйте все страницы проекта.

Если вы хотите изменить содержание футера на страницах в личном кабинете, то не забывайте нажимать кнопку «Сохранить» в настройках личного кабинета. Если это не помогает, то можно пойти более длинным путём:
  1. Сначала перейдите в Настройки → Личный кабинет → Управление пользователями (или просто ткните на странице дашборда в кнопку «ЛК») → Настройки личного кабинета → Настройки проекта → Выбрать шапку и подвал.
  2. В футере выберите пункт «Не выбрано».
  3. Опубликуйте все страницы сайта (можно только в корневой папке).
  4. Измените содержимое футера.
  5. Прицепите снова футер к страницам личного кабинета.
  6. Опубликуйте все страницы.

  1. Посмотреть реальный пример можно только на странице со списком групп, если вы состоите в нескольких группах. Но у нас на сайте получить доступ к другим группам просто так невозможно, поэтому вы можете просто протестировать скрипт у себя. Однако вы можете взглянуть на скриншот кастомизированной страницы.
<!-- Кастомизация страницы списка групп личного кабинета | https://necodim.ru/tilda/custom-members-page -->

<style>
.tlk-resources {
    padding: 90px 0 90px;
    color: #ffcc00;
    background-color: #222222;
}
.tlk-resources__container {
    max-width: 560px;
}
.tlk-resources__wrap {
    padding: 40px 30px 40px 30px;
/*background-image: url(https://static.tildacdn.com/tild6132-3537-4131-a337-613563326266/necodim-pattern_tran.svg);*/
    background-color: #ffffff;
    border: 0px solid #000000;
    border-radius: 40px;
}
.tlk-resources__courses, .tlk-resources__groups {
    margin-bottom: 45px;
}
.tlk-resources__item + .tlk-resources__item {
    margin-top: 15px;
}
.tlk-resources__title {
    color: #ffcc00;
    font-weight: 500;
    font-size: 24px;
}
.tlk-resources__title span {
    color: #999999;
    font-weight: 300;
    font-size: 14px;
}
#allrecords [data-field="tlk-link"], [data-field="tlk-link"] {
    color: #ffcc00 !important;
}
#allrecords [data-field="tlk-link"]:hover, [data-field="tlk-link"]:hover {
    color: #999900 !important;
    opacity: 1 !important;
}
.tlk-resources__groups-title-link-icon .st0 {
    stroke: #222222;
}
</style>

Хлебные крошки для товаров

Каждый разработчик сайтов на Тильде однажды сталкивается с вопросом: «А как мне сделать хлебные крошки для товаров? Неужели придётся делать под каждый товар отдельную страницу?»

Не придётся. С этой модификацией вы сможете сделать автоматические хлебные крошки в товаре и на странице со всеми товарами, если выбрана какая-то конкретная категория.

Инструкция непростая, поэтому поделена на 3 шага:
  1. Сбор всех категорий
  2. Создание хлебных крошек для товара
  3. Создание хлебных крошек для страницы каталога

  1. Рекомендуем просмотреть видео, в котором подробно рассказывается, как правильно создать хлебные крошки.
https://www.youtube.com/watch?v=vHBIFUEB_h4&embeds_referring_euri=https%3A%2F%2Fnecodim.ru%2F&source_ve_path=Mjg2NjY&feature=emb_logo

Для начала вам необходимо собрать все категории в массив. Не переживайте, это просто.
  1. Создайте новую страницу (в последствии она станет хэдером для товаров).
  2. Создайте ещё одну страницу для каталога товаров (или перейдите на существующую). Добавьте туда блок ST320N, зайдите в «Контент» и в параметре «Выводить товары из каталога» выберите «Все товары из каталога».
  3. Перейдите в каталог товаров и пропишите все категории.
  4. Для каждого товара пропишите категории.
  5. Если у товара несколько категорий, то на 1 место поставьте ту категорию, которую хотите видеть в хлебных крошках.
  6. Откройте настройки каталога и выберите созданную в п. 1 страницу в качестве хэдера. Не забудьте поставить галочку «Открывать страницу вместо попапа».
  7. Вернитесь на созданную страницу с каталогом товаров, опубликуйте и перейдите на неё, дождитесь полной загрузки товаров.
  8. Откройте консоль разработчика (как это сделать?), пропишите ниже ссылку на открытую страницу и вставьте скрипт, представленный ниже, и нажмите клавишу Enter.
var link = 'https://necodim.ru/';
var storeParts = new Array();
var partsSwitchWrapper = document.querySelector('.t-store__parts-switch-wrapper');
var partElements = partsSwitchWrapper.querySelectorAll('.js-store-parts-switcher');
var catalogIdNum = partsSwitchWrapper.closest('.t-rec').id;
partElements.forEach(part => {
    var obj = new Object();
    obj.id = part.dataset.storepartUid;
    obj.name = part.textContent;
    obj.link = obj.name !== 'Все' ? encodeURI(`${link}?tfc_storepartuid[${catalogIdNum.replace('rec', '')}]=${obj.name}&tfc_div=:::`) : link;
    storeParts.push(obj);
});
copy(storeParts);
После того, как вы всё это проделаете, к вам в буфер обмена скопируется массив всех существующих категорий товаров. Он будет выглядеть примерно так:
[
    {
        "id": "553805324601",
        "name": "Все",
        "link": "http://necodim.ru/"
    },
    {
        "id": "505348925141",
        "name": "Одежда",
        "link": "http://necodim.ru/?tfc_storepartuid%5B592653248%5D=%D0%9E%D0%B4%D0%B5%D0%B6%D0%B4%D0%B0&tfc_div=:::"
    },
    {
        "id": "369752901891",
        "name": "Обувь",
        "link": "http://necodim.ru/?tfc_storepartuid%5B592653248%5D=%D0%9E%D0%B1%D1%83%D0%B2%D1%8C&tfc_div=:::"
    }
]
Здесь вы видите массив из трёх объектов, которые содержат параметры id, name, link. У вас их может быть гораздо больше (количество объектов зависит от числа ваших категорий).

Вставьте текст из буфера обмена в любой текстовый редактор, чтобы не потерять. Там же замените в 4 строке слово «Все» на слово или выражение, которое хотите видеть в хлебных крошках для перехода к странице с каталогом всех товаров (например «Все товары». Это же слово / выражение нужно будет использовать в формах ниже. Это важно, иначе модификация не будет работать.

Кстати, блок ST320N теперь можно заменить каким-то другим для отображения всех товаров.

Шаг №2: Создание хлебных крошек для товара

Дальше всё немного проще:
  1. В форме ниже выберите, хотите ли вы отображать ссылку на главную страницу сайта.
  2. Введите слово / выражение для пункта «Все», которое использовали в первом шаге.
  3. Введите символ для разделителя хлебных крошек (например, стрелочку или косую черту).
  4. Снова скопируйте из текстового редактора массив и вставьте в форму.
  5. Скопируйте полученный код и вставьте его в блок T123 на странице хэдера товара (вы её создали в п. 1 предыдущего шага).
  6. Не забудьте в настройках блока с кодом выбрать ширину блока (100% или 12 колонок), цвет фона и отступы сверху / снизу.
  7. Опубликуйте страницу со всеми товарами, чтобы увидеть изменения.
<!-- Хлебные крошки для товаров | https://necodim.ru/tilda/product-breadcrumbs -->

<div id="necodim-breadcrumbs" class="ncdm-breadcrumbs t-text"><a href="/" class="ncdm-breadcrumb">Главная</a></div>

<style>
.ncdm-breadcrumbs {
    display: inline-block;
}
.ncdm-breadcrumb {
    display: inline-block;
}
.ncdm-breadcrumb:not(:last-child)::after {
    content: '→';
    margin: 0 20px;
}
.ncdm-breadcrumb:last-child {
    font-weight: 700;
    text-decoration: underline;
}
</style>

<script>
const storeParts = [];

const getPart = (key, value) => {
    const obj = storeParts.find(item => item[key] === value);
    return obj;
}

const addBreadcrumb = (data) => {
    const breadcrumb = document.createElement('a');
    breadcrumb.classList.add('ncdm-breadcrumb');
    if (data.id) breadcrumb.dataset.partUid = data.id;
    if (data.name) breadcrumb.innerHTML = data.name;
    if (data.link) breadcrumb.href = data.link;
    breadcrumbs.appendChild(breadcrumb);
}

const breadcrumbs = document.getElementById('necodim-breadcrumbs');
addBreadcrumb(getPart('name', 'Все'));

document.addEventListener('DOMContentLoaded', () => {
    setTimeout(() => {
        const product = document.querySelector('.js-store-product');
        const parts = product.dataset.productPartUid.split(',');
        addBreadcrumb(getPart('id', parts[0]));
        let prodData = {
            'name': product.querySelector('.js-store-prod-name').textContent,
            'link': window.location.href
        }
        addBreadcrumb(prodData);
    }, 500);
});
</script>

Шаг №3: Создание хлебных крошек для страницы каталога

Последний шаг самый простой, т.к. практически полностью повторяет предыдущий, а нужен и вовсе только тем, кто хочет отображать хлебные крошки на странице каталога со всеми товарами (созданной на первом шаге в п. 2).

Будьте внимательны, изменения полей в этой форме приведут к изменению данных в коде выше. Если вы ещё его не скопировали и не вставили на страницу, сделайте это. Если не хотите менять никакие данные, сразу переходите к пункту 5.

А теперь приступим:
  1. В форме ниже выберите, хотите ли вы отображать ссылку на главную страницу сайта.
  2. Введите слово / выражение для пункта «Все», которое использовали в первом шаге.
  3. Введите символ для разделителя хлебных крошек (например, стрелочку или косую черту).
  4. Снова скопируйте из текстового редактора массив и вставьте в форму.
  5. Скопируйте полученный код и вставьте его в блок T123 на странице с каталогом всех товаров (вы её создали в п. 2 шага № 1) над самим каталогом.
  6. Не забудьте в настройках блока с кодом выбрать ширину блока (100% или 12 колонок), цвет фона и отступы сверху / снизу.
  7. Опубликуйте страницу со всеми товарами, чтобы увидеть изменения.
Массив объектов, полученный на предыдущем шаге
<!-- Хлебные крошки для страницы каталога товаров | https://necodim.ru/tilda/product-breadcrumbs -->

<div id="necodim-breadcrumbs" class="ncdm-breadcrumbs t-text"><a href="/" class="ncdm-breadcrumb">Главная</a></div>

<style>
.ncdm-breadcrumbs {
    display: inline-block;
}
.ncdm-breadcrumb {
    display: inline-block;
}
.ncdm-breadcrumb:not(:last-child)::after {
    content: '→';
    margin: 0 20px;
}
.ncdm-breadcrumb:last-child {
    font-weight: 700;
    text-decoration: underline;
}
</style>

<script>
const storeParts = [];

const getPart = (key, value) => {
    const obj = storeParts.find(item => item[key] === value);
    return obj;
}

const addBreadcrumb = (data) => {
    const breadcrumb = document.createElement('a');
    breadcrumb.classList.add('ncdm-breadcrumb');
    if (data.id) breadcrumb.dataset.partUid = data.id;
    if (data.name) breadcrumb.innerHTML = data.name;
    if (data.link) breadcrumb.href = data.link;
    breadcrumbs.appendChild(breadcrumb);
}

const addPart = () => {
    const url = decodeURI(window.location.href);
    const urlParams = new URLSearchParams(window.location.search);
    const regex = /tfc_storepartuid\[(\d+)\]/gi;
    const match = url.match(regex);
    if (match) {
        setTimeout(() => {
            const name = urlParams.get(match[0]);
            addBreadcrumb(getPart('name', name));
        }, 20);
    }
}

const changePart = () => {
    breadcrumbs.childNodes.forEach((element, index) => index > 1 ? element.remove() : false);
    addPart();
}

const breadcrumbs = document.getElementById('necodim-breadcrumbs');
addBreadcrumb(getPart('name', 'Все'));
addPart();
document.addEventListener('DOMContentLoaded', () => {
    document.querySelector('.js-store-grid-cont').addEventListener('tStoreRendered', () => {
        setTimeout(() => {
            document.querySelectorAll('.js-store-parts-switcher').forEach(partsSwitcher => {
                partsSwitcher.addEventListener('click', changePart);
            });
        }, 50);
    });
});
</script>

Аккордеон в несколько колонок на разной ширине экрана

Базово в Тильде есть возможность создать аккордеоны даже в 12 колонок. Но, во-первых, они будут работать неправильно, если в одной колонке будет больше одной раскрывающейся карточки, а во-вторых, вы не сможете один и тот же блок сделать с разным количеством колонок на разных разрешениях.

Долгое время все пользовались модификацией, позволяющей делать 2 колонки. Однако теперь появилось ультимативное решение, позволяющее сделать сколько угодно колонок, и их количество на разных экранах будет разным. А ещё можно здесь же настроить ширину самого контейнера: 12 колонок или 100% с отступами по краям. Посмотрите сами в примере, как это работает. Попробуйте уменьшить или увеличить страницу, чтобы посмотреть, как изменится количество колонок.

Инструкция:
  1. Добавьте на страницу блок с аккордеоном. Подойдут только TX16N или TX16N2.
  2. Добавьте блоку класс (например, .uc-accordion). Как это сделать, читайте тут.
  3. Настройте блок по своему усмотрению. Ширина колонок и отступ не имеют значения, т.к. эти параметры будут удалены.
  4. В настройках ниже напишите, сколько колонок должно отображаться на каждом разрешении. Breakpoint — это ширина экрана от которой будет действовать данная настройка. Если больше нет брейкпоинта, то настройка будет действовать для всех экранов, ширина которых будет больше или равна последнему брейкпоинту.
  5. Скопируйте полученный код в блок T123. Сам блок разместите под аккордеоном или внизу страницы.

  1. P. S. Изначально в настройках указано шесть брейкпоинтов (300, 480, 640, 960, 1200, 1920) — это стандартные брейкпоинты Тильды + дополнительный в 1920px. Если вам нужно будет другое количество брейкпоинтов, вы можете в полученном коде дописать новые по тому же принципу или стереть ненужные.
<!-- Аккордеон в несколько колонок на разной ширине экрана | https://necodim.ru/tilda/accordion-columns -->

<script>
const necodimAccrodionSettings = {
    breakpoint: [
        {
            screen: 300,
            cols: 1
        }, {
            screen: 480,
            cols: 2
        }, {
            screen: 640,
            cols: 3
        }, {
            screen: 960,
            cols: 4
        }, {
            screen: 1200,
            cols: 5
        }, {
            screen: 1920,
            cols: 6
        }
    ]
}

const necodimCountColumns = () => {
    const bodyWidth = document.body.offsetWidth;
    let cols;
    necodimAccrodionSettings.breakpoint.forEach((breakpoint, index) => {
        const isLast = index === necodimAccrodionSettings.breakpoint.length - 1;
        const isBetween = bodyWidth >= breakpoint.screen && (isLast || bodyWidth < necodimAccrodionSettings.breakpoint[index + 1].screen);
        if (isBetween) {
            cols = breakpoint.cols;
        }
    });
    return cols;
}

const necodimResizeAccordionColumns = (n) => {
    let bw = document.body.offsetWidth
    let cw = Math.floor(document.querySelector('.uc-accordion .t-container').offsetWidth / n);
    let columns = document.querySelectorAll('.accordion-column');
    columns.forEach(column => {
        column.style.width = cw + 'px';
        let accordions = column.querySelectorAll('.t-col');
        accordions.forEach(accordion => {
            accordion.style.paddingLeft = '';
            accordion.style.paddingRight = '';
            if (bw >= 1200) {
                accordion.style.width = cw - 40 + 'px';
            } else if (960 <= bw && bw < 1200) {
                accordion.style.width = cw - 20 + 'px';
            } else if (640 <= bw && bw < 960) {
                accordion.style.width = '100%';
            } else {
                accordion.style.width = cw - 20 + 'px';
                accordion.style.paddingLeft = '10px';
                accordion.style.paddingRight = '10px';
            }
        });
    });
}

const necodimCreateColumns = (n) => {
    let a = Array.from(document.querySelectorAll('.uc-accordion .t-col')),
        l = a.length;
    let oldColumns = document.querySelectorAll('.accordion-column');
    if (Array.from(oldColumns).length > 0) oldColumns.forEach(column => column.classList.add('old'));
    for (let i = 0; i < n; i++) {
        let column = document.createElement('div');
        column.classList.add('accordion-column');
        column.dataset.accordionColumn = i;
        let accordionsInColumn = a.slice(Math.ceil(l / n * i), Math.ceil(l / n * (i + 1)));
        accordionsInColumn[0].closest('.t-container').appendChild(column);
        accordionsInColumn.forEach(accordion => {
            column.appendChild(accordion);
            accordion.classList.remove('t-col_1', 't-col_2', 't-col_3', 't-col_4', 't-col_5', 't-col_6', 't-col_7', 't-col_8', 't-col_9', 't-col_10', 't-col_11', 't-col_12', 't-prefix_1', 't-prefix_2', 't-prefix_3', 't-prefix_4', 't-prefix_5', 't-prefix_6', 't-prefix_7', 't-prefix_8', 't-prefix_9', 't-prefix_10', 't-prefix_11', 't-prefix_12');
        });
    }
    oldColumns = document.querySelectorAll('.accordion-column.old');
    if (Array.from(oldColumns).length > 0) oldColumns.forEach(column => column.remove());
    necodimResizeAccordionColumns(n);
}

document.addEventListener('DOMContentLoaded', () => {
    necodimCreateColumns(necodimCountColumns());
});

window.addEventListener('resize', (() => {
    setTimeout((() => {
        necodimCreateColumns(necodimCountColumns());
    }), 300);
}));
</script>

<style>
@media screen and (max-width: 640px) {
    .uc-accordion .t-container {
        margin: 0 10px;
    }
}
</style>

Увеличение изображения в Zero-блоке при наведении в рамках своих границ

Обычное увеличение картинки в Зеро-блоке можно сделать с помощью step-by-step анимации. Но что, если хочется добиться другого эффекта: когда вы наводите на изображение, размер изначальной области изображения не меняется, но при этом оно увеличивается (или уменьшается).

Эта инструкция поможет легко и быстро добиться желаемого результата. Работает как с изображением, так и с шейпом.

  1. Задайте класс для изображения img-zoom. Как задать класс читайте тут.
  2. Задайте размер увеличения / уменьшения (исчисляется в процентах).
  3. Выберите скорость увеличения / уменьшения (исчисляется в миллисекундах).
  4. Если необходимо, укажите радиус скругления изображения (исчисляется в пикселях).
  5. Скопируйте полученных код и вставьте в блок Т123 или в html-элемент в самом Zero-блоке.
<!-- Увеличение изображения в Zero-блоке при наведении в рамках своих границ | https://necodim.ru/tilda/image-zoom-on-hover -->
<style>
.img-zoom {
    border-radius: 20px;
    overflow: hidden;
}
.img-zoom .tn-atom {
    border-radius: 20px;
    transition: transform 200ms ease-in-out;
}
.img-zoom:hover .tn-atom {
    transform: scale(115%);
}
</style>

Меню второго уровня из Zero-блока по клику или наведению

Есть в интернете несколько инструкций, как сделать меню второго уровня из Zero-блока. Однако во всех подобных инструкциях нужно прописывать ID. А если у вас таких меню несколько? Под каждое нужно писать кучу кода. Бр-р-р.

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

https://www.youtube.com/watch?v=GCTIN-oRvsk&embeds_referring_euri=https%3A%2F%2Fnecodim.ru%2F&source_ve_path=Mjg2NjY&feature=emb_logo

Инструкция:
  1. Создайте кнопки в Zero-блоке, которое будет являться вашим меню, для вызова меню второго уровня.
  2. Расположите кнопки по слоям, где на нижнем слое будет первая кнопка, на верхнем слое последняя.
  3. Задайте всем кнопкам класс, например, menu-btn.
  4. Задайте каждой кнопке собственную ссылку с одинаковым началом, например, #menu1, #menu2, #menu3 и т. д.
  5. Укажите высоту основного меню (в пикселях).
  6. Пропишите класс для основного меню (Zero-блока с кнопками), например, uc-menu.
  7. Создайте и задизайните столько Zero-блоков, сколько меню второго уровня вам нужно.
  8. Расставьте их в порядке, в котором у вас стоят сами кнопки. Т. е., если кнопка #menu1, вызывающая меню второго уровня № 1 самая первая, то и блок с вызываемым меню второго уровня № 1 должен находиться выше остальных.
  9. Для каждого блока с меню второго уровня задайте класс, например, uc-menu-sub, отличающийся от остальных классов блоков на сайте.
  10. Введите все параметры в форму ниже и настройте цвета для активной кнопки
  11. Скопируйте получившийся код и вставьте его в блок Т123 под все участвующие в модификации блоки.
<!-- Меню второго уровня из Zero-блока по клику или наведению | https://necodim.ru/tilda/menu-sub -->
<style>
.uc-menu {
    position: absolute;
    top: 0;
    left: 0;
    z-index: 999999;
    width: 100%;
}
.uc-menu-sub .t396__artboard {
    position: absolute;
    top: 80px;
    left: 0;
    z-index: 999998;
    opacity: 0;
    pointer-events: none;
    transform: translateY(-2000px);
    transition: opacity .2s ease-in;
}
.uc-menu-sub .t396__artboard.active {
    pointer-events: all !important;
    transform: translateY(0px) !important;
    opacity: 1;
}
.menu-btn.active .tn-atom {
    color: #222222 !important;
    background-color: #ffcc00 !important;
    border-color: #ffcc00 !important;
}
</style>

<script>
$(function() {
    let menu = $('.uc-menu'),
        menuBtn = menu.find('.menu-btn'),
        menuBtnLink = '#menu',
        menuSub = $('.uc-menu-sub'),
        menuSubArtboard = menuSub.find('.t396__artboard'),
        menuSubWrapper;
    
    for (let i=0; i<menuSub.length; i++) {
        $(menuSub[i]).find('.t396__elem').wrapAll('<div class="menu-sub">');
    }
    menuSubWrapper = $('.menu-sub');
    
    function menuSubOpen(e) {
        e.preventDefault();
        menuBtn.removeClass('active');
        menuSubArtboard.removeClass('active');
        let n = parseInt($(e.target).attr('href').replace(menuBtnLink, ''), 10) - 1;
        $(menuBtn[n]).addClass('active');
        $(menuSub[n]).find('.t396__artboard').addClass('active');
        t_lazyload_update();
    }
    
    function menuSubClose(e) {
        e.preventDefault();
        menuBtn.removeClass('active');
        menuSubArtboard.removeClass('active');
    }
    // menuBtn.hover(e => menuSubOpen(e));
    menuBtn.click(e => menuSubOpen(e));
    menuSubWrapper.mouseleave(e => menuSubClose(e));
    menuSubArtboard.mouseleave(e => menuSubClose(e));
    $(window).scroll(e => menuSubClose(e));
});
</script>

Скругление углов у видео

Как порой не хватает такой простой настройки в Тильде, не правда ли? Но не стоит поддаваться унынию, у вас есть Necodim :)

Просто выберите тип блока, задайте радиус скругления углов и копируйте полученный код. Его можно вставить сразу в CSS всего сайта, чтобы не добавлять стили на каждой страничке.
<!-- Cкругление углов у видео | https://necodim.ru/tilda/video-border-radius -->
<style>
.t121 *:not(.t-text, .t-descr) {
    border-radius: 15px;
}
</style>

Эффект при наведении на элемент в Zero-блоке

Мы привыкли, что при наведении на ссылку появляется подчёркивание. А в Zero-блоке даже этого нет, если выставить текстовому элементу ссылку в настройках. А что, если подчеркивание не просто будет появляться, но и станет цветным или градиентным, а также анимированным — появление подчёркивания начнётся в том месте, в котором вы навели мышкой на элемент?

Хм. А если подумать, то можно не только подчёркивание сделать, но и заливку всего элемента. Сложно представить… проще показать! Поэтому листайте в самый низ страницы и попробуйте навести на каждый элемент.

Если вы всё поняли, то вот простая инструкция:
  1. Задайте элементу Zero-блока класс и впишите этот класс в настройки ниже.
  2. Выберите остальные опции.
  3. Скопируйте код и вставьте его в блок T123 под Zero-блоком.
<!-- Эффект при наведении на элемент в Zero-блоке | https://necodim.ru/tilda/zero-element-hover -->
<style>
.my-class {
    text-decoration: none;
    transition: opacity 300ms cubic-bezier(0.51, 0.92, 0.24, 1);
}
.my-class::after {
    --scale: 0;
    content: "";
    position: absolute;
    left: 0;
    right: 0;
    top: 0;
    height: 100%;
    z-index: -1;
    border-radius: 5px;
    background: linear-gradient(135deg, #ffcc00, #ca1a2b);
    transform: scale(var(--scale));
    transform-origin: var(--x) 50%;
    transition: transform 300ms cubic-bezier(0.51, 0.92, 0.24, 1);
}
.my-class:hover {
    opacity: 1;
}
.my-class:hover::after {
    --scale: 1;
}
</style>

<script>
document.querySelectorAll('.my-class').forEach((elem) => {
	elem.onmouseenter = elem.onmouseleave = (e) => {
        const tolerance = 10;
		const left = 0;
		const right = elem.clientWidth;
		let x = e.pageX - elem.offsetLeft;
		if (x - tolerance < left) x = left;
		if (x + tolerance > right) x = right;
		elem.style.setProperty('--x', `${ x }px`);
	}
});
</script>

Эффект при наведении на элемент в Zero-блоке

Мы привыкли, что при наведении на ссылку появляется подчёркивание. А в Zero-блоке даже этого нет, если выставить текстовому элементу ссылку в настройках. А что, если подчеркивание не просто будет появляться, но и станет цветным или градиентным, а также анимированным — появление подчёркивания начнётся в том месте, в котором вы навели мышкой на элемент?

Хм. А если подумать, то можно не только подчёркивание сделать, но и заливку всего элемента. Сложно представить… проще показать! Поэтому листайте в самый низ страницы и попробуйте навести на каждый элемент.

Если вы всё поняли, то вот простая инструкция:
  1. Задайте элементу Zero-блока класс и впишите этот класс в настройки ниже.
  2. Выберите остальные опции.
  3. Скопируйте код и вставьте его в блок T123 под Zero-блоком.
<!-- Эффект при наведении на элемент в Zero-блоке | https://necodim.ru/tilda/zero-element-hover -->
<style>
.my-class {
    text-decoration: none;
    transition: opacity 300ms cubic-bezier(0.51, 0.92, 0.24, 1);
}
.my-class::after {
    --scale: 0;
    content: "";
    position: absolute;
    left: 0;
    right: 0;
    top: 0;
    height: 100%;
    z-index: -1;
    border-radius: 5px;
    background: linear-gradient(135deg, #ffcc00, #ca1a2b);
    transform: scale(var(--scale));
    transform-origin: var(--x) 50%;
    transition: transform 300ms cubic-bezier(0.51, 0.92, 0.24, 1);
}
.my-class:hover {
    opacity: 1;
}
.my-class:hover::after {
    --scale: 1;
}
</style>

<script>
document.querySelectorAll('.my-class').forEach((elem) => {
	elem.onmouseenter = elem.onmouseleave = (e) => {
        const tolerance = 10;
		const left = 0;
		const right = elem.clientWidth;
		let x = e.pageX - elem.offsetLeft;
		if (x - tolerance < left) x = left;
		if (x + tolerance > right) x = right;
		elem.style.setProperty('--x', `${ x }px`);
	}
});
</script>

Drag scroll или панорамы и необычные слайдеры в Zero-блоке

Обычно, чтобы сделать двигающийся артборд в Zero-блоке, нужно просто выставить в настройках overflow: auto. но тогда добавляется полоса прокрутки, а перетаскивание на компьютере не работает.

И, если вам нужно именно перетаскивание, которое сработает как на десктопе, так и на мобильных устройствах, воспользуйтесь скриптом.

Всё, что вам нужно сделать — это Zero-блок, объекты которого вылезают за края артборда.

После этого впишите ID вашего Zero-блока сюда и скопируйте получившийся код. Если необходимо применить эффект к нескольким блокам, напишите ID этих блоков через запятую, например так: #rec11111, #rec22222, #rec33333.
<!-- Drag scroll или панорамы и необычные слайдеры в Zero-блоке | https://necodim.ru/tilda/drag -->
<script src="https://cdn.jsdelivr.net/npm/jquery.kinetic/jquery.kinetic.js"></script>
<script>
$('#rec123456789').find($('.t396__artboard')).kinetic({
    cursor: 'grab',
    x: true,
    y: true,
    filterTarget: function(target, e){
        if (!/down|start/.test(e.type)){
            return !(/area|a|input/i.test(target.tagName));
        }
    }
});
</script>

Горизонтальный скролл элементов Zero блока по движению мыши

Создаём в Zero block кучу элементов в одну строку. Можно даже вылезать за края артборда. Заходим в настройки первого элемента, скроллом вниз до базовой анимации, в свойстве Parallax выбираем Mouse и выбираем дистанцию по оси X.

Если хотите, чтобы объект двигался в сторону движения мыши, пишете отрицательное число, если в противоположную от движения мыши сторону, то положительное число.

Дистанцию выбираете эмпирическим путём. От неё будет зависеть как скорость, так и видимость каких-то элементов.

Закончили? Копируем анимацию и вставляем в другие элементы.



Кнопка «Подробнее» для длинного текста

Хотите скрыть огромный текст на странице в кнопку «Подробнее»? С помощью этого скрипта, такое сделать будет очень легко. Пример работы скрипта в стандартном блоке можно посмотреть ниже, а как ведёт себя Zero-блок с раскрывающимся внутри текстом, видно тут.


Чтобы воспользоваться скриптом, вставьте ID блока, class элемента. Как их найти читайте тут.

Помимо этого укажите, сколько строк должно быть видно (если в вашем тексте их больше, то кнопка появится, если столько же или меньше, то кнопки не будет), пропишите, что должно быть написано в кнопках «Подробнее» и «Скрыть», а также укажите скорость раскрытия блока.

Если вы используете Zero-блок, то не забудьте самостоятельно добавить класс текстовому элементу и указать его в настройках ниже. Внимание! Высота Zero-блока меняется вместе с высотой текстового элемента, поэтому другие элементы, находящиеся рядом с текстом, могут также скрыться. Если вам это не нужно, удалите из кода строки: 14−20, 26−36.

Если вы хотите таким образом скрывать текст описания в товарах, то необходимо воспользоваться этим скриптом (настройки делаются в одной и той же форме ниже, только вам не нужно будет настраивать первые 3 параметра — их можно оставить любыми). Его нужно разместить в футере всего сайта, скопировать ID блока, создать страницу футера для товара, вставить туда Alias блок, прописать в нем скопированный ID и в каталоге прикрепить футер к товарам (галочка «Открывать товар на отдельной странице» не обязательна). После этого опубликуйте все страницы.

Не забудьте самое главное правило: блок T123 со скриптом необходимо размещать под задействованными элементами или в самом конце страницы.

Пример работы модификации в Zero-блоке в самом низу страницы.


Если по какой-то причине в Zero-блоке у вас кнопка «Подробнее» не скрывает текст, а помещается под него, проверьте настройки текстового блока. У него должен быть задан параметр line-height (высота строки). В Zero-блоке за это отвечает Spacing (первое значение).

<!-- Кнопка «Подробнее» для длинного текста | https://necodim.ru/tilda/collapsed-text -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/Readmore.js/2.2.1/readmore.js"></script>
<script>
document.querySelector('#rec123456789 .t396__artboard').addEventListener('artBoardRendered', function() {
    let block = $('#rec123456789'),
        blockArtboard = block.find($('.t396__artboard')),
        longTextWrap = block.find($('.t-text')),
        longText = longTextWrap.find($('.tn-atom')),
        blockHeight = blockArtboard.height(),
        textHeight = longTextWrap.height(),
        rowHeight = Math.round(parseInt(longText.css('line-height'),10)),
        collapsedHeight = rowHeight * 3
        textPosition = parseInt(longTextWrap.css('top'),10);
    longTextWrap.css({'display':'flex','flex-direction':'column'});
    blockArtboard.css('transition','all 0.2s ease');
    
    function grow(bh,th,rh,ch,tp) {
        blockArtboard.height(bh-th+rh+ch+tp);
    };
    
    longText.readmore({
        speed: 200,
        collapsedHeight: collapsedHeight,
        moreLink: '<a href="#read-more" class="t-name read-more">Подробнее</a>',
        lessLink: '<a href="#read-less" class="t-name read-less">Скрыть</a>',
        blockProcessed: function() {
            grow(blockHeight,textHeight,rowHeight,collapsedHeight,0);
        },
        beforeToggle: function(trigger, element, expanded) {
            if(!expanded) {
                grow(blockHeight,0,rowHeight,0,0);
            } else {
                grow(blockHeight,textHeight,rowHeight,collapsedHeight,0);
                $('html, body').animate({scrollTop: element.offset().top-textPosition}, {duration: 200});
            }
        }
    });
});
</script>

<style>
.read-more,
.read-less {
    color: #ffcc00 !important;
    font-size: 22px;
    font-weight: 700;
}
</style>

Кнопка «Подробнее» для длинного текста

Код для товаров

<!-- Кнопка «Подробнее» для длинного текста | https://necodim.ru/tilda/collapsed-text -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/Readmore.js/2.2.1/readmore.js"></script>
<script>
const makeReadmore = (target) => {
    const rowHeight = Math.round(parseFloat(target.css('line-height').split('px')[0], 10));
        collapsedHeight = rowHeight * 3,
        longTextClasses = target.attr('class');
    target.readmore({
        speed: 200,
        collapsedHeight: collapsedHeight,
        moreLink: '<a href="#read-more" class="t-name read-more">Подробнее</a>',
        lessLink: '<a href="#read-less" class="t-name read-less">Скрыть</a>'
    });
}
$('.js-store-prod-btn').click(function() {
    if ($(this).attr('href').indexOf('tproduct') !== -1) {
        setTimeout(() => {
            let block = $('.t-store__product-popup'),
                longText = block.find($('.js-store-prod-all-text'));
            makeReadmore(longText);
        }, 500);
    }
});

if (window.location.href.indexOf('tproduct') !== -1) {
    setTimeout(() => {
        let block = $('.t-store__product-snippet'),
            longText = block.find($('.js-store-prod-all-text'));
        makeReadmore(longText);
    }, 500);
}
</script>

<style>
.read-more,
.read-less {
    color: #ffcc00 !important;
    font-size: 22px;
    font-weight: 700;
}
</style>

Кнопка «Назад» (предыдущая страница)

Вы наверняка много раз встречали на других сайтах кнопку «Назад», которая позволяла перейти к предыдущей посещённой странице. Такую кнопку часто размещают на странице ошибки 404, чтобы вернуть пользователя назад. Делается она очень просто.

В адрес ссылки для вашей кнопки запишите #back и разместите следующий код:
<!-- Кнопка «Назад» (предыдущая страница) | https://necodim.ru/tilda/history-back -->
<script>
$('a[href="#back"]').click(function() {
    history.back();
    return false;
})
</script>

Кнопка «Назад» (предыдущая страница)

Вы наверняка много раз встречали на других сайтах кнопку «Назад», которая позволяла перейти к предыдущей посещённой странице. Такую кнопку часто размещают на странице ошибки 404, чтобы вернуть пользователя назад. Делается она очень просто.

В адрес ссылки для вашей кнопки запишите #back и разместите следующий код:
<!-- Кнопка «Назад» (предыдущая страница) | https://necodim.ru/tilda/history-back -->
<script>
$('a[href="#back"]').click(function() {
    history.back();
    return false;
})
</script>
Задел есть видео-инструкция
Made on
Tilda