Shadow DOM styling from the outside

后端 未结 3 1524
难免孤独
难免孤独 2020-12-20 12:12

I am searching a way to styling shadow DOM from the outside. For example, I would like to set the color of all text in all \'span.special\' elements as RED. Including \'span

相关标签:
3条回答
  • 2020-12-20 12:28

    I did try many methods, including those described here. Since I'm using an external Web Component lib, I don't have access to modify these components. So, the only solution that worked for me was using JS querySelector, like this:

    document.querySelector("the-element.with-shadow-dom")
      .shadowRoot.querySelector(".some-selector").setAttribute("style", "color: black");
    

    Not the best solution, not suitable for large stylings, but does work for little enchancements.

    @John this was tested with Chrome 83.0.4103.116 (still going to test in Safari) and I did for Ionic (v5) ion-toast component. Here is the (almost) real code I used:

      import { toastController } from '@ionic/core';
    
      let toastOpts = {
        message: "Some message goes here.",
        cssClass: "toast-with-vertical-buttons",
        buttons: [
          {
            text: "Button 1",
            side: 'end'
          },
          {  
            text: "Button2",
            side: 'end'
          },
          {
            icon: "close",
            side: "start"
          }
        ]
      }
      toastController.create(toastOpts).then(async p => {
        let toast = await p.present(); // this renders ion-toast component and returns HTMLIonToastElement
        toast.shadowRoot.querySelector('div.toast-button-group-end').setAttribute("style", "flex-direction: column");
      });
    
    0 讨论(0)
  • 2020-12-20 12:29

    Well, @import is not a solution if you are working with library web component that you can't change ...

    Finally I found several ways to do it:

    1) Cascading. Styles of Shadow DOM's host element affect Shadow DOM elements also. Not an option if you need to style a particular element of the Shadow DOM, not every.

    2) Custom properties https://www.polymer-project.org/1.0/docs/devguide/styling If an author of the web component provided such.

    3) In Polymer, the have Custom Mixins also https://www.polymer-project.org/1.0/docs/devguide/styling

    4) @import, but only for not-library components

    So, there are several possibilities, but all of them are limited. No powerful enough way to outside styling as ::shadow were.

    0 讨论(0)
  • 2020-12-20 12:34

    You could use @import css as explained in this answer to another question on SO.

    Include the rule inside the style element in the shadow tree.

     <style>
       @import url( '/css/external-styles.css' )
     </style>
    

    Note that the >>> combinator is still part of the CSS Scoping Module Draft.

    0 讨论(0)
提交回复
热议问题