--- title: shape-outside slug: Web/CSS/shape-outside tags: - CSS - CSS Shapes translation_of: Web/CSS/shape-outside --- <div>{{CSSRef}}</div> <div><strong><code>shape-outside</code></strong>的<a href="/en-US/docs/Web/CSS">CSS</a> 属性定义了一个可以是非矩形的形状,相邻的内联内容应围绕该形状进行包装。 默认情况下,内联内容包围其边距框; <code>shape-outside</code>提供了一种自定义此包装的方法,可以将文本包装在复杂对象周围而不是简单的框中。</div> <div>{{EmbedInteractiveExample("pages/css/shape-outside.html")}}</div> <p> </p> <h2 id="语法">语法</h2> <pre class="brush:css no-line-numbers">/* 关键字值 */ shape-outside: none; shape-outside: margin-box; shape-outside: content-box; shape-outside: border-box; shape-outside: padding-box; /* 函数值 */ shape-outside: circle(); shape-outside: ellipse(); shape-outside: inset(10px 10px 10px 10px); shape-outside: polygon(10px 10px, 20px 20px, 30px 30px); /* <url> 值 */ shape-outside: url(image.png); /* 渐变值 */ shape-outside: linear-gradient(45deg, rgba(255, 255, 255, 0) 150px, red 150px); /* 全局值 */ shape-outside: initial; shape-outside: inherit; shape-outside: unset; </pre> <p><code>shape-outside</code> 属性指定使用下面列表的值来定义浮动元素的浮动区域。这个浮动区域决定了行内内容(浮动元素)所包裹的形状。</p> <h3 id="值">值</h3> <dl> <dt><code>none</code></dt> <dd>该浮动区域不产生影响,行内元素以默认的方式包裹着该元素的margin box。</dd> <dt><code><shape-box></code></dt> <dd>根据浮动元素的边缘(通过 <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/box_model">CSS box model</a> 来定义)形状计算出浮动的区域。可能是 <code>margin-box</code>, <code>border-box</code>, <code>padding-box</code>, 或者 <code>content-box</code>。这个形状包括了由 {{cssxref("border-radius")}} 属性制造出来的弧度(与 {{cssxref("background-clip")}} 的表现类似)。</dd> <dd> <dl> <dt><code>margin-box</code></dt> <dd><span style="line-height: 1.5;">定义一个由外边距的外边缘封闭形成的形状。这个形状的角的半径由相应的{{cssxref("border-radius")}} 和{{cssxref("margin")}} 的值决定。如果 <code>border-radius / margin</code> </span>的比率大于等于 <code>1</code> , 那么这个 margin box 的角的弧度就是 <code>border-radius + margin</code> ;如果比率小于 <code>1</code>,那么这个 margin box 的角的弧度就是 <code>border-radius + (margin * (1 + (ratio-1)^3))</code> 。</dd> <dt><code>border-box</code></dt> <dd> <p>定义一个由边界的外边缘封闭形成的形状。 这个形状遵循正常的边界外部圆角的形成规则。</p> </dd> <dt><code>padding-box</code></dt> <dd> <p>定义一个由内边距的外边缘封闭形成的形状。这个形状遵循正常的边界内部圆角的形成规则。</p> </dd> <dt><code>content-box</code></dt> <dd> <p>定义一个由内容区域的外边缘封闭形成的形状(译者:表述的不太好,就是被padding包裹的区域,在chrome控制台中的盒子模型图中的蓝色区域。)。每一个角的弧度取 <code>0</code> 或 <code>border-radius - border-width - padding</code> 中的较大值。</p> </dd> </dl> </dd> <dt>{{cssxref("<basic-shape>")}}</dt> <dd>基于 <code><a href="/en-US/docs/Web/CSS/basic-shape#inset()">inset()</a></code>, <code><a href="/en-US/docs/Web/CSS/basic-shape#circle()">circle()</a></code>, <code><a href="/en-US/docs/Web/CSS/basic-shape#ellipse()">ellipse()</a></code>, 或者 <code><a href="/en-US/docs/Web/CSS/basic-shape#polygon()">polygon()</a></code>其中一个创造出来的形状计算出浮动区域。如果同时存在 <code><shape-box></code> ,那么会为 <code><basic-shape></code> 方法定义一个参考盒,这个参考盒默认为 <code>margin-box</code> 。</dd> <dt>{{cssxref("<image>")}}</dt> <dd>提取并且计算指定 {{cssxref("<image>")}} 的alpha通道得出浮动区域(译者:即根据图片的非透明区域进行包裹)。就跟通过 {{cssxref("shape-image-threshold")}}来定义一样。</dd> <dd> <div class="note"><strong>Note:</strong> {{glossary("User agent", "用户代理")}} 必须使用由HTML5规范定义的CORS-enabled fetch方法来处理 <code>shape-outside</code> 的值中的所有URL。当捕获的时候,用户代理必须使用“匿名”模式来设置层叠样式表的URL的 referrer source 和设置所在文档的URL的 origin 。如果这导致出现没有有效的备份图像这样的网络错误, 产生的影响就跟指定了值 <code>none</code> 一样。</div> </dd> </dl> <h3 id="正式语法">正式语法</h3> {{csssyntax}} <h2 id="插值">插值</h2> <p>当在两个 <code><basic-shape></code> 之间产生动画时,将会应用以下规则。shape 里的值将会被当成一个简单列表插入。插入列表的值的类型可能是 {{cssxref("<length>")}},{{cssxref("<percentage>")}},或 {{cssxref("calc")}}。如果列表的值不是以上的几种类型,但是都相同的话(如在两个列表的相同位置找到了 <code>nonzero</code> ),那些值会插入到列表中。</p> <ul> <li>两个形状必须使用同样的参考盒。</li> <li>如果两个形状都是 <code>ellipse()</code> 或 <code>circle()</code>类型,并且它们的 radii 都没有使用 <code>closest-side</code> 或 <code>farthest-side</code> 关键字,则将两个形状对应值之间的值插入到 shape 方法中。</li> <li>如果两个形状的类型都是 <code>inset()</code>,则将两个形状对应值之间的值插入到 shape 方法中。</li> <li>如果两个形状都是 <code>polygon()</code>, 两个多边形之间有相同的定点数量并且 <code><fill-rule></code> 相同,则将两个形状对应值之间的值插入到 shape 方法中。</li> <li>其余所有情况都不会发生插入。</li> </ul> <h2 id="示例">示例</h2> <h3 id="HTML">HTML</h3> <pre class="brush: html"><div class="main"> <div class="left"></div> <div class="right"></div> <p> Sometimes a web page's text content appears to be funneling your attention towards a spot on the page to drive you to follow a particular link. Sometimes you don't notice. </p> </div></pre> <h3 id="CSS">CSS</h3> <pre class="brush: css; highlight[13,14,21,22]">.main { width: 500px; } .left, .right { width: 40%; height: 12ex; background-color: lightgray; } .left { -webkit-shape-outside: polygon(0 0, 100% 100%, 0 100%); shape-outside: polygon(0 0, 100% 100%, 0 100%); float: left; -webkit-clip-path: polygon(0 0, 100% 100%, 0 100%); clip-path: polygon(0 0, 100% 100%, 0 100%); } .right { -webkit-shape-outside: polygon(100% 0, 100% 100%, 0 100%); shape-outside: polygon(100% 0, 100% 100%, 0 100%); float: right; -webkit-clip-path: polygon(100% 0, 100% 100%, 0 100%); clip-path: polygon(100% 0, 100% 100%, 0 100%); } p { text-align: center; }</pre> <h3 id="Result">Result</h3> <p>{{EmbedLiveSample('示例', 520, 130)}}</p> <h2 id="规范">规范</h2> <table class="standard-table"> <thead> <tr> <th scope="col">Specification</th> <th scope="col">Status</th> <th scope="col">Comment</th> </tr> </thead> <tbody> <tr> <td>{{SpecName('CSS Shapes', '#shape-outside-property', 'shape-outside')}}</td> <td>{{Spec2('CSS Shapes')}}</td> <td>Initial definition.</td> </tr> </tbody> </table> <h2 id="浏览器兼容性">浏览器兼容性</h2> <div>{{Compat("css.properties.shape-outside")}}</div> <p> </p> <h2 id="参见">参见</h2> <ul> <li><a href="https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Shapes">CSS Shapes</a></li> <li><a href="https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Shapes/Overview_of_CSS_Shapes">Overview of CSS Shapes</a></li> <li><a href="https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Shapes/Shapes_From_Box_Values">Shapes from Box Values</a></li> <li><a href="https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Shapes/Basic_Shapes">Basic Shapes</a></li> <li><a href="https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Shapes/Shapes_From_Images">Shapes from Images</a></li> <li>{{cssxref("<basic-shape>")}}</li> <li>{{cssxref("shape-margin")}}</li> <li>{{cssxref("shape-image-threshold")}}</li> </ul>