Как мне применить желоба, но не поля в Material UI grid?

#css #reactjs #material-ui

#css #reactjs #материал-пользовательский интерфейс

Вопрос:

Я целую вечность боролся за то, чтобы мой адаптивный макет работал! Но все выходит из-под контроля, когда я применяю интервал к контейнеру сетки с помощью class=spotlight . Как я могу применить интервал к желобам (т. Е. Между элементами сетки в сетке контейнера spotlight), но не к полям (т. Е. Вне сетки). Вот мой код:

 import React from "react";
import { Grid, makeStyles, Typography } from "@material-ui/core";
import MasterLayout from "../components/MasterLayout";
import ContentThumbnail from "../components/ContentThumbnail";
import ContentList from "../components/ContentList";

const useStyles = makeStyles((theme) => ({
  masterLayout: {
    padding: theme.spacing(3),
  },
  spotlight: {},
}));

const DefaultDashboard = ({ padding }) => {
  const classes = useStyles();
  return (
    <MasterLayout>
      {/*Top row with right bar */}
      <Grid
        container
        className={classes.masterLayout}
        spacing={3}
        alignItems="flex-start"
      >
        {/* Spotlight section */}
        <Grid container xl={8} lg={12} item className={classes.spotlight}>
          <Grid item xs={12}>
            <Typography variant="h3">Spotlight</Typography>
          </Grid>
          <Grid item xl={3} lg={3} md={3} xs={6}>
            <ContentThumbnail />
          </Grid>
          <Grid item xl={3} lg={3} md={3} xs={6}>
            <ContentThumbnail />
          </Grid>
          <Grid item xl={3} lg={3} md={3} xs={6}>
            <ContentThumbnail />
          </Grid>
          <Grid item xl={3} lg={3} md={3} xs={6}>
            <ContentThumbnail />
          </Grid>
        </Grid>
        {/* List section 1 */}
        <Grid container item xl={4} lg={3} md={6} xs={12}>
          <Grid item xs={12}>
            <Typography variant="h3">Title 2</Typography>
          </Grid>
          <Grid item xs={12}>
            <ContentList />
          </Grid>
        </Grid>
        {/* List section 2 */}
        <Grid container item xl={4} lg={3} md={6} xs={12}>
          <Grid item xs={12}>
            <Typography variant="h3">Title 2</Typography>
          </Grid>
          <Grid item xs={12}>
            <ContentList />
          </Grid>
        </Grid>
        {/* List section 3 */}
        <Grid container item xl={4} lg={3} md={6} xs={12}>
          <Grid item xs={12}>
            <Typography variant="h3">Title 3</Typography>
          </Grid>
          <Grid item xs={12}>
            <ContentList />
          </Grid>
        </Grid>
        {/* List section 4 */}
        <Grid container item xl={4} lg={3} md={6} xs={12}>
          <Grid item xs={12}>
            <Typography variant="h3">Title 4</Typography>
          </Grid>
          <Grid item xs={12}>
            <ContentList />
          </Grid>
        </Grid>
      </Grid>
    </MasterLayout>
  );
};

export default DefaultDashboard;
 

Большое спасибо,

Кэти

Ответ №1:

TL; DR: переопределите стиль элементов вашей сетки:

 const useStyles = makeStyles((theme) => ({
//...
  gutter:{
    marginLeft: 80, // or something
    'amp;:first-child':{
      marginLeft: 0,
    }
  }
}));
//...
<Grid ... item classes={{item:classes.gutter}}>
 

Следующие элементы сетки имеют желоба (желоба шириной 80 пикселей среди синих контуров, но первые):
введите описание изображения здесь

NL; PR: Взгляните на этот pastebin. Я посмотрел на Grid API, объект classes позволяет настраивать внутренние стили компонента. Я добавил псевдокласс, чтобы обеспечить некоторый интервал для всех дочерних элементов, кроме первого, добавив таким образом внутренние желоба.

Комментарии:

1. Привет, Дэвид — большое спасибо за вашу помощь. По какой-то причине я пытаюсь это реализовать? Я удалил все интервалы из сетки, чтобы они применялись только стеклом желоба. Однако, когда я применяю его, он применяет желоб ко всем дочерним элементам и не оставляет первый. У меня точно такой же стиль, который мы с вами применили, попробовал применить classes={{item:classes.gutter}} к каждому из элементов сетки внутри класса spotlight (кроме заголовка). Как вы думаете, где я могу ошибаться? Еще раз большое спасибо

2. Еще раз здравствуйте — я понял, что, поскольку у меня есть заголовок, мне нужно изменить код на amp;:nth-child(2) . Но это работает сейчас, так что большое вам спасибо! Мне также нужно внести поправку, чтобы учесть, что произойдет на мобильном устройстве (например, если сетка проскальзывает под ней, тогда вы захотите применить желоб к другому дочернему элементу. У меня 8 компонентов, и иногда он показывает 4 в строке, а иногда и 2. Еще раз большое спасибо!

3. Добро пожаловать, Кэти. Если возможно, поделитесь своей окончательной версией в pastebin (например, codesandbox), возможно, ваши изменения помогут другим разработчикам, =] .

4. К сожалению, моя компания блокирует pastebin и подобные сайты. Чтобы увидеть ваш ответ, мне пришлось продолжать смотреть на персональный планшет, что было непросто! Единственным отличием, я думаю, было использование n-го дочернего элемента вместо первого дочернего элемента, потому что первый дочерний элемент в моей <Grid> не был тем, из чего я хотел удалить отступы. Я также добавил amp;:nth-child(5) для обслуживания 2-го ряда из 4 элементов. Однако мне нужно будет выполнить некоторую дополнительную логику, чтобы учесть, когда экран меньше. Я думаю, что ссылка ниже — это ответ, но я еще не понял этого! material-ui.com/customization/breakpoints/#css-media-queries

Ответ №2:

Возможно, я вас не правильно понял, но вы можете попытаться что-то сделать с помощью реквизита ‘alignItems’ (изменить на stretch) или попытаться использовать вместо этого ‘alignContent’.

Эта ссылка может быть полезной.

Извините, если это не то, что вам нужно, возможно, будет проще помочь с какой-нибудь демонстрацией песочницы.

Комментарии:

1. Большое спасибо, Евгений, за вашу помощь. Я хотел это сделать и попытался, но просто не смог заставить это работать. Это может быть больше связано с моими навыками (или отсутствием!), Чем с решением. Еще раз спасибо 🙂