如何放大material-ui iconButtons中的SVG图标?
Posted
技术标签:
【中文标题】如何放大material-ui iconButtons中的SVG图标?【英文标题】:How to enlarge the SVG icon in material-ui iconButtons? 【发布时间】:2016-07-28 16:27:30 【问题描述】:有人使用react.js 和Material UI 库构建网页吗?我应该如何调整图标大小?这是一个 svg 图标。 我刚刚构建了一个“新建”组件,它是一张材料纸,顶部有一个内容添加按钮。这是代码。
import React from 'react';
import Paper from 'material-ui/lib/paper';
import ContentAdd from 'material-ui/lib/svg-icons/content/add';
import IconButton from 'material-ui/lib/icon-button';
const styleForPaper =
width: '96vw',
height: '20vh',
margin: 20,
textAlign: 'center',
display: 'inline-block',
;
const styleForButton =
'marginTop': '7vh',
;
const PaperToAddNewWidgets = () => (
<div>
<Paper style=styleForPaper zDepth=2>
<IconButton
style=styleForButton
touch=true
tooltip="Add New Widget">
<ContentAdd/>
</IconButton>
</Paper>
</div>
);
export default PaperToAddNewWidgets;
看起来不错(确保您以全尺寸查看),但图标太小。然后我打开了chrome开发工具,看到了下面的html代码。
<div style="background-color:#ffffff;transition:all 450ms cubic-bezier(0.23, 1, 0.32, 1) 0ms;box-sizing:border-box;font-family:Roboto, sans-serif;-webkit-tap-highlight-color:rgba(0,0,0,0);box-shadow:0 3px 10px rgba(0,0,0,0.16),
0 3px 10px rgba(0,0,0,0.23);border-radius:2px;width:96vw;height:20vh;margin:20px;text-align:center;display:inline-block;mui-prepared:;" data-reactid=".0.2.0.1.0"><button style="border:10px;background:none;box-sizing:border-box;display:inline-block;font:inherit;font-family:Roboto, sans-serif;tap-highlight-color:rgba(0, 0, 0, 0);cursor:pointer;text-decoration:none;outline:none;transform:translate3d(0, 0, 0);position:relative;transition:all 450ms cubic-bezier(0.23, 1, 0.32, 1) 0ms;padding:12px;width:48px;height:48px;font-size:0;margin-top:7vh;mui-prepared:;-webkit-appearance:button;" tabindex="0" type="button" data-reactid=".0.2.0.1.0.0"><div data-reactid=".0.2.0.1.0.0.0"><span style="height:100%;width:100%;position:absolute;top:0;left:0;overflow:hidden;mui-prepared:;" data-reactid=".0.2.0.1.0.0.0.0"></span><div style="position: absolute; font-family: Roboto, sans-serif; font-size: 14px; line-height: 32px; padding: 0px 16px; z-index: 3000; color: rgb(255, 255, 255); overflow: hidden; top: -10000px; border-radius: 2px; opacity: 0; left: -44px; transition: top 0ms cubic-bezier(0.23, 1, 0.32, 1) 450ms, transform 450ms cubic-bezier(0.23, 1, 0.32, 1) 0ms, opacity 450ms cubic-bezier(0.23, 1, 0.32, 1) 0ms; box-sizing: border-box; -webkit-user-select: none;" data-reactid=".0.2.0.1.0.0.0.1:0"><div style="position: absolute; left: 50%; top: 0px; transform: translate(-50%, -50%); border-radius: 50%; transition: width 0ms cubic-bezier(0.23, 1, 0.32, 1) 450ms, height 0ms cubic-bezier(0.23, 1, 0.32, 1) 450ms, backgroundColor 450ms cubic-bezier(0.23, 1, 0.32, 1) 0ms; width: 0px; height: 0px; background-color: transparent;" data-reactid=".0.2.0.1.0.0.0.1:0.0"></div><span style="position:relative;white-space:nowrap;mui-prepared:;" data-reactid=".0.2.0.1.0.0.0.1:0.1">Add New Widget</span></div><svg style="display:inline-block;height:24px;width:24px;transition:all 450ms cubic-bezier(0.23, 1, 0.32, 1) 0ms;fill:rgba(0, 0, 0, 0.87);mui-prepared:;-webkit-user-select:none;" viewBox="0 0 24 24" data-reactid=".0.2.0.1.0.0.0.1:2:$/=10"><path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z" data-reactid=".0.2.0.1.0.0.0.1:2:$/=10.0"></path></svg></div></button></div>
使用 chrome dev 工具,我修改了 svg 图标大小和 svg 的 viewbox 属性,并使浏览器中的图标变大。但我不确定如何在我的代码中调整图标大小。如果我编写一个 CSS 文件来修改 svg,那么如果有多个 svg 元素就会有问题。
【问题讨论】:
如果你使用<i class="material-icons">&#abc;</i>
,那么它只是更新font-size: NNpx
的NN 例如:在jQuery中$(".material-icons").css('font-size', "48px");
阿尔文,感谢您的见解。 “font-size”适用于“abc;”,但不能解决我的问题。我使用了 'material-ui/lib/svg-icons/content/add' 中的 <svg style="display:inline-block;height:24px;width:24px;...
的style=
,例如:尝试改变height:48px; width:48px
。有一些图标是基于 FONT 的,因为它是 font-size
tweak
澄清一下,material-ui
(在反应中)不是基于material design lite
。如果您正在寻找 MDL,请查看 react-mdl
库
谢谢,@Brandon。我将在获得编辑问题的权限后更新问题。
【参考方案1】:
这样做
<SomeIcon className="svg_icons"/>
.svg_icons
transform: scale(1.8);
只需使用比例:D 就可以了
【讨论】:
问题是宽度不随宽度增长而导致重叠【参考方案2】:注意:IconButton Material UI 不再支持 iconStyle 属性,因此该答案已过时
您必须在<IconButton>
中的iconStyle
属性中设置图标的大小。下面的例子from the material-ui docs。
根据我的经验,如果您只设置高度或宽度,则不会发生任何事情 - 只有当您将高度和宽度设置为相同的值时似乎才有效。
import React from 'react';
import IconButton from 'material-ui/IconButton';
import ActionHome from 'material-ui/svg-icons/action/home';
const styles =
largeIcon:
width: 60,
height: 60,
,
;
const IconButtonExampleSize = () => (
<div>
<IconButton
iconStyle=styles.largeIcon
>
<ActionHome />
</IconButton>
</div>
);
【讨论】:
哇,尝试设置图标的样式本身,不知道它是这样工作的。那是谁设计的?叹息。material-ui
似乎不再支持 iconStyle
属性。这使得这个公认的答案不正确。【参考方案3】:
我在使用最后一个 React 版本(今天是 v16.13.1)和 Material-ui(今天是 v4.9.14)时遇到了同样的问题。
我是怎么解决的?
只需将此样式添加到图标按钮
MyIconButton:
'& svg':
fontSize: theSizeIWant
完整示例
import React from "react";
import makeStyles from '@material-ui/core/styles';
import IconButton from '@material-ui/core/IconButton';
import DeleteIcon from '@material-ui/icons/Delete';
const useStyles = makeStyles((theme) => (
deleteIcon1:
'& svg':
fontSize: 25
,
deleteIcon2:
'& svg':
fontSize: 50
,
deleteIcon3:
'& svg':
fontSize: 75
,
deleteIcon4:
'& svg':
fontSize: 100
));
export default function App()
const classes = useStyles();
return (
<div className="App">
<h1>fontSize: 25</h1>
<IconButton className=classes.deleteIcon1>
<DeleteIcon />
</IconButton>
<h1>fontSize: 50</h1>
<IconButton className=classes.deleteIcon2>
<DeleteIcon />
</IconButton>
<h1>fontSize: 75</h1>
<IconButton className=classes.deleteIcon3>
<DeleteIcon />
</IconButton>
<h1>fontSize: 100</h1>
<IconButton className=classes.deleteIcon4>
<DeleteIcon />
</IconButton>
</div>
);
结果将是:
实时运行代码
我创建了this codesandbox。
希望这会有所帮助!
【讨论】:
【参考方案4】:没有。至少在 2021 年,大多数其他答案都不令人满意,而且实践不佳。这个答案在 documentation here 中得到了真正的回答,并且不需要任何 CSS hack 即可工作。
在 MUI 中,Button
和 IconButton
组件本质上只是将子 Icon
元素嵌套在 <a>
或 <Link>
(react-router) 元素中的包装器。他们对大小没有任何内在控制。因此,要增加按钮大小,只需使用fontSize
属性增加IconButton
的Icon
子项的大小。这会自动使按钮变大。
例如,使下面的IconButton
更大:
<IconButton>
<Icon />
</IconButton>
我们只是直接增加Icon
子的大小。
<IconButton>
<Icon fontSize="large" />
</IconButton>
但是,这是您可以使用 fontSize
属性指定的最大尺寸。要更大,我们必须手动配置 CSS font-size
属性。
<IconButton>
<Icon style= fontSize: 60 />
</IconButton>
简单。
编辑:显然,无论出于何种原因,Button
组件都有一个size
属性,可以控制它们的大小,但IconButton
组件没有。我不确定为什么 MUI 如此不一致......
【讨论】:
【参考方案5】:使用最新版本的material-ui(3.1.0),您可以更改IconButton的padding和SvgIcon的fontSize来更新外观。
const styles = theme => (
smallButton:
padding: 6
,
largeButton:
padding: 24
,
largeIcon:
fontSize: "3em"
,
input:
display: "none"
);
function IconButtons(props)
const classes = props;
return (
<div>
<IconButton className=classes.smallButton aria-label="Delete">
<DeleteIcon fontSize="small" />
</IconButton>
<IconButton aria-label="Delete">
<DeleteIcon fontSize="large" />
</IconButton>
<IconButton className=classes.largeButton aria-label="Delete">
<DeleteIcon className=classes.largeIcon />
</IconButton>
</div>
);
Live demo
【讨论】:
【参考方案6】:您可以只在 IconButton 元素的子节点上使用 fontSize 属性,即在您的情况下 - ContentAdd 节点。
<IconButton
style=styleForButton
touch=true
tooltip="Add New Widget">
<ContentAdd fontSize="large" />
</IconButton>
有 4 个选项可用 - 继承、默认、小和大。
来源 - https://material-ui.com/api/icon/#props
【讨论】:
【参考方案7】:这对我有用 fontSize="大"
<Badge badgeContent=4 color="primary" >
<CameraAltIcon fontSize="large" />
</Badge>
look Props --> fontSize
https://material-ui.com/api/icon/
【讨论】:
【参考方案8】:我正在使用 IconStyle 属性来改变 svg 图标的大小。
<IconButton
tooltip="Add New Group"
tooltipPosition="top-center"
style=padding: 0, height: 0
iconStyle=height: 31, width: 48
onClick=e => this.openNewList()
disabled=!this.state.newAvailable>
<ActionHome />
</IconButton>
【讨论】:
【参考方案9】:放大svg有两种方式,一种是override the style with iconStyle,另一种是编辑https://github.com/callemall/material-ui/blob/master/src/SvgIcon/SvgIcon.js中的代码
注意:ContentAdd
从 SvgIcon
导入
const mergedStyles = Object.assign(
..
height: 24, // <-- change default height
width: 24, // <-- change default width
..
, style);
return (
<svg
...other
..
style=prepareStyles(mergedStyles)
..
>
【讨论】:
【参考方案10】:总有简单的事情要做
给你的材质ui图标一个类名 并转到您的 css 文件并给出
height:40px !important and width 40px !impoetant
【讨论】:
【参考方案11】:假设您使用 Sass:
.divWithTargetSVG
.MuiSvgIcon-root
font-size: Xrem/px;
【讨论】:
【参考方案12】:当您的全局项目需要它时,您可以为您的 MUI 主题添加一个新变体。
components:
MuiSvgIcon:
variants: [
props: fontSize: 'huge' ,
style:
fontSize: '5rem',
,
,
],
,
为了让它适用于 TS,您可能需要扩展模块声明:
declare module '@mui/material/SvgIcon'
interface SvgIconPropsSizeOverrides
huge: true;
用法:
<HomeIcon fontSize="huge" />
我还在dev.to上写了一个小帖子
【讨论】:
【参考方案13】:如果 className= classes.classname , fontSize : '40px' , size= 'large' 等不起作用然后尝试内联样式,您可以根据需要提供高度和宽度尺寸
<OpenInNewIcon style= height: '18px', width: '18px' />
我希望它会起作用,
【讨论】:
以上是关于如何放大material-ui iconButtons中的SVG图标?的主要内容,如果未能解决你的问题,请参考以下文章
ReactJS + Material-UI:如何在每个 TableRow 中使用 Material-UI 的 FlatButton 和 Dialog?
ReactJS + Material-UI:如何使用 Material-UI 的 <DatePicker> 将当前日期设置为默认值?
我如何将 Material-UI 托管样式应用于非 Material-ui、非反应元素?
如何使用 Material-UI 中的 useTheme 钩子?
ReactJS + Material-UI:如何在 Material-UI <Table/> 的 <TableRow/> 之间交替颜色?