Rating
Ratings provide insight regarding others' opinions and experiences, and can allow the user to submit a rating of their own.
<Typography component="legend">Controlled</Typography>
<Rating
name="simple-controlled"
value={value}
onChange={(event, newValue) => {
setValue(newValue);
}}
/>
<Typography component="legend">Read only</Typography>
<Rating name="read-only" value={value} readOnly />
<Typography component="legend">Disabled</Typography>
<Rating name="disabled" value={value} disabled />
<Typography component="legend">No rating given</Typography>
<Rating name="no-value" value={null} />
Rating precision
The rating can display any float number with the value
prop.
Use the precision
prop to define the minimum increment value change allowed.
<Rating name="half-rating" defaultValue={2.5} precision={0.5} />
<Rating name="half-rating-read" defaultValue={2.5} precision={0.5} readOnly />
Hover feedback
You can display a label on hover to help the user pick the correct rating value.
The demo uses the onChangeActive
prop.
<Rating
name="hover-feedback"
value={value}
precision={0.5}
onChange={(event, newValue) => {
setValue(newValue);
}}
onChangeActive={(event, newHover) => {
setHover(newHover);
}}
emptyIcon={<StarIcon style={{ opacity: 0.55 }} fontSize="inherit" />}
/>
{value !== null && (
<Box sx={{ ml: 2 }}>{labels[hover !== -1 ? hover : value]}</Box>
)}
<Rating name="size-small" defaultValue={2} size="small" />
<Rating name="size-medium" defaultValue={2} />
<Rating name="size-large" defaultValue={2} size="large" />
Customization
Here are some examples of customizing the component. You can learn more about this in the overrides documentation page.
<Typography component="legend">Custom icon and color</Typography>
<StyledRating
name="customized-color"
defaultValue={2}
getLabelText={(value: number) => `${value} Heart${value !== 1 ? 's' : ''}`}
precision={0.5}
icon={<FavoriteIcon fontSize="inherit" />}
emptyIcon={<FavoriteBorderIcon fontSize="inherit" />}
/>
<Typography component="legend">10 stars</Typography>
<Rating name="customized-10" defaultValue={2} max={10} />
Radio group
The rating is implemented with a radio group, set highlightSelectedOnly
to restore the natural behavior.
<Rating
name="highlight-selected-only"
defaultValue={2}
IconContainerComponent={IconContainer}
highlightSelectedOnly
/>
Accessibility
The accessibility of this component relies on:
- A radio group with its fields visually hidden.
It contains six radio buttons, one for each star, and another for 0 stars that is checked by default. Be sure to provide a value for the
name
prop that is unique to the parent form. - Labels for the radio buttons containing actual text ("1 Star", "2 Stars", …).
Be sure to provide a suitable function to the
getLabelText
prop when the page is in a language other than English. You can use the included locales, or provide your own. - A visually distinct appearance for the rating icons. By default, the rating component uses both a difference of color and shape (filled and empty icons) to indicate the value. In the event that you are using color as the only means to indicate the value, the information should also be also displayed as text, as in this demo. This is important to match success Criterion 1.4.1 of WCAG2.1.
<Rating
name="text-feedback"
value={value}
readOnly
precision={0.5}
emptyIcon={<StarIcon style={{ opacity: 0.55 }} fontSize="inherit" />}
/>
<Box sx={{ ml: 2 }}>{labels[value]}</Box>
ARIA
The read only rating has a role of "img", and an aria-label that describes the displayed rating.
Keyboard
Because the rating component uses radio buttons, keyboard interaction follows the native browser behavior. Tab will focus the current rating, and cursor keys control the selected rating.
The read only rating is not focusable.