Пришлось полностью с нуля разрабатывать скрипт рейтинга для отображения материалов с сердечком. Проблема в том, что на платформе uCoz рейтинг устроен очень специфически: он не позволяет просто вставить кнопку «лайк» и сразу получать результат, как в современных социальных сетях.
Сложность заключается в нескольких моментах:
1. Система рейтингов uCoz не предусматривает мгновенное обновление
В стандартном движке рейтинги считаются и сохраняются на сервере при отправке формы, а не динамически через JavaScript. Чтобы реализовать интерактивное сердечко, нужно самостоятельно отслеживать клик, менять внешний вид кнопки и обновлять счётчик на странице без перезагрузки.
Необходимость учёта повторного голосования
на uCoz нет встроенного механизма, который бы блокировал повторное нажатие на лайк. Чтобы пользователь не мог кликать несколько раз, пришлось использовать localStorage для хранения ID уже проголосовавших постов.
Отправка данных на сервер
Даже после того как пользователь нажал сердечко, рейтинг должен обновиться и на сервере uCoz. Для этого используется AJAX-запрос через внутреннюю функцию _uPostForm, который имитирует стандартное действие рейтинга движка.
Адаптация под дизайн социальной сети
Кнопка «лайк» должна плавно менять цвет и масштабироваться при наведении или клике. С помощью CSS добавлены эффекты: увеличение, смена цвета фона, тень, чтобы визуально имитировать интерактивное сердечко.
Как работает скрипт лайка на примере кода:
На странице создаётся блок лайка с сердечком и счётчиком:
Таким образом, реализуется полностью интерактивный лайк, похожий на соцсети, но на платформе, которая изначально для этого не предназначена.
Почему сложно сделать лайк на uCoz с нуля:
1. Отсутствие API для динамических голосований – нужно использовать внутренние POST-запросы.
2. Нет клиентской валидации повторного голосования – необходимо самим хранить информацию о том, кто уже голосовал.
3. Обновление визуальной части – сердечко должно менять состояние без перезагрузки страницы.
4. Совмещение с существующей системой рейтингов – счётчик на сервере должен совпадать с тем, что видит пользователь на фронтенде.
В итоге, чтобы получить привычный эффект лайка как в соцсетях, пришлось комбинировать CSS-анимацию, localStorage и AJAX-запрос к uCoz.
Особая деталь - буква X:
Для красоты и ещё одного способа визуализировать рейтинг была добавлена буква X, очень похожая на бренд соцсети Илона Маска. Она заполняется цветами в зависимости от количества лайков, создавая эффект прогресс-бара и делая визуал рейтинга более стильным и узнаваемым.
Чтобы получить привычный эффект лайка как в соцсетях, пришлось сочетать CSS-анимацию, localStorage и AJAX-запрос к uCoz, а буква X добавила интерактивности и красоты, делая рейтинг не только функциональным, но и визуально привлекательным.
Вид материала и интерфейс рейтинга будут меняться со временем. Возможны улучшения и новые визуальные эффекты, чтобы функционал оставался современным и привлекательным для пользователей.
/* Само сердечко */ .likeHeart { cursor: pointer; font-size: 4px; /* размер сердечка */ color: red; /* цвет сердечка по умолчанию */ background: white; /* фон */ border-radius: 50%; /* круг */ padding: 0px 3px; /* внутренние отступы */ display: inline-flex; align-items: center; justify-content: center; transition: all 0.3s ease; /* плавные изменения */ user-select: none; }
/* Ховер эффект */ .likeHeart:hover { transform: scale(1.4); /* немного увеличиваем сердечко при наведении */ }
/* Состояние "лайк поставлен" */ .likeHeart.liked { background: red; /* фон после лайка */ color: white; /* цвет сердечка после лайка */ cursor: default; /* нельзя кликать повторно */ transform: scale(1.3); /* эффект увеличения при клике */ box-shadow: 0 0 2px rgba(255, 0, 0, 0.6); /* лёгкая тень */ }
/* Контейнер звёзд */ .stars { display: inline-block; font-size: 16px; color: #ddd; /* серые звёзды по умолчанию */ position: relative; width: 120px; /* ширина для 5 звёзд по 18px каждая */ height: 16px; }
.stars::before { content: "★★★★★"; /* 5 звёзд */ position: absolute; left: 0; top: 0; width: 100%; overflow: hidden; color: #ffcc00; /* цвет закрашенных звёзд */ }