A recent tweet by Lucas Bonomi sparked a discussion about a common issue in web design: achieving a semi-transparent background behind inline text with padding, without encountering the overlap problem. This article delves into this challenge, exploring solutions to maintain consistent transparency across overlapping areas.
The Problem at Hand
The core issue arises when multiple lines of text, each with its own semi-transparent background, overlap due to padding. This leads to darker intersections where the backgrounds combine, resulting in an unintended increase in opacity. The goal is to create a visually appealing effect without these darker overlaps.
Initial Solution and Approach
To tackle this problem, we start by wrapping middle-aligned text within a <p>
and a <span>
. The <span>
is styled with padding, border-radius, and a semi-transparent background:
p > span {
padding: .25em;
border-radius: 5px;
background: rgb(0 0 0 / var(--a, .7));
color: #fff;
box-decoration-break: clone;
}
The box-decoration-break: clone
property ensures that each line of text receives its own padding and rounded corners. However, as seen in initial tests, this approach still results in overlapping areas that appear darker.
Implementing an SVG Filter
To resolve the overlap issue, we can utilize an SVG filter. The first step involves making the span’s background opaque by setting the variable --a
to 1
. This eliminates the transparency that causes increased alpha in overlapping areas. The subsequent styles look like this:
p {
--a: 1;
filter: url(#alpha);
}
The SVG filter is defined within an SVG element that remains hidden from view:
xml<svg width='0' height='0' aria-hidden='true'>
<filter id='alpha'>
<!-- filter content goes here -->
</filter>
</svg>
The first primitive in our filter, feComponentTransfer
, processes the SourceAlpha input and scales it to the desired alpha value. This creates a semi-transparent version of the background shape while maintaining clarity where no overlap occurs.
Achieving Desired Transparency
Next, we incorporate a feColorMatrix
primitive that uses the green channel as an alpha mask. This allows us to control which areas of the text are opaque or transparent based on their RGB values. By setting up our filter this way, we ensure that only the desired areas are affected by transparency adjustments.
xml<svg width='0' height='0' aria-hidden='true'>
<filter id='alpha'>
<feComponentTransfer in='SourceAlpha' result='back'>
<feFuncA type='linear' slope='.7'/>
</feComponentTransfer>
<feColorMatrix
in='SourceGraphic'
values='0 0 0 0 1
0 0 0 0 1
0 0 0 0 1
0 1 0 0 0'
/>
</filter>
</svg>
This setup preserves transparency where necessary while ensuring that overlapping areas do not darken excessively.
Expanding the Problem Scope
After sharing initial findings on social media, further discussions revealed related issues, such as later lines of text obscuring those above them due to increased padding. When testing with larger padding values, it became evident that adjustments were necessary to prevent overlapping backgrounds from covering preceding text.
Exploring Alternative Solutions
In simpler cases where spans contain separate words with opaque backgrounds, applying mix-blend-mode
can suffice. For instance:
- Dark Text: Use
mix-blend-mode: darken
. - Light Text: Use
mix-blend-mode: lighten
.
However, these solutions may falter against complex backgrounds or images. To address this, setting isolation: isolate
on the parent element can prevent unwanted blending with busy backgrounds.
Advanced Techniques for Complex Scenarios
For more intricate designs where neither text nor background is purely black or white, reverting to SVG filters becomes necessary. By wrapping spans within additional spans and adjusting blend modes accordingly, we can maintain clarity and prevent overlaps from affecting visibility.
Conclusion
The inline background overlap problem presents unique challenges for web developers aiming for aesthetic precision. By leveraging CSS properties alongside SVG filters, it is possible to achieve clean designs without compromising on transparency or readability. As techniques evolve and browser capabilities expand, continued exploration of these methods will enhance our ability to create visually stunning web experiences.
Read more such articles from our Newsletter here.