Вот как это работает простыми словами:Вид на странице: На сайте отображается три элемента:Кнопка «Не нравится» (для отрицательной оценки).
Число, показывающее текущий рейтинг (например, +5 или -3).
Кнопка «Нравится» (для положительной оценки).
Что происходит при клике:Когда пользователь нажимает «Нравится» или «Не нравится», запускается функция rateForm.
Эта функция отправляет запрос на сервер с информацией о том, какую оценку поставили (+1 за «нравится», -1 за «не нравится»), и указывает ID объекта (например, поста или комментария).
Пока запрос обрабатывается, кнопки «нравится» и «не нравится» временно скрываются, чтобы избежать повторных кликов.
Обработка на сервере:Сервер получает запрос, обновляет рейтинг и возвращает новое значение.
Если всё прошло успешно, рейтинг обновляется на странице, и число подсвечивается: зелёным (если рейтинг положительный), красным (если отрицательный) или серым (если ноль).
Появляется сообщение: «Оценка засчитана!».
Если что-то пошло не так:Если сервер вернёт ошибку, скрипт попробует её обработать, но рейтинг не изменится.
Технические детали:Рейтинг рассчитывается как сумма всех оценок минус двойное количество голосов (чтобы учесть начальное значение).
Скрипт использует jQuery для работы с элементами страницы и отправки запросов.
Стили (positiveRate, negativeRate, nullRate) задают внешний вид числа рейтинга в зависимости от его значения.
В общем, это удобная система для голосования, которая позволяет пользователям оценивать контент и сразу видеть результат.
Каталог файлов в нудное место
Код
<div class="rate_my_post">
<a class="orating_m" title="Не нравится" href="#" onclick="rateForm(-1,$ID$);return false"></a>
<a class="<?if(($RATING$*$RATED$-2*$RATED$)=0)?>nullRate<?else?><?if(($RATING$*$RATED$-2*$RATED$)<0)?>negativeRate<?else?>positiveRate<?endif?> <?endif?>" href="javascript://" title="Общий рейтинг"><b id="rate_$ID$"><script type="text/javascript">document.write(Math.round(<?($RATING$*$RATED$)?>)-<?2*$RATED$?>)</script></b> </a>
<a class="orating_p" title="Нравится" href="#" onclick="rateForm(1,$ID$);return false"></a>
</div>
<a class="orating_m" title="Не нравится" href="#" onclick="rateForm(-1,$ID$);return false"></a>
<a class="<?if(($RATING$*$RATED$-2*$RATED$)=0)?>nullRate<?else?><?if(($RATING$*$RATED$-2*$RATED$)<0)?>negativeRate<?else?>positiveRate<?endif?> <?endif?>" href="javascript://" title="Общий рейтинг"><b id="rate_$ID$"><script type="text/javascript">document.write(Math.round(<?($RATING$*$RATED$)?>)-<?2*$RATED$?>)</script></b> </a>
<a class="orating_p" title="Нравится" href="#" onclick="rateForm(1,$ID$);return false"></a>
</div>
Js код
Код
<script>rateForm = function(c, d, f, g) {
if (typeof d == 'undefined' || typeof c == 'undefined' || (c != 1 && c != -1)) return false;
c += 2;
if (!f) f = location.pathname.match(/[^\\\/]+/i) + '';
if (!f) return false;
var h = $('#rate_' + d);
g = $.extend({
'before': function(a) {
a.prev('a').remove();
a.next('a').remove()
},
'after-success': function(a, b) {
a.html(b).addClass(b > 0 ? 'positiveRate' : (b == 0 ? 'nullRate' : 'negativeRate'));
_uWnd.alert('Оценка засчитана!')
},
'after-error': function(a) {
try {
eval(a)
} catch (e) {}
}
}, g || {});
g.before(h);
$.post('/' + f + '/', {
'a': '65',
'id': d,
'mark': c,
'mod': f,
'ajax': '2'
}, function(a) {
a = $('cmd:first', a).text();
var b = a.match(/рейтинг:\s*([\d.]+)\/(\d+)/i);
if (!b) return g['after-error'](a);
b = Math.round(b[1] * b[2]) - 2 * b[2];
g['after-success'](h, b)
})
};
</script>
if (typeof d == 'undefined' || typeof c == 'undefined' || (c != 1 && c != -1)) return false;
c += 2;
if (!f) f = location.pathname.match(/[^\\\/]+/i) + '';
if (!f) return false;
var h = $('#rate_' + d);
g = $.extend({
'before': function(a) {
a.prev('a').remove();
a.next('a').remove()
},
'after-success': function(a, b) {
a.html(b).addClass(b > 0 ? 'positiveRate' : (b == 0 ? 'nullRate' : 'negativeRate'));
_uWnd.alert('Оценка засчитана!')
},
'after-error': function(a) {
try {
eval(a)
} catch (e) {}
}
}, g || {});
g.before(h);
$.post('/' + f + '/', {
'a': '65',
'id': d,
'mark': c,
'mod': f,
'ajax': '2'
}, function(a) {
a = $('cmd:first', a).text();
var b = a.match(/рейтинг:\s*([\d.]+)\/(\d+)/i);
if (!b) return g['after-error'](a);
b = Math.round(b[1] * b[2]) - 2 * b[2];
g['after-success'](h, b)
})
};
</script>
CSS оформление
Код
<style>/* ===== Рейтинг ===== */
.rate_my_post {
display: inline-flex;
align-items: center;
gap: 4px;
padding: 4px;
background: #f5f6f8;
border: 1px solid #e5e7eb;
border-radius: 14px;
box-shadow:
0 2px 6px rgba(0, 0, 0, .04),
inset 0 1px 0 rgba(255, 255, 255, .8);
}
/* Общие стили кнопок */
.rate_my_post > a {
position: relative;
display: inline-flex;
align-items: center;
justify-content: center;
width: 38px;
height: 34px;
border-radius: 10px;
text-decoration: none;
transition:
background .2s ease,
color .2s ease,
transform .15s ease,
box-shadow .2s ease;
}
/* Убираем стандартный размер текста */
.rate_my_post > a {
font-size: 0;
}
/* ===== Не нравится ===== */
.rate_my_post .orating_m::before {
content: "−";
font-size: 22px;
font-weight: 500;
line-height: 1;
}
.rate_my_post .orating_m {
color: #6b7280;
}
.rate_my_post .orating_m:hover {
color: #dc2626;
background: #fee2e2;
}
.rate_my_post .orating_m:active {
transform: scale(.9);
}
/* ===== Нравится ===== */
.rate_my_post .orating_p::before {
content: "+";
font-size: 22px;
font-weight: 500;
line-height: 1;
}
.rate_my_post .orating_p {
color: #6b7280;
}
.rate_my_post .orating_p:hover {
color: #16a34a;
background: #dcfce7;
}
.rate_my_post .orating_p:active {
transform: scale(.9);
}
/* ===== Число рейтинга ===== */
.rate_my_post > a.positiveRate,
.rate_my_post > a.nullRate,
.rate_my_post > a.negativeRate {
width: 46px;
min-width: 46px;
background: #fff;
border: 1px solid #e5e7eb;
box-shadow: 0 2px 5px rgba(0,0,0,.04);
cursor: default;
}
.rate_my_post b {
font-size: 15px;
font-weight: 700;
line-height: 1;
}
/* Положительный */
.rate_my_post .positiveRate {
color: #16a34a;
}
/* Нулевой */
.rate_my_post .nullRate {
color: #6b7280;
}
/* Отрицательный */
.rate_my_post .negativeRate {
color: #dc2626;
}
.rate_my_post:hover {
border-color: #d1d5db;
box-shadow:
0 4px 12px rgba(0, 0, 0, .07),
inset 0 1px 0 rgba(255, 255, 255, .8);
}
/* ===== Анимация изменения рейтинга ===== */
@keyframes rateUpdate {
0% {
transform: scale(.8);
opacity: .4;
}
60% {
transform: scale(1.12);
}
100% {
transform: scale(1);
opacity: 1;
}
}
.rate_my_post b {
display: inline-block;
animation: rateUpdate .25s ease;
}
/* ===== Тёмная тема ===== */
@media (prefers-color-scheme: dark) {
.rate_my_post {
background: #18181b;
border-color: #27272a;
box-shadow:
0 2px 8px rgba(0,0,0,.25),
inset 0 1px 0 rgba(255,255,255,.03);
}
.rate_my_post > a.positiveRate,
.rate_my_post > a.nullRate,
.rate_my_post > a.negativeRate {
background: #27272a;
border-color: #3f3f46;
}
.rate_my_post .orating_m,
.rate_my_post .orating_p {
color: #a1a1aa;
}
.rate_my_post .orating_m:hover {
color: #f87171;
background: #3f2020;
}
.rate_my_post .orating_p:hover {
color: #4ade80;
background: #17351f;
}
.rate_my_post .positiveRate {
color: #4ade80;
}
.rate_my_post .nullRate {
color: #a1a1aa;
}
.rate_my_post .negativeRate {
color: #f87171;
}
}
/* ===== Мобильные устройства ===== */
@media (max-width: 600px) {
.rate_my_post {
padding: 3px;
border-radius: 12px;
}
.rate_my_post > a {
width: 34px;
height: 32px;
}
.rate_my_post > a.positiveRate,
.rate_my_post > a.nullRate,
.rate_my_post > a.negativeRate {
width: 42px;
min-width: 42px;
}
}</style>
Картинку залить к себе на сайт в папку img, На этом установке окончена.

0 комментариев
Присоединиться к обсуждению
Поделитесь мнением об этом материале — комментарий появится в списке слева сразу после отправки.