Вместо предисловия
Оригинальная статья на Habrahabr
Привет всем!
Взбрело мне как-то, холодным зимним вечером, внести на сайт вместо целых звезд рейтинга — их частичную заливку для дробных чисел (4.5, 3.85 и тд.). Так ведь и глазу милее и информативнее — какое заведение лучше, а какое - хуже. Вот и сели мы с командой думать и гадать.
Как мы путь свой искали
Так как у нас, в основном, топовые заведения и рейтинги 3+, то целые звезды сильно размывают восприятие. Но тут возникли нюансы. Самая распространенная практика — использовать наложение изображения одно поверх другого. С самого-самого начала мы думали сделать все с помощью изображения-маски, но, увы, дизайн не подразумевал, что звездочки могут быть рядом, а контролировать ширину блока заливки и размер звезды не очень удобно.
Тут у Кинопоиска все 10 звезд - одна картинка, где они еще и приклеены друг к другу. Так им очень легко закрасить оранжевым на столько, на сколько душа желает.
<div class='starbar'>
<div class='outer'>
<div class='starbar_w'></div>
</div>
</div>
</source>
<source lang="css">
.starbar .outer {
background: url(/images/starz.gif) no-repeat;
width: 219px;
height: 30px;
position: absolute;
}
.starbar_w {
display: block;
width: 167.09px;
background: url(/images/starz.gif) 0 -62px no-repeat;
height: 30px;
position: absolute;
}
Всегда есть где разгуляться!
Всё же, нам хотелось универсальный и масштабируемый вариант, полностью подчиняющийся BEM методологии. К тому же, в проекте нет ни одного спрайта и все иконки реализованы с помощью собственного набора иконок, бережно собранного в шрифт. Но, думаю, об этом мы поговорим в других статьях ;)
В целом, мы пришли к эксперименту: а почему бы не наложить нашу шрифтовую иконочку поверх другой? Вот мы и сделали.
Каждую звездочку сделали отдельным объектом, состоящей из .stars__out
в качестве контейнера и .stars__in
в качестве заливки.
<div class="stars">
<i class="cfi cfi--star stars__out">
<i class="cfi cfi--star stars__in" style="width: 100%;"></i>
</i>
<i class="cfi cfi--star stars__out">
<i class="cfi cfi--star stars__in" style="width: 33.33%;"></i>
</i>
</div>
А вот и CSS:
.cfi.cfi--star { /* ... */ } /* наш аналог Font Awesome, который рисует звезду */
.stars__out {
position: relative;
margin-right: 5px; /* сделаем отступ между зведами */
color: grey;
z-index: 1;
}
.stars__in {
/* разместим ка мы нашу заливку как дочернюю основной иконки и кинем поверх */
position: absolute;
z-index: 2;
color: orange; /* дадим солнечного цвета */
font-size: inherit; /* и шрифту размер родителя */
/* блоку дадим точки отчета по нулям относительно родителя */
display: block;
top: 0; left: 0; bottom: 0;
/* ну и ограничим область видимости, а также ширину установим в 0 по умолчанию */
overflow: hidden;
width: 0;
}
Все. Дальше, когда нам нужно залить на 100% (полная звездочка), мы просто даем ей CSS свойство width: 100%
.
А вот для неполных звездочек мы использовали еще одну хитрость. Мы ставим в ширину не x * 100%
, а значение по специально рассчитанной формуле.
Все дело в психологии. Нам свойственно визуально воспринимать процент заполнения в объеме, а не в ширине, а поскольку звезда слева и справа имеет весьма малую площадь, что усложняет восприятие, мы придумали заполнять ее по ширине нелинейно:
Для нелинейной модели мы взяли синусоиду. Она как раз отлично описывает быстрое начало и окончание роста, и плавный рост в середине.
Развернули ее, получив arсsin, ужали его в рамки {0; 1} по обеим осям и получили неплохую и простую формулу для расчета «психологической заполненности» звезды.
Код на JavaScript:
var y = Math.asin( 2 * x - 1 ) / Math.PI + 0.5;
Рабочий пример можно увидеть на нашем проекте CityFrog
Как оказалось, такой принцип хорошо работает в старых браузерах, и даже ничего не ползет на IE9. Довольны были все: и дизайнеры, и заказчики, и даже мое Эго, что и побудило накатать статью .
Искренне надеюсь, что кому-нибудь это понадобится :)
Привет! :)
Мы - проект на Голосе, который направлен на борьбу с плагиатом, копипастой и кражей личности.
Репост скопированных текстов не несет в себе никакой ценности и вредит развитию сообщества Голос, поэтому данный вид постов не приветствуется и рассматривается как неуважительное отношение к сообществу.
Как Вы можете поделиться понравившимся контентом, найденном на просторах интернета? Вот несколько советов:
Вы можете опубликовать ссылку на оригинал контента, при этом в своем посте описать или высказать свое мнение по поводу контента, которым вы делитесь.
Вы можете приводить цитаты в рамках своей авторской статьи, при этом всегда давайте ссылку на оригинал, а цитату оформляйте в кавычки или воспользуйтесь форматированием Markdown. При этом цитаты составляют не более ~20% от всего текста статьи.
Если Вы на самом деле являетесь автором, пожалуйста, скажите об этом, ответив на комментарий.
Если Вы являетесь автором и уже делали верификацию, а мы просим о ней повторно - просим извинить нас. Если автора нет в нашей базе данных, мы ищем верификацию лишь в текущем посте и первом посте автора. Вы нам поможете, если просто оставите ссылку на свою верификацию или же свяжитесь с нами в чате Культуры Голоса.
Спасибо за сотрудничество!
Да, я и действительно явлюсь автором данной статьи и сделал всего лишь ее репост.
А вот с верификацией опишите подробнее. Что за ссылка? Что за верификация?
@reilag
Большое спасибо за ответ.
Вы можете подтвердить свою личность разместив в своем блоге
https://habrahabr.ru/post/318732/
ссылку на Ваш блог в ГОЛОСЕ. Например - https://golos.id/@reilag
После этого мы внесем Вас в свою базу данных как автора с этого ресурса.
Заранее благодарим Вас за сотрудничество.
Я бы с радостью, но есть проблема.
Правила Habrahabr сочтут подобное размещения как рекламу стороннего сервиса.
Поступлю иначе. Разместил ссылку на мой блог в Golos на странице профиля в Habrahabr: https://habrahabr.ru/users/reilag/
К сожалению, не могу найти ссылку на голос в вашем профиле.
@reilag Поздравляю! Вы получили личную награду!
С Днём Рождения - 2 лет на Голосе
Вы можете нажать на бейдж, чтобы увидеть свою страницу на Доске Почета.
Приветствую Вас на платформе Голос!
Я бот @radogost и меня создали для того, чтобы приветствовать новичков и
помогать им осваиваться на просторах Голоса.
Если вы ещё мало знаете о платформе Голос, то рекомендую ознакомиться со
следующими материалами:
Основы оформления постов на Голосе + полный курс по работе с Markdown
Что такое токены Голос, Сила Голоса и Золотой Видео
Я здесь впервые
Как пользоваться платформой Голос?
Вознаграждение на Голосе: кому и сколько
Как создать пост на платформе Голос?
Если у вас есть конкретные вопросы, то можете задать их в комментарии к этому сообщению и я Вам обязательно отвечу.