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

1
Админ
Постов: 211
2
VIP
Постов: 72
3
Элита
Постов: 50
4
Проверенные
Постов: 35
5
VIP
Постов: 35
6
Проверенные
Постов: 32
7
Пользователи
Постов: 31
8
Проверенные
Постов: 29

  • Страница 1 из 1
  • 1
Модуль ВК «Подписки » для Ucoz v 6.0 стиль Март 2026
Дата: Среда, 04.03.2026, 22:08 | Сообщение # 1 | | Написал: Узнаваемый
Автор темы
Мурчанн не в сети
        Сообщений:211
         Регистрация: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 | | Написал: Узнаваемый
Автор темы
Мурчанн не в сети
        Сообщений:211
         Регистрация:20.10.2016

Мурчанн

Признаюсь, не знаю почему, но глядя на звезды мне всегда хочется мечтать.
Дата: Пятница, 13.03.2026, 18:51 | Сообщение # 3 | | Написал: Узнаваемый
Автор темы
Мурчанн не в сети
        Сообщений:211
         Регистрация: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
Поиск: