CSS圆角实现详解
上次在群里有同学提出这样的问题,因为之前一直在用传统的 Div,所以当时没能回答出来,之后经过 Google 了相关资料后,总结并实践了各种实现方法,现在将它写了来和大家分享一下,如果你是一个 Div+Css 老鸟并且已经熟练掌握,那么请直接跳过本文(您的时间一定很宝贵吧,呵呵!),如果你之前没用过并且也不会,那么请认真、耐心的看完这篇文章,我保证,你肯定能做到。以下几种方法经 IE6、Ie7、Firefox 3.0、Opera 10.60、Chrome 5.0 和 Safari 5.0 等浏览器完美通过 (其它非主流浏览器没测试这,不过都是基于 IE 和 FF 核心,应该不会出现问题),接下来我会尽量说的通俗易懂些,但前提是你要懂得 Css 基出,呵呵,那不费话了,我们开工吧!
方法一:图片实现
Css 圆角大的实现大致分为两种,图片实现和纯 Css 实现,图片实现又分为背景和边框同色和不同色,纯 Css 双分为线条缩进和边框。我们先来说说图片的背景和边框同色的实现方法,很简单!
一,边框和背景色相同
我们先用 PhotoShop 或 CorelDraw 做一张圆角的图片,这里我就用 CorelDraw(Ps 我不会用),这个图片的宽度是你想要的 Div 的宽度,通常情况下高度是自适应的,所以我们不用去管它的高度,比如要做一个宽度为 380Px 的 Div,圆角角度的大小由这张图片决定,图片就应该像这样。
这张图片做好之后,我们就可以开始切了(当然你如果不想切,一个整张的图片也可以,但考虑到访问速度,通常我们不这么做),切的时候注意要把圆角部分全部保留,切过之后应该是这个样子。
这是上半部分:
这是下半部分:
现在,我们须要的背景图片都完了,接下来就是 Css 部分了,先写一个 Div,这个 Div 内应该包括两个子 Div,既 div_top、div_content,结构应该是这样的。
< div id="mydiv"> < div id="div_top"></ div > < div id="div_content"></ div > </ div > |
最外面的 mydiv 是包括 div_top、div_content 的,div_top 是没有实际内容的,它的作用是放圆角背景图片的,而真正的内容是在 div_content 里的,Css 代码应该是这样子的。
#mydiv{ width : 380px ; bckground: #FFFFFF ; margin : 0px ; padding : 0px ;} #div_top{ width : 380px ; height : 10px ; background : url (div_top.gif) no-repeat left bottom ; border : 1px solid blue } #div_content{ width : 380px ; background : url (div_bottom.gif) no-repeat left bottom ; padding-bottom : 10px ; border : 1px solid red ;} |
效果:
现在加上边框来看就一目了然了,已经可以看出只须要再给 div_content 填充一个和背景图片一样的颜色就行了,我们用取色器选取图片颜色并填充为 div_content 背景。
#mydiv{ width : 380px ; bckground: #FFFFFF ; margin : 0px ; padding : 0px ;} #div_top{ width : 380px ; height : 10px ; background : url (div_top.gif) no-repeat left bottom ; border : 0px solid blue } #div_content{ width : 380px ; background : #33CC66 url (div_bottom.gif) no-repeat left bottom ; padding-bottom : 10px ; border : 0px solid red ;} |
现在,我们的圆解 Div 就已做好了。
二 ,边框和背景色不同
同上,做一个宽度为 380Px 的 Div,圆角角度的大小由这张图片决定,图片就应该像这样。
为了看的清楚,我加上了灰色的背景。
这只是圆角 Div 的左上角和右上角,我们再用软件把它旋转 180 度做为下左下角和右下角,旋转之后应该像这样。
我们须要先写一个 Div,这个 Div 内应该包括三个子 Div,既 div_top、div_content、div_bottom,结构应该是这样的。
<div id= "mydiv" > <div id= "div_top" ></div> <div id= "div_content" ></div> <div id= "div_bottom" ></div> </div> |
Css 样试应该是这样子的。
#mydiv,#div_top,#div_content,#div_bottom{ width : 380px ; margin : 0px ; padding : 0px ;} #div_top{ height : 10px ; border : 1px solid blue ; margin : 0px ;} #div_content{ border : 1px solid green ; margin : 0px ;} #div_bottom{ height : 10px ; border : 1px solid red ; margin : 0px ;} |
我们给 mydiv、div_top、div_content 和 div_bottom 设了一个同样的属性值,就是 width=380px 让它们的宽度都为 380 象素,div_top 和 div_bottom 的高度是由我们上面所切的图片的高度而定的,比如,我们上面切的左上角和右上角的图片高度为 10 象素,这里就可以设为 10px,而 div_conetnt 的高度是自适应的,所以我们不用去管它,我给 div_top、div_content 和 div_bottom 分别加上了蓝、绿、红色的边框,并且在 div_content 里加上了测试内容,目的是为了大家更容易理解,加上样式之后应该是这样的。
我们再把切的图上加上去吧。
给 div_top 和 div_bottom 分别设置发我们上面切的图片 div_top.gif 和 div_bottom.gif,考虑到图片的容差,我们让 div_top.gif 贴着 div_top 的底部,div_bottom.gif 贴着 div_bottom 的顶部,这样一个圆角的基本雏形已经出来了,代码应该是这个样式了。
#mydiv,#div_top,#div_content,#div_bottom{ width : 380px ; margin : 0px ; padding : 0px ;} #div_top{ height : 10px ; border : 0px solid blue ; margin : 0px ; background : url (div_top.gif) no-repeat left bottom ;} #div_content{ border : 1px solid green ; margin : 0px ;} #div_bottom{ height : 10px ; border : 0px solid red ; margin : 0px ; background : url (div_bottom.gif) no-repeat left top } |
接下来我们可以设置 div_content 的样式了,我们给 div_content 的左边框和右边框设置和 div_bottom.gif 上面一样的边框颜色,背景也设置为 div_bottom.gif 一样的背景颜色,可以用取色器去取颜色,代码应该是这样子的。
#mydiv,#div_top,#div_content,#div_bottom{ width : 380px ; margin : 0px ; padding : 0px ;} #div_top{ height : 10px ; border : 0px solid blue ; margin : 0px ; background : url (div_top.gif) no-repeat left bottom ;} #div_content{ border-left : 1px solid #84E69C ; border-right : 1px solid #84E69C ; background : #CCFFCC ; margin : 0px ; overflow : hidden ;} #div_bottom{ height : 10px ; border : 0px solid red ; margin : 0px ; background : url (div_bottom.gif) no-repeat left top } |
现在,我们的圆角 div 已经做好了,并且,这个 div 的高度会随着肉容自适应的。
方法二:纯 CSS 实现圆角
一,线条两端缩进,这个是纯 Css 圆角的结构,当然,里面的 div1、div2、div3、div5 也可以用任何可以实现 1 像素线条的标签:
<div class= "mydiv" > <div class= "div1" ></div> <div class= "div2" ></div> <div class= "div3" ></div> <div class= "div5" ></div> <div>这里是内容部分</div> <div class= "div5" ></div> <div class= "div3" ></div> <div class= "div2" ></div> <div class= "div1" ></div> </div> |
这种方法是分别用上下两边的四条高为 1px 的线实现的,其基本思想是,最上面的一条线两端缩进 5px,第二条缩进 3px, 第三条缩进 2px 以此类推,第四缩进 1px,这样就会形成圆角效果,继续往下看,大家就会明白。
比如我们要做一个宽度为 380px 的圆解 div,给这些代码开始加上样式,为了大家更容易理解,我把每根线条都用不同的颜色。
.mydiv{ width : 380px ; border : 1px solid #CCCCCC ;} .div 1 { height : 1px ; display : block ; overflow : hidden ; background : red ; margin : 0px 5px ;} .div 2 { height : 1px ; display : block ; overflow : hidden ; background :yellow; margin : 0px 3px ;} .div 3 { height : 1px ; display : block ; overflow : hidden ; background : green ; margin : 0px 2px ;} .div 5 { height : 1px ; display : block ; overflow : hidden ; background : blue ; margin : 0px 1px ;} .content{ border-left : 1px solid #FF00FF ; border-right : 1px solid #FF00FF ; line-height : 30px ;} |
为了让大家看得更清楚,这是我放大后的效果,我们先给最外面的 mydiv 声明一个 class 类(灰色边框就是),设置它的宽度为 380px,mydiv 内的 div1、div2、div3 和 div4 就分别是红、黄、绿、蓝四条线,并且让它们分别两边缩进 5px、3px、2px、1px,这张截图是 mydiv 的左边,右边和左边同样缩进。
上面的代码是为了让大家好理解而写的,在实际开发过程中就不用这么写的,我们要尽量简化代码,并且为了方便修改边框颜色和背景颜色,接下来我把这个代码修改成:
.mydiv{ width : 380px ;} .div 1 ,.div 2 ,.div 3 ,.div 5 { height : 1px ; font-size : 1px ; overflow : hidden ; display : block ;} .div 1 { margin : 0px 5px ;} .div 2 { margin : 0px 3px ; border-right : 2px solid ; border-left : 2px solid ;} .div 3 { margin : 0px 2px ; border-right : 1px solid ; border-left : 1px solid ;} .div 5 { margin : 0px 1px ; border-right : 1px solid ; border-left : 1px solid ; height : 2px ;} .content{ border-right : 1px solid ; border-left : 1px solid ; line-height : 30px ; overflow : hidden ;} /*在这里定义边框样式*/ .div 2 ,.div 3 ,.div 5 ,.content{ border-color : #84E69C ;} .div 1 { background : #84E69C ;} /*在这里定义背景样式*/ .div 2 ,.div 3 ,.div 5 ,.content{ background : #CCFFCC ;} |
我们把 div2 的边框宽度设为 2px 和把 div5 的的高度设为 2px 的目底是为了圆角看起来更圆滑、自然,这种圆角方案现在应用很广泛,不相的话,包括 IE 浏览器的左右上角都彩用这种解决方法。
要修改这个 div 的宽度,只须要修改 mydiv 的 width 属性就可以,背景和边框颜色修改起来也很方便。
这样我们的纯 CSS 实现圆角就做出来了,并且它能自适高度,宽度修改起来也很方便。
我们再来放大后看看:
从这个角度看,能很清晰的看出为什么要把 div2 的 border-left 和 border-right 设为 2px、div5 的 height 设为 2px 了吧。。。呵呵。
二,边框圆角,这种方法是我不经意间发现的,严格来说这种不属于圆角,不过实现之后发现这种方法挺实用,这是利用了 Css 中的 border 特性,因为在 CSS 中 border 的宽度如果设为 1px 以是的话,把其它三条边设为 0px,这条边的两端就会出现斜角,来看一下吧。
如图,我们来做一个 div,把它的边框宽度设为 5px,颜色设为灰色,并且把它的下边框设为红色,就能看出来了,根据这样的特性,我们就可以做出一个准圆角 div 来,效果还不错先来看看代码吧。
<div> <div></div> <div> <p>CSS圆角技术</p> <p>CSS圆角技术</p> <p>CSS圆角技术</p> <p>CSS圆角技术</p> <p>CSS圆角技术</p> </div> <div></div> </div> |
其 CSS 样试为:
.mydiv{ width : 380px ;} .div 1 { height : 0px ; border : 5px solid #FFFFFF ; border-bottom-color : red ; overflow : hidden ; margin : 0px auto ;} .content{ border : 1px solid #0099FF ; background : #0099FF ; margin : 0px auto ;} .div 3 { height : 0px ; border : 5px solid #FFFFFF ; border-top-colo: red ; overflow : hidden ; margin : 0px auto ;} |
效果:
这个角度的大小是由上同两个 DIV 的边框宽度(即红色部分)决定的,我们再来看看成品吧。
Css 做圆角的方法决大部分的思路就是以上这几种方法,举一反三,根据这几种方法还能衍生出很多类似的方法。。。
做了一天,累死了,好,我们收工吧。