如何在Web Components中引入外部CSS样式?

AI 概述
一、@import二、::part示例代码三、var示例代码四、通过属性传入示例代码五、自定义组件内部定义修改样式函数示例代码六、通过 slot 外部设置样式示例代码七、fetch 获取八、CSS module import 我们在做前端开发时,还是会遇到需要引入外部 CSS 到 Shadow DOM 情况,那么如何处理呢?本文就就最近遇到...
目录
文章目录隐藏
  1. 一、@import
  2. 二、::part
  3. 三、var
  4. 四、通过属性传入
  5. 五、自定义组件内部定义修改样式函数
  6. 六、通过 slot 外部设置样式
  7. 七、fetch 获取
  8. 八、CSS module import

我们在做前端开发时,还是会遇到需要引入外部 CSS 到 Shadow DOM 情况,那么如何处理呢?本文就就最近遇到的情况给出如下几种方案,希望对大家有用。

一、@import

示例代码:

const template = document.createElement('template');

class WhatsUp extends HTMLElement {
  connectedCallback() {
    const shadowRoot = this.attachShadow({mode: 'open'});
    shadowRoot.innderHTML = `
      <style>
          @import "./index.css"; // 核心代码
      </style>
      <div>Sup</div>
    `
  }
}

window.customElements.define('whats-up', WhatsUp);

优点:此方法兼容性非常好。

@import 浏览器兼容性

缺点:性能

二、::part

::part CSS 伪元素表示在阴影树中任何匹配 part 属性的元素。

示例代码

HTML 代码:

<template id="whats-up">
    <div part="sup">Sup</div>
    <div part="foo">Sup</div>
</template>

<whats-up></whats-up>

CSS 代码:

whats-up::part(sup) {
  /* 样式作用于 `sup` 部分 */
}
whats-up::part(foo) {
  /* 样式作用于 `foo` 部分 */
}

优点:简洁明了

缺点:兼容性不太好。

::part 浏览器兼容性

三、var

CSS 自定义属性可以穿透到 Shadow DOM 中!

示例代码

JS 代码:

const template = document.createElement('template');
template.innerHTML = `
<style>
button {
  background: var(--background);
  color: var(--color);
  padding: var(--padding);
  font-size: var(--font-size);
  border: 0;
}
</style>
<div>Sup</div>`;

CSS 代码:

whats-up {
  --background: #1E88E5;
  --color: white;
  --padding: 2rem 4rem;
  --font-size: 1.5rem;
}

优点:兼容性好。

缺点:比较局限,只能外部定几个,样式不能“自由飞翔”。

四、通过属性传入

示例代码

JS 代码:

class Whatsup extends HTMLElement {
  static get observedAttributes() {return ['css']}

  constructor() {
    super();
  }

  get css() {
    return this.getAttribute('css');
  }

  set css(value) {
    if (value === null || value === false) {
      this.removeAttribute('css');
    } else {
      this.setAttribute('css', value);
    }
  }

  connectedCallback() {
    const shadowRoot = this.attachShadow({
      mode: 'open'
    });
    shadowRoot.innerHTML = `
    <style>
      :host{
        display: flex;
      }
      ${this.css} // 核心代码
      </style>
     <div class="name">Sup</div>
      `;
  }
}

HTML 代码:

<whats-up
  css="
    .name{
      color: red;
    }
  "
></whats-up>

优点:样式可以随意修改。

缺点:代码不够优雅。

五、自定义组件内部定义修改样式函数

示例代码

JS 代码:

class Whatsup extends HTMLElement {
  // ...

  // 核心代码
  reStyle(els, styles) {
    const elements = Array.isArray(els) ? els : [els];
    elements.forEach((element) => Object.assign(element.style, styles));
  }
}

HTML 代码:

<whats-up></whats-up>

<script>
    const myEle = document.querySelector('whats-up')
    const title = myEle.shadowRoot.querySelector('.title');

    myEle.reStyle(title, {
        color: 'red',
        width: '200px',
    })
</script>

六、通过 slot 外部设置样式

示例代码

JS 代码:

class WhatsUp extends HTMLElement {
  constructor() {
    super();
    const shadowRoot = this.attachShadow({ mode: 'open' });
    shadowRoot.innerHTML = `
    <div>
      <slot name="header"></slot>
    </div>
    `;
  }
}
customElements.define('whats-up', WhatsUp);

HTML 代码:

<style>
  .header{
    color: red;
  }
</style>

<whats-up>
  <div slot="header" class="header">
    what's up
  </div>
</whats-up>

七、fetch 获取

示例代码:

class WhatsUp extends HTMLElement {
  constructor() {
    super();
    const shadowRoot = this.attachShadow({ mode: 'open' });
    // 获取样式
    fetch('./index.css').then(res => res.text()).then(data => {
        let node = document.createElement('style');
        node.innerHTML = data;
        this.shadowRoot.appendChild(node);
    });
    // ...
  }
}
customElements.define('whats-up', WhatsUp);

优点:优点是兼容性不错,支持 Shadow DOM 的元素均支持此语法;以及性能还 OK。

缺点:不优雅。

八、CSS module import

此方法使用浏览器原生的 import 语法,但是 import 的是 CSS 文件而不是 JS 文件。

也就是把 CSS 文件直接作为模块引入。

示例代码:

import styles from "index.css";

class WhatsUp extends HTMLElement {
  constructor() {
    // ...
    // 核心代码
    shadow.adoptedStyleSheets = [styles];
  }
}

优点:优点是使用方便快捷且是官方推荐方法,或者是 import CSS 模块就是为了这个场景才支持的;以及性能 OK,import 本身就是异步过程。

缺点:兼容性不佳。

import 语法浏览器兼容性

结语

以上就是码云笔记分享的关于前端开发中如何在 Web Components 中引入外部 CSS 样式的 8 种方法,各种方法适用场景各不相同,所以大家小心食用,感谢阅读。

以上关于如何在Web Components中引入外部CSS样式?的文章就介绍到这了,更多相关内容请搜索码云笔记以前的文章或继续浏览下面的相关文章,希望大家以后多多支持码云笔记。

「点点赞赏,手留余香」

1

给作者打赏,鼓励TA抓紧创作!

微信微信 支付宝支付宝

还没有人赞赏,快来当第一个赞赏的人吧!

声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 admin@mybj123.com 进行投诉反馈,一经查实,立即处理!
重要:如软件存在付费、会员、充值等,均属软件开发者或所属公司行为,与本站无关,网友需自行判断
码云笔记 » 如何在Web Components中引入外部CSS样式?

发表回复