兩種簡單的方式根據類似3.7和7.8這種評分顯示五星評價
封裝成react組件,使用時直接引用即可
第一種思想:設置五個元素,根據評分給不同的樣式;第二種思想:設置兩個元素,父元素給沒顏色的五角星,子元素給有顏色的五角星,根據評分設置子元素的寬度來遮擋父元素的背景圖
方法一:根據不同的評分設置不同的css樣式
三張背景圖:star0.png
,star1.png
,star2.png
1)css代碼:樣式可以按照自己的需求修改
.star{ display: inline-block; } .star>span{ display: inline-block; width: 10px; height: 10px; background-size: 10px 10px; } .star0{ background-image: url(img/star0.png); } .star1{ background-image: url(img/star1.png); } .star2{ background-image: url(img/star2.png); }
2)組件js代碼:
import React,{Component} from 'react'
class Star extends Component{
constructor(props){
super(props);
this.state={
starNum:['star0','star0','star0','star0','star0'] //設置默認背景圖
}
}
componentDidMount(){
this.getStar(Math.round(this.props.star)/2+1); //將傳過來的類似7.3數字進行四舍五入再除2,得到的是類似2,3.5,6這種值
}
getStar(num){
let newStar = this.state.starNum.map((item)=>{ //當num=3.5時遍歷后newStar數組變成['star2','star2','star2','star1','star0','star0']
--num;
return num>=1?'star2':((num>0)?'star1':'star0'); //兩次三目運算
})
this.setState({
starNum:newStar //設置state為遍歷后的新數組
})
}
render(){
return (<span className="star">
{
this.state.starNum.map((item, index)=>{
return <span className={item} key={index}></span>
})
}
</span>)
}
}
export default Star;
3)在其他組件中調用Star組件並傳參:
<Star star={4} /> 頁面顯示為:
<Star star={7.3} /> 頁面顯示為:
這種方法需要少量的計算。
方法二:利用子元素的寬度將父元素進行遮擋
父元素背景圖為無色五角星,子元素背景圖為有色五角星
背景圖:

css代碼:
.newstar ul{ background-image: url(component/img/ico.png); } .newstar ul li{ height: 60px; background: url(component/img/ico.png) left -62px; }
組件js代碼:
import React,{Component} from 'react'
class Star extends Component{
render(){
let num=(Math.round(this.props.star)/2)*20+'%'; //根據評分計算子元素的寬度
return (<div className="newstar">
<ul>
<li style={{width:num}}></li>
</ul>
</div>)
}
}
export default Star;
3)調用並傳參
<Star star={4} /> 頁面顯示為:
<Star star={7.3} /> 頁面顯示為:
這種方式需要父和子元素的背景圖大小完全一樣,並且要精確計算五角星個數對應的子元素寬度
