Половина шрифта потрясающий рейтинг сердца css

Я создаю рейтинговую систему, используя класс font-awesome fa-heart. Он отлично работает, раскрашивая полное сердце, но у меня проблемы, когда я пытаюсь залить красным только первую половину сердца. Я искал, но всегда звезды, а не полусердца, всегда полные сердца и не от font-awesome.

Используется Font awesome версии 4.0.3 и не может быть изменен ...

Есть какие-нибудь уловки, чтобы сделать это?

.full {
  color:red;
}
.half {

}
<link rel = "stylesheet" type = "text/css" href = "https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.0.3/css/font-awesome.min.css">

<div class = "rating-love ">
     <span class = "fa fa-heart full"></span>
     <span class = "fa fa-heart full"></span>
     <span class = "fa fa-heart full"></span>
     <span class = "fa fa-heart full"></span>
     <span class = "fa fa-heart half"></span>  
     <a href = "#reviews"><span>23 Review(s)</span></a>
                    </div>   

FA - это значок шрифта, поэтому каждый значок представляет собой отдельный глиф. Насколько мне известно, в HTML / CSS / JS нет способа, чтобы один глиф имел разные цвета. Вы можете сделать что-то вроде использования более бледного цвета для «частичного» сердца.

jonrsharpe 07.08.2018 17:36

Не дурак, но связанный: stackoverflow.com/questions/23569441/…

James Douglas 07.08.2018 18:45
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
2
2
1 193
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Без использования JavaScript вы бы сократили ширину диапазона вдвое, скрывая переполнение.

.full {
  color: red;
  vertical-align:text-bottom;
}

.half {
  color: red;
  width: 8px;
  overflow: hidden;
  vertical-align:text-bottom;
  margin-right: 8px;
}
<link rel = "stylesheet" type = "text/css" href = "https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.0.3/css/font-awesome.min.css">

<div class = "rating-love ">
  <span class = "fa fa-heart full"></span>
  <span class = "fa fa-heart full"></span>
  <span class = "fa fa-heart full"></span>
  <span class = "fa fa-heart full"></span>
  <span class = "fa fa-heart half"></span>
  <a href = "#reviews"><span>23 Review(s)</span></a>
</div>

Это работает, но есть некоторый запас над последним сердечком, который портит эффект ...

James Douglas 07.08.2018 18:05

@JamesDouglas Неправильно, у последнего диапазона сердца нет другого поля, кроме правого, которое я ему дал. Итак, ничего не испортилось.

j08691 07.08.2018 18:13

Я вижу маржу на своем компьютере. Я использую Firefox в OSX. Вот скриншот того, что я вижу.

James Douglas 07.08.2018 18:19

@JamesDouglas Похоже, вместо этого вертикальное выравнивание.

j08691 07.08.2018 18:22

Это может быть решено добавлением vertical-align:text-bottom; к промежуткам .full; Я взял на себя смелость отредактировать ваш ответ, включив его.

James Douglas 07.08.2018 18:28

Это можно сделать с помощью текстового клипа и фонового градиента, я надеюсь, что этот трюк сработает и для вас. Я просто сделал градиент из двух цветов и разделил их на клип, чтобы он выглядел нормально. Вы можете сделать половину сердца белой, если хотите, просто изменив шестнадцатеричный код в css.

.fa-heart.half:before {
    background: -webkit-linear-gradient(180deg,#000 0%, #000 50%,#FF0000 50%);
    -webkit-background-clip: text;
    -webkit-text-fill-color: transparent;
}

.full {
  color:red;
}
.half {

}
.fa-heart.half:before {
    background: -webkit-linear-gradient(180deg,#000 0%, #000 50%,#FF0000 50%);
    -webkit-background-clip: text;
    -webkit-text-fill-color: transparent;
}
<link rel = "stylesheet" type = "text/css" href = "https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.0.3/css/font-awesome.min.css">

<div class = "rating-love ">
     <span class = "fa fa-heart full"></span>
     <span class = "fa fa-heart full"></span>
     <span class = "fa fa-heart full"></span>
     <span class = "fa fa-heart full"></span>
     <span class = "fa fa-heart half"></span>  
     <a href = "#reviews"><span>23 Review(s)</span></a>
                    </div>   

Хорошее решение! К сожалению, это, вероятно, не очень кроссбраузерно совместимо, но все же действительно хорошая идея.

James Douglas 07.08.2018 18:02
text-stroke Не поддерживается в IE. caniuse.com/#feat=text-stroke
James Douglas 07.08.2018 18:22

@JamesDouglas Да, к сожалению, IE не поддерживает Text-stroke, :(

Robin 07.08.2018 18:34

Это тот подход, который я искал. Жаль, что он не работает в IE, но все равно спасибо!

Albeis 07.08.2018 20:33

Буду искать варианты, если как-то возможно такое решение в IE, обновлю вас здесь.

Robin 07.08.2018 21:25
Ответ принят как подходящий

Вот еще одна идея, с помощью которой вы можете легко получить любой рейтинг, просто изменив значение ширины:

.full {
  color: red;
}

.rating-love {
  position: relative;
  display:inline-block;
}

.rate {
  white-space: nowrap;
  overflow: hidden;
  position: absolute;
  top: 0;
  left: 0;
  z-index: 2;
}
<link rel = "stylesheet" type = "text/css" href = "https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.0.3/css/font-awesome.min.css">

<div class = "rating-love ">
  <span class = "fa fa-heart"></span>
  <span class = "fa fa-heart "></span>
  <span class = "fa fa-heart"></span>
  <span class = "fa fa-heart"></span>
  <span class = "fa fa-heart"></span>
  <span class = "rate" style = "width:50%;"> <!-- change this value for 0 to 100 -->
    <span class = "fa fa-heart full"></span>
    <span class = "fa fa-heart full"></span>
    <span class = "fa fa-heart full"></span>
    <span class = "fa fa-heart full"></span>
    <span class = "fa fa-heart full"></span>
  </span>
</div>
  <a href = "#reviews"><span>23 Review(s)</span></a>

С точки зрения семантики, отдавать все сердца классу full - не лучший вариант.

j08691 07.08.2018 17:51

Это интересный взгляд на проблему; Единственная проблема заключается в использовании фиксированной ширины в диапазоне .rate, потому что значки FA представляют собой текст, а фактическая фиксированная ширина отсутствует.

James Douglas 07.08.2018 18:09

@JamesDouglas не нужно использовать фиксированную ширину :) .. вы также можете использовать%, если вы удалите другой текст и сделаете его снаружи. В этом случае 100% ширина будет шириной 5 звезд, независимо от размера шрифта.

Temani Afif 07.08.2018 20:36

Спасибо @TemaniAfif! Хороший подход, но сложно настроить ширину при динамической генерации.

Albeis 07.08.2018 20:42

@Albeis еще раз проверьте, что он обновляется с% сейчас;)

Temani Afif 07.08.2018 20:51

наконец-то я воспользовался вашим подходом :)

Albeis 03.09.2018 16:00

Другие вопросы по теме