css3中的几何图形shape研究

前言

估计大家在日常工作中都会用到css形状,但是目前天朝中使用到最多的估计就是圆(circle)、椭圆(ellipse)、各种三角形形状,但是你肯定很少看见过用几何图形或者多边图形。假如你不懂什么叫做几何图形,那么请前往百度百科,就算是我们用:after :before 这些伪元素来构造我们所需要的形状或者利用边框来曲线救国,但是对于代码来说还是太长了,有没有直接定义几何图形或者是多边形的属性。今天来说说 shape

摘要

关于shape的应用,个人感觉有点奇葩,为什么这么说,因为只能应用于float值中,假如不是浮动元素,那么对不起,不适用。所以个人觉得一般用这个 shape 来构造一个我们工作中的形状,应该是带有浮动的图像,像impressivewebs这种左侧图像右侧文字的头像特别适用 

不过,只能应用于带有浮动属性的元素才能使用这个 shape 属性,想必兼容性应该也不咋地,通过caniuse 可以看得出这个属性兼容性在各个浏览器,哪怕是移动端的兼容性惨不忍睹,只见飘红不见绿。

学习还是要的,说不定哪天用得着呢?

既然这货是给带有float属性的元素使用,那么是时候说说浮动元素了

浮动行为和盒子模型

对于浮动,想必大家在进入到这行的时候,只要是设计稿有明显的左右设计,那么就很喜欢用 float浮动属性,浮动有好也有不足,浮动可以轻松实习各种左右布局,但是也会引起塌陷。但这并不是浮动带来的BUG,而是正常行为,因为外包裹warp并没有足以恰好的包裹整个浮动区域(float area),假如浮动区域(如图片)有固定的维度,而包含带有浮动属性的图片的元素没有指定高度,或者其内容没有比图片本身维度高的话,那就会形成塌陷,对于怎样清除浮动引起的塌陷,不妨回头看看之前写过的一篇博文:利用:after伪类元素清除浮动float所产生的塌陷,或者不妨看看鑫哥很久之前写的一篇博文专门研究float属性,想必你会对浮动有着不一样的认识。

一般来说我们正常的浮动区域都是以矩形框的形式存在,如上图的头像所在红色框框就是其浮动区域,那么这个浮动区域的维度就是一个矩形框,文字都是围绕这个矩形框,对于带有浮动的元素指定一个shape属性的话,那么也许它就会变成这样

文字不必整齐地排在一起,还可以沿着圆形头像环绕,这才是这个shape属性使文字环绕图片真正意义。

因此,shape其实是减少浮动区域,而不是增加浮动区域,这点要搞清楚,因为只有减少浮动区域,那些在矩形框的文字才能进来嘛,衣服都脱了,你就让我们整齐站门口把守?

支持的基本形状

目前的规范支持 shape-outside 属性,但是还没有规定 shape-inside属性,将来的版本可能会有内形状也不一定。假如要指定一个 shape-outside 那么还要指定这个浮动区域(float area)一定的宽高。因此常规css中语法如下:

.left { shape-outside: shape函数; float: left; width: 100px; height: 100px; } 

目前shape支持4种函数定义的形状

inset() = inset( {1,4} [round ]? ) //凹形   circle() = circle( []? [at ]? ) //圆形   ellipse() = ellipse( [{2}]? [at ]? ) //椭圆形   polygon() = polygon( [,]? [ ]# ) //多边形   

其中

shape-arg =<length> | <percentage>;   shape-radius = <length> | <percentage> | closest-side | farthest-side   position = top,right,bottom,left   

其实说白了就是长度值,不管是shape-arg还是shape-radius,只不过跟我们平常所写的css值不太一样的地方就是多了at或者round。

inset()函数

inset()函数中可以定义一个凹形体,让文字围绕凹形体。 
shape-arg函数为长度值,可以是px或者percentage。允许1~4个值,分别是top,right,bottom,left的简写值,对于inset的介绍我们可以用下面的图来解释

css中的很多属性值假如用到的都是简写值,那么都是按照这么一个排序,对于简写还不明白的请去参考之前写过的一篇小文章:margin简写值

那么假如定义一个inset凹形体距离顶端为10px,距离右侧为20px,距离底部为10%,距离左侧为0的话,css如下写到

.inset{     float:left;     width:100px;     height:100px;     background-color:#FF0;     shape-outside:inset(10px 20px 10% 0); } 

效果如下: 

墨绿色区域为浮动区域(float area)减少的值,黄色区域为现在的浮动区域。

round,可选值,环绕的意思。后面紧接的 border-radius是我们在熟悉不过的圆角属性,可定义凹形体中四个角的圆滑程度,也是有1~4个值,分别是左上角、右上角、右下角、左下角。假如有不懂的情况可查阅一下之前写过的:border-radius属性值详解,因此,在刚刚那个凹形体中想要定义成一个椭圆半径值为20px和50px,那么可以如下写到

.inset{ float:left;   width:100px;   height:100px;   background-color:#FF0;   shape-outside:inset(10px 20px 10% 0 round 20px 50px);   } 

效果如下: 

墨绿色区域为浮动区域(float area)减少的值,黄色区域为现在的浮动区域。该浮动区域是由一个距离顶部10px,右侧20px,底部10%,左侧0的矩形框左上角和右下角圆角弧度为20px,右上角和左下角弧度为50px的椭圆组成。

circle()与 ellipse()函数

对于上面这两个圆形形状函数和椭圆形函数的值都是一个样,所以索性直接合并在一起将比较好。他们的值都是:[]? [at ]?,椭圆有点小区别下面说。

shape-radius可选值,代表半径比例,对于圆来说只有一个数值定义圆的半径,但是椭圆就可以定义两个值,一个是X轴半径,一个是Y轴半径,但不管是圆还是椭圆半径值不允许负值。使用百分比将会从参考箱子计算值,也可以使用常见的长度值作为单位,想要半径为50px的圆,那么直接直接写circle(50px),当然还可以使用closest-side或者farthest-side来定义,对于长度值(length)或者是百分比(percentage)我们都好理解,里面的数值的就是规定圆的半径大小。但是对于closest-side或者farthest-side就稍微复杂一点。

closest-side从圆心到靠近边缘的边的最短距离作为半径,对于圆来说,值都相等,对于椭圆来说最短的边。如下图中椭圆红色为半径。

farthest-side从圆心到靠近边缘的边的最长距离作为半径,对于圆来说,值都相等,对于椭圆来说最长的边。如下图中椭圆蓝色为半径。 

*at *可选值,定义圆或者椭圆的圆心位置。假如这么写 shape-outside: circle(20px at 50px 30px),那么圆的半径为20px,圆心距离左侧为50px,距离顶部为30px的点。

效果如下: 
 
放大300%后的截图

假如是shape-outside: circle(closest-side at 50px 40px)那么圆心的位置应该是距离顶部40px,左侧50px处,刚上面也提到了关于 closest-side的半径是到参考框最短边的距离,那么此时最短距离应该是40px,而不是50px,所以这个圆的半径应该是为40px如图显示:

polygon()多边形函数

**可选值,填充规则。这个规则定义shape内部的表现形状,具体请查考这里:fill-rule

*,这是设置多边形的值,最少三个值起,因此必须是这么写polygon(40% 0, 100% 0,50% 50%),当然你也可以用其他数值,不一定要百分比。括号中的第一个数值是水平位移,第二个值是垂直位移,可以重复N次。假如我们想要在100100矩形框内构造一个等边五边形,如下图 
 
对应的A,B,C,D,E的点的坐标应该是如下 
 
因此,相应的css应该可以写成

.polygon{     float:left;     width:100px;     height:100px;     background-color:#000;     shape-outside:polygon(50px 0,100px 37px,82px 100px,19px 100px,0 37px);  } 

当然这么写,是可以构造出一个矩形框,但是假如你想更加具象的五边形,那么就需要添加 clip-path,这个裁剪属性,这个其实有点像图像多边形热点工具,大意就是把图像中某一个需要的部分抠出来,那么完整的代码如下

.polygon{     float:left;     width:100px;     height:100px;     background-color:#000;     shape-outside:polygon(50px 0,100px 37px,82px 100px,19px 100px,0 37px);     -webkit-clip-path:polygon(50px 0,100px 37px,82px 100px,19px 100px,0 37px);  } 

请使用谷歌浏览器打开右侧demo→:css等边五边形

效果如下: 

后话

css3中shape形状属性还跟box-sizing,margin-box,padding-box,borde-box有关系,比较大家css中最最最最最基础的就是盒子模型,shape形状也是基于盒子模型进化而来,为了也是适应时代的需求,再也不可能100年都是矩形、正方形或者圆形。当然,w3c中还可以定义图像的shape形状,这些就不一一去说了,个人觉得假如可以以后这个属性有一天对浏览器们都兼容了,那我们看见的头像可能是五边形、六边形或者是N边形并是非常有可能的,不在仅仅局限于我们目前所见的这些常规形状。当然,这些文字围绕某个多边形图片转转非常适合运用到时尚周刊上的排版去。

那么,更加精彩的等你去研究吧。

对了附上一篇国外妹纸写一篇文章CSS Shapes 101

参考资料: 
http://dev.w3.org/csswg/css-shapes/ 
https://developer.mozilla.org/en-US/docs/Web/CSS/shape

本文地址:http://xiaoho.com/?p=881

时间: 2024-10-11 04:00:44

css3中的几何图形shape研究的相关文章

关于.animate()函数与css3中transition合用失效问题

在写自己项目的时候遇到了这样的一个效果,左侧菜单按钮点击弹出菜单的同时,菜单按钮变成 × 状.(参考关键字:汉堡按钮 http://www.htmleaf.com/Demo/201506232094.html) 大概就是下面gif中的动画效果: 大致的动画效果如下 1. 第一条横线(div)rotate -45deg 2. 第二条横线渐进消失 3. 第三条横线 rotate 45deg 像之前链接里面用纯 CSS3 实现的效果,改变元素 :hover 的 CSS 样式表就行. 因为现在是用点击触

html5+css3中的background: -moz-linear-gradient 用法

在CSS中background: -moz-linear-gradient 让网站背景渐变的属性,目前火狐3.6以上版本和google浏览器支持这个属性. background: -moz-linear-gradient(top,  #bccfe3 0%, #d2dded 100%);  适合 FF3.6+ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#bccfe3), color-stop(

css3 中的渐变

虽说css3 都已经使用多年了,但是关于css3的渐变用的很少.今天遇见了,就学习了一下. 首先我们打开ps,新建一个画布,选择渐变工具,这个时候我们能够看到顶栏上面的渐变类型如下 第一个我们选中的是线性渐变,第二个是径向渐变,第三个是角度渐变,第四个是对称渐变,第五个是菱形渐变.对于css3 并没有提供这么多的渐变类型,只提供了两种基本的渐变类型:线性渐变和径向渐变,还有一种组合渐变就是重复渐变. 线性渐变 css3 中的线性渐变用的是 linear-gradient 这个函数. 基本语法:

CSS3中的渐变效果

渐变是CSS3中比较丰富多彩的一个特性,通过渐变我们可以实现许多绚丽的效果.渐变可分为线性渐变和径向渐变. (1)线性渐变:沿着某条直线朝一个方向产生渐变效果 语法:linear-gradient([<point> || angle]? <stop>,<stop>[,<stop>]*) 参数说明: 第一个参数表示线性渐变的方向.有四个取值,分别是: to left:设置渐变从右到左.相当于270deg. to right:设置渐变从左向右.相当于90deg.

css3中的变形(transform)、过渡(transtion)、动画(animation)

Transform字面上就是变形,改变的意思.在CSS3中transform主要包括以下几种:旋转rotate.扭曲skew.缩放scale和移动translate以及矩阵变形matrix.下面我们一起来看看CSS3中transform的旋转rotate.扭曲skew.缩放scale和移动translate具体如何实现,老样子,我们就从transform的语法开始吧.是构成transtion和animation的基础. 语法: transform : none | <transform-func

理解CSS3中的background-size(对响应性图片等比例缩放)

2016-03-10 01:40 by 空智, 7463 阅读, 8 评论, 收藏, 编辑 阅读目录 background-size的基本属性 给图片设置固定的宽度和高度的 固定宽度400px和高度200px-使用background-size:400px 200px缩放设置 固定宽度400px和高度200px-使用background-size:400px;的缩放设置,那么第二个参数会自动转换为auto 固定宽度400px和高度200px-使用background-size:100% 100%

css3中关于伪类的使用

目标: css中after伪类,last-child伪类的使用.以及部分css3的属性. 过程: 在制作导航时,经常会遇到在每一个li后面添加一个分割符号,到最后一个元素的时候,分割符就会去掉的一种效果. 如图 那么制作这样的一个效果,怎么用纯css很简单的完成了.这里用到了css的伪类. html部分 <body> <ul class="nav"> <li><a href="">Home</a></

linux系统中各个路由表的研究

linux中有0~255共256张路由表.其中0号表示unspec(未指定),253,254,255分别表示default.main.local表.除了以上4张表外的其他表都是留给用户指定的表.现在就说下以上5张系统表的作用. 首先是0号表unspec.这张表可以理解成所有路由表的总和,也就是说所有路由表中的路由条目在这个表中都会有一条相对应.这样如果想看看系统中所有路由表的路由条目就可以看这张表.当然对这张表中的路由条目操作也等同于对其他表中对应的路由条目操作,因此可要小心千万别清空这个路由表

CSS3中REM使用详解

在页面中设置字体,我们知道有常见的两种,px 和 em. px 在Web页面制作中,我们一般使用"px"来设置我们的文本,因为他比较稳定和精确.但是这种方法存在一个问题,当用户在浏览器中浏览我们制作的Web页面时,他改变了浏览器的字体大小(虽然一般人不会去改变浏览器字体大小),这时会使用我们的Web页面布局被打破,这时就提出了使用"em"来定义Web页面的字体. em 一般都是body的font-size为基准常用写法: 01 02 03 04 05 06 07 0