没有宽度或高度的CSS圆形?:这是否可以使用纯CSS实现?

11

我可以像这样将一个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 中显示三行文本,使用 "no-wrap" 使得每个文本段都有自己的一行并且不换行。

我希望将它们显示在一个圆形的中心,并让圆形扩展以适应文本行。

文本行将通过 PHP 从数据库中提取,并且字符长度会有所变化。

问题是上面展示的方法只有在指定宽度/高度时才有效。

是否可以仅使用 CSS,使用百分比实现这一点,还是需要一种 JS 的解决方案。

提前感谢。


我不认为这是可能的。但是,你可以尝试将宽度和高度设置为自动,然后将你的<p>标签(或者任何你用于文本显示的标签)设置为display:block; 这可能会起作用,尽管我有所怀疑。 - khollenbeck
1
我认为你可以通过使用两个div来解决这个问题,一个放在另一个上面的位置。 - Blazemonger
一个圆是完美无缺的。如果你想要创建椭圆,这将非常容易。如果你正在让圆变大,记住宽度和高度将呈指数级增长以保持完美的圆形状态。 - MetalFrog
谢谢大家,@Kris 尝试了你们的想法,但没有成功。 - user1308628
@mblase75,我该如何实现所需的1:1比率,就像MetalFrog提到的那样? - user1308628
如果有人有实现思路,我很愿意采用 jQuery 解决方案。 - user1308628
4个回答

5

纯CSS解决方案,但有一些注意事项

这个示例演示了仅使用CSS的解决方案。它在现代浏览器中(IE9+,该版本需要border-radius适用于单行文本时可以完美地工作(我认为)。注意事项如下:

  1. 正如您可以从粉色“圆”的示例中看到的那样,所有文本必须包含在单个元素中(不像粉色中包含多个元素)。但这并不是一个大问题。
  2. 要获得任何类型的“填充”,需要在设置为“填充”大小的元素上放置一个透明的border。通常这也不会成为问题,因为您不太可能希望将边框放在圆形内部。
  3. 如您所见,当期望(或者在我的情况下强制)多行文本时(通过max-width),则必须根据文本行数设置margin-toptop属性的css,这可能取决于应用程序。在堆叠版本中,IE9需要设置overflow: auto才能正确设置其尺寸。
  4. 如您所见,如果不设置white-space: nowrap并且圆形开始换行其单行文本,则会出现一些椭圆形变形,正如红色圆形的示例所示。

每个网页设计师都需要确定此解决方案的限制是否可以解决。如果不能,则rgthree在这里发布的javascript解决方案应该很好用。但是,如果只期望单行(或某个固定数量的行,例如我的青色圆形),则此css解决方案应该很好用。


很好,谢谢大家。希望其他人也会发现这很有用! - user1308628
2
哇,太棒了!我稍微调整了一下,适用于像徽章一样的小圆圈 - 在这里看:http://jsfiddle.net/zcd75Lcd/ - Eike Thies

1

你只需要用padding和display inline-block替换你的高度和宽度即可。参考: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 可以保持不变。


尝试在圆形div内添加一些带有不同数量内容的div或span,你会发现它无法保持圆形的形状。 - HMartch
第一次阅读时没有看到需要的内容。对此感到抱歉。不确定,可能需要使用JQ来完成。 - laymanje
它似乎可以工作,但只有当填充是内容的两倍或更多时。 - user1308628

1

我不相信你可以仅通过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);
});

编辑:我已经在这个建议上创建了一个 fiddle:http://jsfiddle.net/4m2ZZ/


这个有点难搞,能不能把它放到jsfiddle.net上看看? - user1308628

0

编辑:我误解了你的问题。您需要使用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);
});​

在我看来,它更像一个椭圆而不是一个圆形。 - ScottS
是的,我理解错误了,“circle”应该指“圆形”。我会将其删除。 - rgthree
已更新为使用JavaScript,因为我所知道的没有CSS方式可以强制宽度与高度匹配,反之亦然。 - rgthree
太棒了,这下解决了。谢谢@redlena,你的方法也很有效...可惜似乎没有纯CSS的解决办法。 - user1308628
@user1308628--假设您的目标满足某些条件,有一个纯CSS解决方案。请查看我的答案以了解解决方案和限制其在某些应用程序中使用的注意事项。 - ScottS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接