Как сделать градиент границы диагонального круга?

у меня проблема с CSS3. Я не знаю, как сделать диагональную круглую градиентную границу такой: circle example

Я нашел что-то вроде этой:

.box {
  width: 250px;
  height: 250px;
  margin: auto;
  background: #eee;
  border: 20px solid transparent;
  -moz-border-image: -moz-linear-gradient(top left, #3acfd5 0%, #3a4ed5 100%);
  -webkit-border-image: -webkit-linear-gradient(top left, #3acfd5 0%, #3a4ed5 100%);
  border-image: linear-gradient(to bottom right, #3acfd5 0%, #3a4ed5 100%);
  border-image-slice: 1;
}
<div class="box"></div>

но, к сожалению, это работает только с квадратами.

любая помощь будет оценили.

2 ответов


вы можете попробовать что-то вроде этого я использовал псевдоэлемент с-ve z-index

Примечание: фон не является прозрачным, поскольку я использовал background-color для внутреннего элемента

.box {
  width: 250px;
  height: 250px;
  position: relative;
  margin: auto;
  margin: 30px;
  border-radius: 50%;
  background: #fff;
}
.box:after {
  content: '';
  position: absolute;
  top: -15px;
  bottom: -15px;
  right: -15px;
  left: -15px;
  background-image: linear-gradient(to bottom left, #7B73A4 0%, #150E5E 100%);
  z-index: -1;
  border-radius: inherit;
}
<div class="box"></div>

конический градиент-это градиент, который идет по дуге окружности вокруг центра. Это то, что мы видим в цветных колесах. Как отметил Paulie_D, в настоящее время это невозможно с CSS, но Леа веру разработала для него полифилл.

сказав это, то, что вы ищете не похоже на конический градиент, это нормально угловой линейный градиент, но применяется только к границам. Это не может быть достигнуто через CSS border-image свойство из-за того, как оно предназначено для работы согласно технические характеристики.

фоны коробки, но не ее изображение границы, обрезаются на соответствующую кривую


если центральная часть круга имеет сплошной цвет, то можно использовать подход, упомянутый в ответе Виторино. Если это не сплошной цвет (то есть фон страницы-это градиент или изображение, которое нужно показать), это не поможет. Этот в этом случае можно использовать следующие подходы.

Использование Изображения Маски:

этот подход использует изображение круговой маски для маскировки внутренней части круга. Это делает его похожим на то, что только граница имеет градиент, примененный к ней. The недостаток эта функция в настоящее время поддерживается только в WebKit работает браузеры.

.border-gradient-mask {
  height: 200px;
  width: 200px;
  border-radius: 50%;
  background-image: linear-gradient(to bottom left, #7B73A4 0%, #150E5E 100%);
  -webkit-mask-image: radial-gradient(circle at center, transparent 57%, white 58%);
  mask-image: radial-gradient(circle at center, transparent 57%, white 58%);
}
body {
  background: radial-gradient(circle at center, sandybrown, chocolate);
}
<div class="border-gradient-mask"></div>

используя форму или маску SVG:

другой подход-использовать SVG circle элемент для создания круга, а затем присвоить градиент stroke собственность. Градиент также имеет gradientTransform применяется к нему, потому что это единственный способ получения угловых линейных градиентов с SVG.

.border-gradient-svg {
  position: relative;
  height: 200px;
  width: 200px;
  border-radius: 50%;
}
.border-gradient-svg svg {
  position: absolute;
  top: 0px;
  left: 0px;
  height: 100%;
  width: 100%;
}
.border-gradient-svg circle {
  fill: transparent;
  stroke: url(#grad);
  stroke-width: 8;
}
body {
  background: radial-gradient(circle at center, sandybrown, chocolate);
}
<div class="border-gradient-svg">
  <svg viewBox="0 0 100 100">
    <defs>
      <linearGradient id="grad" gradientUnits="objectBoundingBox" gradientTransform="rotate(135 0.5 0.5)">
        <stop offset="0%" stop-color="#7B73A4" />
        <stop offset="100%" stop-color="#150E5E" />
      </linearGradient>
    </defs>
    <circle r="46" cx="50" cy="50" />
  </svg>
</div>

то же самое можно достигается с помощью SVG mask также. Все, что нужно, это создать маску с двумя circle элементы, заполните больший круг белым, меньший круг черным, а затем примените маску к нашему оригиналу circle элемент. Область, занимаемая меньшим кругом (с черной заливкой), будет прозрачной.

.border-gradient-svg {
  position: relative;
  height: 200px;
  width: 200px;
  border-radius: 50%;
}
.border-gradient-svg svg {
  position: absolute;
  top: 0px;
  left: 0px;
  height: 100%;
  width: 100%;
}
.border-gradient-svg .grad-border {
  fill: url(#grad);
  mask: url(#masker);
}
body {
  background: radial-gradient(circle at center, sandybrown, chocolate);
}
<div class="border-gradient-svg">
  <svg viewBox="0 0 100 100">
    <defs>
      <linearGradient id="grad" gradientUnits="objectBoundingBox" gradientTransform="rotate(135 0.5 0.5)">
        <stop offset="0%" stop-color="#7B73A4" />
        <stop offset="100%" stop-color="#150E5E" />
      </linearGradient>
      <mask id="masker" x="0" y="0" width="100" height="100">
        <circle r="50" cx="50" cy="50" fill="#fff" />
        <circle r="42" cx="50" cy="50" fill="#000" />
      </mask>
    </defs>
    <circle r="50" cx="50" cy="50" class="grad-border"/>
  </svg>
</div>

Использование Пути Клипа:

другим подходом к созданию этого было бы использование clip-path (С inline SVG) с clip-rule значение evenodd. преимущество раствора клип путь над другими заключается в том, что это вызовет эффекты при наведении только при наведении на область (а не прозрачный). The недостаток это то, что IE не поддерживает пути клипа (даже с SVG).

.border-gradient-clip {
  height: 200px;
  width: 200px;
  border-radius: 50%;
  background-image: linear-gradient(to bottom left, #7B73A4 0%, #150E5E 100%);
  -webkit-clip-path: url(#clipper);
  clip-path: url(#clipper);
}
body {
  background: radial-gradient(circle at center, sandybrown, chocolate);
}
<svg width="0" height="0">
  <defs>
    <clipPath id="clipper" clipPathUnits="objectBoundingBox">
      <path d="M0,0.5 a0.5,0.5 0 1,0 1,0 a0.5,0.5 0 1,0 -1,0z M0.08,0.5 a0.42,0.42 0 1,0 0.84,0 a0.42,0.42 0 1,0 -0.84,0z" clip-rule="evenodd" />
    </clipPath>
  </defs>
</svg>
<div class="border-gradient-clip"></div>