Выгрузить / удалить динамически загружаемые файлы css

После загрузки такого файла css:

const themes = ['dark-theme.css', 'light-theme.css'];
async function loadcss(file) {
    return await import(file);
}
loadcss(themes[0]).then(console.info)

Вывод на консоль - это для меня пустой объект, а новый анонимный тег <style> находится в <head> моего index.html. Пока все хорошо, но что, если я (в этом примере) хочу изменить тему на light-theme.css. Это объединит обе темы, поскольку dark-theme.css уже загружен.

Есть ли способ Удалить тега <style> из DOM?

Чтобы уточнить мой вопрос, приведенный пример демонстрирует абстрактное поведение, и меня интересует только удаление динамически загружаемого CSS из DOM.

Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
CSS: FlexBox
CSS: FlexBox
Ранее разработчики использовали макеты с помощью Position и Float. После появления flexbox сценарий полностью изменился.
3
0
2 798
2

Ответы 2

Я не знаю vue.js, но вот простой пример в React, надеюсь, что это как-то поможет :) возможно, по крайней мере, некоторые идеи :)

class TodoApp extends React.Component {
  static themes = {
    dark: 'dark-theme.css', 
    light: 'light-theme.css',
  };

  render() {
    return ReactDOM.createPortal(
        (<link rel = "stylesheet" href = {TodoApp.themes.dark} type = "text/css"></link>),
      document.head
    );  
  }
}

ReactDOM.render(<TodoApp />, document.querySelector("#app"))

http://jsfiddle.net/3y4hw2ox/

Спасибо, это уже подсказало мне идею. При написании своего вопроса я подумал о подходе на чистом javascript, но использование компонентов и их управления DOM того стоит!

Armin Bu 07.01.2019 19:53

Благодаря OZZIE я подверг сомнению свою методологию и обнаружил, что импорт файлов css, как показывает мой вопрос (через импорт ES6 или require.context (...)), бесполезен, поскольку мы не можем его идентифицировать, мы не получаем доступа к элементу <style>, что не оставляет нам доступа к DOM и возможности манипулировать им.

Вместо этого мы свяжем файлы css вручную в <head>, так как мы знаем их имя и путь.

const themes = ['dark-theme.css', 'light-theme.css'];
const head = document.body.parentElement.firstElementChild;
const link = document.createElement('link');
link.setAttribute('href', process.env.BASE_URL + themes[0]);
link.setAttribute('id', themes[0]); // set id so we can remove it later
head.appendChild(link);

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