добавьте компонент react на существующую веб-страницу и избегайте конфликтов CSS

#html #css

#HTML #css

Вопрос:

Я разрабатываю компонент React / MaterialUI, который будет встроен в существующие веб-сайты.

Чтобы свести к минимуму работу, необходимую на существующей странице для встраивания моего компонента, я объединяю свой компонент в app.js и единственное изменение, запрошенное для существующей страницы, это что-то вроде:

 <div id="embedded-component"></div>
<script type="text/javascript" src="https://example.com/app.js"></script>
  

мой компонент находит div по идентификатору и затем монтирует этот элемент.

В основном все работает, но у меня возникают проблемы с CSS-конфликтами между CSS-файлами на исходной странице (которые я не могу изменить) и элементами моего приложения.

Например, исходная страница использует элементы ввода текста с рамкой / отступом / цветом, которые я не хочу, чтобы мой компонент «наследовал». Я хочу, чтобы мой компонент отображался одинаково, независимо от того, на какой странице он встроен.

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

Пытаясь найти решение этой проблемы, я наткнулся на Shadow DOM (например https://medium.com/rate-engineering/winning-the-war-of-css-conflicts-through-the-shadow-dom-de6c797b5cba ) но я не уверен, насколько широко это поддерживается в разных браузерах.

Есть ли какое-либо решение для этого, которое широко поддерживается всеми основными браузерами?

Я не могу использовать iframes и иметь полный контроль над своими файлами js / css, но не могу контролировать существующую страницу, кроме «монтируемого» div.

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

1. Вы пытались перезаписать свойства, с которыми у вас возникли конфликты?

2. Возможно, вы захотите просмотреть таблицы стилей сброса: meyerweb.com/eric/tools/css/reset Вам придется выполнить сброс с той же спецификацией, с которой они были первоначально объявлены.

3. Спасибо. Я пытаюсь не перезаписывать конфликты CSS явно, поскольку мой компонент будет встроен во множество разных веб-страниц, для которых потребуется другая / специфическая логика перезаписи для каждой страницы. Я использую CSSBaseline от MaterialUI, который, если я правильно понимаю, должен иметь некоторые сбросы CSS.

4. @user2987504 вы нашли решение своей проблемы? У меня похожая проблема.

5. в итоге мне пришлось использовать iframes, хотя я пытался этого не делать. Возможно, это поможет: medium.com/@ryanseddon /…