Cómo alinear el icono horizontal y el texto en Material UI

4 minutos de lectura

avatar de usuario de tong
lengua

Soy un novato en Material UI, ahora mi ícono y texto no están alineados:

no alinear

Mis resultados deseados:

Cómo alinear el icono horizontal y el texto en Material UI

mi código es:

<div style={{
    display: 'inline-flex',
    VerticalAlign: 'text-bottom',
    BoxSizing: 'inherit',
    textAlign: 'center',
    AlignItems: 'center'
}}>
    <LinkIcon className={classes.linkIcon}  />
    revolve
</div>  

Probé cuadrícula y fila, pero no funcionó. ¿Alguien puede ayudarme?

Avatar de usuario de Peter Moses
pedro moisés

¡Esto funciona perfectamente!

<div style={{
    display: 'flex',
    alignItems: 'center',
    flexWrap: 'wrap',
}}>
    <LinkIcon />
    <span>revolve</span>
</div>  

  • Usé el estilo pero los apliqué a un solo Typography así que no necesitaba el p elemento. Funciona de maravilla con v4.0.2.

    – hsimah

    5 de junio de 2019 a las 23:42

avatar de usuario de tinmarfrutos
tinmarfrutos

Necesitas usar Grid. Algo así debería funcionar:

<Grid container direction="row" alignItems="center">
  <Grid item>
    <LinkIcon className={classes.linkIcon} />
  </Grid>
  <Grid item>
    revolve
  </Grid>
</Grid>

  • Perfecto, si el texto es más largo que la fila de forma predeterminada, la cuadrícula comienza a ajustarse, lo que significa que el texto estará debajo del ícono, para evitar esto, puede agregar wrap="nowrap"

    – Shikyō

    10 de mayo de 2019 a las 8:48

  • 👍🏾 Se siente más como la forma ‘MUI’, usando sus componentes. POR CIERTO, direction="row" no debería ser necesario. Bastante seguro de que es el predeterminado.

    – CódigoFinity

    8 mayo 2022 a las 20:38


Esto se puede lograr fácilmente en MUI v5 usando un Stack y establecer alignItems apoyar a center:

import Stack from '@mui/material/Stack';
import Typography from '@mui/material/Typography';
import AddCircleIcon from '@mui/icons-material/AddCircle';
<Stack direction="row" alignItems="center" gap={1}>
  <AddCircleIcon />
  <Typography variant="body1">text</Typography>
</Stack>

Demostración de Codesandbox

Pruebe el siguiente código. Puedes usar variant según su requerimiento.

const useStyles = makeStyles(theme => ({
  wrapIcon: {
    verticalAlign: 'middle',
    display: 'inline-flex'
   }
}));

<Typography variant="subtitle1" className={classes.wrapIcon}>
    <LinkIcon className={classes.linkIcon}  /> revolve
</Typography>

solución alternativa sencilla

<Grid container direction="row" alignItems="center">
     <SearchIcon /> example
</Grid>

  • Estoy confundido por qué esto funciona, ya que el Interfaz de usuario de materiales Los ejemplos siempre tienen un <Grid item justo debajo de un <Grid containerpero aquí solo usaste <Grid container. Mi caso es si agrego <Grid container><Grid item>el alignItems="center" no funciona, el ícono aún no está alineado verticalmente, pero con esta solución finalmente funciona. yo tambien encuentro <Grid container item trabajo también. Dado que Material UI menciona que los elementos secundarios del contenedor son elementos, creo que es canónico tener ambos container y item.

    – Shawn

    20/04/2022 a las 19:01

  • Creo que por eso han introducido Stack en V5

    – Thomas P1988

    21 de abril de 2022 a las 8:28

estilos

const styles = theme => ({
    icon: {
        position: "relative",
        top: theme.spacing.unit,
        width: theme.typography.display1.fontSize,
        height: theme.typography.display1.fontSize
    }
});

JSX

<Typography variant="display1">
    <Icon className={this.props.classes.icon}/>Your&nbsp;Text
</Typography>

podrías reemplazar display1 con display3 u otro variante de tipografía en los 3 lugares para elegir el tamaño del texto. El &nbsp; asegura que su texto no se rompa entre palabras cuando se ajusta.

Para mí, esto puede hacer que se vea así

ingrese la descripción de la imagen aquí

con display3 y algunos otros estilos agregados para el color.

  • Estoy confundido por qué esto funciona, ya que el Interfaz de usuario de materiales Los ejemplos siempre tienen un <Grid item justo debajo de un <Grid containerpero aquí solo usaste <Grid container. Mi caso es si agrego <Grid container><Grid item>el alignItems="center" no funciona, el ícono aún no está alineado verticalmente, pero con esta solución finalmente funciona. yo tambien encuentro <Grid container item trabajo también. Dado que Material UI menciona que los elementos secundarios del contenedor son elementos, creo que es canónico tener ambos container y item.

    – Shawn

    20/04/2022 a las 19:01

  • Creo que por eso han introducido Stack en V5

    – Thomas P1988

    21 de abril de 2022 a las 8:28

Avatar de usuario de Christos Lytras
Christos Lytras

Teniendo ListItemIcon y ListItemText envuelto dentro de un ListItem lo mantendrá en una línea y evitará que se rompa:

import ListItem from '@material-ui/core/ListItem';
import ListItemIcon from '@material-ui/core/ListItemIcon';
import ListItemText from '@material-ui/core/ListItemText';
    
<ListItem >
  <ListItemIcon><AccessAlarmIcon color="secondary" /></ListItemIcon>
  <ListItemText>Updated 1 hour ago</ListItemText>
</ListItem>

Imagen de demostración:

Imagen de demostración

  • ¿Puedes agregar un poco más de contexto con la respuesta?

    – Rigin Oommen

    16 oct 2019 a las 9:32

  • Por favor, simplemente coloque un enlace a la imagen que estaba tratando de adjuntar y explique por qué. ListItem resuelve el problema

    – CPH Python

    16 oct 2019 a las 10:21

  • @Sabareesh, veo que eres nuevo en Stack Overflow, así que te damos la bienvenida a la comunidad. Al responder preguntas, es útil explicar por qué su respuesta funciona. No estoy seguro de cómo el AccessAlarmIcon está mágicamente alineado verticalmente, así que explique por qué funciona.

    – PatS

    1 de noviembre de 2019 a las 20:00


¿Ha sido útil esta solución?