Forked from http://codepen.io/yelp/pen/aLxbG.
A Pen by Hugo Giraudel on CodePen.
Forked from http://codepen.io/yelp/pen/aLxbG.
A Pen by Hugo Giraudel on CodePen.
| <div class="rating" data-rate="1"> | |
| <i class="star-1">★</i> | |
| <i class="star-2">★</i> | |
| <i class="star-3">★</i> | |
| <i class="star-4">★</i> | |
| <i class="star-5">★</i> | |
| </div> | |
| <div class="rating" data-rate="1.5"> | |
| <i class="star-1">★</i> | |
| <i class="star-2">★</i> | |
| <i class="star-3">★</i> | |
| <i class="star-4">★</i> | |
| <i class="star-5">★</i> | |
| </div> | |
| <div class="rating" data-rate="2"> | |
| <i class="star-1">★</i> | |
| <i class="star-2">★</i> | |
| <i class="star-3">★</i> | |
| <i class="star-4">★</i> | |
| <i class="star-5">★</i> | |
| </div> | |
| <div class="rating" data-rate="2.5"> | |
| <i class="star-1">★</i> | |
| <i class="star-2">★</i> | |
| <i class="star-3">★</i> | |
| <i class="star-4">★</i> | |
| <i class="star-5">★</i> | |
| </div> | |
| <div class="rating" data-rate="3"> | |
| <i class="star-1">★</i> | |
| <i class="star-2">★</i> | |
| <i class="star-3">★</i> | |
| <i class="star-4">★</i> | |
| <i class="star-5">★</i> | |
| </div> | |
| <div class="rating" data-rate="3.5"> | |
| <i class="star-1">★</i> | |
| <i class="star-2">★</i> | |
| <i class="star-3">★</i> | |
| <i class="star-4">★</i> | |
| <i class="star-5">★</i> | |
| </div> | |
| <div class="rating rating-4" data-rate="4"> | |
| <i class="star-1">★</i> | |
| <i class="star-2">★</i> | |
| <i class="star-3">★</i> | |
| <i class="star-4">★</i> | |
| <i class="star-5">★</i> | |
| </div> | |
| <div class="rating" data-rate="4.5"> | |
| <i class="star-1">★</i> | |
| <i class="star-2">★</i> | |
| <i class="star-3">★</i> | |
| <i class="star-4">★</i> | |
| <i class="star-5">★</i> | |
| </div> | |
| <div class="rating" data-rate="5"> | |
| <i class="star-1">★</i> | |
| <i class="star-2">★</i> | |
| <i class="star-3">★</i> | |
| <i class="star-4">★</i> | |
| <i class="star-5">★</i> | |
| </div> |
| $font-size: 20px; // <-- Adjust this only! | |
| $star-width: 1.5em; | |
| $max-stars: 5; | |
| body { | |
| padding: 20px; | |
| font-size: $font-size; | |
| } | |
| .rating { | |
| margin: 10px 0; | |
| } | |
| .rating i { | |
| display: inline-block; | |
| width: 0; | |
| height: $star-width; | |
| border-width: 0 ( $star-width / 2 ); | |
| border-style: solid; | |
| border-color: #eee; | |
| border-radius: .22em; | |
| color: white; | |
| background: #eee; | |
| font-style: normal; | |
| line-height: $star-width + 0.1em; | |
| text-indent: -0.5em; | |
| text-shadow: 1px 0 1px hsl(0, 0%, 70%); | |
| } | |
| // Revamping the stars-color function | |
| // To use a list and some logic | |
| // In order to avoid repeted code | |
| // Also add a fallback color, just in case (#333) | |
| @function stars-color($stars) { | |
| @if type-of($stars) != number { | |
| @warn '#{$stars} is not a number for `stars-color`.'; | |
| @return false; | |
| } | |
| $colors: #cc8b1f #dcb228 #f0991e #f26a2c #dd050b; | |
| @return if($stars <= length($colors), nth($colors, $stars), #333); | |
| } | |
| // Main loop, looping through 1 to 4 (instead of 5) | |
| // 1. Instanciating a list that will be used as a CSS selector | |
| // 2. Caching the return from stars-color to speed up compilation | |
| @for $i from 1 to $max-stars { | |
| $selector: (); // 1 | |
| $color: stars-color($i); // 2 | |
| // Inner loop not dumping anything | |
| // 1. Only appending stuff to $selector | |
| // 2. Using the [attr^='X'] selector to target both X and X.Y | |
| // 3. Forcing comma separated list for the selector to work | |
| @for $j from 1 through $i { | |
| $selector: append( | |
| $selector, // 1 | |
| unquote("[data-rate^='#{$i}'] .star-#{$j}"), // 2 | |
| comma // 3 | |
| ); | |
| } | |
| // Using the concatenated selector | |
| #{$selector} { | |
| border-color: $color; | |
| background: $color; | |
| } | |
| // For half ratings only, applying color to left border of next star | |
| [data-rate='#{$i + 0.5}'] .star-#{$i + 1} { | |
| border-left-color: $color; | |
| } | |
| } | |
| // Dealing with 5-stars rating in a very simple way | |
| // Since there is no 5.5 rating possible | |
| $color: stars-color($max-stars); | |
| [data-rate='#{$max-stars}'] i { | |
| border-color: $color; | |
| background: $color; | |
| } | |
| /** Print */ | |
| @media print { | |
| .rating { | |
| -webkit-print-color-adjust: exact; | |
| i { | |
| text-shadow: none; | |
| } | |
| } | |
| } |