I found a recent discussion on Reddit’s r/webdev interesting: how might one make a container appear to have a slanted bottom border, as shown above? The top-voted answer, while clever, only worked on fixed-width containers, and used a lot of CSS to achieve the effect; by sacrificing a small amount of backwards compatibility, I think there’s a better option.
This mini-lesson might be considered part of a push to re-imagine website layout: for the longest time we’ve been reliant on three-column grids and 90° angles. But with a little imagination, we can do so much more:
My solution doesn’t even require an extra element. Instead, it uses multiple backgrounds with a linear gradient. The full HTML is as follows:
<div id="login">
<h1>Sign Up</h1>
<img src="adriana.jpg" alt>
<label for="name">Name</label>
<input id="name" type="text" name="name">
<label for="email">Email</label>
<input id="email" type="email" name="email">
<label for="password">Password</label>
<input id="password" type="password" name="password">
<input type="submit" value="Done">
</div>
The key CSS:
#login {
font-family: Avenir, Calibri, sans-serif;
width: 33%;
margin: 0 auto;
background-image:
linear-gradient(175deg, transparent 36%, white 36.05%),
url(nahatlatch.jpg);
text-align: center;
background-size: 100%, cover;
background-repeat: no-repeat;
}
By overlaying the bitmap background image with a linear gradient (remember, in CSS the last background image in a declaration is laid down first), we get the sweep of the gradient over the image; by starting the gradient transparent
, we get to see the image underneath, and by placing the transition of the transparent
part of the gradient very close to the white
stop, the effect is a sharp, angled cutoff.
The rest of the CSS simply styles the div
(which could be almost any container element) and its content; I’ve left it here for anyone who may be interested.
#login h1 { font-weight: 100; padding-top: 6rem; }
#login img {
width: 33%;
height: auto;
border-radius: 50%;
border: 5px solid white;
}
#login label { color: #666; margin-top: 1rem; }
#login input, #login label {
display: block;
width: 90%;
margin: 0 auto;
padding: .5rem;
}
#login input {
text-align: center;
border: none;
border-bottom: 1px solid #aaa;
font-size: 1rem;
}
#login input[type="submit"] {
width: 100%;
margin-top: 1rem;
background: hsl(0, 90%, 60%);
color: #fff; padding: 1rem;
text-transform: uppercase;
}
There’s also the Codepen repo, which contains code for some responsive breakpoints. The single downside to this version of the effect is a bit of browser compatibility: Internet Explorer didn’t support gradients until version 10. You could, however, provide another version of the background-image
declaration earlier for just that browser.
Photograph by Dru, licensed under Creative Commons
Enjoy this piece? I invite you to follow me at twitter.com/dudleystorey to learn more.
Check out the CodePen demo for this article at https://codepen.io/dudleystorey/pen/rObREE