【译】CSS Shapes 简介

栏目: CSS · 发布时间: 5年前

内容简介:CSS Shapes 允许我们通过定义文本内容可以环绕的几何形状、图像和渐变,来创建有趣且独特的布局。本次教程会教你如何使用它们。在CSS Shapes 问世之前,为网页设计文本自由环绕的杂志式布局几乎是不可能的。相反,网页设计布局传统上一直用网格、盒子和直线构造。CSS Shapes 允许我们定义文本环绕的几何形状。这些形状可以是圆、椭圆、简单或复杂的多边形,甚至图像和渐变。Shapes 的一些实际设计应用可能是圆形头像周围显示圆形环绕文本,全屏背景图片的简单部位上面展示文本,以及在文章中显示首字下沉。

CSS Shapes 允许我们通过定义文本内容可以环绕的几何形状、图像和渐变,来创建有趣且独特的布局。本次教程会教你如何使用它们。

【译】CSS Shapes 简介

在CSS Shapes 问世之前,为网页设计文本自由环绕的杂志式布局几乎是不可能的。相反,网页设计布局传统上一直用网格、盒子和直线构造。

CSS Shapes 允许我们定义文本环绕的几何形状。这些形状可以是圆、椭圆、简单或复杂的多边形,甚至图像和渐变。Shapes 的一些实际设计应用可能是圆形头像周围显示圆形环绕文本,全屏背景图片的简单部位上面展示文本,以及在文章中显示首字下沉。

现在 CSS Shapes 已经获得了现代浏览器的广泛支持,值得一看的是它们提供的灵活性和功能,以确定它们在你的下一个设计项目中是否能派上用场。

注意:截至攥写本文时,CSS Shapes 支持 Firefox、Chrome、Safari 和 Opera,以及 iOS Safari 和 Chrome for Android 等移动浏览器。Shapes 不支持 IE,对 Microsoft Edge 的支持正在考虑中。

CSS Shapes 初探

CSS Shapes 的当前实现是 CSS Shapes Module Level 1 ,它主要包含 [shape-outside](https://tympanus.net/codrops/css_reference/shape-outside/) 属性。 shape-outside 定义了文本环绕的形状。

考虑到有 shape-outside 属性,你可能会想到还有一个相应的 shape-inside 属性,它包含形状内的文本。 shape-inside 属性可能会在将来实现,目前它只是 CSS Shapes Module Level 2 里面的一个草案,并没有被任何浏览器实现。

在本文中,我们将演示如何使用数据类型,并使用形状函数值设置它,以及使用半透明 URL 或渐变设置形状。

基本的形状函数

我们可以通过将下列函数值应用于 shape-outside 属性来定义 CSS 中的各种基本形状:

circle()
ellipse()
inset()
polygon()

要给元素设定 shape-outside 属性,该元素必须是浮动的并且已设定宽高。让我们逐个来看四个基本形状,并演示它们的使用方法。

我们将从 circle() 函数开始。设想如下场景,有一个圆形的作者头像,我们想让头像左浮动并且作者的描述文本环绕它。仅对头像元素使用 border-radius: 50% 不足以使文本呈圆形;文本仍将把头像当成矩形元素。

通过圆形,我们可以演示文本如何按圆形环绕。

首先我们在一个普通的 div 上创建 circle 样式,并且写几段文字。(我使用 Bob Ross 语录作为 Lorem Ipsum 文本。)

<div class="circle"></div>
<p>Example text...</p>
复制代码

circle 样式中,我们设置元素左浮动,设定等值的 heightwidth ,并且设置 shape-outsidecircle()

.circle {
  float: left;
  height: 200px;
  width: 200px;
  shape-outside: circle();
}
复制代码

如果我们访问页面,会看到如下场景。

【译】CSS Shapes 简介

如你所见,文本围绕圆形环绕,但是我们并没有看到任何形状。使用开发 工具 审查元素,我们可以看到已经设置好的实际形状。

【译】CSS Shapes 简介

此时,你可能会认为,给元素 background 设置颜色或者图片就能看到形状了。我们来试一下。

.circle {
  float: left;
  height: 200px;
  width: 200px;
  shape-outside: circle();
  background: linear-gradient(to top right, #FDB171, #FD987D);
}
复制代码

不幸的是,给 circle 设置 background 后会显示一个矩形,这是我们一直试图避免的事情。

【译】CSS Shapes 简介

我们可以清晰地看到文本在它周围环绕,但元素本身没有形状。如果我们想要真实地显示形状函数,需要使用 clip-path 属性。 clip-path 采用许多和 shape-outside 相同的值,因此我们可以给它同样的 circle() 值。

.circle {
  float: left;
  height: 200px;
  width: 200px;
  shape-outside: circle();
  clip-path: circle();
  background: linear-gradient(to top right, #FDB171, #FD987D);
}
复制代码
【译】CSS Shapes 简介

在本文剩下的部分,我将使用 clip-path 帮助我们辨认形状。

circle() 函数接收可选的 radius 参数。在本例中,默认 radius 是 50% 或者 100px 。使用 circle(50%) 或者 circle(100px) 都将产生和我们已经完成样例的同样结果。

你可能注意到文本刚好和形状贴合。我们可以使用 shape-margin 属性给形状添加 margin,单位可以是 pxem% 和其他标准的 CSS 测量单位。

.circle {
  float: left;
  height: 200px;
  width: 200px;
  shape-outside: circle(25%);
  shape-margin: 1rem;
  clip-path: circle(25%);
  background: linear-gradient(to top right, #FDB171, #FD987D);
}
复制代码

这里有个 circle radius 设置 25% 并且使用 shape-margin 的例子。

【译】CSS Shapes 简介

除了 radius,形状函数可以使用 at 定位。默认位置是圆心,因此 circle() 也可以被显式设置为 circle(50% at 50% 50%)circle(100px at 100px 100px) ,两个值分别是水平和垂直位置。

为了搞清楚 position 的作用,我们可以设置水平位置值为 0 来创造一个完美的半圆。

circle(50% at 0 50%);
复制代码

该坐标定位系统称为引用框。

【译】CSS Shapes 简介

稍后,我们将学习如何使用图像代替形状或者渐变。现在,我们将继续进行下一个形状函数。

椭圆

ellipse()circle() 函数类似,只是它会创造椭圆。为了演示,我们创建一个 ellipse 元素和样式。

<div class="ellipse"></div>
<p>Example text...</p>
复制代码
.ellipse {
  float: left;
  shape-outside: ellipse();
  clip-path: ellipse();
  width: 150px;
  height: 300px;
  background: linear-gradient(to top right, #F17BB7, #AD84E3);
}
复制代码

这次,我们设置不同的 heightwidth 创建一个垂直拉长的椭圆。

【译】CSS Shapes 简介

ellipse()circle() 的区别在于椭圆有两个半径 —— _r_x_r_y ,或者 X 轴半径和 Y 轴半径。因此,上面的例子也可以写成:

ellipse(75px 150px);
复制代码

circles 和 ellipses 的位置参数是一样的。除了是测量单位,半径也包括 farthest-sideclosest-side 的选项。

closest-side 代表引用框的中心到最近侧的长度,相反, farthest-side 代表引用框中心到最远侧的长度。这意味着如果未设置默认值以外的位置,则这两个值无效。

这里演示了在 ellipse() 上翻转 closest-sidefarthest-side 的区别,它的 X 和 Y 轴的偏移量是 25%

ellipse(farthest-side closest-side at 25% 25%)
复制代码
【译】CSS Shapes 简介
ellipse(farthest-side closest-side at 25% 25%)
复制代码
【译】CSS Shapes 简介

内嵌

目前为止我们只处理了圆形,但是我们可以使用 inset() 函数定义内嵌矩形。

<div class="inset"></div>
<p>Example text...</p>
复制代码
.inset {
  float: left;
  shape-outside: inset(75px);
  clip-path: inset(75px);
  width: 300px;
  height: 300px;
  background: linear-gradient(#58C2ED, #1B85DC);
}
复制代码

在本例中,我们创造了一个 300px 的正方形,每条边内嵌 75px 。这将给我们留下 150px 周围有 75px 空间。

【译】CSS Shapes 简介

我们可以看到矩形是内嵌的,文本忽略了内嵌区域。

【译】CSS Shapes 简介

inset() 形状也可以使用 round 参数接收 border-radius ,并且文本会识别圆角,就像本例中所有边都是 25px 内嵌和 75px 圆角。

inset(25px round 75px)
复制代码
【译】CSS Shapes 简介

paddingmargin 简写,inset 值以顺时针方式( inset(25px 25px 25px 25px) )接收 top right bottom left ,并且只传一个值将使四条边都相同( inset(25px) )。

多边形

形状函数最有趣和灵活的是 polygon() ,它可以采用一系列 xy 点来制作任何复杂形状。数组里的每个元素代表 _x_i _y_i,将被写成 polygon(x1 y1, x2 y2, x3 y3...) 等等。

我们可以为多边形设置的点集数量最少为 3,这将创建一个三角形。

<div class="polygon"></div>
<p>Example text...</p>
复制代码
.polygon {
  float: left;
  shape-outside: polygon(0 0, 0 300px, 200px 300px);
  clip-path: polygon(0 0, 0 300px, 200px 300px);
  height: 300px;
  width: 300px;
  background: linear-gradient(to top right, #86F7CC, #67D7F5);
}
复制代码

在这个形状中,第一个点是 0 0div 中最左上角的点。第二个点是 0 300px ,它是 div 中最左下角的点。第三个也就是最后一个点是 200px 300px ,它在 X 轴的 2/3 处并且也在底部。最终的形状是这样:

【译】CSS Shapes 简介

polygon() 形状函数的一个有趣用法是文本内容可以在两个或以上形状中环绕。因为 polygon() 形状是如此灵活和动态,这给我们制作真正独特的杂志式布局提供了一个最好机会。在本例中,我们将把文本放在两个多边形中。

<div class="left"></div>
<div class="right"></div>
<p>Example text...</p>
复制代码
.left {
  float: left;
  shape-outside: polygon(0 0, 0 300px, 200px 300px);
  clip-path: polygon(0 0, 0 300px, 200px 300px);
  background: linear-gradient(to top right, #67D7F5, #86F7CC);
  height: 300px;
  width: 300px;
}

.right {
  float: right;
  shape-outside: polygon(200px 300px, 300px 300px, 300px 0, 0 0);
  clip-path: polygon(200px 300px, 300px 300px, 300px 0, 0 0);
  background: linear-gradient(to bottom left, #67D7F5, #86F7CC);
  height: 300px;
  width: 300px;
}
复制代码
【译】CSS Shapes 简介

显然,想要手动创造你自己的复杂形状是非常困难的。幸运的是,你可以用一些工具来创建多边形。Firefox 有一个内置的形状编辑器,你可以在 Inspector 中通过点击多边形使用。

【译】CSS Shapes 简介

目前,Chrome 有一些你可以使用的扩展程序,比如CSS Shapes Editor。

多边形可以用来剪切图像或其他元素周围的形状。在另一个例子中,我们可以通过在大字母周围绘制多边形来创建首字下沉。

<div class="letter">R</div>
<p>Example text...</p>
复制代码
.letter {
  float: left;
  font-size: 400px;
  font-family: Georgia;
  line-height: .8;
  margin-top: 20px;
  margin-right: 20px;
  shape-outside: polygon(5px 14px, 233px 20px, 246px 133px, 189px 167px, 308px 304px, 0px 306px) content-box;
  clip-path: polygon(5px 14px, 233px 20px, 246px 133px, 189px 167px, 308px 304px, 0px 306px);
}
复制代码
【译】CSS Shapes 简介

URLs

CSS Shapes 一个令人激动的特性是你不必每次都通过形状函数明确定义;你也可以使用半透明图像的 url 来定义形状,这样文本就会自动环绕它。

重要的是要注意图像使用必须要兼容CORS,否则你将会遇到如下错误。

Access to image at 'file:///users/tania/star.png' from origin 'null' 
has been blocked by CORS policy: The response is invalid.
复制代码

在同一个服务器上提供图像将会保证你不会遇到上面的错误。

与其他例子不同,我们将使用 img 代替 div 。这次的 CSS 很简单——只用把 url() 放进 shape-outside 属性,就像 background-image 一样。

<img src="./star.png" class="star">
<p>Example text...</p>
复制代码
.star {
  float: left;
  height: 350px;
  width: 350px;
  shape-outside: url('./star.png')
}
复制代码
【译】CSS Shapes 简介

因为我使用了透明背景的星星图像,文本知道哪些区域是透明的哪些是不透明的,并进行自适应布局。

渐变

最后,渐变也可以用来当成形状。渐变和图像一样,就像我们上面用到的图像例子,文本也将知道在透明部分环绕。

我们将使用渐变的一个新属性 —— shape-image-threshold shape-image-threshold 定义形状的 alpha 通道阈值,或者图像透明的百分比值。

我们将制作一个渐变例子,它是 50%/50% 的颜色和透明分割,并且设置 shape-image-threshold.5 ,意味着超过 50% 不透明的所有像素都应被视为图像的一部分。

<div class="gradient"></div>
<p>Example text...</p>
复制代码
.gradient {
  float: left;
  height: 300px;
  width: 100%;
  background: linear-gradient(to bottom right, #86F7CC, transparent);
  shape-outside: linear-gradient(to bottom right, #86F7CC, transparent);
  shape-image-threshold: .5;
}
复制代码
【译】CSS Shapes 简介

我们可以看到渐变在不透明和透明的中心对角线完美分割。

结语

在本文中,我们学习了 CSS Shapes 的三个属性 shape-outsideshape-marginshape-image-threshold 。我们也了解到如何使用函数值创建可供文本环绕的圆、椭圆、内嵌矩形以及复杂的多边形,并且演示了形状如何检测图像和渐变的透明部分。

你可以在如下demo 中找到本文中用到的所有例子,也可以下载源文件。

如果发现译文存在错误或其他需要改进的地方,欢迎到 掘金翻译计划 对译文进行修改并 PR,也可获得相应奖励积分。文章开头的 本文永久链接 即为本文在 GitHub 上的 MarkDown 链接。

掘金翻译计划 是一个翻译优质互联网技术文章的社区,文章来源为掘金 上的英文分享文章。内容覆盖 AndroidiOS前端后端区块链产品设计人工智能 等领域,想要查看更多优质译文请持续关注 掘金翻译计划 、官方微博、 知乎专栏


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

电商产品经理宝典:电商后台系统产品逻辑全解析

电商产品经理宝典:电商后台系统产品逻辑全解析

刘志远 / 电子工业出版社 / 2017-10-1 / 49.00元

时至今日,对于产品经理的要求趋向业务型、平台型,甚至产生了细分领域专家。纯粹的前端产品经理(页面、交互)逐渐失去竞争力。而当后台产品经理的视野开始从功能延伸到模块,再延伸到子系统,最后关注整体系统时,就有了把控平台型产品的能力。 《电商产品经理宝典:电商后台系统产品逻辑全解析》围绕“电商后台产品”,从电商的整体产品架构入手,逐步剖析各支撑子系统。通过学习电商产品后台的架构和逻辑,可以让读者从......一起来看看 《电商产品经理宝典:电商后台系统产品逻辑全解析》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具