Is there a way to create a button (or div) with a border with a gradient and rounded corners?

Here's how it should look:

enter image description here

Attempts so far:

  • Use a gradient background plus an inner element to cover it and leave only the outer “border”. The background is clearly not transparent .

body { background: #242424; height: 100%; width: 100%; margin: 0; padding: 0; box-sizing: border-box; font-family: sans-serif; color: #FFFFFF; } div { display: flex; flex-direction: column; justify-content: center; align-content: center; align-items: center; width: 100%; height: 100vh; } h1 { margin: 2em; text-align: center; } a { cursor: pointer; transition: ease-in-out,.2s,color; } a:hover { color: #DDD; } .nested { display: block; max-width: 20em; padding: 2px; overflow: hidden; border-radius: 2em; background: linear-gradient(to right, #00ff00 0%, #00e5ff 100%); } .nested span { display: inline-block; padding: 1em; text-align: center; background: #242424; border-radius: 2rem; } .nested span p { padding: 0 2em; margin: 0; } .pseudo { display: block; margin-top: 20px; position: relative; border-radius: 2em; padding: 1em 2em; background: #242424; } .pseudo:after { position: absolute; z-index: -1; top: -2px; bottom: -2px; right: -2px; left: -2px; background: linear-gradient(to right, #00ff00 0%, #00e5ff 100%); border-radius: 2em; content: ''; } 
 <div> <h1>Gradient + Border Radius</h1> <a class="nested"><span><p>ANOTHER ONE</p></span></a> <a class="pseudo">AND ANOTHER ONE</a> </div> 
  1. Using border-image . corners are not rounded .

 body { background: url(http://subtlepatterns2015.subtlepatterns.netdna-cdn.com/patterns/ignasi_pattern_s.png); height: 100%; width: 100%; margin: 0; padding: 0; box-sizing: border-box; font-family: sans-serif; } a { padding: 20px 40px; border-image: linear-gradient(to bottom right, #00aeef 0%, #7cc578 100%); border-image-slice: 1; border-radius: 10px; } div { display: flex; flex-direction: column; justify-content: center; align-content: center; align-items: center; width: 100%; height: 100vh; } h1 { margin: 2em; text-align: center; } a { text-decoration: none; font-weight: bold; color: black; cursor: pointer; transition: ease-in-out,.2s,color; } a:hover { color: #DDD; } 
 <div> <h1>Gradient + [non working] Border Radius</h1> <a href="#">CLICK ME </a> </div> 
+7
css css3 css-shapes border linear-gradients
source share
2 answers

No, you cannot use border-image for an element with border-radius , because according to the specifications , only the background element is cropped based on the radius of the border, not border-image . Thus, the image will always be a rectangle (or square).

If you need a transparent center (or a transparent area of ​​content), it is best to use SVG. An SVG rotation can even take a gradient as a value, and therefore it can create a rounded shape, the border of which is a gradient, and the center is transparent.

path used to create the form is simple, and you can learn more about path commands here .

 .border-with-grad { position: relative; height: 100px; width: 250px; color: white; line-height: 100px; text-align: center; letter-spacing: 1.5px; } .border-with-grad svg { position: absolute; top: 0px; left: 0px; height: 100%; width: 100%; } .border-with-grad path { fill: transparent; stroke: url(#border-gradient); stroke-width: 4; } /* Just for demo */ body { background-image: radial-gradient(circle, #3F9CBA 0%, #153346 100%); min-height: 100vh; font-family: sans-serif; } 
 <div class='border-with-grad'> <svg viewBox='0 0 250 100'> <defs> <linearGradient id='border-gradient' gradientUnits='objectBoundingBox' gradientTransform='rotate(5 0.5 0.5)'> <stop offset='0%' stop-color='rgb(248,244,135)' /> <stop offset='25%' stop-color='rgb(248,244,135)' /> <stop offset='75%' stop-color='rgb(53,176,182)' /> <stop offset='100%' stop-color='rgb(53,176,182)' /> </linearGradient> </defs> <path d='M50,95 a45,45 0 0,1 0,-90 h150 a45,45 0 1,1 0,90 h-150' /> </svg> CLICK HERE </div> 

With CSS, we can use mask-image to make the center part transparent, but its browser support is very poor. Currently, only webkit-enabled browsers are supported. Another way is to use clip-path , but this is not the case if you need to support IE and Firefox (Firefox only supports SVG clip paths).

+6
source share

If you need full browser support, and you want the inside to be transparent, and you only want to use a CSS solution ... you cannot use a gradient. You have to fake it without a shadow

 .test { width: 200px; height: 80px; border-radius: 40px; position: relative; overflow: hidden; color: white; font-size: 50px; padding-left: 30px; } .test:after { content: ""; position: absolute; width: calc(100% - 10px); height: calc(100% - 10px); top: 0px; right: 0px; bottom: 0px; left: 0px; margin: auto; border-radius: inherit; box-shadow: -20px 0px 10px 5px rgba(250, 250, 20, 1), 20px 0px 10px 10px rgba( 20, 250, 200, 1); } body { background: radial-gradient(circle, black, darkgrey); } 
 <div class="test">TEST</div> 
+3
source share

All Articles