shape-outside 和 shape-margin 的形状是如何创建的?
shape-outside property's reference box is always the margin-box of the element。因此,当使用shape-outside 属性绘制假想圆时,它是根据元素的大小加上其边距来绘制的。形状绘制完成后,shape-margin 属性将用于在其外部绘制更大的形状。
下面的屏幕截图显示了它们的实际创建方式。最内圈是实际图像,与内圈稍有偏移的浅蓝色是使用 shape outside 属性创建的实际形状。它与实际的圆形略有偏移,因为再次引用的是margin-box,并且由于您只设置了margin-right,它会向右偏移。大外圆是基于shape-margin 属性绘制的形状。这个圆的半径是 12em + .25em (margin-right/2) + 元素的实际大小(大约 80px x 80px)。
为 shape-margin 创建的假想形状有多大限制?
现在,要注意的关键是shape-margin 创建的形状将始终被限制为元素的margin-box,因此超出它的任何内容都会被剪裁。在此示例中,整个形状位于元素的 margin-box 之外,因此我们看到的最终只是一个正方形。
以上来源为this HTML5Rocks article:
请记住,形状最终被限制在元素的边距框(元素加上其周围的边距)
在下面的屏幕截图中,黑色方块(使用伪 + div 包装器创建)表示 img 的边距框区域。
img {
float: left;
max-height: 5em;
margin-right: .5em;
-webkit-shape-margin: 12em;
shape-margin: 12em;
-webkit-shape-outside: circle(50%);
shape-outside: circle(50%);
}
/* added just to indicate where margin box ends */
div {
position: relative;
}
div:after {
position: absolute;
content: '';
height: 80px;
width: calc(.5em + 80px); /* 80px is width of element + .5em margin */
border: 1px solid;
top: 0px;
left: 0px;
}
<h2>Example of shape margin</h2>
<div>
<img src="http://icons.iconarchive.com/icons/custom-icon-design/flatastic-6/128/Circle-icon.png" style="">
<p>lorem ipsum lorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsu mlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem
ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem
ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsum</p>
</div>
那么,解决办法是什么?
这意味着要让shape-margin 正常工作,应该创建更大的圆圈(边距的参考),使其包含在元素的边距框内。
选项 1:设置 shape-margin 低于 margin-right
这可以通过设置shape-margin 使其小于margin-right 来完成,如下面的sn-p。
img {
float: left;
max-height: 5em;
margin-right: .5em;
-webkit-shape-margin: .15em;
shape-margin: .15em;
-webkit-shape-outside: circle(50%);
shape-outside: circle(50%);
}
<h2>Example of shape margin</h2>
<img src="http://icons.iconarchive.com/icons/custom-icon-design/flatastic-6/128/Circle-icon.png" style="">
<p>lorem ipsum lorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsu mlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem
ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem
ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsum</p>
选项 2:设置 margin-right 大于 shape-margin
或者,可以通过设置一个大于shape-margin 值的margin-right 来完成,如下面的 sn-p 所示。
img {
float: left;
max-height: 5em;
margin-right: 2.5em;
-webkit-shape-margin: .25em;
shape-margin: .25em;
-webkit-shape-outside: circle(50%);
shape-outside: circle(50%);
}
<h2>Example of shape margin</h2>
<img src="http://icons.iconarchive.com/icons/custom-icon-design/flatastic-6/128/Circle-icon.png" style="">
<p>lorem ipsum lorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsu mlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem
ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem
ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsum</p>
但第二个选项的问题在于,随着margin-right 的增加,形状的半径也会增加,因为margin-box 是参考,因此shape-margin 必须比margin-right 小得多。
选项3:将shape outside的参考设置为border-box,shape-margin与margin-right相同
或者,另一种选择是将shape-outside 属性的引用框设置为img 元素的border-box。这意味着形状的大小不会受到边距的影响。
将border-box 设置为shape-outside 属性的参考的另一个优点是形状不会在偏移处绘制(因为边距也不会影响它)。
img {
float: left;
max-height: 5em;
margin-right: 12em;
-webkit-shape-margin: 12em;
shape-margin: 12em;
-webkit-shape-outside: circle(50%) border-box;
shape-outside: circle(50%) border-box;
}
<h2>Example of shape margin</h2>
<img src="http://icons.iconarchive.com/icons/custom-icon-design/flatastic-6/128/Circle-icon.png" style="">
<p>lorem ipsum lorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsu mlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem
ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem
ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsum</p>
注意:在上面的sn-p中实际上有一个圆形的边距,但是看不清楚,因为这么大的圆的一部分总是几乎是一条直线。您可以通过开发工具看到圆圈。