Круги CSS без ширины или высоты? : Возможно ли это с помощью чистого CSS или нет?

Я могу превратить div в круг следующим образом:

.circle {
 background-color: rgba(0, 0139, 0139, 0.5);
 height: 200px;
 width: 200px;
 -moz-border-radius:50%;
 -webkit-border-radius: 50%;
 border-radius:50%;
}

<div class="circle"></div>
</div>

Но я должен указать высоту ширины:

Я хочу отобразить три строки текста в DIV с «без переноса», чтобы каждый из трех сегментов текста имел собственную строку и не переносился.

Я хочу отобразить их в центре круга и расширить круг, чтобы он соответствовал строкам текста.

Текстовые строки будут извлечены из базы данных через PHP и будут различаться по длине символов.

Проблема в том, что метод, показанный выше, работает только в том случае, если указаны ширина/высота.

Возможно ли это с использованием только CSS, с использованием процентов или мне понадобится обходной путь JS.

заранее спасибо.


person user1308628    schedule 02.04.2012    source источник
comment
Я не думаю, что это возможно. Тем не менее, вы можете попробовать установить ширину и высоту автоматически, а затем установить тег ‹p› или любой другой тег, который вы используете для отображения текста: block; Это может сработать, хотя у меня есть сомнения.   -  person Kris Hollenbeck    schedule 02.04.2012
comment
Я предполагаю, что вы могли бы обойти проблему, используя два div, расположенных один над другим.   -  person Blazemonger    schedule 02.04.2012
comment
Круг идеально круглый. Если вы хотите создать овалы, это будет очень просто. Если вы выращиваете круги, имейте в виду, что ширина и высота будут расти экспоненциально, чтобы поддерживать статус идеального круга.   -  person MetalFrog    schedule 02.04.2012
comment
Спасибо всем, @Kris попробовал вашу идею, но безуспешно.   -  person user1308628    schedule 02.04.2012
comment
@mblase75, как мне это реализовать, чтобы получить требуемое соотношение 1: 1, как упоминал MetalFrog.   -  person user1308628    schedule 02.04.2012
comment
Я открыт для решения jQuery, если у кого-нибудь есть идея, как я могу это реализовать.   -  person user1308628    schedule 02.04.2012


Ответы (4)


Решение на чистом CSS с некоторыми оговорками

Эта скрипта демонстрирует решение, использующее только css. Он работает безупречно (я думаю) в современных браузерах (IE9+, который в любом случае нужен для border-radius) с отдельными строками текста. Предостережения:

  1. Как видно по розовому «кружку», весь текст должен содержаться в одном элементе (а не в нескольких интервалах, как в розовом). Это не большая проблема.
  2. Чтобы получить какой-либо «отступ», нужно поместить прозрачный border в набор span с размером «отступа». Это также обычно не должно быть большой проблемой, поскольку маловероятно, что вам нужны границы внутри круга.
  3. Как вы можете видеть по css на голубом круге, если ожидается несколько строк текста (или принудительно в моем случае max-width), тогда css для margin-top и top свойства должны быть установлены в соответствии с количеством строк текста. Это может быть проблемой в зависимости от приложения. В многоуровневой версии IE9 требовалось установить overflow: auto, чтобы получить правильный размер.
  4. Как вы можете видеть по красному кругу, если вы сузите область отображения, если white-space: nowrap не установлено, и круг начинает оборачивать свою единственную строку текста, тогда происходит некоторое овулярное искажение круга.

Каждый веб-дизайнер должен был бы определить, можно ли учесть ограничения этого решения или нет. Если нет, то решение javascript, опубликованное здесь rgthree, должно работать хорошо. Но если ожидается только одна строка (или некоторое заданное количество строк, как в моем голубом круге), то это решение css должно работать хорошо.

person ScottS    schedule 02.04.2012
comment
Хороший, спасибо всем. Надеюсь, кто-то еще найдет это полезным! - person user1308628; 03.04.2012
comment
Вау, отличный ответ, я немного подправил его для меньших кругов, таких как те, которые используются в качестве значков - см. Здесь: jsfiddle.net/zcd75Lcd - person Eike Thies; 12.09.2014

Все, что вам нужно сделать, это заменить высоту и ширину отступом и отобразить встроенный блок. Ссылка: http://jsfiddle.net/6mzP7/

.circle {
   background-color: rgba(0, 0139, 0139, 0.5);
   padding: 200px;
   display: inline-block;
   -moz-border-radius:50%;
   -webkit-border-radius: 50%;
   border-radius:50%; 
}

​<div class="circle"></div>

HTML может остаться прежним.

person laymanje    schedule 02.04.2012
comment
попробуйте добавить несколько div или span внутри этого круглого div с различным количеством контента, и вы увидите, что он не поддерживает форму круга. - person redlena; 02.04.2012
comment
Не увидел необходимости в содержании в первый раз, когда я прочитал это. Прости за это. Тогда не уверен. Возможно, придется сделать это с JQ. - person laymanje; 02.04.2012
comment
Кажется, это работает, но только если отступ в два раза больше содержимого или больше. - person user1308628; 02.04.2012

Я не верю, что вы можете достичь того, чего хотите, просто с помощью CSS. Я попробовал скриптовое решение проблемы...

CSS:

.circle {
 background-color: rgba(0, 0139, 0139, 0.5);
 -moz-border-radius:50%;
 -webkit-border-radius: 50%;
 border-radius:50%;
 padding:10px;
}
.circle span {
white-space: nowrap;
}
.circle div {
position:relative;
top:0;
left:0;
}

HTML:

<div class="circle">
    <div>
        <span>this is some text</span>
        <span>this is some more text</span>
        <span>this is text</span>
    </div>
</div>

Сценарий:

$(function() {
    var widest = 0;
    $('.circle span').each(function(){
        thisWidth = $(this).innerWidth()
        if (thisWidth > widest) {
            widest = thisWidth;
            };
    });
    $('.circle').css('width',widest).css('height',widest);
    $('.circle div').css('top',(widest - $('.circle div').innerHeight())/2);
});

Изменить: я создал скрипт этого предложения: http://jsfiddle.net/4m2ZZ/

person redlena    schedule 02.04.2012
comment
Не повезло с этим, есть ли шанс закрепить это на jsfiddle.net? - person user1308628; 02.04.2012

РЕДАКТИРОВАТЬ: я ошибся в вашем вопросе. Вам понадобится Javascript, чтобы присвоить ширину по высоте максимальному значению, а также убедиться, что ваш контент расположен по центру.

Вот как в этом JSFiddle: http://jsfiddle.net/rgthree/K4Kpw/

<div class="circle">
    <div>
        <span>This is a line</span>
        <span>This is yet another line!</span>
        <span>Last Line!</span>
    </div>
</div>​

CSS:

.circle {
    position:relative;
    background-color: rgba(0, 0139, 0139, 0.5);
    padding:10px;
    -moz-border-radius:50%;
    -webkit-border-radius: 50%;
    border-radius:50%;
}
.circle > div{
    position:absolute;
    top:50%;
    left:50%;
}

JQuery:

$('.circle > div').each(function(){
    var h, w, max;
    w = $(this).width();
    h = $(this).height();
    max = w > h ? w : h;
    $(this).css('margin-left', -parseInt(w/2,10));
    $(this).css('margin-top', -parseInt(h/2,10));
    $(this).parent().width(max);
    $(this).parent().height(max);
});​
person rgthree    schedule 02.04.2012
comment
Мне он кажется скорее овалом, чем кругом. - person ScottS; 02.04.2012
comment
Туше, это. Я неправильно понял, что круг означает круг. Я удалю. - person rgthree; 02.04.2012
comment
Обновлено для использования Javascript, так как нет способа CSS (я знаю), чтобы заставить ширину соответствовать высоте или наоборот. - person rgthree; 02.04.2012
comment
Блестяще, что прибило. Спасибо @redlena, ваш метод тоже работает ... Жаль, что нет способа сделать это на чистом CSS. - person user1308628; 02.04.2012
comment
@user1308628 user1308628 - есть чистое решение CSS, предполагающее, что ограничения вашей цели соответствуют определенным критериям. См. мой ответ для решения и предостережений, которые ограничивают его использование определенными приложениями. - person ScottS; 03.04.2012