HTML и CSS Fluid Circle

Опитвам се да създам течен кръг, използвайки HTML и CSS. Почти съм готов, но тъй като трябва да е течно и съдържанието вътре е динамично, то променя формата си от кръг на овална и други.

body {
  position: relative;
}
.notify {
  position: absolute;
  top: 100%;
  left: 20%;
  background: red;
  border: 2px solid white;
  border-radius: 50%;
  text-align: center;
}
.notify > div {
  padding: 20px;
}
<div class="notify">
  <div>
    12
  </div>
</div>

Можете ли да ми помогнете, моля?


person Umair A.    schedule 08.07.2011    source източник
comment
Уверете се, че сте го тествали, като промените текста в div от 12 на 100 и т.н   -  person Umair A.    schedule 08.07.2011
comment
Виждал съм много отговори, предлагащи използването на JavaScript, за да се наложи квадратно съотношение на елемента за 50% радиус на границата. Наскоро написах публикация в блог за това как това може да се направи само с CSS: ansciath. tumblr.com/post/7347495869/css-aspect-ratio   -  person Nathan Ryan    schedule 08.07.2011
comment
О, и Safari все още не се справя грациозно с радиус на границата, определен като процент.   -  person Nathan Ryan    schedule 08.07.2011


Отговори (6)


Хакът border-radius:50%, който използвате, прави предположението, че <div> е квадратно преди прилагането на заоблените ъгли, в противен случай ще се получи овал, а не кръг, точно както сте отбелязали.

Следователно, ако искате кръгът да остане кръгъл, докато съдържанието се разширява, трябва динамично да регулирате височината, за да съответства на ширината. Вероятно ще трябва да използвате Javascript, за да постигнете това.

Освен това имайте предвид, че border-radius не се поддържа в по-стари версии на IE, така че потребителите с IE6, IE7 или IE8 изобщо няма да виждат вашия кръг. (макар че има хак за него, наречен CSS3Pie)

Разбира се, коригирането на height ще има страничен ефект от това, че елементът ще заема повече място вертикално. Това може да не е това, което искате; може да искате кръгът да е с еднакъв размер, независимо какво съдържание има в него? В този случай трябва да фиксирате височината и ширината на кръга и да дадете на съдържанието position:absolute;, за да предотвратите влиянието му върху размера на неговия родител.

Алтернатива на използването на хака border-radius за създаване на кръг би била използването на SVG. SVG е векторен графичен формат, който е вграден в повечето браузъри.

Отново забележителното изключение е IE8 и по-ранни, но IE поддържа алтернативен формат, наречен VML. Съществуват различни скриптове, които могат да конвертират между SVG и VML, така че можете да създадете решение за различни браузъри със SVG плюс Javascript.

Ако ще приемем, че Javascript е част от решението, можете просто да използвате библиотека на JavaScript, за да го начертаете на първо място. Моето предложение за това би било Raphael, който генерира SVG или VML графики в зависимост от браузъра, който изпълнява.

Надявам се това да помогне.

person Spudley    schedule 08.07.2011

Трябва да зададете както width, така и height на максимума от двете, за да изобразите квадрат, който с 50% радиус на ъглите води до кръг.

Можете да направите това в jQuery:

$(function() {
  var $elem = $(".notify > div");
  var maxSize = Math.max($elem.width(), $elem.height());

  $elem.width(maxSize).height(maxSize);
});

Опитайте да промените съдържанието (както по ширина, така и по височина) тук

person Jose Rui Santos    schedule 08.07.2011

Пример за течен кръг, използващ само HTML и CSS. Както споменах в моите коментари към въпроса, техниката е обяснена в моята публикация в блога. Освен това, както споменахме, Safari в момента не работи добре с радиус на границата, определен като процент.

person Nathan Ryan    schedule 08.07.2011
comment
Това е интересен хак, но как да поставя съдържание във вътрешния div сега, ако не искам да изчислявам абсолютна позиция за съдържанието? - person Eugene Gluhotorenko; 14.11.2012
comment
Съдържанието (в този случай кръгът) е абсолютно позиционирано вътре в контейнера. Кръгът трябва да заема цялата площ на контейнера. По този начин контейнерът действа като вид прокси за съдържанието. След това контейнерът може да бъде поставен по какъвто начин желаете, като изчислявате позицията му по желания от вас начин. - person Nathan Ryan; 14.11.2012

Начинът, по който сте направили Jose Rui Santos, можете да постигнете целта си. Но направете малко промени във вашия css.

Като премахване на подложката от .notify > div и добавяне на стилове като този:

.notify > div
{    
    display: table-cell;
    vertical-align: middle;
}

и добавете подложка в клас .notify по този начин:

.notify
{
    position: absolute;
    top: 100%;
    left: 20%;
    background: red;
    border: 2px solid white;
    border-radius: 50%;
    padding: 30px;
    text-align: center;

}

и Jquery код, както е споменато от Jose Rui Santos:

var $elem = $(".notify > div");
var maxSize = Math.max($elem.width(), $elem.height());
$elem.width(maxSize).height(maxSize);

Вижте работещата демонстрация: http://jsfiddle.net/2j5Ek/63/

person Ahsan Rathod    schedule 08.07.2011

Форсирането на неговата максимална височина и тегло чрез настройка max-width:XXpx; max-height:XXpx ще свърши работа.

Моля, обърнете внимание, че може да се наложи да използвате CSS3 word-wrap: break-word;, за да разделите думите. Съвместимостта между различни браузъри може да е проблем.

person Andrzej Ośmiałowski    schedule 08.07.2011

имате нужда от начин да наложите височина/широчина, в противен случай просто ще стане овална... възможно е!

на този html

<div class="notify">
    <div class="child">
        12334        
    </div>
</div>

този jQuery скрипт трябва да го направи..

var cw = $('.child').width();
$('.child').css({
    'height': cw + 'px',
    'line-height': cw + 'px'
});
person Treemonkey    schedule 08.07.2011
comment
Не, ако опитате, например ‹div class=notify› ‹div class=child› 12‹br /› 12‹br /› 12‹br /› 12‹br /› ‹/div› ‹/div› - person Jose Rui Santos; 08.07.2011
comment
Umair написа content inside is dynamic. Това означава, че може да се променя по ширина или височина. Защо винаги трябва да е ширина › височина? - person Jose Rui Santos; 08.07.2011
comment
добре, може да се счупи, но за един ред центриран текст работи добре!, за разлика от вашия, който оставя текста в горната част, така че ако текстът е дълъг, тогава текстът излиза от кръга, така че моето решение е по-добро (предполагаме, че 1 ред от текст) - person Treemonkey; 08.07.2011