Список пользователей

1
Админ
Постов: 288
2
VIP
Постов: 75
3
Элита
Постов: 62
4
Проверенные
Постов: 46
5
Проверенные
Постов: 45
6
Проверенные
Постов: 39
7
VIP
Постов: 36
8
VIP
Постов: 35

  • Страница 1 из 1
  • 1
Модуль ВК «Подписки » для Ucoz v 6.0 стиль Март 2026
Дата: Среда, 04.03.2026, 22:08 | Сообщение # 1 | | Написал: Известный
Автор темы
Мурчанн не в сети
        Сообщений:288
         Регистрация:20.10.2016
За уважение окружающих За уважение окружающих За хорошее поведение За преданность форуму За любовь народа

Представлен немного видоизменённый стиль CSS для блока подписок. Логика работы скрипта при этом осталась без изменений, но сам шаблон отображения подписок был обновлён. Это закономерный этап эволюции .



Исходник

Код
<!-- ======= Блок подписок ======= -->

<div class="vksub-block">
<div class="vksub-head">
<span>Подписки</span>
<span class="vksub-count" id="subsCount">
<span class="subs-label">Подписок</span>
<span class="subs-number">0</span>
</span>
</div>
<div class="vksub-container" id="subsParser">
<div class="vksub-empty">Загрузка подписок...</div>
</div>
</div>

<script>
(async function() {

const container = document.getElementById('subsParser');
const counter = document.getElementById('subsCount');
const parser = new DOMParser();
const forumURL = '/forum/0-0-1-46';
const localKey = 'cachedSubs';
const MAX_ITEMS = 5; // ограничение на количество выводимых материалов

/* ===================== КЛИК ПО СЧЁТЧИКУ ===================== */
if(counter){
counter.style.cursor = 'pointer';
counter.title = 'Перейти к списку подписок';
counter.onclick = () => window.location.href = forumURL;
}

/* ===================== ПОКАЗ КЭША ===================== */
let cached = JSON.parse(localStorage.getItem(localKey) || 'null');
if(cached){
container.className='';
container.innerHTML = cached.html;
if(counter.querySelector('.subs-number')) {
counter.querySelector('.subs-number').textContent = cached.count;
}
}

try {
/* ===== грузим страницу подписок ===== */
let page = await fetch(forumURL, {credentials:'include'});
let html = await page.text();
let doc = parser.parseFromString(html,'text/html');

// Получаем все темы, но ограничиваем вывод MAX_ITEMS
let rowsAll = doc.querySelectorAll('tr[id^="tt"]');
let totalCount = rowsAll.length;
let rows = Array.from(rowsAll).slice(0, MAX_ITEMS);

if(counter.querySelector('.subs-number')) {
counter.querySelector('.subs-number').textContent = `${rows.length} | ${totalCount}`;
}

if(cached && cached.count === totalCount) return;

if(!rows.length){
container.className = "vksub-empty";
container.textContent = "Нет подписок";
if(counter.querySelector('.subs-number')) {
counter.querySelector('.subs-number').textContent = "0";
}
localStorage.removeItem(localKey);
return;
}

let resultHTML = '';
let delay = 0;

/* ===================== ЦИКЛ ТЕМ ===================== */
for(let row of rows){

let topicEl = row.querySelector('.topic-item-title');
if(!topicEl) continue;

let topic = topicEl.textContent.trim();
let topicLink = topicEl.href;

let avatar = '/.s/img/icon/user.png';
let topicDesc = '';

try{
let topicPage = await fetch(topicLink,{credentials:'include'});
let topicHTML = await topicPage.text();
let topicDoc = parser.parseFromString(topicHTML,'text/html');

let firstImg = topicDoc.querySelector('.post-content-main img');
if(firstImg && firstImg.src) avatar = firstImg.src;

let thDescrEl = topicDoc.querySelector('span.thDescr');
topicDesc = thDescrEl ? thDescrEl.textContent.trim() : '';

}catch(e){
console.warn('Не удалось получить тему', topicLink);
}

/* ===== HTML В СТИЛЕ СТАРОГО CSS ===== */
resultHTML += `
<div class="vksub-item" style="animation-delay:${delay}ms" onclick="location.href='${topicLink}'">
<img class="vksub-avatar" src="${avatar}" alt="">
<div class="vksub-info">
<div class="vksub-name">
<a href="${topicLink}">${topic}</a>
</div>
${topicDesc
? `<div class="vksub-desc" style="font-style:italic;color:#555;margin-top:3px;">${topicDesc}</div>`
: ''}
</div>
<div class="vksub-indicator"></div>
</div>`;
delay += 40;
}

container.className = '';
container.innerHTML = resultHTML;

/* ===================== СОХРАНЯЕМ КЭШ ===================== */
localStorage.setItem(localKey, JSON.stringify({
count: totalCount,
html: resultHTML
}));

} catch(e){
if(!cached){
container.className = "vksub-empty";
container.textContent = "Ошибка загрузки подписок";
if(counter.querySelector('.subs-number')) {
counter.querySelector('.subs-number').textContent = "0";
}
}
console.error(e);
}

})();
</script>

<style>
/* ======= VK Sidebar Style 2026 Ultra Clean ======= */

.vksub-block {
background: #fff;
border-radius: 12px;
margin: 12px 0;
overflow: hidden;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Inter, sans-serif;
box-shadow: 0 1px 2px rgba(0,0,0,0.04);
border: 1px solid #e7e8ec;
}

/* Шапка */
.vksub-head {
padding: 12px 16px;
font-size: 15px;
font-weight: 600;
color: #1d1f23;
display: flex;
justify-content: space-between;
align-items: center;
background: #fff;
}

.vksub-head span:first-child {
color: #2a5885;
}

/* Счётчик */
.vksub-count {
display: flex;
align-items: center;
gap: 6px;
font-size: 13px;
color: #6d7885;
transition: opacity .15s ease;
}

.vksub-count:hover {
opacity: .75;
}

.subs-number {
background: #edeef0;
padding: 2px 8px;
border-radius: 20px;
font-weight: 600;
color: #2a5885;
font-size: 12px;
}

/* Контейнер */
.vksub-container {
max-height: 300px;
overflow-y: auto;
padding: 4px 0;
scroll-behavior: smooth;
}

/* Скроллбар */
.vksub-container::-webkit-scrollbar {
width: 6px;
}
.vksub-container::-webkit-scrollbar-thumb {
background: #d3d9de;
border-radius: 10px;
}
.vksub-container::-webkit-scrollbar-thumb:hover {
background: #b8c1cc;
}

/* Элемент */
.vksub-item {
display: flex;
align-items: center;
padding: 10px 16px;
margin: 8px; var(--vk-sub-gap) var(--vk-sub-gap) var(--vk-sub-gap);
border-radius: 1px;
cursor: pointer;
transition: background .15s ease, transform .08s ease;
position: relative;
}

.vksub-item:hover {
background: #f2f3f5;
transform: translateY(0px);
}

.vksub-item:active {
background: #e9edf1;
transform: scale(.98);
}

/* Разделитель */
.vksub-item:not(:last-child)::after {
content: "";
position: absolute;
bottom: 0;
left: 64px;
right: 0;
height: 1px;
background: #f0f2f5;
}

/* Аватар */
.vksub-avatar {
width: 45px;
height: 45px;
border-radius: 50%;
object-fit: cover;
margin-right: 12px;
flex-shrink: 0;
background: #f2f3f5;
}

/* Инфо */
.vksub-info {
flex: 1;
min-width: 0;
}

.vksub-name {
font-size: 14px;
font-weight: 500;
color: #1d1f23;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}

.vksub-name a {
color: inherit;
text-decoration: none;
}

.vksub-name a:hover {
text-decoration: none;
}

.vksub-desc {
font-size: 13px;
color: #6d7885;
margin-top: 3px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}

/* Убираем зелёную точку */
.vksub-indicator {
display: none;
}

/* Пусто */
.vksub-empty {
padding: 20px 16px;
text-align: center;
color: #6d7885;
font-size: 14px;
}

/* Мобильная версия */
@media (max-width: 900px) {
.vksub-block { border-radius: 10px; }
.vksub-item { padding: 9px 14px; }
.vksub-avatar { width: 36px; height: 36px; }
.vksub-name { font-size: 13.5px; }
}
</style>

Мурчанн

Признаюсь, не знаю почему, но глядя на звезды мне всегда хочется мечтать.
Дата: Среда, 04.03.2026, 22:10 | Сообщение # 2 | | Написал: Известный
Автор темы
Мурчанн не в сети
        Сообщений:288
         Регистрация:20.10.2016
За уважение окружающих За уважение окружающих За хорошее поведение За преданность форуму За любовь народа

Мурчанн

Признаюсь, не знаю почему, но глядя на звезды мне всегда хочется мечтать.
Дата: Пятница, 13.03.2026, 18:51 | Сообщение # 3 | | Написал: Известный
Автор темы
Мурчанн не в сети
        Сообщений:288
         Регистрация:20.10.2016
За уважение окружающих За уважение окружающих За хорошее поведение За преданность форуму За любовь народа

Если запаковать будет выглядеть так , место намного меньше будет занимать.

Код
<!-- ======= Блок подписок ======= -->
<div class="vksub-block">
<div class="vksub-head">
<span>Подписки</span>
<span class="vksub-count" id="subsCount">
<span class="subs-label">Подписок</span>
<span class="subs-number">0</span>
</span>
</div>
<div class="vksub-container" id="subsParser">
<div class="vksub-empty">Загрузка подписок...</div>
</div>
</div>

<script src="https://bro.usite.pro/js/subs-parser.js" defer></script>
<link rel="stylesheet" href="https://bro.usite.pro/css/subscribe-system.css" media="all">

Мурчанн

Признаюсь, не знаю почему, но глядя на звезды мне всегда хочется мечтать.
  • Страница 1 из 1
  • 1
Поиск: