I’m trying to override third party component inline style.
I followed the doc how can i override inline styles
So, I used &[style]
to override the inline style but this is not working.
The third party component I use is CookieConsent
Right now, my component is looking like that:
import React from 'react';
import CookieConsent from 'react-cookie-consent';
import styled from 'styled-components';
const StyledCookieBanner = styled(CookieConsent)`
&[style] {
justify-content: center;
align-items: center;
width: calc(100% - 20px);
margin: 10px;
padding: 20px;
background-color: white;
border-radius: 22px;
box-shadow: 0 0 19px 3px rgba(0, 0, 0, 0.17);
}
`;
const CookieBanner = (): React.ReactElement => {
return (
<StyledCookieBanner debug buttonText='Ok'>
Cookie
</StyledCookieBanner>
);
};
export default CookieBanner;
I also tried how can i override styles with higher specificity without success.
The only way I found to override the style is doing something like that and use !important
const StyledCookieBanner = styled(CookieConsent)`
> div {
justify-content: center;
align-items: center !important;
width: calc(100% - 20px) !important;
margin: 10px;
padding: 20px;
background-color: white !important;
border-radius: 22px;
box-shadow: 0 0 19px 3px rgba(0, 0, 0, 0.17);
}
`;
and also tried, without success
const StyledCookieBanner = styled(CookieConsent)`
> div {
// &&& {
&[style] {
justify-content: center;
align-items: center;
...
}
}
`;
The docs seems pretty clear but I didn’t succeed.
Did I miss something? Is that possible or should I use the style
component props?
Advertisement
Answer
From the documentation page you linked:
Inline styles will always take precedence over external CSS, so you cannot override it by simply increasing specificity.
Let’s stop right there. Styled Components adds classes to elements. In HTML/CSS, style
attribute styles will almost always trump class-based styles; there is nothing Styled Components (or any other class-based library) can do to change that … unless you use a “hack” with !important
that is …
There is a neat trick however, which is to use the style element-attr CSS Selector in conjunction with !important:
The !important
is an essential part of that hack, and so the (working) code you posted:
const StyledCookieBanner = styled(CookieConsent)`
> div {
justify-content: center;
align-items: center !important;
width: calc(100% - 20px) !important;
margin: 10px;
padding: 20px;
background-color: white !important;
border-radius: 22px;
box-shadow: 0 0 19px 3px rgba(0, 0, 0, 0.17);
}
`;
is both correct, and your only option.
If you really want to override style
attributes … override the style attributes 🙂 Don’t use Styled Components, use a style
prop on your element (or in your case, ask react-cookie-consent
to take a style
prop to achieve that effect).