ForumD.ru - Дизайн, графика, скрипты, техническая поддержка для форумов и сайтов

Объявление

🎲 Майский ваншот

Ленивая сезонная майская акция
Сыграем в настольную игру в дискорде?
Пишите, присоединяйтесь к обсуждению!

Подробности

GEMcross

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

Посетить

🔥 Новинка в портфолио: ДИЗАЙН И ГРАФИКА В СТИЛЕ GENSHIN IMPACT

Платформа: MyBB.ru (RusFF)
Стоимость: 6500 рублей;
Авторы: Moju & wasurenagusa

Посмотреть

💰 Теперь у нас можно приобрести "Мгновенные уведомления от Алекса"

Скрипт оповещает пользователей о событиях на форуме в реальном времени, придавая динамики общению.
Автор: Alex_63 | Платформа: MyBB.ru.

У нас: структурированная документация, возможность платить иностранными картами, перевыпустить подписку или купить бессрочно.

Купить скрипт

🌟 ОПЛАТА ЗАКАЗА НАГРАДНЫМИ БАЛЛАМИ И СКИДКИ

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

узнать подробности

❤️ Поддержать проект

Если у вас есть желание помочь нам сделать наш проект лучше:
Реклама на сайтеПредложения
Стать модераторомОтзывы

Подробнее

SPECIAL OFFER: We distribute designs for free

Finalizing the layout for your project;
Developing a style code;
Mobile version included if you wish.

Details

Support the project

If you want to help us:
Become a moderator
SuggestionsReviews

Details
❗ ❗ ❗ Technical work is underway. We'll fix it soon. :) If you're english-speaker and want to use our forum, switch to the russian language. This is temporary, until the works with multi-language option will be done. Sorry for the inconvenience.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.



Настройка скрипта фильтрации контента

Сообщений 1 страница 7 из 7

1

Форум: https://astra.rolebb.ru/
Логин: Тестовый пользователь
Пароль:

Нужна помощь с настройкой скрипта, так как мои познания уже всё.
https://astra.rolebb.ru/pages/rasi_test

Что я смогла: собрать списки фильтров и сделать так, чтобы они отображались в нужных мне блоках.
Что я не смогла: заставить при нажатии на эти сами теги фильтроваться содержимое. В идеале ещё хотелось бы воплотить опцию с тем, чтобы при активной галке у заголовка выбирались все опции, входящие в блок.
Второй момент: сейчас в блок, где собираются отличительные черты, фильтры подтягиваются в сам блок, а хотелось бы обернуть конкретно их в <details>, чтобы оно занимало меньше места. Как оно должно примерно визуально выглядеть.

Готова добровольно задонатить за донастройку того, что не смогла сделать сама, потому что понимаю, что мои запросы явно отходят от того, что было представлено в исходном коде, но бюджет ограничен 3000 рублей.

+1

2

Смотри, считается, что idPrefix - это id блока-обертки, который содержит И итемы, И блоки с фильтрами. Ну то есть если обернуть все содержимое до первого <script> в <div id="whatever"></div> и проставить whatever как idPrefix - жизнь станет сильно интереснее)
Сейчас же получается, как минимум, что в #everspace нет блока с классом inner. Поэтому const filtersContainer = document.querySelector(`#${idPrefix} .${filtersContainerClassname}`); => null и он радостно падает на filtersContainer.append(wrapper);
Ну и да, тестовый пользователь не имеет прав доступа к форуму, где лежат посты 3, 4 и 8, поэтому там немножко пустой ответ и дебажить плотнее не совсем тривиально)

+3

3

Emerael
Из ответа поняла, что ничего не поняла)
Но права профилю выдала, чтобы были видны все нужные темы.

0

4

#p196936,starling написал(а):

Emerael
Из ответа поняла, что ничего не поняла)
Но права профилю выдала, чтобы были видны все нужные темы.

итоговый код страницы примерно такой
и да, я осознала, что на страничке скрипта не актуализировала код после допиливания для фд, ща исправим)
UPD: исправлено

Код:
    <style>

        .hidden {
            display: none !important;
        }

        label {
            cursor: pointer;
        }

        /*пример стиля для тоггла*/
        .toggle input {
            display: none;
        }

        .toggle:has(input:checked) {
            cursor: pointer;
            background: #66bb6a;
            color: var(--background);
        }

        .toggle {
            padding: .25em;
            border: 1px solid var(--border1);
        }
    </style>

    <style>
        #formoder {
            display: none;
            padding: 5px;
            background: #ccc;
        }

        .ismoderator #formoder {
            display: block;
        }
    </style>
    <!-- Фильтры -->
    <div id="len-pridumivat">
        <div class="inner">
            <h2>Список рас</h2>
            <em>В списке рас кратко представлены расы персонажей, имеющихся на форуме, введённых в игру в качестве NPC
                или описанных в заявках. Для поиска по фильтрам выберите нужные характеристики из представленных ниже.
                Фильтр позволяет отсортировать список по трём основным категориям: территория, вид, отличительная черта.
                Описание расы в списке дано в виде краткой характеристики по основным пунктам. С полным описанием расы
                вы можете ознакомиться в анкете её представителя (доступны после регистрации).</em>
            <div class="filter territory">
                <h2>Территория</h2>
                <em>Историческая родина расы (может не совпадать с местом фактического проживания
                    персонажа)<br>Поставьте галочку возле одной из трёх территорий, чтобы увидеть расы, проживающие во
                    всех системах выбранной территории. Для поиска по конкретной системе отметьте её в списке ниже.</em>
                <div id="filt-block" class="imp">
                    <div class="checkbox-wrapper-1">
                        <h3>Нэсарская Империя</h3>
                        <div class="tooltip"> <img src="https://forumstatic.ru/files/001b/f2/fa/23616.png">
                            <span class="tooltiptext">Для вывода полного списка рас Империи поставьте отметку в поле
                                рядом. Для поиска по конкретной системе выберите её из списка внизу.</span>
                        </div>
                        <div class="round">
                            <input type="checkbox" id="checkbox-1">
                            <label for="checkbox-1"></label>
                        </div>
                    </div>
                </div>
                <div id="filt-block" class="fed">
                    <div class="checkbox-wrapper-2">
                        <h3>Объединенная Федерация</h3>
                        <div class="tooltip"> <img src="https://forumstatic.ru/files/001b/f2/fa/23616.png">
                            <span class="tooltiptext">Для вывода полного списка рас Федерации поставьте отметку в поле
                                рядом. Для поиска по конкретной системе выберите её из списка внизу.</span>
                        </div>
                        <div class="round">
                            <input type="checkbox" id="checkbox-2">
                            <label for="checkbox-2"></label>
                        </div>
                    </div>
                </div>
                <div id="filt-block" class="neu">
                    <div class="checkbox-wrapper-3">
                        <h3>Нейтральная территория</h3>
                        <div class="tooltip"> <img src="https://forumstatic.ru/files/001b/f2/fa/23616.png">
                            <span class="tooltiptext">Для вывода полного списка рас Нейтральной территории поставьте
                                отметку в поле рядом. Для поиска по конкретной системе выберите её из списка
                                внизу.</span>
                        </div>
                        <div class="round">
                            <input type="checkbox" id="checkbox-3">
                            <label for="checkbox-3"></label>
                        </div>
                    </div>
                </div>
            </div>
            <div class="filter species">
                <div id="filt-block" class="specieslist">
                    <h2>Виды</h2>
                    <em>Фильтр рас по видам. Подробнее о видах <a
                            href="https://codepen.io/starl1ng/pen/NWJBRME">здесь</a></em>
                </div>
                <div id="filt-block" class="uni">
                    <h2>Дополнительно</h2>
                    <em>Дополнительные теги фильтрации</em>
                </div>
            </div>
            <div class="filter signs">
                <h2>Отличительные черты</h2>
                <em>Особенности каждой из рас. Названия расовых способностей из списка могут совпадать с названиями <a
                        href="https://codepen.io/starl1ng/pen/NWJBRME">пустотных способностей</a>. Расовые способности
                    присутствуют у каждого её представителя и не зависят от Пустоты. </em>
                <details>
                    <summary>подробнее</summary>
                    <p>
                    </p>
                </details>
            </div>
        </div>

        <!-- Фильтры-конец -->
        <!-- Блок для подгрузки данных -->
        <div class="post-content not-found" style="" id="everspace"></div>
        <div class="post-loader" style="display: none;">Загрузка...</div>
    </div>



    <script>
        (() => {
            const filterFieldToFilter = {
                //виды
                "grib": { name: "Грибовидные", type: "toggle", filterContainerSelector: '.species .specieslist' },
                "gum": { name: "Гуманоиды", type: "toggle", filterContainerSelector: '.species .specieslist' },
                "lit": { name: "Литоиды", type: "toggle", filterContainerSelector: '.species .specieslist' },
                "mlek": { name: "Млекопитающие", type: "toggle", filterContainerSelector: '.species .specieslist' },
                "okean": { name: "Океаниды", type: "toggle", filterContainerSelector: '.species .specieslist' },
                "pern": { name: "Пернатые", type: "toggle", filterContainerSelector: '.species .specieslist' },
                "rept": { name: "Рептилоиды", type: "toggle", filterContainerSelector: '.species .specieslist' },
                "flor": { name: "Флориды", type: "toggle", filterContainerSelector: '.species .specieslist' },
                "chlen": { name: "Членистоногие", type: "toggle", filterContainerSelector: '.species .specieslist' },

                //дополнительные фильтры

                //Империя
                "alkura": { name: "Алькура", type: "toggle", filterContainerSelector: '.territory .imp' },
                "alradif": { name: "Альрадиф", type: "toggle", filterContainerSelector: '.territory .imp' },
                "aftab": { name: "Афтаб", type: "toggle", filterContainerSelector: '.territory .imp' },
                "bcefeya": { name: "Бета Цефея", type: "toggle", filterContainerSelector: '.territory .imp' },
                "gcefeyai": { name: "Гамма Цефея", type: "toggle", filterContainerSelector: '.territory .imp' },
                "glanc": { name: "Гланц", type: "toggle", filterContainerSelector: '.territory .imp' },
                "kalor": { name: "Калор", type: "toggle", filterContainerSelector: '.territory .imp' },
                "kruger": { name: "Крюгер", type: "toggle", filterContainerSelector: '.territory .imp' },
                "lyumena": { name: "Люмена", type: "toggle", filterContainerSelector: '.territory .imp' },
                "persius": { name: "Персиус", type: "toggle", filterContainerSelector: '.territory .imp' },
                "solus": { name: "Солус", type: "toggle", filterContainerSelector: '.territory .imp' },
                "tondi": { name: "Тонди", type: "toggle", filterContainerSelector: '.territory .imp' },
                "fernliht": { name: "Фернлихт", type: "toggle", filterContainerSelector: '.territory .imp' },
                "fulgor": { name: "Фулгор", type: "toggle", filterContainerSelector: '.territory .imp' },
                "helikait": { name: "Хеликайт", type: "toggle", filterContainerSelector: '.territory .imp' },
                "eane": { name: "Эане", type: "toggle", filterContainerSelector: '.territory .imp' },

                //Федерация
                "alkindi": { name: "Аль-Кинди", type: "toggle", filterContainerSelector: '.territory .fed' },
                "gcefeyaf": { name: "Гамма Цефея", type: "toggle", filterContainerSelector: '.territory .fed' },
                "gerioz": { name: "Гериоз", type: "toggle", filterContainerSelector: '.territory .fed' },
                "davinchi": { name: "Да Винчи", type: "toggle", filterContainerSelector: '.territory .fed' },
                "delaks": { name: "Делакс", type: "toggle", filterContainerSelector: '.territory .fed' },
                "djebtet": { name: "Джеб'тет", type: "toggle", filterContainerSelector: '.territory .fed' },
                "zenkai": { name: "Зенкай", type: "toggle", filterContainerSelector: '.territory .fed' },
                "zent": { name: "Зент", type: "toggle", filterContainerSelector: '.territory .fed' },
                "irida": { name: "Ирида", type: "toggle", filterContainerSelector: '.territory .fed' },
                "lavgud": { name: "Лавгуд", type: "toggle", filterContainerSelector: '.territory .fed' },
                "laplas": { name: "Лаплас", type: "toggle", filterContainerSelector: '.territory .fed' },
                "ozamis": { name: "Озамис", type: "toggle", filterContainerSelector: '.territory .fed' },
                "olur": { name: "Олур", type: "toggle", filterContainerSelector: '.territory .fed' },
                "rondell": { name: "Ронделл", type: "toggle", filterContainerSelector: '.territory .fed' },
                "solsys": { name: "Солнечная система", type: "toggle", filterContainerSelector: '.territory .fed' },
                "razmos": { name: "Размос", type: "toggle", filterContainerSelector: '.territory .fed' },
                "enatos": { name: "Энатос", type: "toggle", filterContainerSelector: '.territory .fed' },
                "yatun": { name: "Ятун", type: "toggle", filterContainerSelector: '.territory .fed' },

                //Нейтральная территория
                "sn1987a": { name: "SN 1987A", type: "toggle", filterContainerSelector: '.territory .neu' },
                "aonxiii": { name: "Аон XIII", type: "toggle", filterContainerSelector: '.territory .neu' },
                "befana": { name: "Бефана", type: "toggle", filterContainerSelector: '.territory .neu' },
                "birham": { name: "Бирхам", type: "toggle", filterContainerSelector: '.territory .neu' },
                "varkraim": { name: "Варкрайм", type: "toggle", filterContainerSelector: '.territory .neu' },
                "kardos": { name: "Кардос", type: "toggle", filterContainerSelector: '.territory .neu' },
                "klios": { name: "Клиос", type: "toggle", filterContainerSelector: '.territory .neu' },
                "ksi": { name: "Кси", type: "toggle", filterContainerSelector: '.territory .neu' },
                "lopsa": { name: "Лопса", type: "toggle", filterContainerSelector: '.territory .neu' },
                "myucefeya": { name: "Мю Цефея", type: "toggle", filterContainerSelector: '.territory .neu' },
                "noksiya": { name: "Ноксия", type: "toggle", filterContainerSelector: '.territory .neu' },
                "praksima": { name: "Праксима", type: "toggle", filterContainerSelector: '.territory .neu' },
                "proteya": { name: "Протея", type: "toggle", filterContainerSelector: '.territory .neu' },
                "sovilo": { name: "Совило", type: "toggle", filterContainerSelector: '.territory .neu' },

                //черты
                "roga": { name: "Рога", type: "toggle", filterContainerSelector: '.signs' },

                "text": { name: "Поиск по тексту", type: "search", filterValueGetter: (item) => item.innerText }
            };

            const config = {
                idPrefix: "len-pridumivat",
                emptyResultClass: "not-found",
                itemsContainerClassname: "items",
                itemClassname: "item",
                filtersContainerClassname: "inner",
                //Можно переопределить для всяких нестандартных штук в духе "фильтруем по содержанию определенного блока"
                //valuesGetter: (item, field) => item.dataset.field,
                valuesGetter: (item, field) => !!item.classList.contains(field),
                //можно делать нестандартные обертки над итемами, например, спаны, если у нас только тогглы
                createWrapper: () => document.createElement('span'),
                //вызывается в конце обработчика change
                afterFilterChange: (filterField, filterValue, filterElement) => {},
                //вызывается когда фильтр засунут в обертку, а обертка засунута на свое место
                afterFilterRender: (filterField, filterElement) => {}
            };


            //Код в который лучше без особых причин не лезть XD
            const makeFiltersGreat = () => {
                const {
                    idPrefix,
                    emptyResultClass,
                    itemsContainerClassname,
                    itemClassname,
                    filtersContainerClassname,
                    useUrlSearchParams,
                    valuesGetter,
                    createWrapper,
                    afterFilterChange,
                    afterFilterRender
                } = config;

                const filtersContainer = document.querySelector(`#${idPrefix} .${filtersContainerClassname}`);
                const items = document.querySelectorAll(`#${idPrefix}${itemsContainerClassname ? (' .' + itemsContainerClassname) : ''} .${itemClassname}`);

                const itemsForHideReasons = new Map();
                items.forEach(item => itemsForHideReasons.set(item, new Set()));

                const filtersConfigs = Object.entries(filterFieldToFilter);
                const isSorted = filtersConfigs.reduce((acc, [field, { sortOrder }]) => {
                    if (sortOrder === undefined) return false;
                    return acc;
                }, true);
                if (isSorted) {
                    filtersConfigs.sort(([field1, { sortOrder: sortOrder1 }], [field2, { sortOrder: sortOrder2 }]) => sortOrder1 - sortOrder2);
                }

                filtersConfigs.forEach(([field, {
                    name, type, valueSeparator, filterContainerSelector, filterValueGetter, filterCreateWrapper, beautifyAfterWrapperFilled
                }]) => {
                    const filterId = `${idPrefix}-filter-${field}`;
                    let filter;

                    //функция, которая принимает значение фильтра, значение итема и определяет, должен ли итем показываться
                    let valueComparator = (filterValue, value) => true;
                    const wrapper = filterCreateWrapper ? filterCreateWrapper() : createWrapper();
                    wrapper.id = `${filterId}-wrapper`;
                    wrapper.classList.add('wrapper');
                    if (type) wrapper.classList.add(type);

                    const label = document.createElement('label');
                    label.innerText = name;
                    label.htmlFor = filterId;

                    wrapper.append(label);

                    if (filterContainerSelector) {
                        document.querySelector(filterContainerSelector).append(wrapper)
                    } else filtersContainer.append(wrapper);

                    switch (type) {
                        case "search":
                            filter = document.createElement('input');
                            filter.type = 'text';
                            filter.addEventListener('input', (e) => {
                                const event = new Event('change')
                                e.target.dispatchEvent(event);
                            });
                            valueComparator = (filterValue, value) => {
                                return value.includes(filterValue);
                            }
                            break;
                        case "toggle":
                            filter = document.createElement('input');
                            filter.type = 'checkbox';
                            valueComparator = (filterValue, value) => {
                                const isFalseValue = !value && value !== '' || value === "false";
                                const isFalseFilterValue = filterValue === "false";

                                if (!filterValue || isFalseValue === isFalseFilterValue) return true
                                return false
                            }
                            break;
                        case "boolean":
                            filter = document.createElement('select');
                            filter.insertAdjacentHTML('afterbegin', `
                        <option label="Все"></option>
                        <option label="Да" value="true">Да</option>
                        <option label="Нет" value="false">Нет</option>
                    `);
                            valueComparator = (filterValue, value) => {
                                const isFalseValue = !value && value !== '' || value === "false";
                                const isFalseFilterValue = filterValue === "false";

                                if (!filterValue || isFalseValue === isFalseFilterValue) return true
                                return false
                            }
                            break;
                        default:
                            const values = new Set();
                            items.forEach(el => {
                                const vals = valueSeparator ? el.dataset[field].split(valueSeparator) : [el.dataset[field]];
                                vals.forEach(val => values.add(val));
                            });
                            filter = document.createElement('select');
                            filter.insertAdjacentHTML('afterbegin', '<option label="Все"></option>');
                            valueComparator = (filterValue, value) => {
                                if (!filterValue || filterValue === value) {
                                    return true;
                                }
                                return false;
                            }
                            const valuesArray = Array.from(values);
                            valuesArray.sort();
                            for (const value of valuesArray) {
                                filter.insertAdjacentHTML('beforeend', `<option label="${value}" value="${value}">${value}</option>`);
                            }
                    }
                    wrapper.append(filter);
                    if (beautifyAfterWrapperFilled) beautifyAfterWrapperFilled(wrapper)

                    filter.id = filterId;
                    filter.addEventListener('change', (e) => {
                        const filterValue = e.target.type !== 'checkbox' ? e.target.value : e.target.checked;
                        if (useUrlSearchParams) {
                            const curentSearchParams = new URLSearchParams(location.search);
                            if (!filterValue) {
                                curentSearchParams.delete(field);
                            } else {
                                curentSearchParams.set(field, filterValue);
                            }
                            if (history.pushState) {
                                const newurl = location.origin + location.pathname + '?' + curentSearchParams.toString();
                                history.pushState({ path: newurl }, '', newurl);
                            }
                        }
                        let shownElementsCount = 0;
                        items.forEach(item => {
                            const rawValue = filterValueGetter ? filterValueGetter(item) : valuesGetter(item, field);
                            const values = valueSeparator ? rawValue?.split(valueSeparator) ?? [] : [rawValue];
                            const hideReasons = itemsForHideReasons.get(item);
                            const shouldBeShown = values.reduce((acc, cur) => {
                                return acc || valueComparator(filterValue, cur)
                            }, false);
                            if (shouldBeShown) {
                                hideReasons.delete(field);
                                if (!hideReasons.size) {
                                    item.classList.remove("hidden");
                                    shownElementsCount++;
                                }
                            } else {
                                hideReasons.add(field);
                                item.classList.add("hidden");
                            }
                        });
                        if (!shownElementsCount) {
                            document.querySelector(`#${idPrefix}`).classList.add(emptyResultClass);
                        }

                        afterFilterChange(field, filterValue, filter);
                    });
                    afterFilterRender(field, filter);
                    if (useUrlSearchParams) {
                        const searchParamValue = new URLSearchParams(location.search).get(field);
                        if (searchParamValue) {
                            const ev = new Event('change');
                            switch (type) {
                                case "toggle":
                                    if (searchParamValue === 'true') {
                                        filter.checked = true;
                                    }
                                    break;
                                case "search":
                                    filter.value = searchParamValue;
                            }
                            filter.dispatchEvent(ev);
                        }
                    }
                })
            }
            makeFiltersGreat();
        })()
    </script>
    <script>
                var posts = [3, 4, 8]
                $.getJSON('/api.php?method=post.get&post_id=' + posts.join(','), function (jsondata) {
                    if (jsondata.response && (jsondata.response.length > 0)) {
                        $('.post-content').html(jsondata.response.map((el, index) => `<div id="formoder"><b>postId:</b> <a href="/viewtopic.php?id=${jsondata.response[index].topic_id}#p${posts[index]}">${posts[index]}</a></div>` + el.message).join('')).show();
                        $('.post-loader').hide();
                    }
                    else {
                        $('.post-loader').html('Ошибка загрузки');
                    }
                });
    </script>

Отредактировано Emerael (25.02.24 17:29)

+1

5

Emerael
обновлённый код поставила, но даже с ним фильтр не видит блоки, которые должен фильтровать

0

6

#p197025,starling написал(а):

Emerael
обновлённый код поставила, но даже с ним фильтр не видит блоки, которые должен фильтровать

А, ну резонно, он исполняется сразу после рендера, а блоки появляются после подгрузки постов (сори, я тестила на захардкоженных блоках)
тогда вместо вызова makeFiltersGreat() пишем

Код:
window.makeFiltersGreat = makeFiltersGreat;

и вызываем это чудо-функцию после строки $('.post-loader').hide();

+1

7

Emerael
Всё заработало, спасибо большое
Правда просто перенесла makeFiltersGreat() под $('.post-loader').hide();
В противном случае оно не работало

0

Быстрый ответ

Напишите ваше сообщение и нажмите «Отправить»


ВНИМАНИЕ! При обращении за техподдержкой и вопросами по скриптам/оформлению, оставляй ссылку на форум/сайт с проблемой! Специалист должен вживую видеть проблему, чтобы подсказать как ее решить.

ВНИМАНИЕ! Гости (не зарегистрированные на форуме) могут писать сообщения, но не могут вставлять прямые ссылки! Чтобы оставить сообщение со ссылкой на сайт, форум или скриншот удали символы: "http://", "https://" или "www."
font_download format_size format_bold format_italic format_underlined strikethrough_s format_paint color_lens
format_align_left format_align_center format_align_right list table_view
link add_photo_alternate ondemand_video mood
content_cut lock_open format_quote code
horizontal_rule anchor live_help emoji_symbols library_add
Bebas Neue Arial Georgia Microsoft Sans Serif Tahoma Verdana Century Gothic Palatino Linotype Times New Roman Franklin Gothic Medium Impact Arial Black Courier New Lucida Console Comic Sans Ms
10px 12px 14px 16px 18px 20px 22px
  • Точками
  • Кружочками
  • Квадратами
  • Цифрами
  • Римскими цифрами
  • Без обозначений
Многострочный пункт списка
© ® « » ¢ £
Заголовок Автосжатие больших картинок Скрыть от гостей Ссылка «скачать» Имя читателя Добавлено спустя… Надстрочный текст Подстрочный текст Блок HTML Анкета: разделитель текста Анкета: закрыть ответы

Теги оформления специальных постов

Сделать пост специальным[block="portfoliopost"]portfoliopost[/block],
Светлый фон[block="makeportfoliolight"]makeportfoliolight[/block],
Красный пост[block="saledpost"]saledpost[/block],
Синий пост[block="forsalepost"]forsalepost[/block],
Зеленый пост[block="freepost"]freepost[/block],

Пост без профиля[block="no-prof"]no-prof[/block],
Общее портфолио FD[block="FDteam-portf"]FDteam-portf[/block],

Теги оформления картинок

Обложки: Для одной картинки по центру в рамке, автоматически уменьшается до ширины 480px

Обложка[block="cover"][block="picture"][img]ссылка на картинку,[/img][/block][/block]
Закрыто[block="cover"][block="icon material-icons"]lock[/block][block="picture"][img]ссылка на картинку,[/img][/block][/block]
Продажа[block="cover"][block="icon fa-solid fa-sack-dollar"][/block][block="picture"][img]ссылка на картинку,[/img][/block][/block]
Подарок[block="cover"][block="icon fa-solid fa-gift"][/block][block="picture"][img]ссылка на картинку,[/img][/block][/block]

Превью: Для любого количества картинок по центру в рамке, автоматически уменьшается до ширины или высоты 300px

Блок для превью[block="morepics"],[/block]

Разноцветные картинки-ссылки: Для любого количества картинок по центру в разноцветных рамках с заголовком, автоматически уменьшается до ширины 350px, минимальная высота 230px (если высота больше, картинка "обрезается" снизу, но не сжимается)

Блок для картинок-ссылок[block="port-block"],[/block]
Красный[block="p-out saled"] [url=ссылка]заголовок,[/url] [block="picture"][img]ссылка на картинку[/img][/block] [/block]
Синий[block="p-out forsale"] [url=ссылка]заголовок,[/url] [block="picture"][img]ссылка на картинку[/img][/block] [/block]
Зеленый[block="p-out free"] [url=ссылка]заголовок,[/url] [block="picture"][img]ссылка на картинку[/img][/block] [/block]
Желтый[block="p-out yellow"] [url=ссылка]заголовок,[/url] [block="picture"][img]ссылка на картинку[/img][/block] [/block]

Теги оформления контента

Обведенный текст[block="details"] [block="det"],[/block] [/block]
Добавить еще блок[block="det"],[/block]

Блок с кнопками[block="links"] [block="demo"][url=ссылка]синяя кнопка,[/url][/block] [block="store"][url=ссылка]оранжевая кнопка[/url][/block] [/block]
Синяя кнопка[block="demo"][url=ссылка]текст,[/url][/block]
Оранжевая кнопка[block="store"][url=ссылка]текст,[/url][/block]

добавить работу [block="wow bounceIn p-out,"] иконка [block="p-descr"][url=https://forumd.ru/viewtopic.php?id=]описание[/url][/block] [block="p-inner"][url=https://forumd.ru/viewtopic.php?id=][img]картинка[/img][/url][/block] [/block]

Иконки:

lock[block="icon material-icons"]lock,[/block]

[block="icon fa-solid fa-sack-dollar"],[/block]

[block="icon fa-solid fa-gift"],[/block]

ТЕГИ (вставить в p-out через пробел)
Тип работы:

под заказ saled,

на продажу forsale,

бесплатно free,



Основная категория:

Вебдизайн dis,

(для всего связанного с работой на сайтах/форумах, кроме готовых скриптов и мелкой графики)

Графика graf,

(для графона, НЕ включающего кодинг/скрипты)

Скрипты/коды code,

(для готовых разработок и работы по верстке/кодингу)

Мини-фильтры дизайнов:

адаптивные mob,

ролевые игры frpg,

компьютерные игры game,

нейтральные flat,

Подкатегории:

Дизайн форумов/сайтов fulldis,

(для полных работ по дизайну)

Макеты layout,

(для дизайнов, где только макет без кода, или работ по созданию макетов чего-либо)

Верстка dis-code,

(для работ по верстке чужих дизайнов или отдельных штук)

Соц-сети/стримы graf-s,

(графон для оформления соцсетей/стримов)

Ролевая графика/арт art,

(для мелкой графики)

Javascript/CSS js,

(для скриптов или выложенных цсс кодов)

Бесплатный диз от FD [block="p-out free fd"] [url=https://forumd.ru/viewtopic.php?id=]заголовок,[/url] [block="picture"][img]ссылка на картинку[/img][/block][/block]

Платный диз от FD [block="p-out forsale fd"] [url=https://forumd.ru/viewtopic.php?id=]заголовок,[/url] [block="picture"][img]ссылка на картинку[/img][/block][/block]

Дизайн от юзеров [block="p-out yellow"] [url=https://forumd.ru/viewtopic.php?id=]заголовок,[/url] [block="picture"][img]ссылка на картинку[/img][/block][/block]

ТЕГИ (вставить в p-out через пробел)
Платформа:

MyBB.ru mybb-ru,

Макет (любая платформа) any,



Параметры:

+ PSD psd-in,

(в наличии макет помимо кодов)

+ адаптивка mob,

(есть версия для мобилок)
Тематика:

нейтральные flat,

ролевые игры frpg,

компьютерные игры game,

фентези fant,

аниме anime,

кино/сериалы kino,

стимпанк/киберпанк cyb,

мультфильмы kids,

животные cats,



Цвета:

тёмные darkst,

светлые light,

яркие bright,

добавить скрипт/код [block="SCRBLOCK"] [block="stforlink"] иконка, [block="link"][url=https://forumd.ru/viewtopic.php?id=]название[/url][/block] [/block] [block="sttags"] теги [/block] [/block]

Иконки:

[block="icon fa-brands fa-js"],[/block]

[block="icon fa-brands fa-css3-alt"],[/block]

[block="icon fa-regular fa-file-lines"],[/block]

[block="icon fa-solid fa-file-code"],[/block]

[block="icon fa-solid fa-file-invoice-dollar"],[/block]

ТЕГИ (*значение в скобках вставить в SCRBLOCK через пробел)
Тип кода:

скрипт (js)[block="js"]скрипт, js[/block]

css код (css)[block="css"]css код, css[/block]

HTML/CSS шаблоны (shab)[block="shab"]HTML/CSS шаблоны, shab[/block]

Модули/Расширения (global)[block="global"]Модули/Расширения, global[/block]

Платформа:

MyBB.ru (mybb-ru)[block="mybb-ru"]MyBB.ru, mybb-ru[/block]

Любой движок (any)[block="any"]Любой движок, any[/block]

Тип для форума:

Пользователи (users)[block="users"]Пользователи, users[/block]

Профиль (userprof)[block="userprof"]Профиль, userprof[/block]

Доп. поля профиля (adfield)[block="adfield"]Доп. поля профиля, adfield[/block]

Аватары (avatars)[block="avatars"]Аватары, avatars[/block]

Репутация (repa)[block="repa"]Репутация, repa[/block]


Группы (groups)[block="groups"]Группы, groups[/block]

Гoсти (guest)[block="guest"]Гoсти, guest[/block]

Администраторы (admins)[block="admins"]Администраторы, admins[/block]

Модераторы (moders)[block="moders"]Модераторы, moders[/block]


Регистрация (regis)[block="regis"]Регистрация, regis[/block]

Личные сообщения (ls)[block="ls"]Личные сообщения, ls[/block]

Вход (login)[block="login"]Вход, login[/block]

Подписки (subsc)[block="subsc"]Подписки, subsc[/block]


Поиск (search)[block="search"]Поиск, search[/block]

Цитирование (quotes)[block="quotes"]Цитирование, quotes[/block]

Пагинация (pagin)[block="pagin"]Пагинация, pagin[/block]

Опросы (polls)[block="polls"]Опросы, polls[/block]

Смайлы (smiles)[block="smiles"]Смайлы, smiles[/block]


Фикс скриптов QuadroBoards (qbfix)[block="qbfix"]Фикс скриптов QuadroBoards, qbfix[/block]

Страница форума:

На всех страницах (allpages)[block="allpages"]На всех страницах, allpages[/block]

Страницы (созд. в админке) (fpages)[block="fpages"]Страницы (соз. в админке), fpages[/block]


Главная страница (mainpage)[block="mainpage"]Главная страница, mainpage[/block]

Объявление (announ)[block="announ"]Объявление, announ[/block]

Категории (categ)[block="categ"]Категории, categ[/block]

Форумы (forums)[block="forums"]Форумы, forums[/block]

Статистика (stats)[block="stats"]Статистика, stats[/block]


Список тем (topiclist)[block="topiclist"]Список тем, topiclist[/block]

Страница профиля (profpage)[block="profpage"]Страница профиля, profpage[/block]


Тема (topics)[block="topics"]Тема, topics[/block]

Сообщения (posts)[block="posts"]Сообщения, posts[/block]

Контент сообщений (p-content)[block="p-content"]Контент сообщений, p-content[/block]

Рейтинг постов (p-repa)[block="p-repa"]Рейтинг постов, p-repa[/block]

Профиль автора поста (p-prof)[block="p-prof"]Профиль автора поста, p-prof[/block]


Форма ответа (fo)[block="fo"]Форма ответа, fo[/block]

Модификация ФО (fomod)[block="fomod"]Модификация ФО, fomod[/block]

Новые BB-теги (newbb)[block="newbb"]Новые BB-теги, newbb[/block]

Инструментарий спец тем/постов (spesh)[block="spesh"]Инструментарий спец тем/постов, spesh[/block]

Универсальные теги:

Дизайн/стиль (dis)[block="dis"]Дизайн/стиль, dis[/block]

Замена элементов/атрибутов (chan)[block="chan"]Замена элементов/атрибутов, chan[/block]

Загрузка (load)[block="load"]Загрузка, load[/block]

Переадресация (redir)[block="redir"]Переадресация, redir[/block]

Скроллинг (scroll)[block="scroll"]Скроллинг, scroll[/block]


Виджеты (vidjet)[block="vidjet"]Виджеты, vidjet[/block]

Меню (menu)[block="menu"]Меню, menu[/block]

Вкладки (ttabs)[block="ttabs"]Вкладки, ttabs[/block]

Галереи (gall)[block="gall"]Галереи, gall[/block]

Слайдеры (sliders)[block="sliders"]Слайдеры, sliders[/block]

Ротаторы (rotat)[block="rotat"]Ротаторы, rotat[/block]

Таймеры/даты (timers)[block="timers"]Таймеры/даты, timers[/block]

Спойлеры (spoilers)[block="spoilers"]Спойлеры, spoilers[/block]


Реклама (adv)[block="adv"]Реклама, adv[/block]

Изображения (pics)[block="pics"]Изображения, pics[/block]

Медиа (media)[block="media"]Медиа, media[/block]

Ролевые игры (frpg)[block="frpg"]Ролевые игры, frpg[/block]


Hover-эффекты (hover)[block="hover"]Hover-эффекты, hover[/block]

Анимация (anim)[block="anim"]Анимация, anim[/block]

Украшения (decor)[block="decor"]Украшения, decor[/block]

Праздники (seleb)[block="seleb"]Праздники, seleb[/block]


Ограничения/запреты (stops)[block="stops"]Ограничения/запреты, stops[/block]

Антикопирование (nocopy)[block="nocopy"]Антикопирование, nocopy[/block]

Уведомления (notif)[block="notif"]Уведомления, notif[/block]