стилизация страницы потоков
бесплатный мастер-класс #5
мастер-класс


<!--https://dsgnmax.ru/useful-->

<style>

@media screen and (min-width: 980px){
    /* Общие настройки контейнера */
    .t-feed__post-popup__container.t-container {
        display: flex;
        flex-direction: row;
        gap: 40px; /*Отступ между колонками*/
    }
}

/* Стили популярных новостей */
.js-feed-relevants.t-feed__post-popup__relevants {
    height: fit-content;    /*Высота блока подстраивается под контент внутри*/
    min-height: 40dvh; /*Минимальная высота блока*/
    max-height: calc(100dvh - 220px);
    width: 440px !important;    /*Ширина блока*/
    padding: 30px;  /*Отступы внутри блока */
    box-sizing: border-box;
    background-color: #f6f6f6;  /*Фоновый цвет*/
    border-radius: 16px;/*Скругление углов*/
    position: sticky;
    top: 100px; /*Отступ сверху, когда начинается прилипание блока*/
    overflow-y: auto;
}

/*Заголовок популярных новостей*/
.t-feed__post-popup__relevants-title-wrapper {
    padding: 0 !important;
    margin: 0 !important;
}
.t-feed__post-popup__relevants-title {
    margin: 0 0 30px 0; /*Отступ снизу у заголовка*/
    font-size: 20px !important; /*Рамзер заголовка*/
}

/*Карточки популярных новостей*/
.t-feed__post-popup__relevants-wrapper {
    display: flex;
    flex-direction: column; /*Располагаем элементы в колонку*/
    gap: 10px;  /*Отступ между карточками*/
}
.t-feed__post-popup__relevants-item {
    padding: 0 !important;
    margin: 0 !important;
}
.t-feed__post-popup__relevants-content,
.t-feed__post-popup__relevants-item a{
    display: flex;
    flex-wrap: wrap;
    flex-direction: column;
    gap: 15px;  /*Отступ от изображения до текста*/
}
.t-feed__post-popup__relevants-textwrapper {
    width: 100%;
    padding: 0 10px 10px 10px;  /*Отступы у текста*/
    box-sizing: border-box;
}
.t-feed__post-popup__relevants-imgwrapper {
    width: 100% !important;
    height: 100px !important;
    margin: 0 !important;
    border-radius: 10px;    /*Скругление картинки*/
    overflow: hidden;
    padding-bottom: 0 !important;
}
.t-feed__post-popup__relevants-item-wrapper,
.t-feed__post-popup__relevants-item{
    padding: 5px !important;   /*Отступы вокруг всей карточки популярной новости*/
    background-color: #ffffff;  /*Фоновый цвет популярной новости*/
    border-radius: 12px; /*Скругление углов*/
    width: 100% !important;
    max-width: 100% !important;
    box-sizing: border-box;
}

/*Заголовок популярной новости*/
.t-feed__post-popup__relevants-item-title{
    font-size: 14px;    /*Размер текста*/
    overflow:hidden;
    text-overflow: ellipsis;
    display: -webkit-box;
    -webkit-line-clamp: 2; /*Количество строк текста, которое будет отображаться*/
    -webkit-box-orient: vertical;
}
/*Описание популярной новости*/
.t-feed__post-popup__relevants-item-descr {
    font-size: 12px;    /*Размер текста*/
    overflow:hidden;
    text-overflow: ellipsis;
    display: -webkit-box;
    -webkit-line-clamp: 3; /*Количество строк текста, которое будет отображаться*/
    -webkit-box-orient: vertical;
}

/*Стили самой новости*/
.t-feed__post-popup__content-wrapper {
    width: 100%;
    padding: 40px;  /*Отступы*/
    background-color: #f6f6f6;  /*Фоновый цвет*/
    border-radius: 16px;    /*Радиус скругления*/
    box-sizing: border-box;
    display: flex;
    flex-direction: column;
}
.t-feed__post-popup__content {
    max-width: 100%;
    margin: 0 !important;
}

/*Скрываем лишний блок с комментариями*/
.t-feed__post-popup__content-wrapper:has(.js-feed-comments) {
    display: none;
}

/*Стили хэдера статьи*/
.dbmHeaderNew .t-feed__post-popup__img {
    max-width: 100%;
    height: 300px;      /*Высота картинки*/
    width: 100%;
    object-fit: cover;
    object-position: center;
}

.dbmHeaderNew {
    padding: 10px;   /*Отступы*/   
    background-color: white;    /*Фоновый цвет*/ 
    border-radius: 16px;    /*Радиус скругления углов*/
}
.dbmHeaderNew .t-feed__post-popup__cover-wrapper{
    border-radius: 12px; /*Скругление углов картинки*/
    overflow: hidden;
}

.dbmHeaderNew .t-feed__post-popup__title-wrapper {
    padding: 10px 20px 0 20px;  /*Отступы у заголовка*/
}

.dbmHeaderNew .t-feed__post-popup__date-parts-wrapper{
    padding: 0 20px 20px;   /*Отступы у даты и раздела*/
}


/*Стили блока, который появляется при скроле*/
.dbmHeaderNew.sticky {
    display: grid;
    grid-template-columns: 80px auto;   /*80 – ширина картинки*/
    grid-template-rows: auto auto;
    gap: 10px 20px; /*Отступы между рядами и колонками*/
    padding: 10px;  /*Отступ вокруг*/
    border-radius: 16px;    /*Радиус скругления*/
    background-color: #232323 !important;   /*Цвет фона плашки*/
}
.dbmHeaderNew.sticky {
    position: sticky;
    top: 100px; /*Отступ сверху, когда начинается прилипание блока*/
}
/*Заголовок внутри плашки*/
.dbmHeaderNew.sticky .t-feed__post-popup__title-wrapper {
    grid-column: 2/3;
    height: auto;
    align-self: flex-end;
    padding: 0 !important;
}
.dbmHeaderNew.sticky .t-feed__post-popup__title-wrapper h1 {
    color: white !important;
    font-size: 18px !important;
}
/*Дата и раздел внутри плашки*/
.dbmHeaderNew.sticky .t-feed__post-popup__date-parts-wrapper{
    grid-column: 2/3;
    align-self: flex-start;
    padding: 0;
}
.dbmHeaderNew.sticky .t-feed__post-popup__date-parts-wrapper span {
    color: white;   /*Цвет даты и раздела*/
    opacity: 1 !important;
}
.dbmHeaderNew.sticky #feed-cover {
    margin: 0;
    grid-row: 1/3;  /*Фото внутри плашки занимает всю высоту*/
}
.dbmHeaderNew.sticky .t-feed__post-popup__img {
    height: 100%;
    width: 100%;
}
@media screen and (max-width: 979px){
    /* Общие настройки контейнера */
    .t-feed__post-popup__container.t-container {
        flex-direction: column;
        gap: 40px; /*Отступ между колонками*/
    }
    /* Стили популярных новостей */
    .js-feed-relevants.t-feed__post-popup__relevants {
        height: 100% !important;
        min-height: 100%;
        max-height: 100%;
        width: 100% !important;    /*Ширина блока*/
    }
    /*Карточки популярных новостей*/
    .t-feed__post-popup__relevants-wrapper {
        display: grid;
        grid-template-columns: 1fr 1fr; /*Количество карточек популчрных новостей*/
        gap: 10px;  /*Отступ между карточками*/
    }
}

@media screen and (max-width: 560px){
    .dbmHeaderNew.sticky #feed-cover{
        display: none; /*Скрываю фото в плашке на мобилках*/
    }
        /*Заголовок внутри плашки*/
    .dbmHeaderNew.sticky .t-feed__post-popup__title-wrapper {
        grid-column: 2 span;
    }
    /*Дата и раздел внутри плашки*/
    .dbmHeaderNew.sticky .t-feed__post-popup__date-parts-wrapper{
        grid-column: 2 span;
    }
  /*Стили самой новости*/
    .t-feed__post-popup__content-wrapper {
        padding: 20px;  /*Отступы*/
        gap: 30px;
    }  
    .dbmHeaderNew .t-feed__post-popup__title-wrapper h1{
        font-size: 18px;    /*Размер заголовка статьи на мобилке*/
    }
    .dbmHeaderNew .t-feed__post-popup__img {
        max-width: 100%;
        height: 200px;
    }
    /*Карточки популярных новостей*/
    .t-feed__post-popup__relevants-wrapper {
        grid-template-columns: 1fr; /*Количество карточек популчрных новостей*/
    }
    .dbmHeaderNew.sticky .t-feed__post-popup__title-wrapper h1 {
        font-size: 14px !important; /*Размер заголовка в выпадающей плашке*/
    }
}
</style>

<script>

// Создание нового div, который будет общим контейнером
let containerDiv = document.createElement('div');
containerDiv.className = 'dbmHeaderNew';

// Находим все элементы по заданным классам
let elementsToWrap = document.querySelectorAll('.t-feed__post-popup__title-wrapper, .t-feed__post-popup__date-parts-wrapper, .t-feed__post-popup__cover-wrapper');

// Находим блок, в начале которого нужно разместить containerDiv
let targetBlock = document.querySelector('.t-feed__post-popup__content-wrapper:first-child');

// Перемещение элементов и создание наблюдателя добавляется в DOMContentLoaded, чтобы обеспечить, что DOM полностью загружен
document.addEventListener('DOMContentLoaded', () => {
    // Убедитесь, что targetBlock существует, чтобы избежать ошибок при попытке вставить перед несуществующим элементом
    if (targetBlock) {
        // Вставляем containerDiv в самое начало targetBlock
        targetBlock.insertBefore(containerDiv, targetBlock.firstChild);

        // Перемещаем найденные элементы в общий контейнер
        elementsToWrap.forEach(element => {
            // Перемещение каждого элемента в containerDiv
            containerDiv.appendChild(element);
        });

        // После того как элементы перемещены, настраиваем наблюдатель IntersectionObserver
        const header = document.querySelector('.dbmHeaderNew');
        if (!header) return;

        let headerClone = null;
        const observer = new IntersectionObserver(entries => {
            entries.forEach(entry => {
                if (!entry.isIntersecting) {
                    // Если исходный блок не виден и его клон еще не создан
                    if (!headerClone) {
                        headerClone = header.cloneNode(true); // Клонируем элемент
                        headerClone.classList.add('sticky'); // Добавляем класс 'sticky'
                        header.parentNode.insertBefore(headerClone, header.nextSibling); // Вставляем клон сразу после оригинала
                    }
                } else {
                    // Если исходный блок снова виден, удаляем его клон
                    if (headerClone) {
                        headerClone.remove();
                        headerClone = null;
                    }
                }
            });
        }, {
            threshold: 0,
            rootMargin: '0px'
        });

        observer.observe(header);

    } else {
        console.log('Целевой блок .t-feed__post-popup__content-wrapper не найден.');
    }
});
</script>

Made on
Tilda