Как динамически изменять размер значка вПоставщик>

#css #reactjs #next.js #react-icons

Вопрос:

в настоящее время для оформления моих значков в библиотеке «react-иконки» я использую » IconContext.Метка поставщика. Однако есть ли для меня решение динамически изменять размер значка в зависимости от размера моего носителя ?

Является ли единственным решением сделать это только с помощью глобальной таблицы стилей? Я избегаю этого, так как я только начал использовать NextJS, и я не хочу, чтобы мой стиль мог столкнуться с другим стилем. Поэтому я разделяю их на модули.

Спасибо.

NavBar.Модуль.Css

 @import url("https://fontlibrary.org//face/metropolis");  .siteTitleWrapper {  box-sizing: border-box;  display: table-cell;  vertical-align: middle; }  .siteTitle {  font-family: "MetropolisRegular";  font-weight: 600;  font-style: normal;  font-size: 20px;  letter-spacing: 2px;  text-transform: uppercase;  color: #000;  margin: 0;  padding-top: 0;  padding-bottom: 0;  line-height: 1em;  white-space: nowrap; }  .headerInner {  padding: 20px 0;  display: table;  width: 100%; }  .mainNavigation {  text-align: right;  position: relative;  z-index: 1000;  display: block; }  .NavItemsWrapper {  display: inline-flex;  align-items: center;  overflow: hidden;  cursor: pointer; }  .NavItems {  font: "MetropolisRegular";  font-weight: 600;  font-style: normal;  font-size: 13px;  letter-spacing: 2px;  text-transform: uppercase;  text-decoration: none; }  @media only screen and (max-width: 830px) {  .mainNavigation {  -webkit-font-smoothing: subpixel-antialiased;  display: inline-flexbox;  position: fixed;  bottom: 64px;  left: 0;  height: auto;  width: 100%;  background-color: #f7f7f7;  overflow: hidden;  text-align: center;  vertical-align: top;  }   .NavItems {  display: none;  }  }   

NavBar.tsx

 import Link from 'next/link' import styles from '../styles/components/NavBar.module.css' import {HiHome} from 'react-icons/hi' import {FaBloggerB} from 'react-icons/fa' import {AiOutlineFundProjectionScreen} from 'react-icons/ai' import {BsPersonBadge} from 'react-icons/bs' import {IconContext} from 'react-icons' import { IconType } from 'react-icons/lib'  interface navItemsTypes {  icon: IconType,  category: string,  link: string }  const navItems : navItemsTypes[] = [  {icon: HiHome, category: 'Home', link: '/'},  {icon: AiOutlineFundProjectionScreen, category: 'Projects', link: '/projects'},  {icon: FaBloggerB, category: 'Blogs', link: '/blogs'},  {icon: BsPersonBadge, category: 'About', link: '/about'}, ]   const NavBar = () =gt; {  return (  lt;divgt;  lt;nav className={styles.headerInner}gt;  lt;div className={styles.siteTitleWrapper}gt;  lt;h1 id="site-title" className={styles.siteTitle} gt;lt;Link href='/'gt;Hong Sheng Yanglt;/Linkgt;lt;/h1gt;  lt;/divgt;    lt;div className={styles.mainNavigation}gt;  lt;IconContext.Provider value={{ size: '1em', style:{marginLeft:'3em',marginRight:'0.5em', color:'#000'}}}gt;  {navItems.map((item) =gt; (  lt;div className={styles.NavItemsWrapper}gt;  lt;Link href={item.link}gt;  lt;span style={{display:'flex'}}gt;  lt;item.icon/gt;  lt;p className={styles.NavItems}gt;  {item.category}  lt;/pgt;  lt;/spangt;  lt;/Linkgt;  lt;/divgt;  ))}   lt;/IconContext.Providergt;   lt;/divgt;  lt;/navgt;   lt;/divgt;  ) }  export default NavBar   

Ответ №1:

Я сделал «npm, я реагирую-реагирую» и импортировал в свой код следующее

 import { useMediaQuery } from 'react-responsive'  

Кроме того, я объявил размеры для мобильного телефона и телефона с 2 константами

 const phoneViewNav = { size: '1em',  }  const DesktopViewNav = {  size: '1.5em', }  

Наконец, я использую медиа-запрос, чтобы проверить размер экрана и применить его соответствующим образом

 const NavBar = () =gt; {    const isDesktopOrLaptop = useMediaQuery({maxWidth:830})  const iconSize = isDesktopOrLaptop ? phoneViewNav : DesktopViewNav  const router = useRouter();    return (  lt;div id="nav"gt;  ....  lt;IconContext.Provider value={{ size: iconSize.size, style:{color:"#000"}}}gt; ...  lt;/divgt; )}