CSS3干货20:CSS3中的形状(shape)及其应用(补充)

275 阅读6分钟

一、形状 Shape

形状 Shape 的出现,打破了传统 CSS 中,只有矩形形状的尴尬,可以让我们的形状多元化。

用以下结构和样式为基础案例说明:

<div class="txtBox">
   <div class="txtBox_content">
       <p>
           小说是以刻画人物形象为中心,通过完整的故事情节和环境描写来反映社会生活的文学体裁。
       </p>
       <p>
           “小说”出自《庄子·外物》。
       </p>
       <p>
           人物、情节、环境是小说的三要素。情节一般包括开端、发展、高潮、结局四部分,有的包括序幕、尾声。环境包括自然环境和社会环境。 小说按照篇幅及容量可分为长篇、中篇、短篇和微型小说(小小说)。按照表现的内容可分为神话、仙侠、武侠、科幻、悬疑、古传、当代、爱情、家庭伦理篇、浪漫青春、游戏竞技等。按照体制可分为章回体小说、日记体小说、书信体小说、自传体小说。按照语言形式可分为文言小说和白话小说。
       </p>
       <p>
           “小说”一词最早出现于《庄子·外物》:「饰小说以干县令,其于大达亦远矣。」庄子所谓的「小说」,是指琐碎的言论,与小说观念相差甚远。直至东汉桓谭《新论》:「小说家合残丛小语,近取譬喻,以作短书,治身理家,有可观之辞。」班固《汉书.艺文志》将「小说家」列为十家之后,其下的定义为:「小说家者流,盖出于稗官,街谈巷语,道听途说者之所造也。」才稍与小说的意义相近。而中国小说最大的特色,便自宋代开始具有文言小说与白话小说两种不同的小说系统。文言小说起源于先秦的街谈巷语,是一种小知小道的纪录。
       </p>
   </div>
</div>
*{  margin: 0; padding: 0;}
.txtBox{
    width: 600px;
    height: 600px;
    background: #eee;
    margin-right: auto;
    margin-left: auto;
}
.txtBox_content{
    width: 600px;
    height: 600px;
    background: #999;
}

1. 形状值

很多参考资料称之为 <basic-shape> , 我更喜欢称之为形状值,因为它就是定义了一个形状,可以作为属性值用在 clip-pathshape-outside 属性上。

可能的数据有:

(1)inset()

inset() 函数在形状内部指定一个矩形区域。它的参数为4个偏移值,以及可选的圆角度数。

 inset( <shape-arg>{1,4} [round <border-radius>]? )

以下都是正确的 inset() 的写法:

inset(10% 20% round 5px) 
/*一个带5像素圆角的矩形,上下2条边向内10%,左右2条边向内20%*/
inset(15px 20px 30px)  /* 上边距   左右边距  下边距 */
inset(25% round 10px 30px) 
inset(10px 20px 30px 40px round 10px) 

比如:

.txtBox_content{
    clip-path: inset(10% 20% 10% round 10%);
}

(2)circle()

circle()函数用于定义一个圆形

circle() = circle( [<shape-radius>]? [at <position>]? )
/* where.. */
<shape-radius> = <length> | <percentage> | closest-side | farthest-side

<shape-radius> 参数用于指定圆形的半径。半径,也可以使用两个关键字来指定:closest-sidefurthest-side

<position> 参数用于指定圆的圆心,默认是正中心。

如果不指定参数,则是 closest-side ,且默认正中心。

以下都是正确的 circle() 的写法:

circle(); 
/* 使用默认值:圆形使用closest-side作为半径,圆形位于元素的中心 */
 
circle(100px at 30% 50%); 
/* 圆形的半径为100像素,位于元素的水平30%,垂直50%的位置 */
 
circle(farthest-side at 25% 25%); 
/* 圆形的半径为最远边的一半,位于元素的水平25%,垂直25%的地方 */
 
circle(10em at 500px 300px); 

比如:

.txtBox_content{
    clip-path: circle();
}

(3)ellipse()

ellipse()函数用于定义一个椭圆形

ellipse() = ellipse( [<shape-radius>{2}]? [at <position>]? )
/* 其中... */
<shape-radius> = <length> | <percentage> | closest-side | farthest-side

它的参数和 circle() 函数相同。

<shape-radius>参数用于指定椭圆形的半径。它可以指定2个半径值:rx 和 ry,分别代表椭圆的X轴半径和Y轴半径。

以下都是正确的 ellipse() 的写法:

ellipse() 
/* 使用默认值 */
 
ellipse(100px 50px at 30% 50%) 
/* 椭圆形的X轴半径100像素,Y轴半径50像素。圆心位于水平30%,垂直50%的地方 */
 
ellipse(farthest-side closest-side at 25% 25%) 
/* 椭圆形的X轴半径为farthest-side,Y轴半径为closest-side。圆心位于水平25%,垂直25%的地方 */
 
ellipse(10em 10em at 500px 300px) 
/* 椭圆形的X轴半径和Y轴半径都为10em。圆心位于水平500像素,垂直300像素的地方 */

比如:

.txtBox_content{
    clip-path: ellipse(50% 20%);
}

(4)polygon()

polygon()函数用于定义一个多边形

polygon() = polygon( [<fill-rule>,]? [<shape-arg> <shape-arg>]# )
/* 其中.. */
<shape-arg> = <length> | <percentage>

polygon() 的参数是一组坐标对<shape-arg> <shape-arg>),每一个坐标对代表多边形的一个顶点坐标。浏览器会将最后一个顶点和第一个顶点连接得到一个封闭的多边形。坐标对使用逗号来进行分隔,可以使用绝对单位或百分比单位值。

除了坐标对参数,polygon() 函数还可以使用一个可选的关键字 fill-rule 。该关键字指定如何处理可能相交的多边形形状的区域。可取值有nonzeroevenodd。默认值为nonzero

下面都是有效的polygon()函数声明。

polygon(0 0, 100% 100%, 0 100%)
polygon(0 0, 100% 100%, 0 100%)
polygon(50px 0px, 100px 100px, 0px 100px)
polygon(evenodd, 446.33px 452.00px, 443.63px 246.82px, 389.92px 245.63px )

比如:

.txtBox_content{
    clip-path: polygon(50% 2.4%, 34.5% 33.8%, 0% 38.8%, 25% 63.1%, 19.1% 97.6%, 50% 81.3%, 80.9% 97.6%, 75% 63.1%, 100% 38.8%, 65.5% 33.8%);
}

2. 形状的应用:clip-path

clip-path ,裁剪属性,用于指定使用一个形状值、内联或外部的 SVG 路径作为剪裁路径对元素进行裁剪。

裁剪区域内的内容将会显示,而不在这个区域内的内容不会显示。

裁剪的元素可以是任何容器和图片元素。

/* SVG中的clipPath的使用 */ 
.element { 
    clip-path: url(#svgClipPathID); 
} 
/* 使用CSS中的基本图形函数 */ 
.element { 
    clip-path: polygon(...); 
}
/* 或者其他的图形函数 */ 

基本形状在 clip-path 的使用见前面的案例。

这里举例说明下 SVG 的使用。

<svg height="0" width="0">
    <defs>
        <clipPath id="svgTextPath">
            <text x="0" y="300" textLength="600px" lengthAdjust="spacing" font-family="Vollkorn" font-size="100px" font-weight="700" font-style="italic">
                White Mouse
            </text>
        </clipPath>
    </defs>
</svg>
.txtBox_content{
    clip-path: url(#svgTextPath);
}

                                </div>