前端知识 | CSS小技巧-自适应椭圆

背景知识:

border-radius 属性的基本用法。

难题:

你可能注意到过,给任何正方形元素设置一个足够大的 border-radius,就可以把它变成一个圆形。所用到的 CSS 代码如下所示:

图1.1给元素设置固定宽高以及一半长度的 border-radius,可以得到一个圆形

你可能还注意到了,如果指定任何大于 100px 的半径,仍然可以得到一个圆形。规范特别指出了这其中的原因:

“当任意两个相邻圆角的半径之和超过 borderbox 的尺寸时,用户代理必须按比例减小各个边框半径所使用的值,直到它们不会相互重叠为止。”——CSS 背景与边框(第三版)(http://w3.org/TR/css3-background/#corner-overlap)

不过,我们往往不愿意对一个元素指定固定的宽度和高度,因为我们希望它能根据其内容自动调整并适应,而内容的长短不可能在事先就知道。即使是在设计一个静态网站的时候(元素的内容可以预先确定),我们也可能需要在某个时刻改变其内容;或者我们为它准备了一款尺寸略有差异的回退字体,而不同字体对相同内容的渲染结果很可能是不同的。在这个案例中,我们通常期望达到这个效果:如果它的宽高相等,就显示为一个圆;如果宽高不等,就显示为一个椭圆。可是,我们前面的代码并不能满足这个期望。当宽度大于高度时,我们得到的形状如图1.2所示。那我们到底能不能用 border-radius 来产生一个椭圆,甚至是一个自适应的椭圆呢?

图1.2在前面的圆形示例中,当高度小于宽度时发生的情况;border-radius 所产生的圆形用虚线标示。

解决方案:

说到 border-radius,有一个鲜为人知的真相:它可以单独指定水平和垂直半径,只要用一个斜杠(/)分隔这两个值即可。这个特性允许我们在拐角处创建椭圆圆角(参见图1.3)。因此,如果我们有一个尺寸为 200px×150px 的元素,就可以把它圆角的两个半径值分别指定为元素宽高的一半,从而得到一个精确的椭圆:

图1.3一个容器设置了不相等的水平和垂直 border-radius;拐角处的弧线现在呈现出椭圆的形状,这个椭圆的水平和垂直半径就是我们为 border-radius 指定的值,在图中用虚线标示。

图1.4通过非对称的 border-radius 曲线来创建一个椭圆。

我们可以在图1.4中看到结果。但是,这段代码存在一个很大的缺陷:只要元素的尺寸发生变化,border-radius 的值就得跟着改。我们在图3-5中可以看到,当元素的尺寸变为 200px×300px 时,如果 border-radius 没有跟着改变,会发生什么后果。因此,如果我们的元素尺寸会随着它的内容变化而变化,这就是一个问题了。难道我们真的走投无路了吗?其实,border-radius 这个属性还有另外一个鲜为人知的真相,它不仅可以接受长度值,还可以接受百分比值。这个百分比值会基于元素的尺寸进行解析,即宽度用于水平半径的解析,而高度用于垂直半径的解析。这意味着相同的百分比可能会计算出不同的水平和垂直半径。因此,如果要创建一个自适应的椭圆,我们可以把这两个半径值都设置为50%:

由于斜杠前后的两个值现在是一致的(即使它们最终可能会被计算为不同的值),我们可以把这行代码进一步简化为:

最终,只需要这一行代码,我们就可以得到一个自适应的椭圆了。

扩展:border-radius 的简写方式

延伸一句代码半椭圆:border-radius: 100% 0 0 100%/50%;即可形成如图1.5所示的半椭圆

图1.5

延伸一句代码实现1/4椭圆:border-radius: 100% 0 0 0; 即可形成如图1.6所示的1/4椭圆

图1.6

小花絮:

为什么叫 border-radius?可能有人会奇怪,border-radius 到底由何得名。这个属性并不需要边框来参与工作,似乎把它叫作 corner-radius 更贴切一些。这个名字乍听起来确实让人摸不着头脑,其实原因在于 border-radius 是对元素 borderbox 进行切圆角处理的。当元素没有边框时,可能还看不出差异;当它有边框时,则以边框外侧的拐角作为切圆角的基准。边框内侧的圆角会稍小一些(严格来说内角半径将是 max(0,border-radius-border-width))。

海说软件会持续推出前端教学课程、技术干货。

-END-

原文地址:http://blog.51cto.com/13476205/2062492

时间: 2024-10-10 08:03:22

前端知识 | CSS小技巧-自适应椭圆的相关文章

前端常用CSS小技巧

注意:以下前缀兼容性写法注释-o-:Opera-ms://IE10-moz://火狐-webkit://Safari 4-5, Chrome 1-9 1. 去除 iOS移动端 input,textarea输入框聚焦时上方内阴影样式 input, textarea, select{ appearance: none; -moz-appearance: none; //Firefox -webkit-appearance: none; //Safari 和 Chrome } appearance属性

iOS 知识-常用小技巧大杂烩

iOS 知识-常用小技巧大杂烩 1,打印View所有子视图 po [[self view]recursiveDescription] 2,layoutSubviews调用的调用时机 * 当视图第一次显示的时候会被调用 * 当这个视图显示到屏幕上了,点击按钮 * 添加子视图也会调用这个方法 * 当本视图的大小发生改变的时候是会调用的 * 当子视图的frame发生改变的时候是会调用的 * 当删除子视图的时候是会调用的 3,NSString过滤特殊字符 // 定义一个特殊字符的集合 NSCharact

CSS小技巧

CSS 小技巧 总结的网络上的资源,以备自己后续参考... 使用:not()去除导航上不需要的边框 为body添加行高 垂直居中任何元素 逗号分离的列表 使用负nth-child选择元素 使用SVG图标 文本显示优化 在纯CSS幻灯片上使用max-height 继承box-sizing 表格单元格等宽 使用Flexbox摆脱边界Hack 使用属性选择器选择空链接 使用:not()添加/去除导航上不需要的边框 添加边框… /* 添加边框 */ .nav li { border-right: 1px

css小技巧(1)

1.-webkit-overflow-scrolling: touch; 解决ios滑动时无缓冲问题 2.::-webkit-scrollbar 设置ios滑动时是否显示滚动条 3.::selection 选中文字时文字颜色和选中色 <!doctype html> <html> <head> <meta charset="utf-8"> <meta content="width=device-width,initial-s

Css 小技巧总结

相对偏移 指定left top等属性就能够够完美控制一个元素的位置 如: position:relative; left:2px; 今天遇到一个很好玩的问题,当两个并排浮动框,当一个框的长度太大时就会把另一个框顶到下一行,这个时候就可以用margin-right:-2px;将右外距设置为负数来解决! css写表达式控制图片大小,当图片大小大于某一数值时,强制设置其宽 高为指定大小. img { max-width: 163px; width:expression(this.width > 163

前端开发者应该知道的 CSS 小技巧

一些小技巧让你的CSS技术更专业 使用:not()去除导航上不需要的边框 为body添加行高 垂直居中任何元素 逗号分离的列表 使用负nth-child选择元素 使用SVG图标 文本显示优化 在纯CSS幻灯片上使用max-height 继承box-sizing 表格单元格等宽 使用Flexbox摆脱边界Hack 使用属性选择器选择空链接 使用:not()添加/去除导航上不需要的边框 添加边框… CSS 1 2 3 4 5 /* 添加边框 */ .nav li { border-right: 1p

作为一枚web前端开发工程师 这些CSS 小技巧你值得掌握

http://web.jobbole.com/85142/ 使用:not()去除导航上不需要的边框 为body添加行高 垂直居中任何元素 逗号分离的列表 使用负nth-child选择元素 使用SVG图标 文本显示优化 在纯CSS幻灯片上使用max-height 继承box-sizing 表格单元格等宽 使用Flexbox摆脱边界Hack 使用属性选择器选择空链接 使用:not()添加/去除导航上不需要的边框 添加边框- CSS 1 2 3 4 5 /* 添加边框 */ .nav li { bor

Web前端开发基础 第四课(CSS小技巧)

水平居中设置-行内元素 我们在实际工作中常会遇到需要设置水平居中场景,今天我们就来看看怎么设置水平居中的. 如果被设置元素为文本.图片等行内元素时,水平居中是通过给父元素设置 text-align:center 来实现的.如下代码: html代码: <body> <div class="txtCenter">我是文本,哈哈,我想要在父容器中水平居中显示.</div> </body> css代码: <style> div.txt

HTML+CSS - 前端设计的小技巧(持续更新......)

2015年7月6日20:28:20 1.设置文字的居中,非控件内的. :text-alain:center 2.图片在ASP.NET中,可以直接拖放到界面,自动形成img控件. 3.CSS直接在全局样式  *  内,设置UL标签无样式,图片无边框,margin和padding都为0. 4.取消浮动Clear. :clear:left   取消左浮动 5.图片按钮   ImageButton控件 SRC属性,设置图片的路径. 6.服务器空间,在网页中也是input控件,所以,直接设置input属性