如何使用 CSS 在两个渐变之间创建曲线?
How to create a curve between two gradient using CSS?
我有两个具有不同渐变背景的 div,我需要在它们之间创建一条 S-Shape 曲线。
这是渐变 divs 的示例 fiddle:https://jsfiddle.net/JerryGoyal/rjyfc46c/2/
<div id="section1">
</div>
<div id="section2">
</div>
#section1{
height:200px;
background: linear-gradient(to bottom right, #ad3, #add);
}
#section2{
height:200px;
background: linear-gradient(to bottom right, #de350b, #0065ff);
}
我想到了一些事情,但是:
- svg: 不知道如何处理其他渐变 div.
- border-radius: 未能真正获得 S-like 曲线,而且当我调整屏幕大小时它变得很难看。
- clip-path: 某些浏览器不支持 https://caniuse.com/css-clip-path
- png 图像: 不!需要动态内容。
如有任何帮助,我们将不胜感激!
P.S:未来读者必读:https://css-tricks.com/creating-non-rectangular-headers/
这是一个使用 linearGradient 和 SVG 的解决方案。
.container {
width: 500px;
height: 200px;
background:linear-gradient(to bottom right, #de350b, #0065ff);
}
svg {
width:100%;
}
<div class="container">
<svg mlns='http://www.w3.org/2000/svg' viewBox="0 0 64 64">
<defs>
<linearGradient id="grad" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" stop-color="#ad3" />
<stop offset="100%" stop-color="#add" />
</linearGradient>
</defs>
<path d='M0 10 C30 28 38 0 64 10 L64 0 L0 0 Z' fill="url(#grad)"/>
</svg>
</div>
这里还有一个有用的 online tool 可以轻松编辑形状(只需将路径附加到 URL 即可编辑它http://jxnblk.com/paths/?d=M0 10 C30 28 38 0 64 10 L64 0 L0 0 Z
)
将相同的 SVG 用作背景的另一个想法,这样您就可以轻松处理其上方的内容:
.container {
width: 500px;
height: 200px;
background: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" width="500" ><defs><linearGradient id="grad" x1="0%" y1="0%" x2="100%" y2="100%"><stop offset="0%" stop-color="%23ad3" /><stop offset="100%" stop-color="%23add" /></linearGradient></defs><path d="M0 10 C30 28 38 0 64 10 L64 0 L0 0 Z" fill="url(%23grad)"/></svg>'),
linear-gradient(to bottom right, #de350b, #0065ff);
display:flex;
justify-content:space-around;
align-items:center;
flex-direction:column;
color:#fff;
}
<div class="container">
<p>TOP</p>
<p>BOTTOM</p>
</div>
如果您想要一个不涉及 SVG 的纯 CSS 解决方案,这里使用 mask
和 radial-gradient:
.box {
height:200px;
position:relative;
}
.box:before,
.box:after{
content:"";
position:absolute;
top:0;
left:0;
right:0;
height:100%;
background: linear-gradient(to bottom right, #ad3, #add);
}
.box:after {
-webkit-mask:
radial-gradient(100% 80% at top ,white 79.5%,transparent 80%) left,
radial-gradient(100% 80% at bottom,transparent 79.5%,white 80%) right;
mask:
radial-gradient(100% 80% at top ,white 79.5%,transparent 80%) left,
radial-gradient(100% 80% at bottom,transparent 79.5%,white 80%) right;
-webkit-mask-size:50.1% 100%;
-webkit-mask-repeat:no-repeat;
mask-size:50.1% 100%;
mask-repeat:no-repeat;
background:linear-gradient(to bottom right, #de350b, #0065ff);
}
<div class="box">
</div>
调整不同的值来控制曲线。诀窍是确保两者相同并从同一点开始以创建连续的形状。你可以引入CSS个变量来轻松控制这个:
.box {
height:200px;
margin:10px;
position:relative;
}
.box:before,
.box:after{
content:"";
position:absolute;
top:0;
left:0;
right:0;
height:100%;
background: linear-gradient(to bottom right, #ad3, #add);
}
.box:after {
-webkit-mask:
radial-gradient(var(--r1,100%) var(--r2,80%) at top ,white 79.5%,transparent 80%) left,
radial-gradient(var(--r1,100%) var(--r2,80%) at bottom,transparent 79.5%,white 80%) right;
mask:
radial-gradient(var(--r1,100%) var(--r2,80%) at top ,white 79.5%,transparent 80%) left,
radial-gradient(var(--r1,100%) var(--r2,80%) at bottom,transparent 79.5%,white 80%) right;
-webkit-mask-size:50.1% 100%;
-webkit-mask-repeat:no-repeat;
mask-size:50.1% 100%;
mask-repeat:no-repeat;
background:linear-gradient(to bottom right, #de350b, #0065ff);
}
<div class="box">
</div>
<div class="box" style="--r1:82%;--r2:97%">
</div>
<div class="box" style="--r1:126%;--r2:72%">
</div>
为了让事情变得更有趣,我们可以在曲线之后的两个渐变之间添加一个边界,我们可以在其中放置另一个渐变!
.box {
height:200px;
margin:10px;
position:relative;
background:linear-gradient(to right,blue,black);
}
.box:before,
.box:after{
content:"";
position:absolute;
left:0;
right:0;
height:calc(100% - var(--b,10px)); /*control the gap here*/
-webkit-mask:
radial-gradient(var(--r1,100%) var(--r2,80%) at var(--p1,top) ,white 79.5%,transparent 80%) var(--d1,right),
radial-gradient(var(--r1,100%) var(--r2,80%) at var(--p2,bottom),transparent 79.5%,white 80%) var(--d2,left);
mask:
radial-gradient(var(--r1,100%) var(--r2,80%) at var(--p1,top) ,white 79.5%,transparent 80%) var(--d1,right),
radial-gradient(var(--r1,100%) var(--r2,80%) at var(--p2,bottom),transparent 79.5%,white 80%) var(--d2,left);
-webkit-mask-size:50.1% 100%;
-webkit-mask-repeat:no-repeat;
mask-size:50.1% 100%;
mask-repeat:no-repeat;
}
.box:before {
top:0;
background:linear-gradient(to bottom right, #de350b, #0065ff);
}
.box:after {
bottom:0;
background: linear-gradient(to bottom right, #ad3, #add);
--p1:bottom;
--p2:top;
--d1:left;
--d2:right;
}
<div class="box">
</div>
<div class="box" style="--r1:82%;--r2:97%;--b:20px">
</div>
<div class="box" style="--r1:126%;--r2:72%;--b:5px">
</div>
我有两个具有不同渐变背景的 div,我需要在它们之间创建一条 S-Shape 曲线。
这是渐变 divs 的示例 fiddle:https://jsfiddle.net/JerryGoyal/rjyfc46c/2/
<div id="section1">
</div>
<div id="section2">
</div>
#section1{
height:200px;
background: linear-gradient(to bottom right, #ad3, #add);
}
#section2{
height:200px;
background: linear-gradient(to bottom right, #de350b, #0065ff);
}
我想到了一些事情,但是:
- svg: 不知道如何处理其他渐变 div.
- border-radius: 未能真正获得 S-like 曲线,而且当我调整屏幕大小时它变得很难看。
- clip-path: 某些浏览器不支持 https://caniuse.com/css-clip-path
- png 图像: 不!需要动态内容。
如有任何帮助,我们将不胜感激!
P.S:未来读者必读:https://css-tricks.com/creating-non-rectangular-headers/
这是一个使用 linearGradient 和 SVG 的解决方案。
.container {
width: 500px;
height: 200px;
background:linear-gradient(to bottom right, #de350b, #0065ff);
}
svg {
width:100%;
}
<div class="container">
<svg mlns='http://www.w3.org/2000/svg' viewBox="0 0 64 64">
<defs>
<linearGradient id="grad" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" stop-color="#ad3" />
<stop offset="100%" stop-color="#add" />
</linearGradient>
</defs>
<path d='M0 10 C30 28 38 0 64 10 L64 0 L0 0 Z' fill="url(#grad)"/>
</svg>
</div>
这里还有一个有用的 online tool 可以轻松编辑形状(只需将路径附加到 URL 即可编辑它http://jxnblk.com/paths/?d=M0 10 C30 28 38 0 64 10 L64 0 L0 0 Z
)
将相同的 SVG 用作背景的另一个想法,这样您就可以轻松处理其上方的内容:
.container {
width: 500px;
height: 200px;
background: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" width="500" ><defs><linearGradient id="grad" x1="0%" y1="0%" x2="100%" y2="100%"><stop offset="0%" stop-color="%23ad3" /><stop offset="100%" stop-color="%23add" /></linearGradient></defs><path d="M0 10 C30 28 38 0 64 10 L64 0 L0 0 Z" fill="url(%23grad)"/></svg>'),
linear-gradient(to bottom right, #de350b, #0065ff);
display:flex;
justify-content:space-around;
align-items:center;
flex-direction:column;
color:#fff;
}
<div class="container">
<p>TOP</p>
<p>BOTTOM</p>
</div>
如果您想要一个不涉及 SVG 的纯 CSS 解决方案,这里使用 mask
和 radial-gradient:
.box {
height:200px;
position:relative;
}
.box:before,
.box:after{
content:"";
position:absolute;
top:0;
left:0;
right:0;
height:100%;
background: linear-gradient(to bottom right, #ad3, #add);
}
.box:after {
-webkit-mask:
radial-gradient(100% 80% at top ,white 79.5%,transparent 80%) left,
radial-gradient(100% 80% at bottom,transparent 79.5%,white 80%) right;
mask:
radial-gradient(100% 80% at top ,white 79.5%,transparent 80%) left,
radial-gradient(100% 80% at bottom,transparent 79.5%,white 80%) right;
-webkit-mask-size:50.1% 100%;
-webkit-mask-repeat:no-repeat;
mask-size:50.1% 100%;
mask-repeat:no-repeat;
background:linear-gradient(to bottom right, #de350b, #0065ff);
}
<div class="box">
</div>
调整不同的值来控制曲线。诀窍是确保两者相同并从同一点开始以创建连续的形状。你可以引入CSS个变量来轻松控制这个:
.box {
height:200px;
margin:10px;
position:relative;
}
.box:before,
.box:after{
content:"";
position:absolute;
top:0;
left:0;
right:0;
height:100%;
background: linear-gradient(to bottom right, #ad3, #add);
}
.box:after {
-webkit-mask:
radial-gradient(var(--r1,100%) var(--r2,80%) at top ,white 79.5%,transparent 80%) left,
radial-gradient(var(--r1,100%) var(--r2,80%) at bottom,transparent 79.5%,white 80%) right;
mask:
radial-gradient(var(--r1,100%) var(--r2,80%) at top ,white 79.5%,transparent 80%) left,
radial-gradient(var(--r1,100%) var(--r2,80%) at bottom,transparent 79.5%,white 80%) right;
-webkit-mask-size:50.1% 100%;
-webkit-mask-repeat:no-repeat;
mask-size:50.1% 100%;
mask-repeat:no-repeat;
background:linear-gradient(to bottom right, #de350b, #0065ff);
}
<div class="box">
</div>
<div class="box" style="--r1:82%;--r2:97%">
</div>
<div class="box" style="--r1:126%;--r2:72%">
</div>
为了让事情变得更有趣,我们可以在曲线之后的两个渐变之间添加一个边界,我们可以在其中放置另一个渐变!
.box {
height:200px;
margin:10px;
position:relative;
background:linear-gradient(to right,blue,black);
}
.box:before,
.box:after{
content:"";
position:absolute;
left:0;
right:0;
height:calc(100% - var(--b,10px)); /*control the gap here*/
-webkit-mask:
radial-gradient(var(--r1,100%) var(--r2,80%) at var(--p1,top) ,white 79.5%,transparent 80%) var(--d1,right),
radial-gradient(var(--r1,100%) var(--r2,80%) at var(--p2,bottom),transparent 79.5%,white 80%) var(--d2,left);
mask:
radial-gradient(var(--r1,100%) var(--r2,80%) at var(--p1,top) ,white 79.5%,transparent 80%) var(--d1,right),
radial-gradient(var(--r1,100%) var(--r2,80%) at var(--p2,bottom),transparent 79.5%,white 80%) var(--d2,left);
-webkit-mask-size:50.1% 100%;
-webkit-mask-repeat:no-repeat;
mask-size:50.1% 100%;
mask-repeat:no-repeat;
}
.box:before {
top:0;
background:linear-gradient(to bottom right, #de350b, #0065ff);
}
.box:after {
bottom:0;
background: linear-gradient(to bottom right, #ad3, #add);
--p1:bottom;
--p2:top;
--d1:left;
--d2:right;
}
<div class="box">
</div>
<div class="box" style="--r1:82%;--r2:97%;--b:20px">
</div>
<div class="box" style="--r1:126%;--r2:72%;--b:5px">
</div>