Search code examples
javascriptjqueryhtmlcssrating

How to make simple star rating?


I make my own star rating with html css, but it is not working true. If i use direction: rtl or float: right it works but i can't use rtl or float:right because of php.

How can i make it with pure css and html?

$('.stars a').on('click', function(){
	$('.stars a').removeClass('active');
	$(this).addClass('active');
});
.stars input {
    position: absolute;
    left: -999999px;
}

.stars a {
    display: inline-block;
    font-size: 0;
    text-decoration: none;
}

.stars a:before {
    position: relative;
    font-size: 18px;
    font-family: 'FontAwesome', serif;
    display: block;
    content: "\f005";
    color: #9e9e9e;
}

.stars a:hover:before,
.stars a:hover ~ a:before,
.stars a.active:before,
.stars a.active ~ a:before {
    color: blue;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">

<p class="stars">
  <span>
    <a class="star-1" href="#">1</a>
    <a class="star-2" href="#">2</a>
    <a class="star-3" href="#">3</a>
    <a class="star-4" href="#">4</a>
    <a class="star-5" href="#">5</a>
  </span>
</p>


Solution

  • Starting to your HTML, I tried to reverse the color's change 'cause in pure CSS + & ~ works only on next elements. Then why you don't make the next a gray and not blue?

    I tried to play only with your CSS, but I had to add also a class to span to work with active situation. Sorry :P

    This is the result:

    $('.stars a').on('click', function(){
      $('.stars span, .stars a').removeClass('active');
    
      $(this).addClass('active');
      $('.stars span').addClass('active');
    });
    .stars input {
        position: absolute;
        left: -999999px;
    }
    
    .stars a {
        display: inline-block;
        padding-right:4px;
        text-decoration: none;
        margin:0;
    }
    
    .stars a:after {
        position: relative;
        font-size: 18px;
        font-family: 'FontAwesome', serif;
        display: block;
        content: "\f005";
        color: #9e9e9e;
    }
    
    
    span {
      font-size: 0; /* trick to remove inline-element's margin */
    }
    
    .stars a:hover ~ a:after{
      color: #9e9e9e !important;
    }
    span.active a.active ~ a:after{
      color: #9e9e9e;
    }
    
    span:hover a:after{
      color:blue !important;
    }
    
    span.active a:after,
    .stars a.active:after{
      color:blue;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">
    
    <p class="stars">
      <span>
        <a class="star-1" href="#">1</a>
        <a class="star-2" href="#">2</a>
        <a class="star-3" href="#">3</a>
        <a class="star-4" href="#">4</a>
        <a class="star-5" href="#">5</a>
      </span>
    </p>

    Hope it helps! :)