В начале я хочу сказать, что я знаю, что вопрос похож на:
Как позволить импортированному шрифту / значкам css влиять на элементы в теневом доме?
Это не так и это не помогает.
Проблема: недавно я решил использовать ShadowDOM для инкапсуляции стилей в моем проекте. В самом начале я думал, что это работает, как и ожидалось, но я заметил, что некоторые значки из внешних файлов CSS исчезли. Важно отметить, что эти стили являются внешними и возможности внесения изменений ограничены.
Я подготовил код для демонстрации проблемы (посмотрите на фрагмент ниже).
Кажется, все работает нормально, кроме @font-face
Как видите, HTML, содержащий внешний файл CSS с иконками, вне ShadowDOM работает должным образом. Я также хотел бы использовать его внутри shadowDOM.
Как я могу этого добиться?
ПРИМЕЧАНИЕ. Если вы проверите инструменты разработчика, возникнет проблема с путем CSS на вкладке сети, но это проблема фрагмента SO. Если запустить сниппет локально, то в сети все ок.
const body = document.getElementsByTagName('body')[0];
const wrapper = document.querySelector('.wrapper')
const handleAddToShadowClick = (param) => {
const host = document.querySelector('#shadowHost');
if(param === 'insideShadow') {
const shadowRoot = host.attachShadow({mode: 'open'});
shadowRoot.innerHTML = firstComponent
} else {
const shadowRoot = host;
wrapper !== null ? body.removeChild(wrapper): ''
shadowRoot.innerHTML = firstComponent
}
}
const firstComponent = `
<div class="wrapper">
<div class="icon login">Bla bla</div>
<div style="font-family: testFont;">Sample String od text</div>
<link rel="stylesheet" href="./style.css" />
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.13.0/css/all.css" integrity="sha384-Bfad6CLCknfcloXFOyFnlgtENryhrpZCe29RTifKEixXQZ38WheV+i/6YWSzkz3V" crossorigin="anonymous">
</div>
`
.wrapper {
font-family: agGridBalham;
background-color: aquamarine;
color: black;
}
.balham:before {
content: "\F11F";
}
.login::before {
font-family: "Font Awesome 5 Free";
font-weight: 900;
content: "\f007";
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
Refresh the page after each button click
</p>
<button onclick="handleAddToShadowClick('outside')">Add outside shadow</button>
<button onclick="handleAddToShadowClick('insideShadow')">Add inside shadow</button>
<div>
<div id="shadowHost"> </div>
</div>
<script src="./script.js"></script>
</body>
</html>