CSS躬行记(8)——裁剪和遮罩

摘要:
裁剪最早是在CSS2.1时代由clip属性引入,但该属性只能应用于绝对定位的元素,并且只能裁剪成矩形。CSS3提供了强大的clip-path属性,突破了clip属性的众多限制,接下来将围绕clip-path属性展开讲解。3)裁剪路径对于复杂的形状,可以采用SVG来创建裁剪路径,实现自定义。2)替换元素的填充和定位CSS3引入了两个新属性,用于遮罩替换元素。
一、 裁剪

裁剪(clipping)能让元素显示指定形状的区域,在布局时可起点缀的作用,丰富了视觉呈现。注意,裁剪本质上只是让元素的部分区域透明,由此可知,裁剪完后元素所占的空间仍旧会保留。裁剪最早是在CSS 2.1时代由clip属性引入,但该属性只能应用于绝对定位的元素,并且只能裁剪成矩形。CSS3提供了强大的clip-path属性,突破了clip属性的众多限制,接下来将围绕clip-path属性展开讲解。

1)裁剪形状

clip-path属性可以使用四种裁剪函数:circle()、ellipse()、inset()和polygon(),它们的作用和浮动形状中的shape-outside属性中的形状函数相同。

下面用一个例子来演示这四个函数的效果,将它们分别应用到四个div元素中,样式如下,得到的形状如下图所示。

div {width:200px;height:200px;background:url(./lake.png);
}.circle {clip-path:circle(50%);
}.ellipse {clip-path:ellipse(50% 30%);
}.inset {clip-path:inset(20px 10px);
}.polygon {clip-path:polygon(0 0, 100px 0, 160px 200px, 0 200px);
}

CSS躬行记(8)——裁剪和遮罩第1张

2)裁剪盒子

裁剪盒子可指定形状的边界,其中margin-box、border-box、padding-box和content-box的作用与shape-outside属性中的相同,并且这些关键字也能与裁剪函数组合使用,如下所示。在下图中,左侧是原图,右侧是使用了clip-path属性后的效果。

div {width:160px;height:160px;padding:20px;clip-path:content-box circle(50%);
}

CSS躬行记(8)——裁剪和遮罩第2张

还有三个关键字view-box、fill-box和stroke-box适用于SVG元素,具体用途可在网上查到相关资料。

3)裁剪路径

对于复杂的形状,可以采用SVG来创建裁剪路径,实现自定义。引用方式和滤镜中的一样,也是使用url()函数,但指向的是SVG文件中的clipPath元素,下面的SVG文件源自MDN网站。

<svg height="0"width="0"xmlns="http://www.w3.org/2000/svg">
  <defs>
    <clipPath id="cross">
      <rect y="110"x="137"width="90"height="90" />
      <rect x="0"y="110"width="90"height="90" />
      <rect x="137"y="0"width="90"height="90" />
      <rect x="0"y="0"width="90"height="90" />
    </clipPath>
  </defs>
</svg>

有两种方式引用SVG文件中的形状,第一种是外部引用,将SVG元素放在单独的文件中;第二种是行内引用,将SVG元素放在当前的HTML结构中。下面用两个CSS类来演示这两种引用方式,其中url()函数接收的参数的最大区别就是是否包含文件路径。

.url-cross {clip-path:url(./shapes.svg#cross);
}.inline-cross {clip-path:url(#cross);
}

两种方式的效果是相同的,都是将元素裁剪成四部分,如下图所示。注意,外部引用的浏览器支持度比较糟糕,目前只有Firefox支持。

CSS躬行记(8)——裁剪和遮罩第3张

二、遮罩

1)蒙版

蒙版(masking)与裁剪类似,也是让元素以某种形状显示,但蒙版能根据透明度和灰度值计算裁剪边缘,并且有更多的蒙版属性可供选择,例如定位、尺寸、填充方式等。

下面用一个例子来演示蒙版的用法,首先创建HTML结构,包含三个div元素。

<div class="lake"></div>
<div class="star"></div>
<div class="lake star-mask"></div>

然后为三个div元素添加背景图,并给第三个元素定义蒙版,样式如下。注意,在Chrome浏览器中定义蒙版属性时,需要额外添加-webkit-前缀,例如将原来的mask-image属性改成-webkit-mask-image属性。

.lake {background:url(./lake.png);
}.star {background:url(./star-shadow.png);background-position:center;background-repeat:no-repeat;
}.star-mask {mask-image:url(./star-shadow.png);mask-position:center;mask-repeat:no-repeat;
}

在下图中,将第二张五角星作为蒙版,作用到第一张风景照中,第三张是发生遮罩后的效果图,可以看到五角星中不透明和半透明的区域会显示风景照中的内容。

CSS躬行记(8)——裁剪和遮罩第4张

在.star-mask类中用到了mask-position,它的语法与background-position一样,下表列出了所有的蒙版属性和背景属性之间的对应关系。

蒙版属性背景属性作用
mask-sizebackground-size调整蒙版的尺寸
mask-repeatbackground-repeat调整蒙版的填充方式
mask-positionbackground-position调整蒙版的定位
mask-originbackground-origin调整蒙版的原点
mask-clipbackground-clip调整蒙版的裁剪区域

CSS还提供了一个简写属性mask,可将上述属性合并到该属性中。关于蒙版还有一点需要注意,那就是遮罩用的蒙版图像既可以是位图图像(png、jpg等),也可以是矢量图形(指向SVG中的mask元素)。

2)替换元素的填充和定位

CSS3引入了两个新属性,用于遮罩替换元素。第一个是object-fit属性,用来控制替换元素的内容以何种方式填充当前所使用的元素盒子,它有5个关键字可供选择,如下所列,效果如下图所示。

(1)fill:将元素盒子填充满,它是object-fit属性的默认值。

(2)contain:保持宽高比缩放,直到能将整块内容填充进元素盒子为止。

(3)none:保持原有尺寸填充。

(4)cover:保持宽高比缩放,直到水平或垂直方向撑满元素盒子为止。

(5)scale-down:作用与none或contain中的一个相同,取决于谁的尺寸更小。

CSS躬行记(8)——裁剪和遮罩第5张

第二个是object-position属性,用来控制替换元素的内容在元素盒子中的位置,其语法和background-position相同。

免责声明:文章转载自《CSS躬行记(8)——裁剪和遮罩》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇IntelliJ idea设置显示错误代码提示汇编指令MOV下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

浅谈css中浮动和清除浮动带来的影响

有很多时候,我们都会用到浮动,而我们有时候对浮动只是一知半解,却不是太清楚它到底是怎么回事,不知道各位有没有和我一样的感觉,只知道用它,却不知道它到底是怎么回事,所以,在学习的过程中,就要把一个概念不是很清晰的问题把它弄清楚了,便于我们以后的使用。早些时候,W3C规定出来的浮动实际并不是为了布局所用,当时是为了做文字环绕才使用到浮动,后来有人发现用它来做布...

css画圆弧

有时候,在编写公众号,或者微信小程序,或者webapp的时候,需要一些比较特殊的效果,如圆弧。 效果图如下: 上图中的红色部分。 其实原理很简单,只要在外部写一个box装住红色的部分,红色部分设置宽度比box宽度的大,然后调整红色的圆弧和位置就可以了 直接上代码 .box{ 100%; background-color: #5e5...

给一个div添加多个背景图片

效果: 代码: <template> <div class="mod_get_gift"> </div> </template> <style lang="less" scoped> .mod_get_gift{ height:100%;backgro...

如何在Markdown文档中插入空格?

简单说  在 Markdown 文档中,可以直接采用 HTML 标记插入空格(blank space),而且无需任何其他前缀或分隔符。具体如下所示: 插入一个空格 (non-breaking space)     &nbsp;    或    &#160;     或      &#xA0; 插入两个空格 (en space)   ...

Android如何制作漂亮的自适布局的键盘

  最近做了个自定义键盘,但面对不同分辨率的机型其中数字键盘不能根据界面大小自已铺满,但又不能每种机型都做一套吧,所以要做成自适应,那这里主讲思路。   这里最上面的titlebar高度固定,下面输入的金额高度也固定(当然也可以自适应),主要是中间的数字键盘,高度和宽度需要自适应。先来张效果图:   最常见的解决方案是用线性布局,自适应当然是按比例,但布...

10大经典CSS3菜单应用欣赏

很多时候,我们的网页菜单需要个性化,从而来适应各种行业的用户视觉操作体验。本文将带领大家一起来欣赏10个非常经典的CSS3菜单应用,菜单涉及到动画菜单、Tab菜单、面包屑菜单等。 1、CSS3飘带状3D菜单 菜单带小图标 这次我们要来分享一款很特别的CSS3菜单,菜单的外观是飘带状的,并且每一个菜单项有一个精美的小图标,鼠标滑过菜单项时,菜单项就会向上凸起...