【问题标题】:HTML5 / CSS3 Circle with Partial BorderHTML5 / CSS3 带部分边框的圆圈
【发布时间】:2012-10-15 01:57:57
【问题描述】:

是否可以仅使用 HTML5 / CSS3 创建一个圆形,该圆形的边框仅围绕圆形的一部分?如果不是,我可以使用什么技术来实现这种效果?我更喜欢使用纯 DOM 元素,但如果必须,我可以在画布上绘制或启动 SVG。

【问题讨论】:

  • 什么是“分道扬镳”? 1/4、1/2、3/4?还是更随意的东西?
  • 可以在圆周围从 0% 到 100% 平滑动画的东西。

标签: html css border css-shapes


【解决方案1】:

是的,有可能 - 请参阅:

demo

.circle {
  position: relative;
  margin: 7em auto;
  width: 16em;
  height: 16em;
  border-radius: 50%;
  background: lightblue;
}

.arc {
  overflow: hidden;
  position: absolute;
  /* make sure top & left values are - the width of the border */
  /* the bottom right corner is the centre of the parent circle */
  top: -1em;
  right: 50%;
  bottom: 50%;
  left: -1em;
  /* the transform origin is the bottom right corner */
  transform-origin: 100% 100%;
  /* rotate by any angle */
  /* the skew angle is 90deg - the angle you want for the arc */
  transform: rotate(45deg) skewX(30deg);
}

.arc:before {
  box-sizing: border-box;
  display: block;
  border: solid 1em navy;
  width: 200%;
  height: 200%;
  border-radius: 50%;
  transform: skewX(-30deg);
  content: '';
}
<div class='circle'>
  <div class='arc'></div>
</div>

【讨论】:

  • 你不能用这种方式制作 N 度弧。只有 90,180 或 270。
  • 请原谅我的无知,但是如何更改弧的长度? KPthunder 提到他希望能够在 0 到 100% 的范围内平滑地围绕圆圈设置动画。
  • 你改变倾斜角度。倾斜角为90deg - the angle of the arc。但要让它填满整个圆圈,需要不止一个元素。
  • 我无法让它工作。请您指定我应该更改哪个参数以使圆弧根据需要从 0% 到 100% 平滑地围绕圆进行动画处理?
  • 正在寻找一种方法使圆上的一半边框透明。这是我能找到的唯一可行的方法。谢谢。
【解决方案2】:

这是可能的。

  • 使用border-radius 绘制两个圆,一个在另一个之上。
  • 通过更改 border-color 来创建两个圆 transparent 的一个或多个弧。
  • 使用transform 旋转第二个圆,您将获得所需大小的圆弧。

这是演示http://jsfiddle.net/kJXwZ/2/

.wrapper {
  position: relative;
  margin: 20px;
}

.arc {
  position: absolute;
  top: 0;
  left: 0;
  width: 100px;
  height: 100px;
  border-radius: 100%;
  border: 1px solid;
}

.arc_start {
  border-color: transparent red red red;
  -webkit-transform: rotate(45deg);
  -moz-transform: rotate(45deg);
  -ms-transform: rotate(45deg);
  -o-transform: rotate(45deg);
  transform: rotate(45deg);
}

.arc_end {
  border-color: red red red transparent;
  -webkit-transform: rotate(75deg);
  -moz-transform: rotate(75deg);
  -ms-transform: rotate(75deg);
  -o-transform: rotate(75deg);
  transform: rotate(75deg);
}
<div class="wrapper">
  <div class="arc arc_start"></div>
  <div class="arc arc_end"></div>
</div>

【讨论】:

  • 你不能用这种方法得到小于 1/4 的圆,因为总是会显示其中一个边界季度......
  • 是的,但是如果你使用背景颜色而不是 transparent,你可以少于 1/4
【解决方案3】:

这也使用了 JavaScript,因此它打破了最初的要求 :(
..它确实提供了

有一个>>demo

@gkond 谢谢,我从你的回答中得出了这个

// create a circle using HTML5 / CSS3 / JS which has a border that only goes part-way around
// the circle .. and which can be smoothly animated from 0% to 100% around the circle

// this solution allows for animation and still results in relatively clean code
// we use four quarter-circles, all hidden away behind a white square to start with..
// all four are rotated out clockwise, and each quarter will stop at it's own maximum:
// q1 at 25%, q2 at 50% .. etc. once we reach a value at or over 25%, all four quarters
// should be out from behind the white square, and we can hide it.. it needs to be
// hidden if we display a value over 75%, or else q4 will end up going in behind it again
// .. also, since the top border will usually sit between the angles of  -45 to 45, we
// rotate everything by an extra -45 to make it all line up with the top nicely

var fromHidden = -90;

// utility function to align 0 degrees with top
// takes degrees and returns degrees - 45
function topAlign(degrees) {
  return degrees - 45
};

// utility function to rotate a jQuery element
// takes element and the degree of rotation (from the top) 
function rotate(el, degrees) {
  var degrees = topAlign(degrees || 0);
  el.css(
    'transform', 'rotate(' + degrees + 'deg)',
    '-webkit-transform', 'rotate(' + degrees + 'deg)',
    '-moz-transform', 'rotate(' + degrees + 'deg)',
    '-ms-transform', 'rotate(' + degrees + 'deg)',
    '-o-transform', 'rotate(' + degrees + 'deg)'
  )
}

// function to draw semi-circle
// takes a jQuery element and a value (between 0 and 1)
// element must contain four .arc_q elements
function circle(el, normalisedValue) {
  var degrees = normalisedValue * 360; // turn normalised value into degrees
  var counter = 1; // keeps track of which quarter we're working with
  el.find('.arc_q').each(function() { // loop over quarters..
    var angle = Math.min(counter * 90, degrees); // limit angle to maximum allowed for this quarter
    rotate($(this), fromHidden + angle); // rotate from the hiding place
    counter++; // track which quarter we'll be working with in next pass over loop
  });
  if (degrees > 90) { // hide the cover-up square soon as we can
    el.find('.arc_cover').css('display', 'none');
  }
}

// uses the the circle function to 'animate' drawing of the semi-circle
// incrementally increses the value passed by 0.01 up to the value required
function animate(el, normalisedValue, current) {
  var current = current || 0;
  circle(el, current);
  if (current < normalisedValue) {
    current += 0.01;
    setTimeout(function() {
      animate(el, normalisedValue, current);
    }, 1);
  }
}

// kick things off ..
animate($('.circle'), 0.69);
.circle {
  position: relative;
  margin: 20px;
  width: 120px;
  height: 120px;
}

.arc_q {
  position: absolute;
  top: 0;
  left: 0;
  width: 100px;
  height: 100px;
  border-radius: 50%;
  border: 10px solid;
  border-color: transparent green transparent transparent;
  transform: rotate(-45deg);
  -webkit-transform: rotate(-45deg);
  -moz-transform: rotate(-45deg);
  -ms-transform: rotate(-45deg);
  -o-transform: rotate(-45deg);
}

.arc_cover {
  position: absolute;
  top: 0;
  left: 0;
  width: 60px;
  height: 60px;
  background-color: white;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="circle">
  <div class="arc_q"></div>
  <div class="arc_q"></div>
  <div class="arc_q"></div>
  <div class="arc_q"></div>
  <div class="arc_cover"></div>
</div>

【讨论】:

  • 太棒了 - 非常感谢!刚刚在我正在构建的网站上使用 - 将在代码中归因于您:)
【解决方案4】:

为此,您可以使用简单的框边框属性,一个元素和一个类。这将是内联、内联块或块处理,具体取决于您放置 easy-circle 类的位置,以及您如何/是否设置位置样式。

<!DOCTYPE html>
<html>
<head>
<style>
.easy-circle {
    background: transparent;
    border: 1em solid black; /* color not required, may show device fail */
    border-color: red green blue transparent;
    height: 10em;
    width: 10em;
    -moz-border-radius: 6em; /* height/2 + border thickness */
    -webkit-border-radius: 6em;
    border-radius: 50%; /* more than 50, shape-size adjustment irrelevant */
    -ms-transform: rotate(45deg); /* IE 9 */
    -webkit-transform: rotate(45deg); /* Chrome, Safari, Opera */
     transform: rotate(45deg); /* transform optional */
}
</style>
</head>
<body>
<div class="easy-circle">
</div>​
</body>
</html>

【讨论】:

    【解决方案5】:

    最简单的动画方法是使用 css 关键帧。

    http://jsfiddle.net/8SUPX/644/

    /**
     * HTML5 / CSS3 Circle with Partial Border
     * http://stackoverflow.com/q/13059190/1397351
     */
    * { margin: 0; padding: 0; }
    .circle {
    	position: relative;
    	margin: 6em auto;
    	width: 12em; height: 12em;
    	border-radius: 50%;
    	background: transparent;
    	border:20px solid #efefef;
    	border-top-color: #efefef;
        border-right-color: #efefef;
        border-bottom-color: #efefef;
        border-left-color: #efefef;
        
        -webkit-transition:.5s;-moz-transition:.5s;transition:.5s;
    }
    .circle:hover{
          -webkit-animation:  animix 0.5s 1;
          -webkit-animation-fill-mode: forwards;
          -moz-animation:  animix 0.5s 1;
          -moz-animation-fill-mode: forwards;
          animation:  animix 0.5s 1;
          animation-fill-mode: forwards;
    }
    
    
    
      //Animate
       @-webkit-keyframes animix {
        0% { 
          border-top-color: transparent;
          border-right-color: transparent;
          border-bottom-color: transparent;
          border-left-color: transparent;
        }
         25% { 
           border-top-color: red;
           border-right-color: transparent;
           border-bottom-color: transparent;
           border-left-color: transparent;
         }
         50% { 
           border-top-color: red;
           border-right-color: red;
           border-bottom-color: transparent;
           border-left-color: transparent;
         }
         75% { 
           border-top-color: red;
           border-right-color: red;
           border-bottom-color: red;
           border-left-color: transparent;
         }
         100% { 
           border-top-color: red;
           border-right-color: red;
           border-bottom-color: red;
           border-left-color: red;
         }
       }
       
          @keyframes animix {
        0% { 
          border-top-color: transparent;
          border-right-color: transparent;
          border-bottom-color: transparent;
          border-left-color: transparent;
        }
         25% { 
           border-top-color: red;
           border-right-color: transparent;
           border-bottom-color: transparent;
           border-left-color: transparent;
         }
         50% { 
           border-top-color: red;
           border-right-color: red;
           border-bottom-color: transparent;
           border-left-color: transparent;
         }
         75% { 
           border-top-color: red;
           border-right-color: red;
           border-bottom-color: red;
           border-left-color: transparent;
         }
         100% { 
           border-top-color: red;
           border-right-color: red;
           border-bottom-color: red;
           border-left-color: red;
         }
       }
    &lt;div class="circle"&gt; &lt;/div&gt;

    【讨论】:

      【解决方案6】:

      这可以通过在透明圆圈周围设置透明边框并使用border-top-color: ; 为圆形边框的一部分赋予颜色来实现。

      background-color:transparent;
      border:3px solid transparent;
      border-top-color: green;
      

      这会创建一个仅在上四分之一周围有边框的圆圈;

      你也可以使用

      border-bottom-color:green;
      

      以及左右边界的圆圈圆周的不同季度。

      这是一个用于加载器的小提琴,它具有 3 个部分圆圈,这些圆圈在彼此内部以交替方向旋转,显示了这一点。

      Here's a fiddle for a loader with 3 partial circles that spin inside each other in alternate directions that show this in action.

      【讨论】:

        【解决方案7】:

        圆锥梯度解(适用于任何度数):

        :root{
        --degree:80deg;
        --color:red;
        }
        
        .a{
          height:200px;
          width:200px;
        border-radius:50%;
        background: conic-gradient(
             var(--color) var(--degree), transparent calc(var(--degree) + 0.5deg) 100%);
        
        }
        
        .b{
          height:84%;
          width:84%;
          top:8%;
          left:8%;
          position:relative;
          border-radius:50%;
          background:#D3D3D3;
        }
        <div class ="a">
            <div class="b">
        </div>

        【讨论】:

          【解决方案8】:

          如果你想要双边框,你也可以使用它

          div
          {
            background-color: #ddd;
            text-align: center;
            display: flex;
            align-items: center;
            justify-content: center;
            font-weight: bold;
            font-size: 30px;
            margin:  40px auto;
            color: black; 
            width: 200px;
            height: 200px; 
            border-radius: 50%; 
            position: relative;
          }
          
          div::before
          { 
            content: "";
            width: 200px;
            height: 200px;
            border-radius: 50%;
            position: absolute;
            left: 0;
            top: 0;
            transform: translate(-10px, -10px);
            z-index: -1;
            border: 10px solid;
            border-color: red red red transparent;
          }
          body ::after
          {
            content: "";
            width: 220px;
            height: 220px;
            border-radius: 50%;
            position: absolute;
            left: 0;
            top: 0;
            transform: translate(-21px, -22px);
            z-index: -8;
            border: 12px solid;
            background: transparent;
            border-color: blue transparent blue blue;
          }
          &lt;div&gt; &lt;/div&gt;

          【讨论】:

          • 这个很有用,为了缩小差距,你可以使用不同旋转的双圆。
          猜你喜欢
          • 1970-01-01
          • 2016-01-21
          • 2021-01-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-05-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多