圆角样式
长时间以来,圆角都是开发者最期盼的效果,很多网页设计的老手都投入几十甚至上百个小时,就是为了通过图片来实现可以可以缩放,同时由兼容各种游览器的圆角效果,现在并不用考虑那么多兼容问题也就ie8及ie8以前和opera mini不支持.
况且圆角也只是锦上添花的效果,并没有对可用性构成实际影响,所以大家使用标准属性即可.
网页的排版,布局内容设置都是矩形,我们圆角只是隐藏了四周的角而已.不具有继承性.
矩形是作为网页布局一个核心的元素,
以前手机塞班系统logo按钮都是矩形
然后到ios很多圆角矩形的图标
最后是安卓很多各式自定义新主题,
我们可以做很多特殊的东西,例如对话框,气泡等等.
但是如果这个圆角矩形用图片容量就太大了.
圆角样式的开发意义
- 代码代替原生的图片素材,使得网页体量更小,用户下载更快.
- 网页的观感更佳
谷歌游览器现在就有很多圆角样式
我们怎么去写圆角样式呢?
.cir{
width:400px;
height: 400px;
margin:100px auto 0;
background-color: skyblue;
border-radius: 50px;
}
<div class="cir"></div>
/*相当于我们在矩形的四角画上了半径为50px的圆,将在圆弧以外的角进行隐藏*/
既然我们在四周上画了四个圆.那这四个圆非得一样吗?我们只让两个角有圆角样式,能不能去修改?
其实我们的border-radius可以写四个值分别代表四角圆的大小.如何marin,padding一样.
border-radius: 50px 60px 120px 150px;
/*每个边角画不同的小圆,四个属性值:分别为左上 右上 右下 左下.*/
Border-radius:50px 100px 150px;
/*三个属性值:左上 右上与左下 右下*/
border-radius:50px 100px;
/*两个属性值:左上与右下,左下与右上;*/
我们写一个值默认就相当于四边的值一样
border-radius:50px;
/*相当于border-radius:50px 50px 50px 50px;*/
回到最开始我们如果只要两个角有样式.
border-radius: 50px 100px 0px 0px;
/*除了这样我们还可以设置单例型写法*/
上面这个我们用圆角的单例型样式的设置为
border-top-left-radius:50px;/*左上角小圆半径*/
border-top-right-radius:100px; /*右上角小圆半径*/
border-bottom-left-radius:/*设置左下角边框的圆角样式;*/
border-bottom-right-radius:/*设置右下角边框的圆角样式;*/
注意:边框的顺序不能打乱,比如border-top-left-radius就不可以写成border-left-top-radius 属性是固定的。
我们去左上角设置一个圆弧,把这个圆弧设置的足够大,整个圆的半径和矩形的宽高一样大,这时候会显示什么?
border-top-left-radius:200px;
/*即便单一一个角圆特别大,大到好像可以把其他的角影响到.
游览器也只会切割矩形的左上角,对其他的三个角没有影响*/
如果继续扩大呢,此时我们去让圆的半径是矩形的宽高
border-top-left-radius:400px;
/*左上角的圆已经超出矩形了,即使是在这样的情况下也只会对矩形的左上角进行裁切.
无论我们画的圆有多大,你设置是左上角的圆角样式,也只会影响左上角.
所以我们设置单一角度的圆角值,只会影响你设置单一的那个角
如果我们打开控制台继续调大圆角数值,可以发现此时数值再大是没有效果.
所以我们圆角的半径必须小于等于元素的宽度,我们的纵轴必须小于等于元素的高度*/
上面我们说了如何去设置圆角,其实我们还可以去设置椭圆角
border-radius: 200px/50px;
/*此时前面的值为椭圆的横轴值200px,斜杠后面的为椭圆的纵轴值50px.
我们横轴和纵轴是完全独立开来的,用斜杠分割,中间的值要进行分别设置.
前面的横轴值可接受四个值,后面的纵轴值同样最多接受四个值.
方向规则和我们上面讲的是一样的.*/
/*注意前面没有斜杠的情况*/
border-radius:200px;
/*这个其实默认是border-radius:200px/200px;*/
椭圆和圆的区别
圆从中心点到圆上每个点的位置都是一个半径大小.
椭圆从中心点到椭圆边上的任意一点距离会有一个最小值和最大值,最小值就是纵轴,最大值就是横轴.
接下来我们去学习实用的应用
border-radius: 200px;
/*这时候我们可以看到一个正圆就出现了,为什么我们给矩形这四个角设置这样的圆角值它会变成圆呢?
因为我们在四个角分别画了半径200px的圆,然后把弧线外面的进行裁切.
然后这四条裁切的弧线相互连接就形成了我们的圆.*/
/*这时候我们打开开发者工具继续调大圆角值,大家觉得会有变化吗?
结果是不会有任何的变化.
可是刚刚我们设置的单个角直到400px之后才会不变化,这里为什么每个角200px就没有变化了?
这是因为当时就一个角裁切所以弧线到了矩形高一半的位置还能继续裁切.
可是这里是四个角的弧线进行裁切,上下两个圆都到中点弧线进行相交的时候.
此时继续增大圆角值,该怎么裁切?
所以他个两个就会打架,最后实在没有办法就各占一半.所以才形成了我们的圆.*/
上面我们用的都是像素px值设置圆角值,
我们还有一种更为简单的单位去设置圆角,就是我们的百分比值.
border-radius: 50%;
/*此时我们同样实现了圆,这个百分比的单位又是相对于什么呢?
上面我们说过设置单一的值并不代表我们就没有横轴与纵轴了.
我们写的50%相当于横轴也是50%,纵轴也是50%,即反斜杠前后值相等.
反斜杠前的50%就是相对于元素的宽度,反斜杠后的50%就是相对于元素的高度
我们要想实现一个圆形,首先要设置出一个正方形.
给border-radius设置任何大于或等于50%的百分数,都可以实现圆形效果.*/
前面我们可以设置椭圆角,就是斜杠前后设置不一样的值.我们其实还有另外一种方法实现椭圆.
width:400px;
height: 200px;
border-radius: 50%;
/*我们慢慢减少宽度或者高度也能慢慢变成椭圆.
所以当我们设置元素的宽和高不再相等,表现出来的也是椭圆形.*/
这时候我们想去做一个自适应的半圆去怎么制作?
width: 400px;
height: 200px;
border-radius:50% 50% 0 0/100% 100% 0 0
/*半圆不就是由两个四分之一圆组成,相当于把左上变成四分之一个圆,右上变成四分之一个圆.
这个情况下圆的半径刚好等于宽度的一半,高度就是我们整个元素的高度.
所以我们左上右上宽度是元素的50%,左下右下不要了,纵轴就是元素高度的全部即可*/
或者我们这么去设置也行.
border-radius: 400px 400px 0 0;
/*同样能实现一个半圆的效果*/
前面我们说的椭圆形可能不那么受欢迎,我们有时候更希望看到"胶囊形",即一个矩形的两端各带一个半圆形.
这种形状在工程上称为"长圆形".
比如实现谷歌游览器地址栏这个长方形圆角功能怎么去实现?
我们可以利用border-radius计算上的一个特性来达到目的,
我们知道,圆角弧线为保证不会相交会自动缩小半径/
在使用长度值(而非百分之比值的时候),半径并不相对于元素大小而缩小.最终会得到对称效果.
因此,在创建胶囊两头的半圆形时,我们可以故意指定一个比所需半径大的值的来得到半圆形.
border-radius: 100px;
/*这里只需每个角的四分之一圆组成,我们将每个圆的半径设置为高度的一半相等就可以.
或者设置足够大也行.*/
最后关于边框的圆角效果效果,最后还有一点要跟大家说清楚.
元素形状改变前后对页面的布局不会产生影响.矩形在变成圆角之前之后对布局没有影响.
但是会改变圆角后元素的可点击和可触摸的区域,会以变化之后的圆角为准.
所以在使用圆角矩形按钮的时候,需要保证可点击触摸的区域不要太小.
border-radius实现四个方向的半圆
.top {
float: left;
width: 200px;
height: 100px;
border-radius: 100px 100px 0 0;
background: lightgreen;
}
.left {
float: left;
width: 100px;
height: 200px;
border-radius: 100px 0 0 100px;
background: skyblue;
}
.bottom {
float: left;
width: 200px;
height: 100px;
border-radius: 0 0 100px 100px;
background: pink;
}
.right {
float: left;
width: 100px;
height: 200px;
border-radius: 0 100px 100px 0;
background: tomato;
}
<div class="top">1</div>
<div class="left">2</div>
<div class="bottom">3</div>
<div class="right">4</div>
渐变(彩虹)
渐渐(均匀)的变化
渐变的主体:特指颜色的渐渐变化(从某一个位置到另一个位置)
在日常生活中我们有什么东西是一个渐变的效果,
头发,比如有可能父母发尖是黑色的,到发根慢慢就变成白色了,由黑色到白色,由一块变色位置到另一块.
还有一个更加典型的渐变例子就是彩虹.彩虹的颜色从外到里是赤橙黄绿青蓝紫.
我们日常所吃的苹果的颜色也可能是渐变,
我们就需要在页面中制作颜色变化位置的效果.
渐变色更多属于一种装饰型的样式,显示多种颜色平滑过度的效果.
渐变色通过代码来实现就像我们刚刚的border-raidus一样.
通过border-raidus来画一个图形好处在于我们不用担心它的体积,体积一定是最小的.
通过border-radius画出来可能只有几十字节到几百字节.
但用图片就要几kb到几十kb.渐变如果用代码书写体积同样会比用渐变颜色的图片体积小的多.
渐变分为两种:
1.变化方向平行(线性(均匀的)渐变) :任何位置的渐变效果都是平行的,从一个位置开始到另一个位置结束.
2.变化方向从一个点出发(径向渐变) 这个径叫做半径,大家都知道圆的半径都是从中心圆点朝着四周扩散测量
渐变是颜色变化,我们要写出渐变效果,写到哪里?
首先渐变是我们视觉上的效果
描述的是页面中的元素盒子的渐变
盒子中跟颜色有关的是背景,是不是我们的背景?所以我们的渐变的基础是背景.
渐变的基础是背景
1.背景颜色(那渐变效果更像是一张图片还是颜色,我们页面上的盒子其实是不能用background-color设置渐变颜色的,因为background-color本质上是单色,或者叫纯色,更多是充当一个打底的颜色)
2,背景图片(如果把渐变当成是一张背景图片的话,大家可以这么理解,我们在盒子内部创建了一张图片,这张图片有渐变效果,所以我们去写渐变的时候是写在background-image中.)
线性渐变(linear-gradient)
.box{
width: 300px;
height: 300px;
margin: 100px auto 0;
border: 1px solid black;
background-image:linear-gradient()
}
/*这里我们不使用url去引入渐变,因为url本质上是引用一个地址.
相当于游览器悄悄的又打开了一个游览器悄悄的输入了网址把图片下载下来放在盒子里边.
我们这里去使用linear-gradient,这里必然要有颜色和颜色的变化.
没有颜色怎么渐变,而一种颜色也没法渐变,所以我们还至少要去写两个颜色的参数,*/
<div class="box"></div>
background-image;linear-gradient(red,red)
/*两个一样的颜色就为全红,跟我们的背景颜色一样.*/
background-image;linear-gradient(red,blue)
/*我问大家一个问题,这个效果是不是渐变效果?它是由红色逐渐变成了蓝色.
中间的颜色说它红又不是很红,说它蓝也不够蓝.
而且这从上往下是一个像素一个像素去变化的.变化方向是平行的.
这就是由我们的纯红色渐变到纯蓝色.
这里面的颜色单位可以是关键字,可以是十六进制表示法,当然也可以是rgb表示法.*/
box-shadow: 0 0 10px 10px red;/*这里的模糊距离10px也是从红色过渡到白色*/
background-image:linear-gradient(lightgreen,skyblue);
/*我们换个颜色给大家演示一下,大家就会看到一个还算比较好看到颜色.这就是我们的线性渐变,
大家在今后做开发时,颜色就不会太过单调,我们就可以去做颜色的渐渐变化,对于网站视觉效果会非常好.*/
渐变的特性
变化方向默认是从上往下
就像百米赛跑一样,我们顶部就相当于初始位置,底部就相当于结束位置,这是我们的整体朝向
我们规定了初始位置在0%的位置,结束位置在100%的位置,
我们把0%和100%就当做描述这个位置的关键节点.
颜色最浓的地方在哪里?
background-image:linear-gradient(green,blue);
/*这两个颜色最浓的地方分别就会在0%和100%;
此时绿色最浓的地方默认在0%的位置,蓝色最浓的地方在100%的位置.
*/
background-image:linear-gradient(green 0%,blue 100%);
/*这样写没区别*/
background-image:linear-gradient(green,blue,yellow);
/*如果我们写三个颜色最浓的地方分别在0% 50% 100%*/
background-image:linear-gradient(green,blue,yellow,pink);
/*如果我们写四个颜色最浓的地方在哪里?这里我们一共有四个节点,四个节点分为三段,
每一段100除以3,所以他们颜色最浓的地方分别0% 33.3% 66.6% 100%,只需在颜色变化方向上进行分割确认,
如果我们有四种颜色就分割为三块区域,有五种颜色就四块,六种自然就为五块.
我们能不能手动去控制最浓地方在哪里?*/
background-image:linear-gradient(green,blue,yellow);
/*这时候我们就要去控制颜色最浓的位置.让蓝色往上走
怎么去控制我们颜色最浓的位置呢?我们只需在颜色后面写百分比就可以控制*/
background-image:linear-gradient(green,blue 60%,yellow);
/*此时blue后面写60%
最上面是0%的位置,最下面是100%位置,60%位置就从上往下十分之六的位置.
我们在这里把60%改一改,改成到百分之70%话蓝色最浓的地方就更下去了.
改成百分之20%的话,最浓的蓝色就会上去.
*/
我们改成0%的话,第一个颜色就会失效.
background-image:linear-gradient(green,blue 0%, );
我们改成100%的话,最后一个颜色就会失效.
background-image:linear-gradient(green,blue 0%, );
大家要抓住一个核心问题
百分比是一个相对于谁的百分比?
相对于自身盒子的高度,这时候我们去把盒子高度调高,你会发现颜色的变化也符合一个比例关系
接下来我们来聊一个问题?
渐变的极限在哪里?
两种颜色一开始均匀分布,如果我用百分比使他们慢慢靠近,最后颜色冲突到了一起怎么办
假如我们一个区域,
上面是蓝色下面是紫色,它能够缓慢的变化,
假如这两块渐变最浓的区域区域越来越近,会出现什么效果.
会不会融合成一个颜色,其实是不会融合成一个颜色
background-image:linear-gradient(purple,blue);
/*现在渐变上面是紫色,下面是蓝色.
第一个颜色默认位置百分比是多少?默认是0%的位置.
第二个颜色的默认位置就是100%,这是它的默认值.*/
background-image:linear-gradient(purple 0%,blue 100%);
/*刷新后可以发现颜色渐变跟原来没有变化*/
background-image:linear-gradient(purple 20%,blue 100%);
/*这时候我把第一个区域增大到20%;现在最浓的位置在哪里?
我们现在盒子的高度是300px,最浓的位置就是从上往下60px的位置,利用300乘以20%可以算出.
那在60px之前是什么颜色?点击刷新页面看下,鼠标移动到这块区域.
20%位置之前区域都是一个颜色,你在这写20%代表20%前都是这个最浓的颜色,即我们的紫色*/
background-image:linear-gradient(purple 20% ,blue 80%);
/*前面代表20%的位置之前那都是紫色,后面代表80%位置之后时都是蓝色.这两个位置没有发生所谓的渐变.
我们设置前面颜色40%,后面颜色60%,此时40%位置之前的颜色都是紫色,60%的位置之后都是蓝色.*/
那如果前后颜色位置都写50%,50%的话.
background-image:linear-gradient(purple 50% ,blue 50%);
/*两种颜色泾渭分明.
上面50%的区域全是紫色,下面50%的区域全是蓝色.*/
如果我们先写的颜色位置比后写的颜色位置更大呢?
background-image:linear-gradient(purple 60% ,blue 50%);
/*此时后写的百分比的就没有效果了.
就跟我们的正宫和我们的侧室一个概念,正房比侧房更有发言权.
第一个颜色也更有发言权.*/
background-image:linear-gradient(purple 60% ,blue 10%);
/*写10%也没作用谁先写就厉害,我们一般来写不会写出这样的表现效果*/
background-image:linear-gradient(purple 40% ,blue 40%);
/*注意这样写表示0-40%的位置为紫色,40%位置之后默认填充为蓝色.
所以前一个颜色位置的百分比最好小于等于后一个的颜色位置,这样才好观察颜色的变化.*/
我们渐变还可以渐变透明色.
background-image:linear-gradient(purple 30% ,transparent 70%);
/*此时30%之前的区域是紫色,30%到70%的是由紫色渐变到透明色,70%之后全是透明*/
如果我们只想让中间的区域有紫色呢?
background-image:linear-gradient(transparent 30%,purple 30% ,purple 70% ,transparent 70%);
除了百分比描述颜色的位置
现在说一个新的单位 像素值px
background-image:linear-gradient(purple 100px ,blue 100px);
/*100px高度之前的区域也都是紫色,现在紫色区域的高度刚好也就是100px,后面的区域就全为蓝色了.*/
上面我们的渐变都是从上往下渐变的,那我如果想改变方向可以实现吗?
渐变的方向可以控制,用第一个参数控制,第一个参数不写默认方向从上往下
background-image:linear-gradient(to left ,purple 30% ,transparent 70%);
/*从右往左去渐变.*/
background-image:linear-gradient(to right ,purple 30% ,transparent 70%);
/*现在百分比朝向也发生变化,现在?百分比30%现在跟宽度什么关系?
宽度的30%现在就是90px前面都是颜色最浓的地方.*/
对角线渐变
你甚至可以设置渐变方向为从一个对角到另一个对角.
background-image:linear-gradient(to left top ,purple 30% ,transparent 70%);
/*可以写两个值,表示左上,但是最多只有八个方向,有局限性.*/
除了left top right bootom等关键字值之外还有度数deg
一个圆周就是360度 从12点钟出发,顺时针
to top == 0deg
to right == 90deg
to bottom == 180deg
to left == 270deg
正角度都属于顺时针方向。 而负角度意味着逆时针方向
渐变的本质是一张图片(用控制背景图片的方式控制渐变的效果)
background:linear-gradient(purple 0% ,blue 100%) 0px 0px /100px 100px;
/*这时候我们的背景图片怎么变成了三段了?
其实背景图片大小默认不是盒子所决定的,而是由背景图片中background-size这个来决定的.
这时这张渐变图片相当于进行了平铺,那我们如何解决掉平铺呢?
要去写上no-repeat.*/
background:linear-gradient(purple 0% ,blue 100%) no-repeat 0px 0px /100px 100px;
/*现在这个背景是不是有点像一张图片的写法,默认位置从上往下,基础像素大小100px,
我们就可以通过这样一个背景的复合样式去书写我们的渐变.*/
我们还可以写逗号创建多个渐变效果
background:
linear-gradient(purple 0% ,blue 100%) no-repeat 0px 0px /100px 100px,
linear-gradient(red 0% ,green 100%) no-repeat 100px 0px / 100px 100px;
/*渐变的本质是一张图片,我们通过background可以创建多张渐变的图片.
同样是先写的会覆盖后写的.*/
堆叠渐变
您甚至可以将渐变与其他渐变堆叠在一起。只要顶部渐变不是完全不透明,下面的渐变仍将可见。
.stacked-linear {
background:
linear-gradient(217deg, rgba(255,0,0,.8), rgba(255,0,0,0) 70.71%),
linear-gradient(127deg, rgba(0,255,0,.8), rgba(0,255,0,0) 70.71%),
linear-gradient(336deg, rgba(0,0,255,.8), rgba(0,0,255,0) 70.71%);
}
全局网格桌布
body{
margin: 0;
background-color: #fff;
background-image:
linear-gradient(
transparent,
transparent 50%,
rgba(255,0,0,0.2) 50%
),
linear-gradient(
to right,
transparent,
transparent 50%,
rgba(0,255,0,0.2) 50%
);
background-size: 20px 20px;
}
径向渐变(radial-gradient)
这个径向渐变和我们的线性渐变有什么区别?
线性渐变表示我们的变化方向均匀,径向渐变是从某一个点出发,发散开来.如同放烟花爆炸的效果,
background-image: radial-gradient(yellow,red)
/*这个渐变效果有没有像一个太阳或者向日葵?
此时的渐变方向由中心点的黄色到红色.
所以我管这种点状中心发散的变化叫做径向渐变.
我们刚才学线性渐变说的是颜色最浓的地方在哪里,这个图颜色最浓的地方在哪里?
第一个就是我们的中心点.
那另外一个颜色最浓的地方就在我们的四个角里面.
这里中心点到一个角的距离为100%的距离,最开始的位置为0%,最后的位置为100%.*/
这时候如果有产品经理提需求,说我们颜色变化太单调了.
我们这时就需要添加更多的颜色
background-image: radial-gradient(yellow,red,pink)
/*这里颜色最浓的地方改变了没有?
其实这里颜色变化最浓的地方没有变化.
最浓的0%的黄色和100%粉色中间多了一个50%的最浓的红色*/
接下来我们去聊聊颜色的极限问题.
background-image: radial-gradient (yellow 30%,red 70%)
/*中心有一个圆的颜色都是最浓的,其次四角的浓度也会变大.
我们可以慢慢的让颜色进行靠近*/
background-image: radial-gradient(yellow 50%,red 50%)
/*/*这个时候50%的分界圆特别明显,
这个圆的半径现在是多少?
圆中心到四角的距离是我们100%,我们盒子宽度是300px.
那我们盒子的对角线的长度就是300乘以根号2,再中间截掉一半的一半就是75乘以根号2.
打开控制台可以计算一下75*Math.pow(2,1/2)
结果这个就为圆的半径,乘以2就是圆的直径*/
我们还可以设置多个不