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

Posted

技术标签:

【中文标题】这个 CSS 是如何产生一个圆圈的?【英文标题】:How does this CSS produce a circle? 【发布时间】:2013-04-17 20:09:29 【问题描述】:

这是 CSS:

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

下面的圆圈是怎么产生的?

假设,如果一个矩形宽度为 180 像素,高度为 180 像素,那么它会如下所示:

应用边框半径 30 像素后,它会如下所示:

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

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

【问题讨论】:

它是一个 0x0 对象,周围有一个 180 像素的边框,它有圆角。所以圆角是圆的象限。 我有个愚蠢的问题,你为什么要让circle带边框???我们可以很容易地用widthheight 制作circle,所以为什么我们要使用border 仅供参考,对于圆形制作,请使用 border-radius: 50% - 使布局正确时更容易调整宽度/高度。 是的女士们,这是一道数学题 【参考方案1】:

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

【讨论】:

【参考方案2】:

一个180像素高/宽->0px的边框怎么变成半径180像素的圆?

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

widthheight 实际适用于哪里?

让我们看看一个典型盒子的区域 (source):

heightwidth 仅适用于内容,前提是使用了正确的盒子模型(没有怪癖模式,没有旧的 Internet Explorer)。

border-radius 适用于哪里?

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

这对我们的边界半径/圆意味着什么?

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

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

应用border-radiusonly to two corners会更容易理解:

#silly-circle
    width:0; height:0;
    border: 180px solid red;
    border-top-left-radius: 180px;
    border-top-right-radius: 180px;

由于在您的示例中,所有角/边框的大小和半径都相等,因此您得到了一个圆。

更多资源

参考文献

W3C:CSS Backgrounds and Borders Module Level 3(尤其是5. Rounded Corners)

示范

请打开下面的demo,它展示了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;

#choosermargin: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>

【讨论】:

我认为 css3-background 没有对 css3-box 进行任何引用(css3-box 正在等待重写)。 @BoltClock:我认为 css3-box 会定义 edges。介绍中只有对 css2.1-box 的引用(非规范),并且给定的图像也在那里,所以 css3-box 并不是真正需要理解border-radius (在重写中会发生什么变化) css3-box 的?)。 @Zeta 我有个愚蠢的问题,为什么你要让circle 带有边框???我们可以很容易地用widthheight 制作circle,所以为什么我们要使用border @Sarfaraz:看看 OP 的问题:“那么,height/width-&gt; 0px 的 180px 边框如何变成半径为 180px 的圆?”。我简单地回答了这个问题。还有其他方法可以创建一个圆圈,但 OP 只对这种特定方法的工作原理感兴趣。 @Zeta:我不确定具体会发生什么变化,但鉴于 WD 已经 6 年没有更新了,我怀疑会有很多。我确实知道第 11 节(overflow 属性系列)现在存在于它自己的模块 css-overflow-3 中,但这还没有反映在 ED 中。您会在 ED 中看到很多问题,但我想这并不是一份详尽的清单:dev.w3.org/csswg/css3-box【参考方案3】:

.a.b 都会给出相同的输出。

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

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

【讨论】:

嗯? “.a 是如何工作的?” “这是 .a 和 .b 之间的比较”我不确定你在这里想说什么。【参考方案4】:

Demo

让我们通过这张图片演示换一种方式来研究这个问题:

我们先看看边界半径是怎么产生的?

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

从每边取 25 个像素,它会产生如下效果:

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

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

从顶部最多可以占用 180 像素,从右侧最多可以占用 180 像素。然后它会产生这样的结果:

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

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

假设,如果你只对两个角不等地应用边框半径:

右上角到 180 像素

右下角到 100 像素

那就需要

右上角:距顶部 90 像素,距右侧 90 像素

右下:距右侧 50 像素,距底部 50 像素

然后它会像这样产生

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

正方形在所有边上最多可以占用多少边框?看看它是如何产生一个圆圈的?

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

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

为什么只需要一半的正方形就适用于所有边?

因为所有角都必须设置相同的半径值。

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

【讨论】:

实际上这个答案的当前版本有点远。问题只是“这个 CSS 如何创建一个圆”,而不是“border-radius 通常如何工作”,所以虽然在技术上是正确的,但它有点过分。您也可以重新格式化问题并将实际代码放入代码环境中。【参考方案5】:

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

【讨论】:

以上是关于这个 CSS 是如何产生一个圆圈的?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 CSS 用圆圈包围数字?

如何使用CSS画一个圆圈?圆圈中间写字?

css 如何在Piterest主题中改变蓝色圆圈的颜色?

如何创建 UIView 波纹圆圈动画?

如何在 iOS 7 下对 UIButton 产生涟漪效果? [复制]

css如何使这个div位于另一个div的底部[重复]