Можно ли использовать border-radius вместе с border-image с градиентом?

Я задаю стиль для поля ввода с закругленной границей (border-radius) и пытаюсь добавить градиент к указанной границе. Я могу успешно сделать градиент и закругленную границу, но ни то, ни другое не работают вместе. Он либо закруглен без градиента, либо граница с градиентом, но без закругленных углов.

-webkit-border-radius: 5px;
-webkit-border-image: -webkit-gradient(linear, 0 0, 0 100%, from(#b0bbc4), to(#ced9de)) 1 100%;

Есть ли способ, чтобы оба свойства CSS работали вместе, или это невозможно?

Свободный перевод вопроса Possible to use border-radius together with a border-image which has a gradient? от участника @paulwilde.


Ответы (3 шт):

Автор решения: Alexandr_TT

Работаем над той же проблемой. Наткнулся на решение без svg, которое более лаконично, чем другие здесь:

div{
  width: 300px;
  height: 80px;
  border: double 1em transparent;
  border-radius: 30px;
  background-image: linear-gradient(white, white), 
                    linear-gradient(to right, green, gold);
  background-origin: border-box;
  background-clip: content-box, border-box;
}
<div></div>

Это не мое собственное решение, оно взято отсюда

Свободный перевод ответа от участника @alphazwest.

→ Ссылка
Автор решения: Alexandr_TT

Теперь мы можем использовать маску, чтобы легко добиться этого, сохраняя при этом прозрачность и отзывчивость.

.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>

Более подробно в этом ответе

Свободный перевод ответа от участника @Temani Afif.

→ Ссылка
Автор решения: Alexandr_TT

Я бы использовал для этого SVG:

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 220 220" width="50%" height="50%" 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>

Чтобы это работало в 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 */
}
<div></div>

Свободный перевод ответа от участника @Vadim Ovchinnikov.

→ Ссылка