我正在设置一个具有圆角边框(border-radius)的输入字段,并尝试向所述边框添加渐变。我可以成功地制作渐变和圆形边框,但不能同时工作。它既没有渐变的圆角,也没有渐变的边框,但没有圆角。
-webkit-border-radius: 5px;
-webkit-border-image: -webkit-gradient(linear, 0 0, 0 100%, from(#b0bbc4), to(#ced9de)) 1 100%;
是否有两个CSS属性一起工作,或者这是不可能的?
答案 0 :(得分:86)
这是可能的,不需要额外的标记,但使用::after
pseudo-element。
它涉及在下面放置一个带有渐变背景的伪元素并剪切它。这适用于所有当前浏览器,没有供应商前缀或黑客(甚至IE),但如果你想支持IE的复古版本,你应该考虑纯色回退,javascript和/或自定义MSIE CSS扩展(即{{3类似于CSSPie的矢量欺骗等等。
这是一个实例(filter
):
@import url('//raw.githubusercontent.com/necolas/normalize.css/master/normalize.css');
html {
/* just for showing that background doesn't need to be solid */
background: linear-gradient(to right, #DDD 0%, #FFF 50%, #DDD 100%);
padding: 10px;
}
.grounded-radiants {
position: relative;
border: 4px solid transparent;
border-radius: 16px;
background: linear-gradient(orange, violet);
background-clip: padding-box;
padding: 10px;
/* just to show box-shadow still works fine */
box-shadow: 0 3px 9px black, inset 0 0 9px white;
}
.grounded-radiants::after {
position: absolute;
top: -4px; bottom: -4px;
left: -4px; right: -4px;
background: linear-gradient(red, blue);
content: '';
z-index: -1;
border-radius: 16px;
}
<p class="grounded-radiants">
Some text is here.<br/>
There's even a line break!<br/>
so cool.
</p>
上面的额外造型是显示:
box-shadow
,inset
或不是同样,这适用于IE,Firefox和Webkit / Blink浏览器。
答案 1 :(得分:29)
根据W3C规范,可能不可能:
一个盒子的背景,但不是它的背景 边框图像,被剪切到 适当的曲线(由...确定) “背景剪辑”)。其他影响 剪辑到边框或填充边缘 (比如'溢出'除了 '可见')也必须剪辑到 曲线。替换的内容 元素总是被修剪为 内容边缘曲线。此外,该地区 在边界边缘的曲线之外 代表不接受鼠标事件 元素。
这可能是因为border-image
可能会采取一些潜在的复杂模式。如果你想要一个圆形的图像边框,你需要自己创建一个。
答案 2 :(得分:7)
致力于解决同一问题,并且遇到了一个非svg解决方案,该解决方案比此处的其他解决方案更为简洁:
.rounded-color-border-element{
width: 300px;
height: 80px;
border: double 4px transparent;
border-radius: 80px;
background-image: linear-gradient(white, white), radial-gradient(circle at top left, #f00,#3020ff);
background-origin: border-box;
background-clip: content-box, border-box;
}
这不是我自己的解决方案,已从此处获取:https://gist.github.com/stereokai/36dc0095b9d24ce93b045e2ddc60d7a0
答案 3 :(得分:4)
现在我们可以使用掩码轻松实现这一点,同时具有透明度和响应性
.box {
position:relative;
padding:20px 30px;
margin:5px;
display:inline-block;
font-size:30px;
}
.box::before {
content:"";
position:absolute;
top:0;
left:0;
right:0;
bottom:0;
border-radius:50px;
padding:10px;
background:linear-gradient(45deg,red,blue);
-webkit-mask:
linear-gradient(#fff 0 0) content-box,
linear-gradient(#fff 0 0);
-webkit-mask-composite: destination-out;
mask-composite: exclude;
}
<div class="box">
Hello World
</div>
<div class="box">
Hello World again
</div>
<div class="box">
Hello World <br> two lines
</div>
更多详情:https://dev.to/afif/border-with-gradient-and-radius-387f
答案 4 :(得分:2)
如果将渐变应用于背景,该怎么办?比并在内部添加一个额外的div,边距设置为旧的边框宽度和白色背景,当然还有borderradius。这样你就可以获得边框的效果了,但实际上是使用了正确剪裁的背景。
答案 5 :(得分:2)
这对我来说在WebKit中总是有用,虽然它有点棘手!
基本上你只是让边框变大然后用越来越小的伪元素边框掩盖它:)。
.thing {
display: block;
position: absolute;
left: 50px;
top: 50px;
margin-top: 18pt;
padding-left: 50pt;
padding-right: 50pt;
padding-top: 25pt;
padding-bottom: 25pt;
border-radius: 6px;
font-size: 18pt;
background-color: transparent;
border-width: 3pt;
border-image: linear-gradient(#D9421C, #E8A22F) 14% stretch;
}
.thing::after {
content: '';
border-radius: 8px;
border: 3pt solid #fff;
width: calc(100% + 6pt);
height: calc(100% + 6pt);
position: absolute;
top: -6pt;
left: -6pt;
z-index: 900;
}
.thing::before {
content: '';
border-radius: 2px;
border: 1.5pt solid #fff;
width: calc(100%);
height: calc(100% + 0.25pt);
position: absolute;
top: -1.5pt;
left: -1.5pt;
z-index: 900;
}
答案 6 :(得分:2)
我会使用SVG:
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 220 220" width="100%" height="100%" preserveAspectRatio="none">
<defs>
<linearGradient id="gradient">
<stop offset="0" style="stop-color:#0070d8" />
<stop offset="0.5" style="stop-color:#2cdbf1" />
<stop offset="1" style="stop-color:#83eb8a" />
</linearGradient>
</defs>
<ellipse ry="100" rx="100" cy="110" cx="110" style="fill:none;stroke:url(#gradient);stroke-width:6;" />
</svg>
&#13;
SVG可以用作单独的文件(首选方式)或类似background
的值的一部分(以下代码仅适用于webkit浏览器):
div {
width: 250px;
height: 250px;
background: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 220 220" width="100%" height="100%" preserveAspectRatio="none"><defs><linearGradient id="gradient"><stop offset="0" style="stop-color:#0070d8" /><stop offset="0.5" style="stop-color:#2cdbf1" /><stop offset="1" style="stop-color:#83eb8a" /></linearGradient></defs><ellipse ry="100" rx="100" cy="110" cx="110" style="fill:none;stroke:url(#gradient);stroke-width:6;" /></svg>');
}
&#13;
<div></div>
&#13;
为了在MS Edge和Firefox中工作,我们应该在utf8
之后转义我们的标记,因此我们将使用单引号"
,'
替换双引号#
使用%23
和%
加%25
:
div {
width: 250px;
height: 250px;
background: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 220 220' width='100%25' height='100%25' preserveAspectRatio='none'><defs><linearGradient id='gradient'><stop offset='0' style='stop-color:%230070d8' /><stop offset='0.5' style='stop-color:%232cdbf1' /><stop offset='1' style='stop-color:%2383eb8a' /></linearGradient></defs><ellipse ry='100' rx='100' cy='110' cx='110' style='fill:none;stroke:url(%23gradient);stroke-width:6;' /></svg>");
background-size: 100% 100%; /* Fix for Fifefox image scaling */
}
&#13;
<div></div>
&#13;
答案 7 :(得分:1)
透明元素的解决方案: 至少在Firefox中工作。
实际上我找到了一种没有伪类的方法 - 但它只适用于径向渐变:
body {
background: linear-gradient(white, black), -moz-linear-gradient(white, black), -webkit-linear-gradient(white, black);
height: 300px;
}
div{
text-align: center;
width: 100px;
height: 100px;
font-size:30px;
color: lightgrey;
border-radius: 80px;
color: transparent;
background-clip: border-box, text;
-moz-background-clip: border-box, text;
-webkit-background-clip: border-box, text;
background-image: radial-gradient(circle,
transparent, transparent 57%, yellow 58%, red 100%), repeating-linear-gradient(-40deg, yellow,
yellow 10%, orange 21%, orange 30%, yellow 41%);
line-height: 100px;
}
&#13;
<body>
<div class="radial-gradient"> OK </div>
</body>
&#13;
获取具有伪类的透明元素我只是这样找到 - 好吧它不是渐变,但它至少是一个多彩的条纹边框(看起来像生命环):
body {
background: linear-gradient(white, black, white);
height: 600px;
}
div{
position: absolute;
width: 100px;
height: 100px;
font-size:30px;
background-color:transparent;
border-radius:80px;
border: 10px dashed orange;
color: transparent;
background-clip: text;
-moz-background-clip: text;
-webkit-background-clip: text;
background-image: repeating-linear-gradient(-40deg, yellow,
yellow 10%, orange 11%, orange 20%, yellow 21%);
text-align:center;
line-height:100px;
}
div::after {
position: absolute;
top: -10px; bottom: -10px;
left: -10px; right: -10px;
border: 10px solid yellow;
content: '';
z-index: -1;
border-radius: 80px;
}
&#13;
<body>
<div class="gradient"> OK </div>
</body>
&#13;
使用svg(在可变性方面最令人满意,但也需要大多数代码行):
body{
margin: 0;
padding: 0;
}
div {
position: absolute;
display: flex;
align-items: center;
left: 50%;
transform: translateX(-50%);
text-align: center;
}
span {
position: absolute;
left: 50%;
transform: translateX(-50%);
width: 100px;
height: 100px;
line-height: 105px;
font-size:40px;
background-clip: text;
-moz-background-clip: text;
-webkit-background-clip: text;
background-image: repeating-linear-gradient(-40deg, yellow,
yellow 10%, orange 11%, orange 20%, yellow 21%);
color: transparent;
}
svg {
fill: transparent;
stroke-width: 10px;
stroke:url(#gradient);
}
&#13;
<head>
</head>
<body>
<div>
<span>OK</span>
<svg>
<circle class="stroke-1" cx="50%" cy="50%" r="50"/>
<defs>
<linearGradient id="gradient" x1="0%" y1="0%" x2="0%" y2="15%" gradientTransform="rotate(-40)" spreadMethod="reflect">
<stop offset="0%" stop-color="orange" />
<stop offset="49%" stop-color="orange" />
<stop offset="50%" stop-color="yellow" />
<stop offset="99%" stop-color="yellow" />
</linearGradient>
</defs>
</svg>
</div>
</body>
&#13;
答案 8 :(得分:0)
答案很简单:要具有彩色的弯曲边框,我们首先需要具有弯曲的背景。然后您的问题将得到解决(没有梯度的情况):
.buttonBorder {
-fx-border-color: red;
-fx-background-color: white;
-fx-background-radius: 30;
-fx-border-radius: 30;
}
答案 9 :(得分:0)
我们需要背景色而不是白色..
div{
width: 300px;
height: 80px;
border: double 1em transparent;
border-radius: 30px;
background-image: linear-gradient(transparent, transparent),
linear-gradient(to right, green, gold);
background-origin: border-box;
background-clip: content-box, border-box;
}
<div></div>