Заполнение звездного рейтинга

Нужно заполнить звезды в соответствии со значением в rating_value.

       <link rel="stylesheet" href="css/rating.css">
            
            <div class="rating" >
                <div class="rating_body">
                <div class="rating_active"></div>
                    <div class="rating_items"></div>
                </div>  
                <div class="rating_value" >4</div>  
            </div>
        
       
    
     <script type="text/javascript">
            const ratings=document.querySelectorAll('.rating');
            if (ratings.length>0){
                initRatings();
            }
        
            function initRatings(){
                let ratingActive, ratingValue;
                for (let index=0; index<ratings.length; index++){
                    const rating=ratings[index];
                        initRating(rating);
                }
        
            function initRating(rating){
                initRatingVars(rating);
                setRatingActiveWidth();
            }
            
            function initRatingVars(rating){
                    ratingActive=rating.document.querySelectorAll('.rating_active');
                ratingValue=rating.document.querySelectorAll('.rating_value');
                        
            }
        
            function setRatingActiveWidth(index=ratingValue.innerHTML){
            const ratingActiveWidth=index/0.05;
            ratingActive.style.width=`${ratingActiveWidth}%`;
                        
            }
        }
        </script>

.rating{
  font-size: 25px;
  display: inline-flex;
  align-items: flex-end;
}

.rating_body{
 position: relative;
}

.rating_body::before{
  content: '★★★★★';
  display: block;
}
.rating_items{
display: flex;
position: absolute;
width: 100%;
height: 100%;
top: 0;
}

.rating_active{
  position: absolute;
  height: 100%;
  width: 0%;
  overflow: hidden; 
  top: 0;

}
.rating_active::before{
    content: '★★★★★';
    position: absolute;
    width: 100%;
    height: 100%;
    top: 0;
    color: red;
}

.rating_value{
   font-size: 100%;
}

Ответы (1 шт):

Автор решения: Aziz Umarov

Думаю вы так хотели.

const ratings=document.querySelectorAll('.rating');

if (ratings.length>0){
    initRatings();
}

function initRatings(){
    let ratingActive, ratingValue;
    for (let index=0; index<ratings.length; index++){
        const rating=ratings[index];
            initRating(rating);
    }

    function initRating(rating){
        initRatingVars(rating);
        setRatingActiveWidth();
    }

    function initRatingVars(rating){
        ratingActive=rating.querySelectorAll('.rating_active')[0];
        ratingValue=rating.querySelectorAll('.rating_value')[0];
    }


    function setRatingActiveWidth(index=ratingValue.innerHTML){        
        const ratingActiveWidth = index/0.05;
        ratingActive.style.width=`${ratingActiveWidth}%`;
    }
}
.rating{
  font-size: 25px;
  display: inline-flex;
  align-items: flex-end;
}

.rating_body{
 position: relative;
}

.rating_body::before{
  content: '★★★★★';
  display: block;
}
.rating_items{
display: flex;
position: absolute;
width: 100%;
height: 100%;
top: 0;
}

.rating_active{
  position: absolute;
  height: 100%;
  width: 0%;
  overflow: hidden; 
  top: 0;

}
.rating_active::before{
    content: '★★★★★';
    position: absolute;
    width: 100%;
    height: 100%;
    top: 0;
    color: red;
}

.rating_value{
   font-size: 100%;
}
<div class="rating" >
    <div class="rating_body">
    <div class="rating_active"></div>
        <div class="rating_items"></div>
    </div>  
    <div class="rating_value" >4</div>  
</div>
<br>
<div class="rating" >
    <div class="rating_body">
    <div class="rating_active"></div>
        <div class="rating_items"></div>
    </div>  
    <div class="rating_value" >1</div>  
</div>
<br>
<div class="rating" >
    <div class="rating_body">
    <div class="rating_active"></div>
        <div class="rating_items"></div>
    </div>  
    <div class="rating_value" >5</div>  
</div>

а чуть по красивее

const ratings = document.querySelectorAll('.rating');

ratings.forEach( rating =>{
  const ratingActive = rating.querySelectorAll('.rating_active')[0];
  const ratingValue = rating.querySelectorAll('.rating_value')[0];
  const ratingActiveWidth = ratingValue.innerHTML/0.05;
  ratingActive.setAttribute('style', `width:${ratingActiveWidth}%`);
});
.rating{
  font-size: 25px;
  display: inline-flex;
  align-items: flex-end;
}

.rating_body{
 position: relative;
}

.rating_body::before{
  content: '★★★★★';
  display: block;
}
.rating_items{
display: flex;
position: absolute;
width: 100%;
height: 100%;
top: 0;
}

.rating_active{
  position: absolute;
  height: 100%;
  width: 0%;
  overflow: hidden; 
  top: 0;

}
.rating_active::before{
    content: '★★★★★';
    position: absolute;
    width: 100%;
    height: 100%;
    top: 0;
    color: red;
}

.rating_value{
   font-size: 100%;
}
<div class="rating" >
    <div class="rating_body">
    <div class="rating_active"></div>
        <div class="rating_items"></div>
    </div>  
    <div class="rating_value" >4</div>  
</div>
<br>
<div class="rating" >
    <div class="rating_body">
    <div class="rating_active"></div>
        <div class="rating_items"></div>
    </div>  
    <div class="rating_value" >1</div>  
</div>
<br>
<div class="rating" >
    <div class="rating_body">
    <div class="rating_active"></div>
        <div class="rating_items"></div>
    </div>  
    <div class="rating_value" >5</div>  
</div>

→ Ссылка