Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Why does CSS ::part override JavaScript element.style?

I have an HTML custom element that inherits from HTMLElement. The template contains:

<input type="text" part="input"/>

Sample CSS:

  my-element::part(input) {
    padding-right: 1px;
  }

Sample JavaScript (inside class MyElement {}):

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

  this.input.style.paddingRight = "25px";

The Style inspector in DevTools (Rules in Firefox) crosses out the ::part declaration for padding-right and shows:

  element.style {
    padding-right:25px;
  }

But the computed value inspector shows padding-right:1px and it’s rendered as 1px.

The JS code is running after the page fully loads. I don’t see a straightforward way around this behavior. If I modify a CSS property for this element in JS, then I cannot declare it CSS. At least not with padding.

Why does a pseudo-element of the custom element take precedence over the element’s own style?

The fact that the Style/Rules inspector disagrees with the Computed inspector makes me think this is a bug in both browsers, but I’m no expert. I have not yet tried this on browserstack to check other platforms. Right now I’m focused on working around this unexpected behavior.

It’s a bit of work to create a working demo snippet, and the behavior is the same across Firefox and Chrome in Win11, so I’ll wait until someone requests it.

>Solution :

The ::part pseudo-element works in conjunction with browser rendering layers and the cascade order of styles.
To fix this you can force higher specificity in JavaScript code:

this.input.style.setProperty('padding-right', '25px', 'important');

This code will ensure that the inline style with !important takes precedence over the ::part pseudo-element styles.

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading