javascript - 是否可以只显示 SVG 图标的一半?

标签 javascript css reactjs svg react-icons

我目前有一个评分系统,可以产生 5 颗星,可以显示一半的值。我通过使用 FontAwesome 的半星来做到这一点,并做了一些 CSS 技巧让它们看起来像一颗星。但是我想通过想出一种只显示一半 SVG 图标的方法来增加我的 React 和 CSS 知识。因此,我可以使用用户想要的任何图标,而不是使用半星,例如,如果你想给出 3.5 分,它只会显示 50% 的图标。
问:您能否只显示图标的一半并以某种方式知道用户是单击一侧还是另一侧?
这是我目前使用的代码,它使用 HalfStars 作为引用

import React, { useState } from 'react'
import { FaRegStarHalf, FaStarHalf } from 'react-icons/fa'

import './styles/Rater.css'

const Rater = ({ iconCount }) => {
    const [rating, setRating] = useState(null)
    const [hover, setHover] = useState(null)
    // check if user has set a rating by clicking a star and use rating to determine icons
    const Star = rating ? FaStarHalf : FaRegStarHalf

    return (
        <div>
            {[...Array(iconCount), ...Array(iconCount)].map((icon, i) => {
                const value = (i + 1) / 2

                return (
                    <label>
                        <input
                            type='radio'
                            name='rating'
                            value={value}
                            onClick={() => {
                                console.log(`value => `, value)
                                return setRating(value)
                            }}
                        />
                        <div className='star-container'>
                            <div>
                                <Star
                                    className={i % 2 ? 'star-left' : 'star'}
                                    color={value <= (hover || rating) ? '#ffc107' : '#e4e5e9'}
                                    onMouseEnter={() => setHover(value)}
                                    onMouseLeave={() => setHover(null)}
                                />
                            </div>
                        </div>
                    </label>
                )
            })}
        </div>
    )
}

export default Rater


最佳答案

我已经编写了一个代码来让您了解这个想法;如果您单击星星的右侧,它的颜色会变为蓝色,如果您单击左侧,它的颜色会变为金色。另外,最好不要使用stopPropagation并检查 e.target的事件。

const starIcon = document.getElementById("star");
const icon = document.getElementById("icon");
starIcon.onclick = e => {
  starIcon.style.color = "blue";
  e.stopPropagation();
};
icon.onclick = e => {
  starIcon.style.color = "gold";
}
i {
  clip-path: inset(0 0 0 50%);
  color: gold;
}
  <!DOCTYPE html>
  <html lang="en">

    <head>
      <meta charset="UTF-8">
      <title>Document</title>
      <link href="https://pro.fontawesome.com/releases/v5.10.0/css/all.css" rel="stylesheet">
    </head>

    <body>
      <span id="icon"><i id="star", class="fas fa-star"></i></span>
    </body>

  </html>

关于javascript - 是否可以只显示 SVG 图标的一半?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65366162/

相关文章:

javascript - Mobx Observable 不会导致观察者组件更新

javascript - Material -UI FAB 悬停颜色

javascript - 将 javascript 转换添加到 Bootstrap Accordion

javascript - 需要帮助设置 ruby​​ on rails javascript 运行时环境

javascript - 如何使用 Flask 和 jQuery 显示/隐藏回复文本框?

javascript - SDK中首次右键获取鼠标坐标

css - 我可以合并 :nth-child() or :nth-of-type() with an arbitrary selector? 吗

html - 为什么 flex 元素不缩小过去的内容大小?

javascript - React Native 渲染相同的路线

javascript - 无法创建指向未保存的 ParseObject 的指针