当前位置: 首页 > 面试题库 >

具有边界半径的边界渐变

杨昊
2023-03-14
问题内容

我有以下CSS:

a.btn.white-grad {
    background: $lgrey;
    color: #313149 !important;
    border: 1px solid #000;
    border-image-source: linear-gradient(to right, #9c20aa, #fb3570);
    border-image-slice: 20;
    float: left;
    @include font-size(26);
    margin: 75px 0;
}

添加边框半径:5px似乎没有任何作用,我认为这是因为我使用的是边框渐变,我是否有办法完全实现所需的5px边框半径?


问题答案:

You cannot use border-radius with gradient. Here is another idea where you
can rely on multiple background and adjust the background-clip:

.white-grad {

    background:

     linear-gradient(#ccc,#ccc) padding-box, /*this is your grey background*/

     linear-gradient(to right, #9c20aa, #fb3570) border-box;

    color: #313149;

    padding:10px;

    border: 5px solid transparent;

    border-radius:15px;

    display:inline-block;

    margin: 75px 0;

}


<div class="white-grad"> Some text here</div>



<div class="white-grad"> Some long long long text here</div>



<div class="white-grad"> Some long long <br>long text here</div>

如果需要透明性,可以考虑使用SVG,如下所示:

svg {

  width:200px;

  height:100px;

  margin:10px;

}


<svg xmlns="http://www.w3.org/2000/svg">

<defs>

      <linearGradient id="Gradient" x1="0" x2="100" y1="0" y2="0" gradientUnits="userSpaceOnUse">

         <stop stop-color="#9c20aa" offset="0"/>

         <stop stop-color="#fb3570" offset="1"/>

      </linearGradient>

   </defs>

  <rect x="5" y="5" height="100%" width="100%" style="width:calc(100% - 10px);height:calc(100% - 10px)" rx="20" ry="20" stroke-width="10" fill="transparent" stroke="url(#Gradient)"/>

</svg>

That you can apply as background:

.white-grad {

    background:url('data:image/svg+xml;utf8,<svg   xmlns="http://www.w3.org/2000/svg" ><defs><linearGradient id="Gradient" x1="0" x2="100" y1="0" y2="0" gradientUnits="userSpaceOnUse"><stop stop-color="%239c20aa" offset="0"/><stop stop-color="%23fb3570" offset="1"/></linearGradient></defs><rect x="5" y="5" width="100%" height="100%" style="height:calc(100% - 10px);width:calc(100% - 10px)" rx="20" ry="20" stroke-width="10" fill="transparent" stroke="url(%23Gradient)"/></svg>');

    color: #313149;

    padding:25px;

    border-radius:15px;

    display:inline-block;

    margin: 75px 0;

}



body {

  background:yellow;

}


<div class="white-grad"> Some text here</div>



<div class="white-grad"> text very loooooooooooong here</div>

You can also use it as common element and consider position:absolute to
place it around the text:

.white-grad {

  color: #313149;

  padding: 25px;

  border-radius: 15px;

  display: inline-block;

  margin: 75px 0;

  position:relative;

  z-index:0;

}

.white-grad > svg {

  position:absolute;

  top:0;

  left:0;

  height:100%;

  width:100%;

  z-index:-1;

}



body {

  background: yellow;

}



.hide {

 height:0;

 width:0;

}


<svg class="hide" xmlns="http://www.w3.org/2000/svg"><defs><linearGradient id="Gradient" x1="0" x2="100" y1="0" y2="0" gradientUnits="userSpaceOnUse"><stop stop-color="#9c20aa" offset="0"/><stop stop-color="#fb3570" offset="1"/></linearGradient></defs><rect x="5" y="5" width="100%" height="100%" id="border" style="height:calc(100% - 10px);width:calc(100% - 10px)" rx="20" ry="20" stroke-width="10" fill="transparent" stroke="url(#Gradient)"/></svg>





<div class="white-grad">

<svg xmlns="http://www.w3.org/2000/svg">

  <use href="#border" />

</svg>

Some text here</div>



<div class="white-grad">

<svg xmlns="http://www.w3.org/2000/svg">

  <use href="#border" />

</svg>

text very loooooooooooong here</div>

Here is a different and complex idea with CSS using mask where you will have
transparency and it will also be responsive:

.white-grad {

  color: #313149;

  padding: 10px;

  display: inline-block;

  margin: 75px 0;

  position:relative;

  z-index:0;

}

.white-grad:before {

  content:"";

  position:absolute;

  z-index:-1;

  top:0;

  left:0;

  right:0;

  bottom:0;

  border: 5px solid transparent;

  border-radius: 15px;

  background: linear-gradient(to right, #9c20aa, #fb3570) border-box;

  -webkit-mask:

    radial-gradient(farthest-side at bottom left ,transparent calc(100% - 5px),#fff calc(100% - 4px) 100%) top     right/15px 15px,

    radial-gradient(farthest-side at top right   ,transparent calc(100% - 5px),#fff calc(100% - 4px) 100%) bottom  left /15px 15px,

    radial-gradient(farthest-side at top left    ,transparent calc(100% - 5px),#fff calc(100% - 4px) 100%) bottom  right/15px 15px,

    radial-gradient(farthest-side at bottom right,transparent calc(100% - 5px),#fff calc(100% - 4px) 100%) top     left /15px 15px,

    linear-gradient(#fff,#fff) top   /100% 5px,

    linear-gradient(#fff,#fff) bottom/100% 5px,

    linear-gradient(#fff,#fff) left  /5px 100%,

    linear-gradient(#fff,#fff) right /5px 100%;

  -webkit-mask-repeat:no-repeat;



  mask:

    radial-gradient(farthest-side at bottom left ,transparent calc(100% - 5px),#fff calc(100% - 4px) 100%) top     right/15px 15px,

    radial-gradient(farthest-side at top right   ,transparent calc(100% - 5px),#fff calc(100% - 4px) 100%) bottom  left /15px 15px,

    radial-gradient(farthest-side at top left    ,transparent calc(100% - 5px),#fff calc(100% - 4px) 100%) bottom  right/15px 15px,

    radial-gradient(farthest-side at bottom right,transparent calc(100% - 5px),#fff calc(100% - 4px) 100%) top     left /15px 15px,

    linear-gradient(#fff,#fff) top   /100% 5px,

    linear-gradient(#fff,#fff) bottom/100% 5px,

    linear-gradient(#fff,#fff) left  /5px 100%,

    linear-gradient(#fff,#fff) right /5px 100%;

  mask-repeat:no-repeat;

}


<div class="white-grad"> Some text here</div>



<div class="white-grad"> Some long long long text here</div>



<div class="white-grad"> Some long long <br>long text here</div>

CSS border radius with linear
gradient

With CSS variables, we can make it easy to adjust:

.white-grad {

  --b:5px;  /* border width*/

  --r:15px; /* the radius */



  --g:transparent calc(100% - var(--b)),#fff calc(100% - var(--b) + 1px) 100%;

  color: #313149;

  padding: calc(var(--b) + 5px);

  display: inline-block;

  margin: 75px 0;

  position:relative;

  z-index:0;

}

.white-grad:before {

  content:"";

  position:absolute;

  z-index:-1;

  top:0;

  left:0;

  right:0;

  bottom:0;

  border: var(--b) solid transparent;

  border-radius: var(--r);

  background: var(--c,linear-gradient(to right, #9c20aa, #fb3570)) border-box;

  -webkit-mask:

    radial-gradient(farthest-side at bottom left ,var(--g)) top     right/var(--r) var(--r),

    radial-gradient(farthest-side at top right   ,var(--g)) bottom  left /var(--r) var(--r),

    radial-gradient(farthest-side at top left    ,var(--g)) bottom  right/var(--r) var(--r),

    radial-gradient(farthest-side at bottom right,var(--g)) top     left /var(--r) var(--r),

    linear-gradient(#fff,#fff) top   /100% var(--b),

    linear-gradient(#fff,#fff) bottom/100% var(--b),

    linear-gradient(#fff,#fff) left  /var(--b) 100%,

    linear-gradient(#fff,#fff) right /var(--b) 100%;

  -webkit-mask-repeat:no-repeat;



  mask:

    radial-gradient(farthest-side at bottom left ,var(--g)) top     right/var(--r) var(--r),

    radial-gradient(farthest-side at top right   ,var(--g)) bottom  left /var(--r) var(--r),

    radial-gradient(farthest-side at top left    ,var(--g)) bottom  right/var(--r) var(--r),

    radial-gradient(farthest-side at bottom right,var(--g)) top     left /var(--r) var(--r),

    linear-gradient(#fff,#fff) top   /100% var(--b),

    linear-gradient(#fff,#fff) bottom/100% var(--b),

    linear-gradient(#fff,#fff) left  /var(--b) 100%,

    linear-gradient(#fff,#fff) right /var(--b) 100%;

  mask-repeat:no-repeat;

}



body {

  background:#f2f2f2;

}


<div class="white-grad"> Some text here</div>



<div class="white-grad" style="--r:20px;--b:10px;--c:linear-gradient(140deg,red,yellow,green)"> Some long long long text here</div>



<div class="white-grad"  style="--r:30px;--b:8px;--c:linear-gradient(-40deg,black 50%,blue 0)"> Some long long <br>long text here</div>



<div class="white-grad"  style="--r:40px;--b:20px;--c:conic-gradient(black,orange,purple)"> Some long long <br>long text here<br> more and more more and more</div>


 类似资料:
  • 问题内容: 我正在对具有圆形边框(边界半径)的输入字段进行样式设置,并尝试向该边框添加渐变。我可以成功制作渐变色和圆角边框,但是不能同时使用。它可以是不带渐变的圆角,也可以是带渐变但不带圆角的边界。 无论如何,两个CSS属性可以一起工作,还是不可能? 问题答案: 根据W3C规范,可能是不可能的: 框的背景而不是其边框图像被裁剪为适当的曲线 (由“ background- clip”确定)。剪切到边

  • 我有一个元素,其中左上角和右下角的边框半径为5,我试图使它与CSS3Pie兼容。文件指出 只支持速记版本;longhand border-top-left-radius等属性不是。不过,速记语法支持每个角的半径不同。链接

  • 问题内容: 我有一个div,其border-radius设置为某个值(比方说10px),还有一个嵌套的div,它是其父级的完整宽度和高度。 我注意到,尽管溢出被设置为隐藏,但父母并没有将孩子夹在圆角上。另一个stackoverflow线程指示此行为是“设计使然”: …我不禁注意到“拐角裁剪”部分中的以下描述: 剪切到边框或填充边缘的其他效果(例如“可见”以外的“溢出”)也必须剪切到曲线。替换元素的

  • 问题内容: 有谁知道Internet Explorer是否/何时支持“ border-radius” CSS属性? 问题答案: 是! IE9于2011年1月发布时。 假设您要在所有四个侧面上平均15像素: IE9将使用默认值,因此只需确保将其包括在所有样式中(称为边框半径)即可。然后,您的站点将可以使用IE9。 适用于Firefox,适用于Safari和Chrome。 此外:不要忘记声明您的IE编

  • 最近我更新了颤振的最新版本,我发现了一个问题,当我尝试添加borderRadius时,ide指示我需要使用borderRadiusGeometry,有人知道如何修复它吗? 返回容器(子:卡片(子:文本('${myNumbers[index]}'),颜色:Colors.black,),装饰:const BoxDecation(颜色:Colors.black,borderRadius:BorderRa

  • 问题内容: 我正在使用CSS3Piehtc文件在IE8中启用,但没有任何效果。我的CSS是: 我已经将PIE.htc放在了公共根目录中(就像在CSS3PIE演示页上所做的那样),并使用相对uri和绝对uri在同一文件夹中进行了尝试。 演示正在运行;只是不是我的代码! 谢谢 问题答案: 尝试添加