Как этот CSS создает круг?


это CSS:

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

как он производит круг ниже?

предположим, если ширина прямоугольника составляет 180 пикселей, а высота-180 пикселей, то он будет выглядеть так:

после применения границы радиуса 30 пикселей это будет выглядеть так:

прямоугольник становится меньше, то есть почти исчезнет, если размер радиуса увеличивается.

Итак, как же a граница 180 пикселей с height/width-> 0px стать кругом с радиусом 180 пикселей?

5 204

5 ответов:

как граница 180 пикселей с высотой / шириной - > 0px становится кругом с радиусом 180 пикселей?

давайте переформулируем это в два вопроса:

где width и height на самом деле применить?

давайте посмотрим на области типичной коробки (источник):

W3C: Areas of a typical box

The height и width применить только к содержимому, если используется правильная модель коробки (нет в режиме совместимости, ни старый Интернет Эксплорер).

где border-radius применить?

The border-radius применяется на границе края. Если нет ни отступа, ни границы, это напрямую повлияет на ваш край контента, что приведет к вашему третьему примеру.

что это значит для нашей границы-радиус/круг?

это означает, что ваши правила CSS приводят к коробке, которая состоит только из границы. Ваши правила гласят, что эта граница должна иметь максимальную ширину 180 пикселей с каждой стороны, в то время как с другой стороны он должен иметь максимальный радиус одинакового размера:

Example image

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

это становится легче понять, если вы примените border-radiusтолько два углы:

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

демо

давайте рассмотрим вопрос по-другому с этой демонстрационной картинке:

давайте сначала посмотрим, как создается радиус границы?

для получения радиуса требуется две стороны его границы. Если вы установите 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

и посмотрите, как это происходит, если мы устанавливаем неравное значение радиуса?

предположим, если вы применяете радиус границы только к двум углам неравномерно:

  • верхний правый угол до 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

почему это занимает только половину площади, чтобы применить со всех сторон?

потому что все углы должны установить их радиус значение одинаково.

принимая равные части своей границы, он создает круг.

границы-это внешняя коробка любого содержимого, и если вы примените радиус к ней, она просто создаст круговую кромку.

Я думаю, что он изначально создает прямоугольник с height and width = 180px а затем сделать кривую с заданным радиусом, как 30px С каждого угла. Так что он устанавливает border С radius.

и .a и .b даст идентичные результаты.

вопрос: почему я использовал width: 360px; height: 360px;?

А. border: 180px solid red; на .a работы как border-width: 180px 180px 180px 180px; /* Top Right Bottom Left */.

Надежда эта скрипка поможет вам понять концепцию.

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