在实现页面五花八门的有特色的ui时,我们有时会遇到要用实现一个弧形,而这样的弧形要怎么实现呢?用图片?不太优雅,这样就要无故多加载一张图片了,这里来说说怎么用css的after伪类来实现弧形。
写一个主元素,并给该元素添加伪类来设置成圆,取该圆的一部分来作为我们看到的圆弧。
第一种(正圆弧):
实现效果:
参照上面的 要点 ,大概也能知道个原理了吧。 看到的圆弧高度等于主元素高度,伪元素绝对于主元素定位,左右居中,上移100%;圆弧弧度取决于伪类的宽度 ,这点放到这里来说,是怕放在上面说反而让人觉得复杂了。
如果还不理解的话,可以把上面不必要的样式注释掉,辅助理解:
效果:
可以多调调高度宽度来帮助理解。
第二种(有角度的弧):
效果图:
实现角度弧的思路与正圆弧差不多,不同地方是:
不同点1. 伪元素大小与主元素一样,覆盖在主元素上;
不同点2. 设置伪元素的单个角度;
一、CSS3圆角的优点传统的圆角生成方案,必须使用多张图片作为背景图案。CSS3的出现,使得我们再也不必浪费时间去制作这些图片了,而且还有其他多个优点:
* 减少维护的工作量。图片文件的生成、更新、编写网页代码,这些工作都不再需要了。
* 提高网页性能。由于不必再发出多余的HTTP请求,网页的载入速度将变快。
* 增加视觉可靠性。某些情况下(网络拥堵、服务器出错、网速过慢等等),背景图片会下载失败,导致视觉效果不佳。CSS3就不会发生这种情况。
二、border-radius属性
CSS3圆角只需设置一个属性:border-radius(含义是"边框半径")。你为这个属性提供一个值,就能同时设置四个圆角的半径。所有合法的CSS度量值都可以使用:em、ex、pt、px、百分比等等。
比如,下面是一个div方框:
现在设置它的圆角半径为15px:
border-radius: 15px
这条语句同时将每个圆角的"水平半径"(horizontal radius)和"垂直半径"(vertical radius)都设置为15px。
border-radius可以同时设置1到4个值。如果设置1个值,表示4个圆角都使用这个值。如果设置两个值,表示左上角和右下角使用第一个
值,右上角和左下角使用第二个值。如果设置三个值,表示左上角使用第一个值,右上角和左下角使用第二个值,右下角使用第三个值。如果设置四个值,则依次对
应左上角、右上角、右下角、左下角(顺时针顺序)。
border-radius: 15px 5px 15px 5px
三、单个圆角的设置
除了同时设置四个圆角以外,还可以单独对每个角进行设置。对应四个角,CSS3提供四个单独的属性:
* border-top-left-radius
* border-top-right-radius
* border-bottom-right-radius
* border-bottom-left-radius
这四个属性都可以同时设置1到2个值。如果设置1个值,表示水平半径与垂直半径相等。如果设置2个值,第一个值表示水平半径,第二个值表示垂直半径。
border-top-left-radius: 15px
四、浏览器支持
IE 9、Opera 10.5、Safari 5、Chrome 4和Firefox
4,都支持上述的border-radius属性。早期版本的Safari和Chrome,支持-webkit-border-radius属性,早期版
本的Firefox支持-moz-border-radius属性。
目前来看,为了保证兼容性,只需同时设置-moz-border-radius和border-radius即可。
-moz-border-radius: 15px
border-radius: 15px
(注意:border-radius必须放在最后声明,否则可能会失效。)
另外,早期版本Firefox的单个圆角的语句,与标准语法略有不同。
* -moz-border-radius-topleft(标准语法:border-top-left-radius)
* -moz-border-radius-topright(标准语法:border-top-right-radius)
* -moz-border-radius-bottomleft(标准语法:border-bottom-left-radius)
* -moz-border-radius-bottomright(标准语法:border-bottom-right-radius)
五、注意事项
虽然各大浏览器都支持border-radius,但是在某些细节上,实现都不一样。当四个角的颜色、宽度、风格(实线框、虚线框等)、单位都相同
时,所有浏览器的渲染结果基本一致;一旦四个角的设置不相同,就会出现很大的差异。比如,下面这段代码在不同的浏览器中,渲染结果就相差很大。
另外,并非所有浏览器,都支持将圆角半径设为一个百分比值。
因此,目前最安全的做法,就是将每个圆角边框的风格和宽度,都设为一样的值,并且避免使用百分比值。
<!DOCTYPE html ><html>
<head>
<meta http-equiv="Content-Type" content="text/html charset=utf-8" />
<title></title>
<style type="text/css">
body {
font: bold 100% Helvetica, sans-serif
}
.circular {
width: 30em
height: 30em
margin: 15em auto 0
}
.circular svg {
display: block
overflow: visible
xtransition: 10s linear transform
}
.circular svg:hover { transform: rotate(-2turn) }
.circular text { fill: currentColor }
.circular path { fill: none }
</style>
<body>
<div class="circular">
满80元使用满80元使用满80元使用. 满8ZCz
</div>
</body>
<script type="text/javascript">
function $$(selector, context) {
context = context || document
var elements = context.querySelectorAll(selector)
return Array.prototype.slice.call(elements)
}
$$('.circular').forEach(function(el) {
var NS = "http://www.w3.org/2000/svg"
var svg = document.createElementNS(NS, "svg")
svg.setAttribute("viewBox", "0 0 100 100")
var circle = document.createElementNS(NS, "path")
circle.setAttribute("d", "M0,50 a50,50 0 1,1 0,1z")
circle.setAttribute("id", "circle")
var text = document.createElementNS(NS, "text")
var textPath = document.createElementNS(NS, "textPath")
textPath.setAttributeNS("http://www.w3.org/1999/xlink", 'xlink:href', '#circle')
textPath.textContent = el.textContent
text.appendChild(textPath)
svg.appendChild(circle)
svg.appendChild(text)
el.textContent = ''
el.appendChild(svg)
})
</script>
</html>