Пользовательский интерфейс материала: изменение цвета темы с помощью переменных SASS

Я знаю, что мы можем редактировать тему материал UI, но я думал о том, чтобы сделать ее динамической, где мы можем установить переменные SASS, и она автоматически обновит тему пользовательского интерфейса материала.

Я использую sass для разработки своей страницы, и вот пример переменных, которые я использую:

$primary-color: #1E79C7;
$secondary-color: #E5681A;

В настоящее время я делаю следующее для кнопки пользовательского интерфейса материала, потому что хочу, чтобы мой дизайн был как можно больше в одном месте.

.app-button-blue {
  background-color: $primary-color !important; 
  margin: 5px;
}

.app-button-gray {
  background: transparent !important;
  box-shadow: none !important;
}

.app-button-white {
  background: transparent !important;
  box-shadow: none !important;
  border: $primary-color solid 1px !important;
}

Есть ли у меня способ использовать эти переменные SASS для перезаписи темы пользовательского интерфейса материала - например, установить первичный и вторичный цвета?

Не могли бы вы пояснить, что вы имеете в виду, делая тему динамичной.

Luke Peavey 30.09.2018 20:35

@LukePeavey, я обновил свой вопрос. Надеюсь, это поможет вам понять мой вопрос! Спасибо :)

Abigail A. 02.10.2018 17:42

круто, плохо взгляну еще раз

Luke Peavey 02.10.2018 23:31
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
5
3
6 097
4

Ответы 4

Пользовательский интерфейс материала использует решение стиля на основе javascript (JSS) вместо препроцессора CSS, такого как SCSS (см. стилевое решение).

Это означает, что невозможно настроить тему пользовательского интерфейса материала с помощью переменных SCSS. Также невозможно получить доступ к теме в ваших стилях CSS / SCSS.

Если вы хотите использовать SCSS для стилизации / тематики, вы можете вместо этого рассмотреть Материальные веб-компоненты.

можно ли использовать материальные веб-компоненты в Reactjs?

Sam YC 10.09.2020 04:36

@SamYC ReactJs не заботится о том, как вы будете передавать стили компонентам. Вы можете использовать css, scss, jss или другие технологии для создания стиля HTML, созданного с помощью reactjs.

Lukas Liesis 02.07.2021 11:45

Material-UI использует стили на основе JS, но ими тоже можно легко манипулировать. material-ui.com/customization/components проверьте образцы кода там. Для него есть makeStyles. Внутренний код makeStyles похож на scss. Можно даже использовать '&: hover' и тому подобное.

Lukas Liesis 02.07.2021 11:47

Возможно, это не совсем то, чего вы хотели достичь, но в следующей статье объясняется, как можно экспортировать переменные SASS. https://til.hashrocket.com/posts/sxbrscjuqu-share-scss-variables-with-javascript Впоследствии вы можете импортировать их в JS и использовать их для настройки своей темы.

Пример по этой проблеме GitHub подсказывает, как это можно сделать.

import React from 'react';
import { withStyles } from '@material-ui/core';

const cssVariables = (theme) => ({
  '@global': {
    ':root': {
      '--color-primary': theme.palette.primary.main,
      '--color-secondary': theme.palette.secondary.main,
    }
  }
});

const RootComponent = () => {
  return <div>Whatever...</div>
}

export default withStyles(cssVariables, RootComponent);

Имея в виду, что RootComponent инициализируется внутри ThemeProvider.

Можно заполнить тему MaterialUI из переменных Sass / Scss, используя Webpack wizadry

palette.scss

$primary: #1E79C7;
$secondary: #E5681A;

:export {
  primary: $primary;
  secondary: $secondary;
}

theme.js

import { createMuiTheme } from '@material-ui/core/styles'
import palette from './palette.scss'

export const theme = createMuiTheme({
  palette: {
    primary: {
      main: palette.primary,
    },
    secondary: {
      main: palette.secondary,
    },
  }
})

App.js

import React from 'react'
import { ThemeProvider } from '@material-ui/core/styles'
import { theme } from './theme'

export const App = () => {
  return (
    <ThemeProvider theme = {theme}>
       // App
    </ThemeProvider>
  )
}

Это означает, что вы можете использовать Sass для стилизации и раскрашивания компонентов пользовательского интерфейса, не являющегося материальным, и пользовательского интерфейса материала из одного источника правды.

Чтобы стилизовать другие компоненты, просто используйте импорт Sass

@import './palette.scss'

.app-button-blue {
  background-color: $primary; // removed !important cos there's usually a better way
  margin: 5px;
}

Другие вопросы по теме