一个高/宽-> 0px的180像素的边界如何变成一个半径为180像素的圆?
让我们把这个问题归结为两个问题:
宽和高实际应用在哪里?
让我们来看看一个典型的盒子的区域(来源):
如果使用了正确的框模型(没有怪癖模式,没有旧的Internet Explorer),那么高度和宽度只适用于内容。
边界半径在哪里适用?
边界半径应用于边界边缘。如果既没有填充也没有边框,它将直接影响内容边缘,这将导致第三个示例。
这对我们的边界半径/圆意味着什么?
这意味着CSS规则的结果是一个只包含边框的框。你的规则规定这个边界每边的最大宽度应该是180像素,而另一方面,它应该有相同大小的最大半径:
在图中,元素的实际内容(小黑点)实际上是不存在的。如果你没有应用任何边界半径,你最终会得到绿色的方框。边界半径是蓝色的圆。
如果你只对两个角应用边界半径,就更容易理解了:
#silly-circle{
width:0; height:0;
border: 180px solid red;
border-top-left-radius: 180px;
border-top-right-radius: 180px;
}
因为在你的例子中,所有角/边界的大小和半径都是相等的,你得到一个圆。
进一步的资源
参考文献
W3C: CSS背景和边界模块级别3(特别是5。圆角)
示威活动
请打开下面的演示,它展示了边界半径是如何影响边界的(将内部的蓝色框作为内容框,内部的黑色边框作为填充边框,空白区域作为填充,巨大的红色边框作为边框)。内框和红色边框之间的交集通常会影响内容边缘。
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>