这个CSS如何产生一个圆圈?

时间:2013-04-24 10:08:31

标签: html css css-shapes

这是CSS:

div {
    width: 0;
    height: 0;
    border: 180px solid red;
    border-radius: 180px;
}

它如何产生下面的圆圈?

Enter image description here

假设,如果矩形宽度为180像素,高度为180像素,则显示如下:

Enter image description here

应用border-radius 30像素后,它将显示如下:

Enter image description here

矩形变得越来越小,也就是说,如果半径大小增加,矩形几乎会消失。

那么,带有height/width-> 0px的180像素的边框如何变成半径为180像素的圆?

5 个答案:

答案 0 :(得分:372)

  

180像素的边框如何高度/宽度 - > 0px变成半径为180像素的圆?

让我们将其重新分为两个问题:

widthheight实际适用于何处?

让我们看一下典型框(source)的区域:

W3C: Areas of a typical box

heightwidth仅适用于内容,如果正在使用正确的盒子模型(没有怪癖模式,没有旧的Internet Explorer)。

border-radius适用于哪里?

border-radius适用于边缘。如果既没有填充也没有边框,它将直接影响您的内容边缘,这将导致您的第三个示例。

这对我们的border-radius / circle意味着什么?

这意味着您的CSS规则会生成一个仅包含边框的框。您的规则规定此边框的每边最大宽度应为180像素,而另一方面,它应具有相同大小的最大半径:

Example image

在图片中,元素的实际内容(小黑点)实际上不存在。如果您没有应用任何border-radius,您最终会得到绿色框。 border-radius为您提供了蓝色圆圈。

如果您应用border-radius only to two corners

,则会更容易理解
#silly-circle{
    width:0; height:0;
    border: 180px solid red;
    border-top-left-radius: 180px;
    border-top-right-radius: 180px;
}

Border only applied on two corners

因为在你的例子中,所有角落/边界的大小和半径相等,你得到一个圆圈。

更多资源

参考

演示

  • 请打开下面的演示,其中显示了border-radius如何影响边框(将内部蓝框视为内容框,内部黑色边框作为填充边框,空白区域作为填充和巨大的红色边界作为,井,边界)。内框与红色边框之间的交点通常会影响内容边缘。

var all = $('#TopLeft, #TopRight, #BottomRight, #BottomLeft');

all.on('change keyup', function() {
  $('#box').css('border' + this.id + 'Radius', (this.value || 0) + "%");
  $('#' + this.id + 'Text').val(this.value + "%");
});

$('#total').on('change keyup', function() {
  $('#box').css('borderRadius', (this.value || 0) + "%");
  $('#' + this.id + 'Text').val(this.value + "%");
  all.val(this.value);
  all.each(function(){$('#' + this.id + 'Text').val(this.value + "%");})
});
#box {
  margin:auto;
  width: 32px;
  height: 32px;
  border: 100px solid red;
  padding: 32px;
  transition: border-radius 1s ease;
  -moz-transition: border-radius 1s ease;
  -webkit-transition: border-radius 1s ease;
  -o-transition: border-radius 1s ease;
  -ms-transition: border-radius 1s ease;
}
#chooser{margin:auto;}
#innerBox {
  width: 100%;
  height: 100%;
  border: 1px solid blue;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="box">
  <div id="innerBox"></div>
</div>
<table id="chooser">    
  <tr>
    <td><label for="total">Total</label></td>
    <td><input id="total" value="0" type="range" min="0" max="100" step="1" /></td>
    <td><input readonly id="totalText" value="0" type="text" /></td>
  </tr>
  <tr>
    <td><label for="TopLeft">Top-Left</label></td>
    <td><input id="TopLeft" value="0" type="range" min="0" max="100" step="1" /></td>
    <td><input readonly id="TopLeftText" value="0" type="text" /></td>
  </tr>
  <tr>
    <td><label for="TopRight">Top right</label></td>
    <td><input id="TopRight" value="0" type="range" min="0" max="100" step="1" /></td>
    <td><input readonly id="TopRightText" value="0" type="text" /></td>
  </tr>
  <tr>
    <td><label for="BottomRight">Bottom right</label></td>
    <td><input id="BottomRight" value="0" type="range" min="0" max="100" step="1" /></td>
    <td><input readonly id="BottomRightText" value="0" type="text" /></td>
  </tr>
  <tr>
    <td><label for="BottomLeft">Bottom left</label></td>
    <td><input id="BottomLeft" value="0" type="range" min="0" max="100" step="1" /></td>
    <td><input readonly id="BottomLeftText" value="0" type="text" /></td>
  </tr>
  <caption><code>border-radius</code> values. All values are in percent.</caption>
</table>
<p>This demo uses a box with a <code>width/height</code> of 32px, a <code>padding</code> of 32px, and a <code>border</code> of 100px.</p>

答案 1 :(得分:92)

Demo

让我们用另一种方式用这个图片演示来检验这个问题:

我们先看看边界半径是如何产生的?

要产生半径,它需要边界的两边。如果将border-radius设置为50像素,则一侧需要25个像素,另一侧需要25个像素。

Enter image description here

从每一侧取25个像素就可以产生这样的效果:

div{
    width: 0px;
    height: 0px;
    border: 180px solid red;
    border-radius: 0 50px 0 0;
}

Enter image description here

现在看看在一个角上应用最大平方数需要多少?

最高可能需要180像素,右边需要180像素。然后就会产生这样的结果:

div{
    width: 0px;
    height: 0px;
    border: 180px solid red;
    border-radius: 0 180px 0 0;
}

Enter image description here

如果我们设置半径不等的值<?h1>,请看它是如何产生的

假设,如果仅将边界半径不均匀地应用于两个角落:

  • 右上角到180像素

  • 右下角到100像素

然后需要

  • 右上:距离顶部90像素,右侧90像素

  • 右下角:右边50像素,底部50像素

然后就会产生这样的

div{
    width: 0px;
    height: 0px;
    border: 180px solid red;
    border-radius: 0 180px 100px 0;
}

Enter image description here

它的边界最大可以用于四面八方的方形?看看它是如何形成一个圆圈的?

最多可能占边框大小的一半,即180像素/ 2 = 90像素。然后它会产生一个像这样的圆圈

div{
    width: 0px;
    height: 0px;
    border: 180px solid red;
    border-radius: 180px;
}

Enter image description here

为什么只需要一半的方格适用于所有方面?

因为所有角落都必须平均设置半径值。

取其边界相等的部分,会产生一个圆圈。

答案 2 :(得分:3)

我认为它最初使用height and width = 180px创建矩形,然后使用每个角创建具有给定半径的曲线,如30px。 因此,它会将border设置为给定的radius

答案 3 :(得分:3)

边框是任何内容的外框,如果在其上应用半径,它将只生成圆形边。

答案 4 :(得分:0)

.a.b都会提供相同的输出。

Q值。为什么我使用width: 360px; height: 360px;

一个。 border: 180px solid red;中的.a就像border-width: 180px 180px 180px 180px; /* Top Right Bottom Left */一样。

希望this fiddle可以帮助您理解这个概念。

.a{
    width: 0;
    height: 0;
    border: 180px solid red;
    border-radius: 180px;
}
.b{
    background:red;
    width: 360px;
    height: 360px;
    border-radius: 180px;
}