2016-12-30 116 views
8

我想知道您是否可以帮助我。 我有一个div(白色),我需要在边框上放两个圆形按钮(绿色)。一切都应该用CSS完成。 它应该是这样的: Screenshot创建一个宽高比为1:1的div,只知道其百分比高度

现在,事情是,我不知道白格的大小,我不知道它在创作的时候,因为它会被添加到之后的DOM。我所知道的是,白色的div有相对于其未来父母的百分比宽度和高度。因此,在创建时,由于尚未添加,所以对width(),height()或其css值的任何调用都不起作用。 我已经看过所有这些片段,告诉你如何制作一个固定长宽比的div。我现在需要这个,我需要的按钮是1:1,但我所知道的尺寸,它必须是白色div的高度的100%(因此,它的宽度应该等于它的高度)。我见过的所有例子都假设你知道宽度并使高度保持比例。就我而言,我知道的是高度(100%),我希望宽度适应。 我不知道如何做到这一点。

这是我的代码片段:

body{ 
 
    background-color: #DCDCDC; 
 
} 
 
.container { 
 
    width: 50%; 
 
    height: 7%; 
 
    background: white; 
 
    border-radius: 20px; 
 
    position: absolute; 
 
} 
 
.arrow { 
 
    background: green; 
 
    border-radius: 20px; 
 
    height: 100%; 
 
    position: absolute; 
 
} 
 
.arrow:after{ 
 
    content: ""; 
 
    display: block; 
 
    padding-right: 100%; 
 
} 
 
.arrow:last-child { 
 
    right: 0; 
 
}
<div class="container"> 
 
    <div class="arrow"></div> 
 
    <div class="arrow"></div> 
 
</div>

https://jsfiddle.net/7bxecL9m/

如果你知道我怎么能做到这一点,而无需输入任何固定值(jQuery的使用当然是有效的),我我真的很感激它。

感谢。

回答

0

为什么不以百分比做一个固定的宽度为您的箭头:

.arrow { 
    background: green; 
    border-radius: 20px; 
    height: 100%; 
    position: absolute; 
    width: 10%; 
} 
+0

我认为这样做不会维持长宽比,我需要按钮是一个完美的圆。不管怎么说,还是要谢谢你! –

+0

然后把一个固定大小的像素,而不是 –

0

body{ 
 
    background-color: #DCDCDC; 
 
} 
 
.container { 
 
    width: 50%; 
 
    height: 7%; 
 
    background: white; 
 
    border-radius: 20px; 
 
    position: absolute; 
 
} 
 
.container:after,.container:before{ 
 
    content: " "; 
 
    display: block; 
 
    padding: 4%; 
 
    z-index: 999; 
 
    top: 0; 
 
    position:absolute; 
 
    background: green; 
 
    border-radius: 50%; 
 
} 
 
.container:before { 
 
    left: 0; 
 
} 
 
.container:after{ 
 
    right: 0; 
 
}
<div class="container"> 
 
</div>

可以使用beforeafter CSS伪选择实现。你检查这个Example

+0

圆圈将保持宽高比,但不会正确响应容器的大小的变化---> https://jsfiddle.net/a649h726/ – sol

+0

正是ovokuro所说的,如果你调整窗口的大小,你会发现圆圈虽然仍然是一个完美的圆圈,但不会保证相对于白色div的100%的高度。不管怎么说,还是要谢谢你! –

1

有许多变数在这里:

  • 由于容器的height%和圈radiuspx单位,一个是静态的,而另一个将调整。
  • 只有这样,才能保持1:1只是HTML/CSS,考虑容器的height%将调整圆的height为好,将隔离圈的divwidth & height的东西静态像px单位。
  • 现在,既然你说没有固定的尺寸,我能想到的唯一的事情就是评论.arrow100%height,以防止调整大小不是1:1,和嵌套一个div.arrow抑制1:1的静态单位(理想情况下直接影响.arrow将代码更少,但如果您不希望/不能将它们设置在该元素上,也许您会考虑这一点)。

如果您希望圆形在内容展开时保持圆形,则需要动态调整高度以匹配宽度。你可以使用Javascript来达到这个目的,但是你的border-radiuscontainerpx的静态单位相关,因为容器总是比较大,类似于border-radius: 50%对于两者都不起作用,圆的50%radius永远不会匹配container的50% (也就是说,如果你关心半径对齐)。

body { 
 
    background-color: #DCDCDC; 
 
} 
 
body, 
 
html { 
 
    height: 100%; 
 
} 
 
.container { 
 
    width: 50%; 
 
    height: 37%; 
 
    background: white; 
 
    border-radius: 20px; 
 
    position: relative; 
 
} 
 
.arrow { 
 
    background: green; 
 
    border-radius: 20px; 
 
    /*height: 100%;*/ 
 
    position: absolute; 
 
    overflow: hidden; 
 
} 
 
.bLimit { 
 
    height: 40px; 
 
    width: 40px; 
 
    line-height: 40px; 
 
} 
 
.arrow:after { 
 
    content: ""; 
 
    display: block; 
 
    padding-right: 100%; 
 
} 
 
.arrow:last-child { 
 
    right: 0; 
 
}
<div class="container"> 
 
    <div class="arrow"> 
 
    <div class="bLimit">button overflow</div> 
 
    </div> 
 
    <div class="arrow"> 
 
    <div class="bLimit">button</div> 
 
    </div> 
 
</div>

+0

我忘了固定半径,我只是把它放在那里进行测试,但它不一定要修复。它也可以是一个百分比。现在容器会改变大小而不是比率,它将始终是其父级的固定百分比高度,并且具有固定的百分比宽度。并且,它的父母一旦添加,将始终均匀调整大小 –

+0

对不起,我已经按回车太快。 我忘了固定半径,我只是把它放在那里进行测试,但它不一定要修复。它也可以是一个百分比。 我没有提到的一件事(我忘记了)是容器会改变大小而不是比率,它将始终是其父级的固定百分比高度,并且具有固定的百分比宽度。而且,父容器在添加容器后也将均匀调整大小,因此.container的半径将保持不变(以百分比表示),因此.arrow也可以相同。 我会尝试你的方法,看看它是如何去的,谢谢! –

+0

它的工作,但当然,任何调整大小将保持整个圈子,而其余的变化,这不是想法。我想我必须添加一些javascript来检测更改,也许我可以绑定一个事件来检查它何时插入到dom中,一旦发生这种情况,我可以询问其父宽度和高度。 感谢您的帮助! –

0

有一个posibility获得使用所需比例的图像(将未示出)这样的结果。

在这种情况下,这个比例是1:1,因此我们将使用50像素的图像(但它可以是任何尺寸)

.container { 
 
    width: 300px; 
 
    height: 20px; 
 
    border: solid 1px blue; 
 
    margin: 40px; 
 
    position: relative; 
 
} 
 
.container:nth-child(2) { 
 
    height: 40px; 
 
} 
 
.container:nth-child(3) { 
 
    height: 60px; 
 
} 
 
.arrow { 
 
    height: 100%; 
 
    background-color: red; 
 
    opacity: 0.5; 
 
    position: absolute; 
 
    border-radius: 50%; 
 
    transform: translateX(-50%); 
 
} 
 
.arrow:last-child { 
 
    right: 0px; 
 
    transform: translateX(50%); 
 
} 
 
img { 
 
    height: 100%; 
 
    opacity: 0; 
 
}
<div class="container"> 
 
    <div class="arrow"> 
 
    <img src="https://placehold.it/50x50"> 
 
    </div> 
 
    <div class="arrow"> 
 
    <img src="https://placehold.it/50x50"> 
 
    </div> 
 
</div> 
 
<div class="container"> 
 
    <div class="arrow"> 
 
    <img src="https://placehold.it/50x50"> 
 
    </div> 
 
    <div class="arrow"> 
 
    <img src="https://placehold.it/50x50"> 
 
    </div> 
 
</div> 
 
<div class="container"> 
 
    <div class="arrow"> 
 
    <img src="https://placehold.it/50x50"> 
 
    </div> 
 
    <div class="arrow"> 
 
    <img src="https://placehold.it/50x50"> 
 
    </div> 
 
</div>