Yes, it is.
h1 {
font-size: 72px;
background: -webkit-linear-gradient(left, red , yellow);
background: -o-linear-gradient(right, red, yellow);
background: -moz-linear-gradient(right, red, yellow);
background: linear-gradient(to right, red , yellow);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
<h1>Hello World</h1>
Example using React and styled-components:
const ColorText = styled.h1 `
font-size: 72px;
background: linear-gradient(to right, red , yellow);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
`;
const App = () => (
<ColorText>Colorful Text</ColorText>
);
ReactDOM.createRoot(
document.getElementById("root")
).render(<App/>);
<div id="root"></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/18.2.0/umd/react.development.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/18.2.0/umd/react-dom.development.js"></script>
<script crossorigin src="//unpkg.com/styled-components/dist/styled-components.min.js"></script>
Answer from kind user on Stack OverflowVideos
In 2024, we can do this cross-browser, with no vendor prefixes!
p {
background-image: linear-gradient(red, blue);
color: transparent;
background-clip: text;
}
Some things to note:
- A lot of the old examples use
-webkit-text-fill-colorrather thancolor. The two are actually functionally identicial[1] (and both supporttransparent!),-webkit-text-fill-colorjust takes precidence. The reason this was used in old examples was because it provided a graceful fallback for non-webkit browsers --- any non-webkit browser that ignored the gradient or clip instructions would also ignore the-webkit-text-fill-colorinstruction, meaning that you wouldn't be left with transparent text on unsupported browsers. I guess this is a problem with this cross browser implementation, in that that we can't do a fallback like this, but it'll really only be a problem for really old browsers like IE11. background-clipis now standards tracked and implemented in all browsers. However, it took Chrome a long time to support thetextclip option on the non-vendor prefixed one, with this only coming in Chrome 120, released mid 2023! As such, using bothbackground-clip: text(for e.g. Firefox) and-webkit-background-clip: textwas the best solution until just very recently, and you might still need both unless you're only targeting ultra-modern browser versions.
You can do it using CSS but it will only work in webkit browsers (Chrome and Safari):
p {
background: linear-gradient(red, blue);
-webkit-background-clip: text;
background-clip: text;
-webkit-text-fill-color: transparent;
}
<p>blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah</p>
I don't exactly know how the stop stuff works. But I've got a gradient text example. Maybe this will help you out!
_you can also add more colors to the gradient if you want or just select other colors from the color generator
.rainbow2 {
background-image: linear-gradient(to right, #E0F8F7, #585858, #fff);
color: transparent;
-webkit-background-clip: text;
background-clip: text;
}
.rainbow {
background-image: linear-gradient(to right, #f22, #f2f, #22f, #2ff, #2f2, #ff2);
color: transparent;
-webkit-background-clip: text;
background-clip: text;
}
<span class="rainbow">Rainbow text</span>
<br />
<span class="rainbow2">No rainbow text</span>
The way this effect works is very simple. The element is given a background which is the gradient. It goes from one color to another depending on the colors and color-stop percentages given for it.
For example, in rainbow text sample (note that I've converted the gradient into the standard syntax):
- The gradient starts at color
#f22at0%(that is the left edge of the element). First color is always assumed to start at0%even though the percentage is not mentioned explicitly. - Between
0%to14.25%, the color changes from#f22to#f2fgradually. The percenatge is set at14.25because there are seven color changes and we are looking for equal splits. - At
14.25%(of the container's size), the color will exactly be#f2fas per the gradient specified. - Similarly the colors change from one to another depending on the bands specified by color stop percentages. Each band should be a step of
14.25%.
So, we end up getting a gradient like in the below snippet. Now this alone would mean the background applies to the entire element and not just the text.
.rainbow {
background-image: linear-gradient(to right, #f22, #f2f 14.25%, #22f 28.5%, #2ff 42.75%, #2f2 57%, #2f2 71.25%, #ff2 85.5%, #f22);
color: transparent;
}
<span class="rainbow">Rainbow text</span>
Since, the gradient needs to be applied only to the text and not to the element on the whole, we need to instruct the browser to clip the background from the areas outside the text. This is done by setting background-clip: text.
(Note that the background-clip: text is an experimental property and is not supported widely.)
Now if you want the text to have a simple 3 color gradient (that is, say from red - orange - brown), we just need to change the linear-gradient specification as follows:
- First parameter is the direction of the gradient. If the color should be red at left side and brown at the right side then use the direction as
to right. If it should be red at right and brown at left then give the direction asto left. - Next step is to define the colors of the gradient. Since our gradient should start as red on the left side, just specify
redas the first color (percentage is assumed to be 0%). - Now, since we have two color changes (red - orange and orange - brown), the percentages must be set as 100 / 2 for equal splits. If equal splits are not required, we can assign the percentages as we wish.
- So at
50%the color should beorangeand then the final color would bebrown. The position of the final color is always assumed to be at 100%.
Thus the gradient's specification should read as follows:
background-image: linear-gradient(to right, red, orange 50%, brown).
If we form the gradients using the above mentioned method and apply them to the element, we can get the required effect.
.red-orange-brown {
background-image: linear-gradient(to right, red, orange 50%, brown);
color: transparent;
-webkit-background-clip: text;
background-clip: text;
}
.green-yellowgreen-yellow-gold {
background-image: linear-gradient(to right, green, yellowgreen 33%, yellow 66%, gold);
color: transparent;
-webkit-background-clip: text;
background-clip: text;
}
<span class="red-orange-brown">Red to Orange to Brown</span>
<br>
<span class="green-yellowgreen-yellow-gold">Green to Yellow-green to Yellow to Gold</span>