#reactjs #styled-components #react-icons
Вопрос:
Я хочу создать эффект наведения с увеличением размера значка, значки взяты из значков react, я использую стилизованные компоненты. Как мне это сделать ?
export const BottomBar = () => {
const style = { fontSize: "180%" };
return (
<StyledBottomBar>
<StyledIcon>
<FaFacebookSquare style={style} />
</StyledIcon>
<StyledIcon>
<GrInstagram style={style} />
</StyledIcon>
<StyledIcon>
<CgMail style={style} />
</StyledIcon>
<StyledIcon>
<BiPhoneCall style={style} />
</StyledIcon>
</StyledBottomBar>
);
};
Спасибо!!!
Ответ №1:
Невозможно выполнять такие действия в встроенном стиле, как :hover
. Вы могли бы использовать подход JS onMouseEnter
и onMouseLeave
:
const style = { fontSize: "180%",transition: 'font-size 0.5s' };
...
<FaFacebookSquare style={style} onMouseEnter={({target})=>target.style.fontSize= "180%"}
onMouseLeave={({target})=>target.style.fontSize= "100%"}/>
Или вы могли бы разделить их на компоненты <StyledIcon/>
, а затем useRef
useEffect
и useState
выполнить наведение курсора.
const style = { fontSize: "180%",transition: 'font-size 0.5s' };
export function StyledIcon(props){
const [hover,setHover] = useState(false)
const iconRef = useRef(null)
useEffect(()=>{
if(hover){
iconRef.current.style.fontSize="200%"
}
else{
iconRef.current.style.fontSize="180%"
}
},[hover]) // changing fontSize whenever the hover state is updated
const handleIconType = ()=>{
switch(props.type){
case 'facebook':
{
return <FaFacebookSquare style={style} ref={iconRef} onMouseEnter={()=>{setHover(true)}} onMouseLeave={()=>{setHover(false)}}/>
}
...// cases for different type of icon
default:
return null
}
}
return(
<>
<FaFacebookSquare style={style} ref={iconRef} onMouseEnter={()=>{setHover(true)}} onMouseLeave={()=>{setHover(false)}}/>
</>
)
}
export const BottomBar = () => {
return (
<StyledBottomBar>
<StyledIcon type="facebook">
</StyledIcon>
<StyledIcon type="instagram">
</StyledIcon>
</StyledBottomBar>
);
};
Ответ №2:
Поэтому реагируйте-значки будут отображаться как <svg>
элементы. У них есть свойства, которые вы можете переопределить с помощью стилей, вы можете манипулировать ими только с помощью действий над самим элементом.
В вашем примере, если вы посмотрите на инструменты разработки и просмотрите html, то, вероятно, вокруг элемента svg есть оболочка div, означающая, что стили, которые вы пытались применить к ним, были применены к div вместо этого.
const style = { fontSize: "180%",transition: 'font-size 0.5s' }
//Try writing it like this:
const style = {
'amp; svg': {
fontSize: '180%',
transition: 'fontSize 0.5s'
}
}
Здесь мы применяем эти правила к элементу svg, а не к его оболочке.
ОТРЕДАКТИРУЙТЕ, если вы хотите слушать щелчки или зависания, вы слушаете div, который обертывает svg! Убедитесь, что он тоже одинакового размера.