update: refactor

This commit is contained in:
qianguyihao
2019-10-01 20:25:16 +08:00
parent 6c80edc0c2
commit 4625c68dba
71 changed files with 0 additions and 0 deletions

View File

@@ -0,0 +1,449 @@
> 本文最初于2015-10-04发表于[博客园](http://www.cnblogs.com/smyhvae/p/4855106.html),并在[GitHub](https://github.com/qianguyihao/Web)上持续更新**前端的系列文章**。欢迎在GitHub上关注我一起入门和进阶前端。
> 以下是正文。
## 本文重要内容
- CSS的单位
- 字体属性
- 文本属性
- 定位属性position、float、overflow等
## CSS的单位
html中的单位只有一种那就是像素px所以单位是可以省略的但是在CSS中不一样。
<font color="#0000FF">**CSS中的单位是必须要写的**,因为它没有默认单位。</font>
- **绝对单位:**
1 `in`=2.54`cm`=25.4`mm`=72`pt`=6`pc`
各种单位的含义:
- `in`英寸Inches (1 英寸 = 2.54 厘米)
- `cm`厘米Centimeters
- `mm`毫米Millimeters
- `pt`点Points或者叫英镑 (1点 = 1/72英寸)
- `pc`皮卡Picas (1 皮卡 = 12 点)
- **相对单位:**
`px`:像素
`em`印刷单位相当于12个点
`%`:百分比,相对周围的文字的大小
为什么说像素px是一个相对单位呢这也很好理解。比如说电脑屏幕的的尺寸是不变的但是我们可以让其显示不同的分辨率在不同的分辨率下单个像素的长度肯定是不一样的啦。
百分比`%`这个相对单位要怎么用呢?这里也举个例子:
![](http://img.smyhvae.com/2015-10-03-css-17.png)
## 字体属性
### 行高
CSS中所有的行都有行高。盒子模型的padding绝对不是直接作用在文字上的而是作用在“行”上的。
如下图所示:
![](http://img.smyhvae.com/20170808_2216.png)
上图中我们设置行高为30px30px * 5 = 150px通过查看审查元素这个p标签的高度果然为150px。而且我们发现我们并没有给这个p标签设置高度显然是内容将其撑高的。
垂直方向来看文字在自己的行里是居中的。比如文字是14px行高是24px那么padding就是5px
![](http://img.smyhvae.com/20170808_2220.png)
为了严格保证字在行里面居中,我们的工程师有一个约定: **行高、字号,一般都是偶数**。这样可以保证它们的差一定偶数就能够被2整除。
### 如何让单行文本垂直居中
小技巧:如果一段文本只有一行,如果此时设置**行高 = 盒子高**,就可以保证单行文本垂直居中。这个很好理解。
上面这个小技巧只适用于单行文本垂直居中不适用于多行。如果想让多行文本垂直居中还需要计算盒子的padding。计算方式如下
![](http://img.smyhvae.com/20170808_2240.png)
### font字体属性
css样式中字体属性有以下几种
```html
p{
font-size:50px; /*字体大小*/
line-height: 30px; /*行高*/
font-family:幼圆,黑体; /*字体类型:如果没有幼圆就显示黑体,没有黑体就显示默认*/
font-style:italic ; /*italic表示斜体normal表示不倾斜*/
font-weight:bold; /*粗体属性值写成bolder也可以*/
font-variant:small-caps; /*小写变大写*/
}
```
上面这些属性中,字号、行高、字体这三个属性是最常见的。我们继续看。
**1、字号、行高、字体三大属性**
1字号
```
font-size:14px;
```
2行高
```
line-height:24px;
```
3字体font-family就是“字体”family是“家庭”的意思
```
font-family:"宋体";
```
是否加粗属性以及上面这三个属性,我们可以连写:(是否加粗、字号 font-size、行高 line-height、字体 font-family
格式:
```
font: 加粗 字号/行高/ 字体
```
举例:
```
font: 400 14px/24px “宋体”;
```
PS400是nomal700是bold。
上面这几个属性可以连写但是有一个要求font属性连写至少要有**字号和字体**,否则连写是不生效的(相当于没有这一行代码)。
**2、字体属性的说明**
1网页中不是所有字体都能用因为这个字体要看用户的电脑里面装没装比如你设置
```
font-family: "华文彩云";
```
上方代码中,如果用户电脑里面没有这个字体,那么就会变成宋体。
页面中中文我们只使用微软雅黑、宋体、黑体。英文使用Arial、Times New Roman。页面中如果需要其他的字体就需要切图。
2为了防止用户电脑里没有微软雅黑这个字体。就要用英语的逗号隔开备选字体。如下可以备选多个
```
font-family: "微软雅黑","宋体";
```
上方代码表示:如果用户电脑里没有安装微软雅黑字体,那么就是宋体。
3我们须将英语字体放在最前面这样所有的中文就不能匹配英语字体就自动的变为后面的中文字体
```
font-family: "Times New Roman","微软雅黑","宋体";
```
上方代码的意思是英文会采用Times New Roman字体而中文会采用微软雅黑字体因为美国人设计的Times New Roman字体并不针对中文所以中文会采用后面的微软雅黑。比如说对于`smyhvae哈哈哈`这段文字,`smyhvae`会采用Times New Roman字体`哈哈哈`会采用微软雅黑字体。
可是,如果我们把中文字体写在前面:(错误写法)
```
font-family: "微软雅黑","Times New Roman","宋体";
```
上方代码会导致,中文和英文都会采用微软雅黑字体。
4所有的中文字体都有英语别名。
微软雅黑的英语别名:
```
font-family: "Microsoft YaHei";
```
宋体的英语别名:
```
font-family: "SimSun";
```
于是,当我们把字号、行高、字体这三个属性合二为一时,也可以写成:
```
font:12px/30px "Times New Roman","Microsoft YaHei","SimSun";
```
5行高可以用百分比表示字号的百分之多少。
一般来说百分比都是大于100%的,因为行高一定要大于字号。
比如说, `font:12px/200% “宋体”`等价于`font:12px/24px “宋体”``200%`可以理解成word里面的2倍行高。
反过来, `font:16px/48px “宋体”;`等价于`font:16px/300% “宋体”`
## 文本属性
CSS样式中常见的文本属性有以下几种
- `letter-spacing: 0.5cm ;` 单个字母之间的间距
- `word-spacing: 1cm;` 单词之间的间距
- `text-decoration: none;` 字体修饰none去掉下划线、**underline下划线**、line-through中划线、overline上划线、
- `text-transform: lowercase;` 单词字体大小写。uppercase大写、lowercase小写
- `color:red;` 字体颜色
- `text-align: center;` 在当前容器中的对齐方式。属性值可以是left、right、center<font color="#0000FF">**在当前容器的中间**</font>、justify
- `text-transform: lowercase;` 单词的字体大小写。属性值可以是:`uppercase`(单词大写)、`lowercase`(单词小写)、`capitalize`(每个单词的首字母大写)
这里来一张表格的图片吧,一览无遗:
![](http://img.smyhvae.com/2015-10-03-css-18.png)
## 列表属性
```html
ul li{
list-style-image:url(images/2.gif) ; /*列表项前设置为图片*/
margin-left:80px; /*公有属性*/
}
```
另外还有一个简写属性叫做`list-style`,它的作用是:将上面的多个属性写在一个声明中。
我们来看一下`list-style-image`属性的效果:
![](http://img.smyhvae.com/2015-10-03-css-23.png)
给列表前面的图片加个边距吧,不然显示不完整:
![](http://img.smyhvae.com/2015-10-03-css-24_2.png)
这里来一张表格的图片吧,一览无遗:
![](http://img.smyhvae.com/2015-10-03-css-26.png)
## overflow属性超出范围的内容要怎么处理
`overflow`属性的属性值可以是:
- `auto`:浏览器自己解决。在必需时裁切对象多余的内容或显示滚动条。一般采用这个属性值。
- `visible`:默认值。多余的内容不剪切也不添加滚动条,会全部显示出来。
- `hidden`:不显示超过对象尺寸的内容。
对象将以包含对象的 window 或 frame 的尺寸进行裁切,并且 clip 属性设置将失效。
- `scroll`:总是显示滚动条。
针对上面的不同的属性值,我们来看一下效果:
举例:
```html
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="Generator" content="EditPlus®">
<meta name="Author" content="">
<meta name="Keywords" content="">
<meta name="Description" content="">
<title>Document</title>
<style type="text/css">
div{
width: 100px;
height: 100px;
background-color: #00cc66;
margin-right: 100px;
float: left;
}
#div1{
overflow:auto;/*超出的部分让浏览器自行解决*/
}
#div2{
overflow:visible;/*超出的部分会显示出来*/
}
#div3{
overflow:hidden;/*超出的部分将剪切掉*/
}
</style>
</head>
<body>
<div id="div1">其实很简单 其实很自然 两个人的爱由两人分担 其实并不难 是你太悲观 隔着一道墙不跟谁分享 不想让你为难 你不再需要给我个答案</div>
<div id="div2">其实很简单 其实很自然 两个人的爱由两人分担 其实并不难 是你太悲观 隔着一道墙不跟谁分享 不想让你为难 你不再需要给我个答案</div>
<div id="div3">其实很简单 其实很自然 两个人的爱由两人分担 其实并不难 是你太悲观 隔着一道墙不跟谁分享 不想让你为难 你不再需要给我个答案</div>
</body>
</html>
```
效果:
![](http://img.smyhvae.com/2015-10-03-css-31.png)
## 鼠标的属性cursor
鼠标的属性`cursor`有以下几个属性值:
- `auto`:默认值。浏览器根据当前情况自动确定鼠标光标类型。
- `pointer`IE6.0,竖起一只手指的手形光标。就像通常用户将光标移到超链接上时那样。
- `hand`:和`pointer`的作用一样:竖起一只手指的手形光标。就像通常用户将光标移到超链接上时那样。
比如说,我想让鼠标放在那个标签上时,光标显示手状,代码如下:
```html
p:hover{
cursor: pointer;
}
```
另外还有以下的属性:(不用记,需要的时候查一下就行了)
- all-scroll :  IE6.0 有上下左右四个箭头,中间有一个圆点的光标。用于标示页面可以向上下左右任何方向滚动。
- col-resize :  IE6.0 有左右两个箭头,中间由竖线分隔开的光标。用于标示项目或标题栏可以被水平改变尺寸。
- crosshair :  简单的十字线光标。
- default :  客户端平台的默认光标。通常是一个箭头。
- hand :  竖起一只手指的手形光标。就像通常用户将光标移到超链接上时那样。
- move :  十字箭头光标。用于标示对象可被移动。
- help :  带有问号标记的箭头。用于标示有帮助信息存在。
- no-drop :  IE6.0 带有一个被斜线贯穿的圆圈的手形光标。用于标示被拖起的对象不允许在光标的当前位置被放下。
- not-allowed :  IE6.0 禁止标记(一个被斜线贯穿的圆圈)光标。用于标示请求的操作不允许被执行。
- progress :  IE6.0 带有沙漏标记的箭头光标。用于标示一个进程正在后台运行。
- row-resize :  IE6.0 有上下两个箭头,中间由横线分隔开的光标。用于标示项目或标题栏可以被垂直改变尺寸。
- text :  用于标示可编辑的水平文本的光标。通常是大写字母 I 的形状。
- vertical-text :  IE6.0 用于标示可编辑的垂直文本的光标。通常是大写字母 I 旋转90度的形状。
- wait :  用于标示程序忙用户需要等待的光标。通常是沙漏或手表的形状。
- *-resize :  用于标示对象可被改变尺寸方向的箭头光标。
- w-resize | s-resize | n-resize | e-resize | ne-resize | sw-resize | se-resize | nw-resize
- url ( url ) :  IE6.0 用户自定义光标。使用绝对或相对 url 地址指定光标文件(后缀为 .cur 或者 .ani )。
## 滤镜
这里只举一个滤镜的例子吧。比如说让图片变成灰度图的效果,可以这样设置滤镜:
```html
<img src="3.jpg" style="filter:gray()">
```
举例代码:
```html
<body>
<table>
<tr>
<td>原始图片</td>
<td>图片加入黑白效果</td>
</tr>
<tr>
<td><img src="3.jpg"></td>
<td><img src="3.jpg" style="filter:gray()"></td> /*滤镜:设置图片为灰白效果*/
</tr>
</table>
</body>
```
效果如下IE有效果google浏览器无效果
![](http://img.smyhvae.com/2015-10-03-css-36.png)
**延伸:**
滤镜本身是平面设计中的知识。如果你懂一点PS的话···打开PS看看吧
![](http://img.smyhvae.com/2015-10-03-css-38.png)
爆料一下,表示博主有两年多的平面设计经验,我做设计的时间其实比写代码的时间要长,嘿嘿···
## 导航栏的制作(本段内容请忽略)
现在我们利用float浮动属性来把无序列表做成一个简单的导航栏吧效果如下
![](http://img.smyhvae.com/2015-10-03-css-34.png)
代码:
```html
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="Generator" content="EditPlus®">
<meta name="Author" content="">
<meta name="Keywords" content="">
<meta name="Description" content="">
<title>Document</title>
<style type="text/css">
ul{
list-style: none;/*去掉列表前面的圆点*/
width: 420px;
height: 60px;
background-color: black;/*设置整个导航栏的背景为灰色*/
}
li{
float: left;/*平铺*/
margin-right: 30px;
margin-top: 16px;
}
a{
text-decoration: none;/*去掉超链的下划线*/
font-size: 20px;
color: #BBBBBB;/*设置超链的字体为黑色*/
font-family:;
}
</style>
</head>
<body>
<ul>
<li><a href="">博客园</a></li>
<li><a href="">新随笔</a></li>
<li><a href="">联系</a></li>
<li><a href="">订阅</a></li>
<li><a href="">管理</a></li>
</ul>
</body>
</html>
```
实现效果如下:
![](http://img.smyhvae.com/2015-10-03-css-35.png)
国庆这四天,连续写了四天的博客,白天和黑夜,从未停歇,只交替没交换,为的就是这每日一发。以后会不断更新的。
## 我的公众号
想学习<font color=#0000ff>**代码之外的技能**</font>?不妨关注我的微信公众号:**千古壹号**id`qianguyihao`)。
扫一扫,你将发现另一个全新的世界,而这将是一场美丽的意外:
![](http://img.smyhvae.com/2016040102.jpg)

View File

@@ -0,0 +1,325 @@
> 本文最初发表于[博客园](http://www.cnblogs.com/smyhvae/p/8277895.html),并在[GitHub](https://github.com/qianguyihao/Web)上持续更新**前端的系列文章**。欢迎在GitHub上关注我一起入门和进阶前端。
> 以下是正文。
## background系列属性
### 常见背景属性
CSS样式中常见的背景属性有以下几种经常用到要记住
- `background-color:#ff99ff;` 设置元素的背景颜色。
- `background-image:url(images/2.gif);` 将图像设置为背景。
- `background-repeat: no-repeat;` 设置背景图片是否重复及如何重复,默认平铺满。(重要)
- `no-repeat`不要平铺;
- `repeat-x`横向平铺;
- `repeat-y`纵向平铺。
- `background-position:center top;` 设置背景图片在当前容器中的位置。
- `background-attachment:scroll;` 设置背景图片是否跟着滚动条一起移动。
属性值可以是:`scroll`与fixed属性相反默认属性`fixed`(背景就会被固定住,不会被滚动条滚走)。
- 另外还有一个简写属性叫做`background`,它的作用是:将上面的多个属性写在一个声明中。
上面这几个属性经常用到,需要记住。现在我们逐个进行讲解。
### background-color背景颜色的表示方法
css2.1中背景颜色的表示方法有三种单词、rgb表示法、十六进制表示法。
比如红色可以有下面的三种表示方法:
```
background-color: red;
background-color: rgb(255,0,0);
background-color: #ff0000;
```
下面分别介绍。
**1、用英语单词来表示**
能够用英语单词来表述的颜色,都是简单颜色。比如红色:
```
background-color: red;
```
**2、rgb表示法**
rgb表示三原色“红”red、“绿”green、“蓝”blue。
光学显示器中每个像素都是由三原色的发光原件组成的靠明亮度不同调成不同的颜色的。r、g、b的值每个值的取值范围0~255一共256个值。
比如红色:
```
background-color: rgb(255,0,0);
```
黑色:
```
background-color: rgb(0,0,0);
```
颜色可以叠加,比如黄色就是红色和绿色的叠加:
```
background-color: rgb(255,255,0);
```
**3、十六进制表示法**
比如红色:
```
background-color: #ff0000;
```
PS:所有用#开头的值都是16进制的。
这里我们就要学会16进制与10进制之间的转换。下面举几个例子。
16进制中28等于10进制多少
2*16+8 = 40。
16进制中的af等于10进制多少
10 * 16 + 15 = 175
所以,#ff0000就等于rgb(255,0,0)。
`background-color: #123456;`等价于`background-color: rgb(18,52,86);`
**十六进制可以简化为3位所有#aabbcc的形式能够简化为#abc**。举例如下:
比如:
```
background-color:#ff0000;
```
等价于:
```
background-color:#f00;
```
比如:
```
background-color:#112233;
```
等价于:
```
background-color:#123;
```
但是,比如下面这个是无法简化的:
```
background-color:#222333;
```
再比如,下面这个也是无法简化的:
```
background-color:#123123;
```
几种常见的颜色简写可以记住。如下:
```
#000 黑
#fff 白
#f00 红
#222 深灰
#333 灰
#ccc 浅灰
```
### `background-repeat`属性(重要)
`background-repeat:no-repeat;`设置背景图片是否重复及如何重复,默认平铺满。属性值可以是:
- `no-repeat`(不要平铺)
- `repeat-x`(横向平铺)
- `repeat-y`(纵向平铺)
这个属性在开发的时候也是经常用到的。我们通过设置不同的属性值来看一下效果吧:
1不加这个属性时即默认时背景图片会被平铺满
![](http://img.smyhvae.com/2015-10-03-css-19.png)
PSpadding的区域也是有背景图的。
2属性值为`no-repeat`(不要平铺)时:
![](http://img.smyhvae.com/2015-10-03-css-20.png)
3属性值为`repeat-x`(横向平铺)时:
![](http://img.smyhvae.com/2015-10-03-css-21.png)
其实这种属性的作用还是很广的。举个例子设计师设计一张宽度只有1px、颜色纵向渐变的图片然后我们通过这个属性将其进行水平方向的平铺就可以看到整个页面都是渐变的了。
在搜索引擎上搜“**平铺背景**”,就可以发现,**周期性的图片**可以采用此种方法进行平铺。
4属性值为`repeat-y`(纵向平铺)时:
![](http://img.smyhvae.com/2015-10-03-css-22.png)
### `background-position`属性
`background-position`属性指的是**背景定位**属性。公式如下:
在描述属性值的时候,有两种方式:用像素描述、用单词描述。下面分别介绍。
**1、用像素值描述属性值**
格式如下:
```
background-position:向右偏移量 向下偏移量;
```
属性值可以是正数,也可以是负数。比如:`100px 200px``-50px -120px`
举例如下:
![](http://img.smyhvae.com/20170812_1643.png)
![](http://img.smyhvae.com/20170812_1645.png)
**2、用单词描述属性值**
格式如下:
```
background-position: 描述左右的词 描述上下的词;
```
- 描述左右的词left、center、right
- 描述上下的词top 、center、bottom
比如说,`right center`表示将图片放到右边的中间;`center center`表示将图片放到正中间。
比如说,`bottom`表示图片的底边和父亲**底边贴齐**(好好理解)。
位置属性有很多使用场景的。我们来举两个例子。
场景1大背景图
打开“暗黑3 台湾”的官网<https://tw.battle.net/d3/zh/>,可以看到官网的效果是比较炫的:
![](http://img.smyhvae.com/20170812_1945.jpg)
检查网页后找到网站背景图片的url<https://tw.battle.net/d3/static/images/layout/bg-repeat.jpg>。背景图如下:
![](http://img.smyhvae.com/20170812_1950.jpg)
实际上我们是通过把这张图片作为网站的背景图来达到显示效果的。只需要给body标签加如下属性即可
```
body{
background-image: url(/Users/smyhvae/Dropbox/img/20170812_1950.jpg);
background-repeat: no-repeat;
background-position: center top;
}
```
上方代码中,如果没加`background-position`这个属性,背景图会默认处于浏览器的左上角(显得很丑);加了此属性之后,图片在水平方向就位于浏览器的中间了。
场景2通栏banner
很多网站的首页都会有banner图网站最上方的全屏大图叫做「**通栏banner**」这种图要求横向的宽度特别大。比如说设计师给你一张1920*465的超大banner图如果我们把这个banner图作为img标签直接插入网页中会有问题的首先图片不在网页的中间其次肯定会出现横向滚动条。如下图所示
![](http://img.smyhvae.com/20170813_1102.gif)
正确的做法是将banner图作为div的背景图这样的话背景图超出div的部分会自动移溢出。需要给div设置的属性如下
```css
div{
height: 465px;
background-image: url(http://img.smyhvae.com/20170813_1053.jpg);
background-position: center top;
background-repeat: no-repeat;
}
```
上方代码中我们给div设置height高度为banner图的高度不需要设置宽度因为宽度会自动霸占整行。效果如下
![](http://img.smyhvae.com/20170813_1119.gif)
上图可以看出将banner图作为div的背景后banner图会永远处于网页的正中间水平方向来看
### background-attachment属性
- `background-attachment:scroll;` 设置背景图片是否固定。属性值可以是:
- `fixed`(背景就会被固定住,不会被滚动条滚走)。
- `scroll`与fixed属性相反默认属性
`background-attachment:fixed;`的效果如下:
![](http://img.smyhvae.com/20170813_1158.gif)
### background 综合属性
background属性和border一样是一个综合属性可以将多个属性写在一起。(在[盒子模型](http://www.cnblogs.com/smyhvae/p/7256371.html)这篇文章中专门讲到border)
举例1:
```
background:red url(1.jpg) no-repeat 100px 100px fixed;
```
等价于:
```
background-color:red;
background-image:url(1.jpg);
background-repeat:no-repeat;
background-position:100px 100px;
background-attachment:fixed;
```
以后,我们可以用小属性层叠掉大属性。
上面的属性中,可以任意省略其中的一部分。
比如说,对于下面这样的属性:
```
background: blue url(images/wuyifan.jpg) no-repeat 100px 100px;
```
效果如下:
![](http://img.smyhvae.com/20170813_1515.png)
PS以后的CSS3内容中我们会接触到更多的background属性 background-origin、background-clip、background-size在CSS2.1背景图片是不能调整尺寸IE9开始兼容、多背景。
## 我的公众号
想学习<font color=#0000ff>**代码之外的技能**</font>?不妨关注我的微信公众号:**千古壹号**id`qianguyihao`)。
扫一扫,你将发现另一个全新的世界,而这将是一场美丽的意外:
![](http://img.smyhvae.com/2016040102.jpg)

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,338 @@
> 本文最初发表于[博客园](http://www.cnblogs.com/smyhvae/p/8280814.html),并在[GitHub](https://github.com/qianguyihao/Web)上持续更新**前端的系列文章**。欢迎在GitHub上关注我一起入门和进阶前端。
> 以下是正文。
## 伪类(伪类选择器)
**伪类**:同一个标签,根据其**不同的种状态,有不同的样式**。这就叫做“伪类”。伪类用冒号来表示。
比如div是属于box类这一点很明确就是属于box类。但是a属于什么类不明确。因为需要看用户点击前是什么状态点击后是什么状态。所以就叫做“伪类”。
### 静态伪类和动态伪类
伪类选择器分为两种。
1**静态伪类**:只能用于**超链接**的样式。如下:
- `:link` 超链接点击之前
- `:visited` 链接被访问过之后
PS以上两种样式只能用于超链接。
2**动态伪类**:针对**所有标签**都适用的样式。如下:
- `:hover` “悬停”:鼠标放到标签上的时候
- `:active` “激活”: 鼠标点击标签,但是不松手时。
- `:focus` 是某个标签获得焦点时的样式(比如某个输入框获得焦点)
## 超链接a标签
### 超链接的四种状态
a标签有4种伪类即对应四种状态要求背诵。如下
- `:link` “链接”:超链接点击之前
- `:visited` “访问过的”:链接被访问过之后
- `:hover` “悬停”:鼠标放到标签上的时候
- `:active` “激活”: 鼠标点击标签,但是不松手时。
对应的代码如下:
```html
<style type="text/css">
/*让超链接点击之前是红色*/
a:link{
color:red;
}
/*让超链接点击之后是绿色*/
a:visited{
color:orange;
}
/*鼠标悬停,放到标签上的时候*/
a:hover{
color:green;
}
/*鼠标点击链接,但是不松手的时候*/
a:active{
color:black;
</style>
```
记住在css中这四种状态**必须按照固定的顺序写**
> a:link 、a:visited 、a:hover 、a:active
如果不按照顺序那么将失效。“爱恨准则”love hate。必须先爱后恨。
看一下这四种状态的动图效果:
![](http://img.smyhvae.com/20180113_2239.gif)
### 超链接的美化
问:既然`a{}`定义了超链的属性,和`a:link{}`定义了超链点击之前的属性,那这两个有啥区别呢?
答:
**`a{}``a:link{}`的区别:**
- `a{}`定义的样式针对所有的超链接(包括锚点)
- `a:link{}`定义的样式针对所有写了href属性的超链接(不包括锚点)
超链接a标签在使用的时候比较难。因为不仅仅要控制a这个盒子也要控制它的伪类。
我们一定要将a标签写在前面`:link、:visited、:hover、:active`这些伪类写在后面。
针对超链接,我们来举个例子:
![](http://img.smyhvae.com/20170810_2235.gif)
为了实现上面这个效果,完整版代码如下:
```html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Document</title>
<style type="text/css">
*{
margin: 0;
padding: 0;
}
.nav{
width: 960px;
height: 50px;
border: 1px solid red;
margin: 100px auto;
}
.nav ul{
/*去掉小圆点*/
list-style: none;
}
.nav ul li{
float: left;
width: 120px;
height: 50px;
/*让内容水平居中*/
text-align: center;
/*让行高等于nav的高度就可以保证内容垂直居中*/
line-height: 50px;
}
.nav ul li a{
display: block;
width: 120px;
height: 50px;
}
/*两个伪类的属性,可以用逗号隔开*/
.nav ul li a:link , .nav ul li a:visited{
text-decoration: none;
background-color: purple;
color:white;
}
.nav ul li a:hover{
background-color: orange;
}
</style>
</head>
<body>
<div class="nav">
<ul>
<li><a href="#">网站栏目</a></li>
<li><a href="#">网站栏目</a></li>
<li><a href="#">网站栏目</a></li>
<li><a href="#">网站栏目</a></li>
<li><a href="#">网站栏目</a></li>
<li><a href="#">网站栏目</a></li>
<li><a href="#">网站栏目</a></li>
<li><a href="#">网站栏目</a></li>
</ul>
</div>
</body>
</html>
```
上方代码中,我们发现,当我们在定义`a:link``a:visited`这两个伪类的时候,如果它们的属性相同,我们其实可以写在一起,用逗号隔开就好,摘抄如下:
```css
.nav ul li a{
display: block;
width: 120px;
height: 50px;
}
/*两个伪类的属性,可以用逗号隔开*/
.nav ul li a:link , .nav ul li a:visited{
text-decoration: none;
background-color: purple;
color:white;
}
.nav ul li a:hover{
background-color: orange;
}
```
如上方代码所示最标准的写法就是把link、visited、hover这三个伪类都要写。但是前端开发工程师在大量的实践中发现不写link、visited也挺兼容。写法是
> a:link、a:visited都是可以省略的简写在a标签里面。也就是说a标签涵盖了link、visited的状态前提是都具有了相同的属性。写法如下
```css
.nav ul li a{
display: block;
width: 120px;
height: 50px;
text-decoration: none;
background-color: purple;
color:white;
}
.nav ul li a:hover{
background-color: orange;
}
```
当然了,在写`a:link``a:visited`这两个伪类的时候,要么同时写,要么同时不写。如果只写`a`属性和`a:link`属性,不规范。
## 动态伪类举例
我们在第一段中描述过,下面这三种动态伪类,针对所有标签都适用。
- `:hover` “悬停”:鼠标放到标签上的时候
- `:active` “激活”: 鼠标点击标签,但是不松手时。
- `:focus` 是某个标签获得焦点时的样式(比如某个输入框获得焦点)
我们不妨来举下例子。
举例1
```html
<style type="text/css">
/*
伪类选择器:动态伪类
*/
/*
让文本框获取焦点时:
边框:#FF6F3D这种橙色
文字:绿色
背景色:#6a6a6a这种灰色
*/
input:focus{
border:3px solid #FF6F3D;
color:white;
background-color:#6a6a6a;
}
/*
鼠标放在标签上时显示蓝色
*/
label:hover{
color:blue;
}
/*
点击标签鼠标没有松开时显示红色
*/
label:active{
color:red;
}
</style>
```
效果:
![](http://img.smyhvae.com/2015-10-03-css-02.gif)
利用这个`hover`属性,我们同样对表格做一个样式的设置:
表格举例:
```html
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="Generator" content="EditPlus®">
<meta name="Author" content="">
<meta name="Keywords" content="">
<meta name="Description" content="">
<title>Document</title>
<style type="text/css">
/*整个表格的样式*/
table{
width: 300px;
height: 200px;
border: 1px solid blue;
/*border-collapse属性对表格的线进行折叠*/
border-collapse: collapse;
}
/*鼠标悬停时,让当前行显示#868686这种灰色*/
table tr:hover{
background: #868686;
}
/*每个单元格的样式*/
table td{
border:1px solid red;
}
</style>
</head>
<body>
<table>
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
</table>
</body>
</html>
```
效果:
![](http://img.smyhvae.com/2015-10-03-css-04.gif)
##我的公众号
想学习<font color=#0000ff>**代码之外的技能**</font>?不妨关注我的微信公众号:**千古壹号**id`qianguyihao`)。
扫一扫,你将发现另一个全新的世界,而这将是一场美丽的意外:
![](http://img.smyhvae.com/2016040102.jpg)

View File

@@ -0,0 +1,456 @@
> 本文最初于2017-07-29发表于[博客园](http://www.cnblogs.com/smyhvae/p/7253929.html),并在[GitHub](https://github.com/qianguyihao/Web)上持续更新**前端的系列文章**。欢迎在GitHub上关注我一起入门和进阶前端。
> 以下是正文。
## 本文重点
- CSS的继承性
- CSS的层叠性
- 计算权重
- 权重问题大总结
- CSS样式表的冲突的总结
- 权重问题深入
- 同一个标签,携带了多个类名
- !important标记
## CSS的继承性
我们来看下面这样的代码,来引入继承性:
![](http://img.smyhvae.com/20170724_2359.png)
上方代码中我们给div标签增加红色属性却发现div里的每一个子标签`<p>`也增加了红色属性。于是我们得到这样的结论:
> 有一些属性,当给自己设置的时候,自己的后代都继承上了,这个就是**继承性。**
继承性是从自己开始,直到最小的元素。
但是呢,如果再给上方的代码加一条属性:
![](http://img.smyhvae.com/20170725_2122.jpg)
上图中我们给div加了一个border但是发现只有div具备了border属性而p标签却没有border属性。于是我们可以得出结论
- 关于文字样式的属性都具有继承性。这些属性包括color、 text-开头的、line-开头的、font-开头的。
- 关于盒子、定位、布局的属性,都不能继承。
以后当我们谈到css有哪些特性的时候我们要首先想到继承性。而且要知道哪些属性具有继承性、哪些属性没有继承性。
## CSS的层叠性
很多公司如果要笔试,那么一定会考层叠性。
### 层叠性:计算权重
**层叠性就是css处理冲突的能力。** 所有的权重计算,没有任何兼容问题!
CSS像艺术家一样优雅像工程师一样严谨。
我们来看一个例子,就知道什么叫层叠性了。
![](http://img.smyhvae.com/20170725_2132.png)
上图中三种选择器同时给P标签增加颜色的属性但是文字最终显示的是蓝色这个时候就出现了层叠性的情况。
当多个选择器,选择上了某个元素的时候,要按照如下顺序统计权重:
> **id的数量类的数量标签的数量**
因为对于相同方式的样式表其选择器排序的优先级为ID选择器 > 类选择器 > 标签选择器
针对上面这句话,我们接下来举一些复杂一点的例子。
### 层叠性举例
#### 举例1计算权重
![](http://img.smyhvae.com/20170725_2138.png)
如上图所示,统计各个选择器的数量,优先级高的胜出。文字的颜色为红色。
PS不进位实际上能进位奇淫知识点255个标签等于1个类名但是没有实战意义
#### 举例2权重相同时
![](http://img.smyhvae.com/20170725_2250.png)
上图可以看到,第一个样式和第二个样式的权重相同。但第二个样式的书写顺序靠后,因此以第二个样式为准(就近原则)。
#### 举例3具有实战性的例子
![](http://img.smyhvae.com/20170726_2221.png)
现在我要让一个列表实现上面的这种样式第一个li为红色剩下的li全部为蓝色。
如果写成下面这种代码是无法实现的:
![](http://img.smyhvae.com/20170726_2225.png)
无法实现的原因很简单,计算一下三个选择器的权重就清楚了,显然第二个样式被第一个样式表覆盖了。
正确的做法是:(**非常重要**
![](http://img.smyhvae.com/20170726_2229.png)
上图中,第二个样式比第一个样式的权重要大。因此在实战中可以实现这种效果:**所有人当中,让某一个人为红,让其他所有人为蓝。**
这种方式好用是好用,但用好很难。
就拿上方代码来举例,为了达到这种效果,即为了防止权重不够,比较稳妥的做法是:**把第二个样式表照着第一个样式表来写,在此基础上,给第二个样式表再加一个权重。**
上面这个例子很具有实战性。
#### 举例4继承性造成的影响
这里需要声明一点:
>如果不能直接选中某个元素通过继承性影响的话那么权重是0。
为了验证上面这句话,我们来看看下面这样的例子:
![](http://img.smyhvae.com/20170727_0843.png)
另外:**如果大家的权重相同,那么就采用就近原则:谁描述的近,听谁的**。举例如下:(box3 描述得最近,所以采用 box3 的属性)
![](http://img.smyhvae.com/20190122_1530.png)
上方代码的文字版如下:
```html
<!DOCTYPE html>
<html lang="">
<head>
<meta />
<meta />
<meta />
<title>Document</title>
<style>
#box1 {
color: red;
}
#box2 {
color: green;
}
#box3 {
color: blue;
}
</style>
</head>
<body>
<div id="box1">
<div id="box2">
<div id="box3"><p>猜猜我是什么颜色</p></div>
</div>
</div>
</body>
</html>
```
### 层叠性:权重计算的问题大总结(非常重要)
层叠性。层叠性是一种能力就是处理冲突的能力。当不同选择器对一个标签的同一个样式有不同的值听谁的这就是冲突。css有着严格的处理冲突的机制。
通过列举上面几个例子,我们对权重问题做一个总结。
![](http://img.smyhvae.com/20170727_2050.png)
上面这个图非常重要,我们针对这个图做一个文字描述:
- 选择上了,数权重,(id的数量类的数量标签的数量)。如果权重一样,谁写在后面听谁的。
- 没有选择上,通过继承影响的,就近原则,谁描述的近听谁的。如果描述的一样近,比如选择器权重,如果权重再一样重,谁写在后面听谁的。
### CSS样式表的冲突的总结
- 1、对于相同的选择器比如同样都是类选择器其样式表排序行级样式 > 内嵌样式表 > 外部样式表(就近原则)
- 2、对于相同类型的样式表比如同样都是内部样式表其选择器排序ID选择器 > 类选择器 > 标签选择器
- 3、外部样式表的ID选择器 > 内嵌样式表的标签选择器
> 总结就近原则。ID选择器优先级最大。
举例如果都是内嵌样式表优先级的顺序如下ID 选择器 > 类选择器 > 标签选择器)
![](http://img.smyhvae.com/2015-10-03-css-14.png)
另外还有两个冲突的情况:
- 1、对同一个标签如果用到的都是内嵌样式表且权重一致那它的优先级**定义**的CSS样式表中谁最近就用谁。
- 2、对于同一个标签如果用到的都是外部样式表且权重一致那它的优先级html文件中引用样式表的位置越近就用谁。
例如:
![](http://img.smyhvae.com/2015-10-03-css-16.png)
### 题目演示
CSS的层叠性讲完了我们来做几个题目吧。
#### 题目1
![](http://img.smyhvae.com/20170727_0851.png)
#### 题目2
![](http://img.smyhvae.com/20170727_0853.png)
#### 题目3
![](http://img.smyhvae.com/20170727_0855.png)
#### 题目4
![](http://img.smyhvae.com/20170727_0857.png)
## 权重问题深入
### 同一个标签,携带了多个类名,有冲突:
这里需要补充两种冲突的情况:
- 1、对同一个标签如果用到了了多个相同的内嵌样式表它的优先级 **定义**的样式表中,谁最近,就用谁。
- 2、对于同一个标签如果引用了多个相同的外部样式表它的优先级html文件中引用样式表的位置越近就用谁。
例如:(就近原则)
![](http://img.smyhvae.com/20170727_2021.png)
上图中,**文字显示的颜色均为红色**。因为这和在标签中的挂类名的书序无关只和css的顺序有关。
### !important标记
来看个很简单的例子:
![](http://img.smyhvae.com/20170727_2029.png)
上图中显然id选择器的权重最大所以文字的颜色是红色。
如果我们想让文字的颜色显示为绿色,只需要给标签选择器的加一个`!important`标记,此时其权重为无穷大。如下:
![](http://img.smyhvae.com/20170727_2035_2.png)
important是英语里面的“重要的”的意思。我们可以通过如下语法
```
k:v !important;
```
来给一个属性提高权重。这个属性的权重就是**无穷大**。
注意,一定要注意语法的正确性。
正确的语法:
```
font-size:60px !important;
```
错误的语法:
```
font-size:60px; !important; 不能把!important写在外面
font-size:60px important; 不能忘记感叹号
```
`!important`标记需要强调如下3点
**1!important提升的是一个属性而不是一个选择器**
```css
p{
color:red !important; !important
font-size: 100px ; !important
}
#para1{
color:blue;
font-size: 50px;
}
.spec{
color:green;
font-size: 20px;
}
```
所以综合来看字体颜色是red听important的字号是50px听id的
**2!important无法提升继承的权重该是0还是0**
比如HTML结构
```html
<div>
<p>哈哈哈哈哈哈哈哈</p>
</div>
```
有CSS样式
```css
div{
color:red !important;
}
p{
color:blue;
}
```
由于div是通过继承性来影响文字颜色的所以!important无法提升它的权重权重依然是0。
干不过p标签因为p标签是实实在在选中了所以字是蓝色的以p为准
**(3)!important不影响就近原则**
如果大家都是继承来的按理说应该按照“就近原则”那么important能否影响就近原则呢
答案是不影响。远的永远是远的。不能给远的写一个important干掉近的。
为了验证这个问题,我们可以搞两层具有继承性的标签,然后给外层标签加一个!important最终看看就近原则有没有被打破。举例如下
![](http://img.smyhvae.com/20170727_2046.png)
PS! important做站的时候不允许使用。因为会让css写的很乱。
现在,我们知道层叠性能比较很多东西:
选择器的写法权重,谁离的近,谁写在下面。
## 知识回顾
> 我们把以上内容和上一篇文章做一个简单的知识回顾。
### CSS属性
> css属性面试的时候会有笔试笔试没有智能感应的。
加粗,倾斜,下划线:
```
font-weight:bold;
font-style:italic;
text-decoration:underline;
```
背景颜色、前景色:
```
background-color:red;
color:red;
```
### class和id的区别
class用于css的id用于js的。
1class页面上可以重复。id页面上唯一不能重复。
2一个标签可以有多个class用空格隔开。但是id只能有id。
### 各种选择器(浏览器兼容性)
IE6层面兼容的选择器 标签选择器、id选择器、类选择器、后代、交集选择器、并集选择器、通配符。如下
```
p
#box
.spec
div p
div.spec
div,p
*
```
IE7能够兼容的儿子选择器、下一个兄弟选择器。如下
```
div>p
h3+p
```
IE8能够兼容的
```
ul li:first-child
ul li:last-child
```
### css两个性质
- 继承性:好的事儿。继承从上到下,哪些能?哪些不能?
- 层叠性:冲突,多个选择器描述了同一个属性,听谁的?
再看几个题目:
![](http://img.smyhvae.com/20170727_0900.png)
![](http://img.smyhvae.com/20170727_0901.png)
![](http://img.smyhvae.com/20170727_0902.png)
![](http://img.smyhvae.com/20170727_0903.png)
权重问题大总结,最后有个例子,比较难,暂时略掉。
## 我的公众号
想学习<font color=#0000ff>**代码之外的技能**</font>?不妨关注我的微信公众号:**千古壹号**id`qianguyihao`)。
扫一扫,你将发现另一个全新的世界,而这将是一场美丽的意外:
![](http://img.smyhvae.com/2016040102.jpg)

View File

@@ -0,0 +1,545 @@
> 本文最初发表于[博客园](http://www.cnblogs.com/smyhvae/p/7256371.html),并在[GitHub](https://github.com/qianguyihao/Web)上持续更新。以下是正文。
## 盒子模型
### 前言
盒子模型英文即box model。无论是div、span、还是a都是盒子。
但是,图片、表单元素一律看作是文本,它们并不是盒子。这个很好理解,比如说,一张图片里并不能放东西,它自己就是自己的内容。
### 盒子中的区域
一个盒子中主要的属性就5个width、height、padding、border、margin。如下
- width和height**内容**的宽度、高度(不是盒子的宽度、高度)。
- padding内边距。
- border边框。
- margin外边距。
盒子模型的示意图:
![](http://img.smyhvae.com/20170727_2128.png)
代码演示:
![](http://img.smyhvae.com/20170727_2326.png)
上面这个盒子width:200px; height:200px; 但是真实占有的宽高是302*302。 这是因为还要加上padding、border。
注意:**宽度和真实占有宽度,不是一个概念!**来看下面这例子。
### 标准盒模型和IE盒模型
> 我们目前所学习的知识中,以标准盒子模型为准。
标准盒子模型:
![](http://img.smyhvae.com/2015-10-03-css-27.jpg)
IE盒子模型
![](http://img.smyhvae.com/2015-10-03-css-30.jpg)
上图显示:
在 CSS 盒子模型 (Box Model) 规定了元素处理元素的几种方式:
- width和height**内容**的宽度、高度(不是盒子的宽度、高度)。
- padding内边距。
- border边框。
- margin外边距。
CSS盒模型和IE盒模型的区别
- 在 <font color="#0000FF">**标准盒子模型**</font>中,<font color="#0000FF">**width 和 height 指的是内容区域**</font>的宽度和高度。增加内边距、边框和外边距不会影响内容区域的尺寸,但是会增加元素框的总尺寸。
- <font color="#0000FF">**IE盒子模型**</font>中,<font color="#0000FF">**width 和 height 指的是内容区域+border+padding**</font>的宽度和高度。
Android中也有margin和padding的概念意思是差不多的如果你会一点Android应该比较好理解吧。区别在于Android中没有border这个东西而且在Android中margin并不是控件的一部分我觉得这样做更合理一些呵呵。
<br>
### `<body>`标签也有margin
`<body>`标签有必要强调一下。很多人以为`<body>`标签占据的是整个页面的全部区域,其实是错误的,正确的理解是这样的:整个网页最大的盒子是`<document>`,即浏览器。而`<body>``<document>`的儿子。浏览器给`<body>`默认的margin大小是8个像素此时`<body>`占据了整个页面的一大部分区域,而不是全部区域。来看一段代码。
```html
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="Generator" content="EditPlus®">
<meta name="Author" content="">
<meta name="Keywords" content="">
<meta name="Description" content="">
<title>Document</title>
<style type="text/css">
div{
width: 100px;
height: 100px;
border: 1px solid red;
padding: 20px;
margin: 30px;
}
</style>
</head>
<body>
<div>有生之年</div>
<div>狭路相逢</div>
</body>
</html>
```
上面的代码中我们对div标签设置了边距等信息。打开google浏览器按住F12显示效果如下
![](http://img.smyhvae.com/20151003_27.png)
### 认识width、height
一定要知道,在前端开发工程师眼中,世界中的一切都是不同的。
比如说,丈量稿纸,前端开发工程师只会丈量内容宽度:
![](http://img.smyhvae.com/20170727_2329.png)
下面这两个盒子真实占有宽高都是302*302
盒子1
```css
.box1{
width: 100px;
height: 100px;
padding: 100px;
border: 1px solid red;
}
```
盒子2
```css
.box2{
width: 250px;
height: 250px;
padding: 25px;
border: 1px solid red;
}
```
真实占有宽度 = 左border + 左padding + width + 右padding + 右border
上面这两个盒子的盒模型图如下:
![](http://img.smyhvae.com/20170728_0925.png)
**如果想保持一个盒子的真实占有宽度不变那么加width的时候就要减padding。加padding的时候就要减width**。因为盒子变胖了是灾难性的,这会把别的盒子挤下去。
### 认识padding
#### padding区域也有颜色
padding就是内边距。padding的区域有背景颜色css2.1前提下并且背景颜色一定和内容区域的相同。也就是说background-color将填充**所有border以内的区域。**
效果如下:
![](http://img.smyhvae.com/20170728_1005.png)
#### padding有四个方向
padding是4个方向的所以我们能够分别描述4个方向的padding。
方法有两种,第一种写小属性;第二种写综合属性,用空格隔开。
小属性的写法:
```
padding-top: 30px;
padding-right: 20px;
padding-bottom: 40px;
padding-left: 100px;
```
综合属性的写法:(上、右、下、左)顺时针方向用空格隔开。margin的道理也是一样的
```
padding:30px 20px 40px 100px;
```
如果写了四个值,则顺序为:上、右、下、左。
如果只写了三个值,则顺序为:上、右、下。??和右一样。
如果只写了两个值,比如说:
```
padding: 30px 40px;
```
则顺序等价于30px 40px 30px 40px;
要懂得,**用小属性层叠大属性**。比如:
```
padding: 20px;
padding-left: 30px;
```
上面的padding对应盒子模型为
![](http://img.smyhvae.com/20170728_1039.png)
下面的写法:
```
padding-left: 30px;
padding: 20px;
```
第一行的小属性无效,因为被第二行的大属性层叠掉了。
下面的题,会做了,说明你明白了。
#### 一些题目
**题目1**:说出下面盒子真实占有宽高,并画出盒模型图。
```css
div{
width: 200px;
height: 200px;
padding: 10px 20px 30px;
padding-right: 40px;
border: 1px solid #000;
}
```
答案:
![](http://img.smyhvae.com/20170728_1048.png)
**题目2**:说出下面盒子真实占有宽高,并画出盒模型图。
```css
div{
width: 200px;
height: 200px;
padding-left: 10px;
padding-right: 20px;
padding:40px 50px 60px;
padding-bottom: 30px;
border: 1px solid #000;
}
```
答案:
`padding-left:10px``padding-right:20px;` 没用因为后面的padding大属性层叠掉了他们。
盒子模型如下:
![](http://img.smyhvae.com/20170728_1100.png)
**题目3**:现在给你一个盒子模型图,请写出代码,试着用最最简单的方法写。
![](http://img.smyhvae.com/20170728_1401.png)
答案:
```
width:123px;
height:123px;
padding:20px 40px;
border:1px solid red;
```
**题目4**:现在给你一个盒子模型图,请写出代码,试着用最最简单的方法写。
![](http://img.smyhvae.com/20170728_1402.png)
答案:
```
width:123px;
height:123px;
padding:20px;
padding-right:40px;
border:1px solid red;
```
#### 一些元素默认带有padding
一些元素,默认带有`padding`比如ul标签。如下
![](http://img.smyhvae.com/20170728_1413.png)
上图显示不加任何样式的ul也是有40px的padding-left。
所以我们做站的时候为了便于控制总是喜欢清除这个默认的padding。
可以使用`*`进行清除:
```
*{
margin: 0;
padding: 0;
}
```
但是,`*`的效率不高,所以我们使用并集选择器,罗列所有的标签(不用背,有专业的清除默认样式的样式表,今后学习):
```
body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td{
margin:0;
padding:0;
}
```
### 认识border
border就是边框。边框有三个要素像素粗细、线型、颜色。
颜色如果不写,默认是黑色。另外两个属性不写,要命了,显示不出来边框。
#### border-style
border的所有的线型如下我们可以通过查看`CSS参考手册`得到)
![](http://img.smyhvae.com/20170728_1435.png)
比如`border:10px ridge red;`这个属性在chrome和firefox、IE中有细微差别因为可以显示出效果因此并不是兼容性问题只是有细微差别而已
![](http://img.smyhvae.com/20170728_1619.png)
如果公司里面的设计师是处女座的,追求极高的**页面还原度**那么不能使用css来制作边框。就要用到图片就要切图了。
所以比较稳定的border-style就几个solid、dashed、dotted。
#### border拆分
border是一个大综合属性。比如说
```
border:1px solid red;
```
就是把4个边框都设置为1px宽度、线型实线、red颜色。
PS小技巧在sublime text中为了快速输入`border:1px solid red;`这个属性,可以直接输入`bd`,然后选第二个后回车。
border属性是能够被拆开的有两大种拆开的方式
- 1按三要素拆开border-width、border-style、border-color。一个border属性是由三个小属性综合而成的
- 2按方向拆开border-top、border-right、border-bottom、border-left。
现在我们明白了:**一个border属性是由三个小属性综合而成的**。如果某一个小属性后面是空格隔开的多个值,那么就是上右下左的顺序。举例如下:
```
border-width:10px 20px;
border-style:solid dashed dotted;
border-color:red green blue yellow;
```
效果如下:
![](http://img.smyhvae.com/20170728_1516.png)
1按三要素拆
```
border-width:10px; //边框宽度
border-style:solid; //线型
border-color:red; //颜色。
```
等价于:
```
border:10px solid red;
```
(2)按方向来拆:
```
border-top:10px solid red;
border-right:10px solid red;
border-bottom:10px solid red;
border-left:10px solid red;
```
等价于:
```
border:10px solid red;
```
3按三要素和方向来拆(就是把每个方向的每个要素拆开。3*4 = 12)
```
border-top-width:10px;
border-top-style:solid;
border-top-color:red;
border-right-width:10px;
border-right-style:solid;
border-right-color:red;
border-bottom-width:10px;
border-bottom-style:solid;
border-bottom-color:red;
border-left-width:10px;
border-left-style:solid;
border-left-color:red;
```
等价于:
```
border:10px solid red;
```
工作中到底用什么?很简答:什么简单用什么。但要懂得,用小属性层叠大属性。举例如下:
![](http://img.smyhvae.com/20170728_1606.png)
为了实现上方效果,写法如下:
```
border:10px solid red;
border-right-color:blue;
```
![](http://img.smyhvae.com/20170728_1608.png)
为了实现上方效果,写法如下:
```
border:10px solid red;
border-style:solid dashed;
```
border可以没有
```
border:none;
```
可以某一条边没有:
```
border-left: none;
```
也可以调整左边边框的宽度为0
```
border-left-width: 0;
```
#### 举例利用border属性画一个三角形小技巧
步骤如下:
1当我们设置盒子的width和height为0时此时效果如下
![](http://img.smyhvae.com/20170728_1640.png)
2然后将border的底部取消
![](http://img.smyhvae.com/20170728_1645.png)
3最后设置border的左边和右边为白色
![](http://img.smyhvae.com/20170728_1649.png)
这样,一个三角形就画好了。
## 我的公众号
想学习<font color=#0000ff>**代码之外的技能**</font>?不妨关注我的微信公众号:**千古壹号**id`qianguyihao`)。
扫一扫,你将发现另一个全新的世界,而这将是一场美丽的意外:
![](http://img.smyhvae.com/2016040102.jpg)

979
02-CSS基础/07-浮动.md Normal file
View File

@@ -0,0 +1,979 @@
> 本文最初发表于[博客园](http://www.cnblogs.com/smyhvae/p/7297736.html),并在[GitHub](https://github.com/qianguyihao/Web)上持续更新。以下是正文。
## 文本主要内容
- 标准文档流
- 标准文档流的特性
- 行内元素和块级元素
- 行内元素和块级元素的相互转换
- 浮动的性质
- 浮动的清除
- 浏览器的兼容性问题
- 浮动中margin相关
- 关于margin的IE6兼容问题
## 标准文档流
宏观地讲我们的web页面和photoshop等设计软件有本质的区别web页面的制作是个“流”必须从上而下像“织毛衣”。而设计软件想往哪里画个东西都能画。
### 标准文档流的特性
**1空白折叠现象**
无论多少个空格、换行、tab都会折叠为一个空格。
比如如果我们想让img标签之间没有空隙必须紧密连接
```
<img src="images/0.jpg" /><img src="images/1.jpg" /><img src="images/2.jpg" />
```
**2高矮不齐底边对齐**
举例如下:
![](http://img.smyhvae.com/20170729_1508_2.png)
**3自动换行一行写不满换行写。**
### 行内元素和块级元素
学习的初期,我们就要知道,标准文档流等级森严。标签分为两种等级:
- 行内元素
- 块级元素
我们可以举一个例子,看看块级元素和行内元素的区别:
![](http://img.smyhvae.com/20170729_1529_2.png)
上图中可以看到,`h1`标签是块级元素,占据了整行,`span`标签是行内元素,只占据内容这一部分。
现在我们尝试给两个标签设置宽高。效果如下:
![](http://img.smyhvae.com/20170729_1532_2.png)
上图中,我们尝试给两个标签设置宽高,但发现,宽高属性只对块级元素`h1`生效。于是我们可以做出如下总结。
**行内元素和块级元素的区别:**(非常重要)
行内元素:
- 与其他行内元素并排;
- 不能设置宽、高。默认的宽度,就是文字的宽度。
块级元素:
- 霸占一行,不能与其他任何元素并列;
- 能接受宽、高。如果不设置宽度那么宽度将默认变为父亲的100%。
**行内元素和块级元素的分类:**
在以前的HTML知识中我们已经将标签分过类当时分为了文本级、容器级。
从HTML的角度来讲标签分为
- 文本级标签p、span、a、b、i、u、em。
- 容器级标签div、h系列、li、dt、dd。
> PS为甚么说p是文本级标签呢因为p里面只能放文字&图片&表单元素p里面不能放h和ulp里面也不能放p。
现在从CSS的角度讲CSS的分类和上面的很像就p不一样
- 行内元素除了p之外所有的文本级标签都是行内元素。p是个文本级但是是个块级元素。
- 块级元素所有的容器级标签都是块级元素还有p标签。
我们把上面的分类画一个图,即可一目了然:
![](http://img.smyhvae.com/20170729_1545.png)
### 行内元素和块级元素的相互转换
我们可以通过`display`属性将块级元素和行内元素进行相互转换。display即“显示模式”。
#### 块级元素可以转换为行内元素:
一旦给一个块级元素比如div设置
```
display: inline;
```
那么这个标签将立即变为行内元素此时它和一个span无异。inline就是“行内”。也就是说
- 此时这个div不能设置宽度、高度
- 此时这个div可以和别人并排了。
举例如下:
![](http://img.smyhvae.com/20170729_1629.png)
#### 行内元素转换为块级元素:
同样的道理一旦给一个行内元素比如span设置
```
display: block;
```
那么这个标签将立即变为块级元素此时它和一个div无异。block”是“块”的意思。也就是说
- 此时这个span能够设置宽度、高度
- 此时这个span必须霸占一行了别人无法和他并排
- 如果不设置宽度,将撑满父亲
举例如下:
![](http://img.smyhvae.com/20170729_1638.png)
标准流里面的限制非常多,导致很多页面效果无法实现。如果我们现在就要并排、并且就要设置宽高,那该怎么办呢?办法是:移民!**脱离标准流**
css中一共有三种手段使一个元素脱离标准文档流
- 1浮动
- 2绝对定位
- 3固定定位
这便引出我们今天要讲的内容:浮动。
## 浮动的性质
> 浮动是css里面布局用的最多的属性。
现在有两个div分别设置宽高。我们知道它们的效果如下
![](http://img.smyhvae.com/20170729_1722.png)
此时如果给这两个div增加一个浮动属性比如`float: left;`,效果如下:
![](http://img.smyhvae.com/20170729_1723.png)
这就达到了浮动的效果。此时,两个元素并排了,并且两个元素都能够设置宽度、高度了(这在上一段的标准流中,不能实现)。
浮动想学好,一定要知道三个性质。接下来讲一讲。
### 性质1浮动的元素脱标
脱标即脱离标准流。我们来看几个例子。
证明1
![](http://img.smyhvae.com/20170729_2028.png)
上图中在默认情况下两个div标签是上下进行排列的。现在由于float属性让上图中的第一个`<div>`标签出现了浮动,于是这个标签在另外一个层面上进行排列。而第二个`<div>`还在自己的层面上遵从标准流进行排列。
证明2
![](http://img.smyhvae.com/20180111_2320.png)
上图中span标签在标准流中是不能设置宽高的因为是行内元素。但是一旦设置为浮动之后即使不转成块级元素也能够设置宽高了。
所以能够证明一件事:**一旦一个元素浮动了那么将能够并排了并且能够设置宽高了。无论它原来是个div还是个span。**所有标签,浮动之后,已经不区分行内、块级了。
### 性质2浮动的元素互相贴靠
我们来看一个例子就明白了。
我们给三个div均设置了`float: left;`属性之后然后设置宽高。当改变浏览器窗口大小时可以看到div的贴靠效果
![](http://img.smyhvae.com/20170730_1910.gif)
上图显示3号如果有足够空间那么就会靠着2号。如果没有足够的空间那么会靠着1号大哥。
如果没有足够的空间靠着1号大哥3号自己去贴左墙。
不过3号自己去贴墙的时候注意
![](http://img.smyhvae.com/20170730_1928.gif)
上图显示3号贴左墙的时候并不会往1号里面挤。
同样float还有一个属性值是`right`,这个和属性值`left`是对称的。
### 性质3浮动的元素有“字围”效果
来看一张图就明白了。我们让div浮动p不浮动。
![](http://img.smyhvae.com/20170730_2005.png)
上图中,我们发现:**div挡住了p但不会挡住p中的文字**,形成“字围”效果。
总结:**标准流中的文字不会被浮动的盒子遮挡住**。(文字就像水一样)
关于浮动我们要强调一点,浮动这个东西,为避免混乱,我们在初期一定要遵循一个原则:**永远不是一个东西单独浮动,浮动都是一起浮动,要浮动,大家都浮动。**
### 性质4收缩
收缩一个浮动的元素如果没有设置width那么将自动收缩为内容的宽度这点非常像行内元素
举例如下:
![](http://img.smyhvae.com/20170801_1720.png)
上图中div本身是块级元素如果不设置width它会单独霸占整行但是设置div浮动后它会收缩
### 浮动的补充(做网站时注意)
![](http://img.smyhvae.com/20170731_2248.png)
上图所示将para1和para2设置为浮动它们是div的儿子。此时para1+para2的宽度小于div的宽度。效果如上图所示。可如果设置para1+para2的宽度大于div的宽度我们会发现para2掉下来了
![](http://img.smyhvae.com/20170731_2252_2.png)
### 布置一个作业
布置一个作业,要求实现下面的效果:
![](http://img.smyhvae.com/20170801_0858.png)
为实现上方效果,代码如下:
```html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Document</title>
<style type="text/css">
*{
margin: 0;
padding: 0;
}
.header{
width: 970px;
height: 103px;
/*居中。这个语句的意思是:居中:*/
margin: 0 auto;
}
.header .logo{
float: left;
width: 277px;
height: 103px;
background-color: red;
}
.header .language{
float: right;
width: 137px;
height: 49px;
background-color: green;
margin-bottom: 8px;
}
.header .nav{
float: right;
width: 679px;
height: 46px;
background-color: green;
}
.content{
width: 970px;
height: 435px;
/*居中,这个语句今天没讲,你照抄,就是居中:*/
margin: 0 auto;
margin-top: 10px;
}
.content .banner{
float: left;
width: 310px;
height: 435px;
background-color: gold;
margin-right: 10px;
}
.content .rightPart{
float: left;
width: 650px;
height: 435px;
}
.content .rightPart .main{
width: 650px;
height: 400px;
margin-bottom: 10px;
}
.content .rightPart .links{
width: 650px;
height: 25px;
background-color: blue;
}
.content .rightPart .main .news{
float: left;
width: 450px;
height: 400px;
}
.content .rightPart .main .hotpic{
float: left;
width: 190px;
height: 400px;
background-color: purple;
margin-left: 10px;
}
.content .rightPart .main .news .news1{
width: 450px;
height: 240px;
background-color: skyblue;
margin-bottom: 10px;
}
.content .rightPart .main .news .news2{
width: 450px;
height: 110px;
background-color: skyblue;
margin-bottom: 10px;
}
.content .rightPart .main .news .news3{
width: 450px;
height: 30px;
background-color: skyblue;
}
.footer{
width: 970px;
height: 35px;
background-color: pink;
/*没学,就是居中:*/
margin: 0 auto;
margin-top: 10px;
}
</style>
</head>
<body>
<!-- 头部 -->
<div class="header">
<div class="logo">logo</div>
<div class="language">语言选择</div>
<div class="nav">导航条</div>
</div>
<!-- 主要内容 -->
<div class="content">
<div class="banner">大广告</div>
<div class="rightPart">
<div class="main">
<div class="news">
<div class="news1"></div>
<div class="news2"></div>
<div class="news3"></div>
</div>
<div class="hotpic"></div>
</div>
<div class="links"></div>
</div>
</div>
<!-- 页尾 -->
<div class="footer"></div>
</body>
</html>
```
其实,这个页面的布局是下面这个网站:
![](http://img.smyhvae.com/20170801_0900.png)
## 浮动的清除
> 这里所说的清除浮动,指的是清除浮动与浮动之间的影响。
### 前言
通过上面这个例子,我们发现,此例中的网页就是通过浮动实现并排的。
比如说一个网页有header、content、footer这三部分。就拿content部分来举例如果设置content的儿子为浮动但是这个儿子又是一个全新的标准流于是儿子的儿子仍然在标准流里。
从学习浮动的第一天起,我们就要明白,浮动有开始,就要有清除。我们先来做个实验。
下面这个例子有两个块级元素divdiv没有任何属性每个div里有li效果如下
![](http://img.smyhvae.com/20170801_2122.png)
上面这个例子很简单。可如果我们给里面的`<li>`标签加浮动。效果却成了下面这个样子:
代码如下:
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style type="text/css">
*{
}
li{
float: left;
width: 100px;
height: 20px;
background-color: pink;
}
</style>
</head>
<body>
<div class="box1">
<ul>
<li>生命壹号1</li>
<li>生命壹号2</li>
<li>生命壹号3</li>
<li>生命壹号4</li>
</ul>
</div>
<div class="box2">
<ul>
<li>许嵩1</li>
<li>许嵩2</li>
<li>许嵩3</li>
<li>许嵩4</li>
</ul>
</div>
</body>
</html>
```
效果如下:
![](http://img.smyhvae.com/20170801_2137.png)
上图中我们发现第二组中的第1个li去贴靠第一组中的最后一个li了我们本以为这些li会分成两排
这便引出我们要讲的:清除浮动的第一种方式。
那该怎么解决呢?
### 方法1给浮动元素的祖先元素加高度
造成前言中这个现象的根本原因是li的**父亲div没有设置高度**导致这两个div的高度均为0px我们可以通过网页的审查元素进行查看。div的高度为零导致不能给自己浮动的孩子撑起一个容器。
撑不起一个容器,导致自己的孩子没办法在自己的内部进行正确的浮动。
现在就算给这个div设置高度可如果div自己的高度小于孩子的高度也会出现不正常的现象
![](http://img.smyhvae.com/20170801_2152.png)
给div设置一个正确的合适的高度至少保证高度大于儿子的高度就可以看到正确的现象
![](http://img.smyhvae.com/20170801_2153.png)
**总结:**
**如果一个元素要浮动,那么它的祖先元素一定要有高度。**
**有高度的盒子,才能关住浮动**。(记住这句过来人的经验之语)
只要浮动在一个有高度的盒子中,那么这个浮动就不会影响后面的浮动元素。所以就是清除浮动带来的影响了。
![](http://img.smyhvae.com/20170801_2200.png)
![](http://img.smyhvae.com/20170801_2201.png)
### 方法2clear:both;
网页制作中高度height其实很少出现。为什么因为能被内容撑高也就是说刚刚我们讲解的方法1工作中用得很少。
那么能不能不写height也把浮动清除了呢也让浮动之间互不影响呢
这个时候,我们可以使用`clear:both;`这个属性。如下:
![](http://img.smyhvae.com/20170801_2233.png)
```
clear:both;
```
clear就是清除both指的是左浮动、右浮动都要清除。`clear:both`的意思就是:**不允许左侧和右侧有浮动对象。**
这种方法有一个非常大的、致命的问题,**它所在的标签margin属性失效了**。读者可以试试看。
margin失效的本质原因是上图中的box1和box2高度为零。
### 方法3隔墙法
上面这个例子中为了防止第二个div贴靠到第二个div我们可以在这两个div中间用一个新的div隔开然后给这个新的div设置`clear: both;`属性同时既然这个新的div无法设置margin属性我们可以给它设置height以达到margin的效果曲线救国。这便是隔墙法。
我们看看例子效果就知道了:
![](http://img.smyhvae.com/20170802_1109.png)
上图这个例子就是隔墙法。
**内墙法:**
近些年,有演化出了“内墙法”:
![](http://img.smyhvae.com/20170802_1123.png)
上面这个图非常重要,当作内墙法的公式,先记下来。
为了讲内墙法,我们先记住一句重要的话:**一个父亲是不能被浮动的儿子撑出高度的**。举例如下:
1我们在一个div里放一个有宽高的p效果如下很简单
![](http://img.smyhvae.com/20170802_1716.png)
2可如果在此基础之上给p设置浮动却发现父亲div没有高度了
![](http://img.smyhvae.com/20170802_1730.png)
3此时我么可以在div的里面放一个div作为内墙就可以让父亲div恢复高度
![](http://img.smyhvae.com/20170802_1812.png)
于是,我们采用内墙法解决前言中的问题:
![](http://img.smyhvae.com/20170802_1834.png)
与外墙法相比内墙法的优势本质区别在于内墙法可以给它所在的家撑出宽度让box1有高。即box1的高度可以自适应内容。
而外墙法虽然一道墙可以把两个div隔开但是这两个div没有高也就是说无法wrap_content。
### 清除浮动方法4overflow:hidden;
我们可以使用如下属性:
```
overflow:hidden;
```
overflow即“溢出” hidden即“隐藏”。这个属性的意思是“溢出隐藏”。顾名思义所有溢出边框的内容都要隐藏掉。如下
![](http://img.smyhvae.com/20170804_1449.png)
上图显示,`overflow:hidden;`的本意是清除溢出到盒子外面的文字。但是,前端开发工程师发现了,它能做偏方。如下:
一个父亲不能被自己浮动的儿子,撑出高度。但是,只要给父亲加上`overflow:hidden`; 那么,父亲就能被儿子撑出高了。这是一个偏方。
举个例子:
![](http://img.smyhvae.com/20170804_1920.png)
那么对于前言中的例子,我们同样可以使用这一属性:
![](http://img.smyhvae.com/20170804_1934.png)
## 浮动清除的总结
> 我们在上一段讲了四种清除浮动的方法,本段来进行一个总结。
浮动的元素,只能被有高度的盒子关住。 也就是说,如果盒子内部有浮动,这个盒子有高,那么妥妥的,浮动不会互相影响。
### 1、加高法
工作上,我们绝对不会给所有的盒子加高度,这是因为麻烦,并且不能适应页面的快速变化。
```html
<div> //设置height
<p></p>
<p></p>
<p></p>
</div>
<div> //设置height
<p></p>
<p></p>
<p></p>
</div>
```
### 2、`clear:both;`法
最简单的清除浮动的方法就是给盒子增加clear:both表示自己的内部元素不受其他盒子的影响。
```html
<div>
<p></p>
<p></p>
<p></p>
</div>
<div> //clear:both;
<p></p>
<p></p>
<p></p>
</div>
```
浮动确实被清除了不会互相影响了。但是有一个问题就是margin失效。两个div之间没有任何的间隙了。
### 3、隔墙法
在两部分浮动元素中间,建一个墙。隔开两部分浮动,让后面的浮动元素,不去追前面的浮动元素。
墙用自己的身体当做了间隙。
```html
<div>
<p></p>
<p></p>
<p></p>
</div>
<div class="cl h10"></div>
<div>
<p></p>
<p></p>
<p></p>
</div>
```
我们发现隔墙法好用但是第一个div还是没有高度。如果我们现在想让第一个div自动根据自己的儿子撑出高度我们就要想一些“小伎俩”。
内墙法:
```html
<div>
<p></p>
<p></p>
<p></p>
<div class="cl h10"></div>
</div>
<div>
<p></p>
<p></p>
<p></p>
</div>
```
内墙法的优点就是不仅仅能够让后部分的p不去追前部分的p了并且能把第一个div撑出高度。这样这个div的背景、边框就能够根据p的高度来撑开了。
### 4、`overflow:hidden;`
这个属性的本意,就是将所有溢出盒子的内容,隐藏掉。但是,我们发现这个东西能够用于浮动的清除。
我们知道一个父亲不能被自己浮动的儿子撑出高度但是如果这个父亲加上了overflow:hidden那么这个父亲就能够被浮动的儿子撑出高度了。这个现象不能解释就是浏览器的偏方。
并且,overflow:hidden;能够让margin生效。
**清除浮动的例子:**
我们现在举个例子,要求实现下图中无序列表部分的效果:
![](http://img.smyhvae.com/20170804_2321.png)
对比一下我们讲的四种清除浮动的方法。如果用外墙法ul中不能插入div标签因为ul中只能插入li如果插入li的墙会浪费语义。如果用内墙法不美观。综合对比还是用第四种方法来实现吧这会让标签显得极其干净整洁
![](http://img.smyhvae.com/20170805_1615.png)
上方代码中,如果没有加`overflow:hidden;`那么第二行的li会紧跟着第一行li的后面。
## 浏览器的兼容性问题
> 讲一下上述知识点涉及到的浏览器兼容问题。
### 兼容性1微型盒子
**兼容性的第一条**IE6不支持小于12px的盒子任何小于12px的盒子在IE6中看都大。即IE 6不支持微型盒子。
举个例子。我们设置一个height为 5px 、宽度为 200px的盒子看下在IE 8和 IE 6中的显示效果
![](http://img.smyhvae.com/20170805_1726.png)
解决办法很简单,就是将盒子的字号大小,设置为**小于盒子的高**比如如果盒子的高为5px那就把font-size设置为0px(0px < 5px)。如下:
```
height: 5px;
_font-size: 0px;
```
我们现在介绍一下浏览器hack。hack就是“黑客”就是使用浏览器提供的后门针对某一种浏览器做兼容。
IE6留了一个**后门**只要给css属性之前加上**下划线**这个属性就是IE6的专有属性。
比如说,我们给背景颜色这个属性加上下划线,就变成了`_background-color: green;`。效果如下:
![](http://img.smyhvae.com/20170805_2026.png)
于是乎为了解决微型盒子即height小于12px的问题正确写法注意不要忘记下划线
```
height: 10px;
_font-size:0;
```
### 兼容性2
**兼容性的第二条:**IE6不支持用`overflow:hidden;`来清除浮动。
解决办法,以毒攻毒。追加一条:
```
_zoom:1;
```
完整写法:
```
overflow: hidden;
_zoom:1;
```
实际上,`_zoom:1;`能够触发浏览器hasLayout机制。这个机制不要深究了因为只有IE6有。我们只需要让IE6好用具体的实现机制可以自行查阅。
需要强调的是,`overflow:hidden;`的本意就是让溢出盒子的border的内容隐藏这个功能是IE6兼容的。不兼容的是`overflow:hidden;`清除浮动的时候。
**总结:**
我们刚才学习的两个IE6的兼容问题都是通过多写一条hack来解决的这个我们称为伴生属性即两个属性要写一起写。
属性1
```
height:6px;
_font-size:0;
```
属性2
```
overflow:hidden;
_zoom:1;
```
## margin相关
> 我们来讲一下浮动中和margin相关的知识。
### margin塌陷/margin重叠
**标准文档流中竖直方向的margin不叠加取**较大的值**作为margin(水平方向的margin是可以叠加的即水平方向没有塌陷现象)。如下图所示:
![](http://img.smyhvae.com/20170805_0904.png)
如果不在标准流,比如盒子都浮动了,那么两个盒子之间是没有塌陷现象的。
### 盒子居中`margin:0 auto;`
margin的值可以为auto表示自动。当left、right两个方向都是auto的时候盒子居中了
```
margin-left: auto;
margin-right: auto;
```
盒子居中的简写为:
```
margin:0 auto;
```
对上方代码的理解上下的margin为0左右的margin都尽可能的大于是就居中了。
注意:
- 1只有标准流的盒子才能使用`margin:0 auto;`居中。也就是说当一个盒子浮动了、绝对定位了、固定定位了都不能使用margin:0 auto;
- 2使用`margin:0 auto;`的盒子必须有width有明确的width。可以这样理解如果没有明确的witdh那么它的witdh就是霸占整行没有意义
- 3`margin:0 auto;`是让盒子居中,不是让盒子里的文本居中。文本的居中,要使用`text-align:center;`
对上面的第三条总结一下:(非常重要)
```
margin:0 auto; //让这个div自己在大容器中的水平方向上居中。
text-align: center; //让这个div内部的文本居中。
```
顺便普及一下知识text-align还有
```
text-align:left; //没啥用,因为默认居左
text-align:right; //文本居右
```
### 善于使用父亲的padding而不是儿子的margin
我们来看一个奇怪的现象。现在有下面这样一个结构div中放一个p
```
<div>
<p></p>
</div>
```
上面的结构中,我们尝试通过给儿子`p`一个`margin-top:50px;`的属性让其与父亲保持50px的上边距。结果却看到了下面的奇怪的现象
![](http://img.smyhvae.com/20170806_1537.png)
此时我们给父亲div加一个border属性就正常了
![](http://img.smyhvae.com/20170806_1544.png)
如果父亲没有border那么儿子的margin实际上踹的是“流”踹的是这“行”。所以父亲整体也掉下来了。
**margin这个属性本质上描述的是兄弟和兄弟之间的距离 最好不要用这个marign表达父子之间的距离。**
所以如果要表达父子之间的距离我们一定要善于使用父亲的padding而不是儿子的margin。
## 关于margin的IE6兼容问题
### IE6的双倍margin的bug
当出现连续浮动的元素携带与浮动方向相同的margin时队首的元素会双倍marign。
```
<ul>
<li></li>
<li></li>
<li></li>
</ul>
```
![](http://img.smyhvae.com/20170806_1558.png)
解决方案:
1使浮动的方向和margin的方向相反。
所以你就会发现我们特别喜欢浮动的方向和margin的方向相反。并且前端开发工程师把这个当做习惯了。
```
float: left;
margin-right: 40px;
```
2使用hack没必要别惯着这个IE6
单独给队首的元素写一个一半的margin
```
<li class="no1"></li>
```
```
ul li.no1{
_margin-left:20px;
}
```
PS双倍margin的问题面试经常问哦。
### IE6的3px bug
![](http://img.smyhvae.com/20170806_1616.png)
解决办法不用管因为根本就不允许用儿子踹父亲即描述父子之间的距离请用padding而不是margin。所以如果你出现了3px bug说明你的代码不标准。
IE6千万不要跟他死坑、较劲它不配。 格调要高我们讲IE6的兼容性问题就是为了增加面试的成功率不是为了成为IE6的专家。
## Fireworks和others
### Fireworks
fireworks是Adobe公司的一个设计软件。功能非常多我们以后用啥讲啥。Fireworks的默认文件格式是png。
标尺的快捷键Ctrl + Alt+ R
### others
首行缩进两个汉字:
```
text-indent: 2em;
```
上方属性中单位比较奇怪叫做emem就是汉字的一个宽度。indent的意思是缩进。
## 我的公众号
想学习<font color=#0000ff>**代码之外的技能**</font>?不妨关注我的微信公众号:**千古壹号**id`qianguyihao`)。
扫一扫,你将发现另一个全新的世界,而这将是一场美丽的意外:
![](http://img.smyhvae.com/2016040102.jpg)

View File

@@ -0,0 +1,528 @@
> 本文最初发表于[博客园](http://www.cnblogs.com/smyhvae/p/8296748.html),并在[GitHub](https://github.com/qianguyihao/Web)上持续更新**前端的系列文章**。欢迎在GitHub上关注我一起入门和进阶前端。
> 以下是正文。
CSS的定位属性有三种分别是绝对定位、相对定位、固定定位。
```
position: absolute; <!-- 绝对定位 -->
position: relative; <!-- 相对定位 -->
position: fixed; <!-- 固定定位 -->
```
下面逐一介绍。
## 相对定位
**相对定位**:让元素相对于自己原来的位置,进行位置调整(可用于盒子的位置微调)。
我们之前学习的背景属性中,是通过如下格式:
```
background-position:向右偏移量 向下偏移量;
```
但这回的定位属性,是通过如下格式:
```
position: relative;
left: 50px;
top: 50px;
```
相对定位的举例:
```html
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="Generator" content="EditPlus®">
<meta name="Author" content="">
<meta name="Keywords" content="">
<meta name="Description" content="">
<title>Document</title>
<style type="text/css">
body{
margin: 0px;
}
.div1{
width: 200px;
height: 200px;
border: 1px solid red;
}
.div2{
position: relative;/*相对定位:相对于自己原来的位置*/
left: 50px;/*横坐标:正值表示向右偏移,负值表示向左偏移*/
top: 50px;/*纵坐标:正值表示向下偏移,负值表示向上偏移*/
width: 200px;
height: 200px;
border: 1px solid red;
}
</style>
</head>
<body>
<div class="div1">有生之年</div>
<div class="div2">狭路相逢</div>
</body>
</html>
```
效果:
![](http://img.smyhvae.com/2015-10-03-css-28.png)
### 相对定位不脱标
**相对定位**:不脱标,老家留坑,**别人不会把它的位置挤走**。
也就是说,相对定位的真实位置还在老家,只不过影子出去了,可以到处飘。
### 相对定位的用途
如果想做“压盖”效果把一个div放到另一个div之上我们一般**不用**相对定位来做。相对定位,就两个作用:
- 1微调元素
- 2做绝对定位的参考子绝父相
### 相对定位的定位值
- left盒子右移
- right盒子左移
- top盒子下移
- bottom盒子上移
PS负数表示相反的方向。
↘:
```
position: relative;
left: 40px;
top: 10px;
```
↙:
```
position: relative;
right: 100px;
top: 100px;
```
↖:
```
position: relative;
right: 100px;
bottom: 100px;
```
↗:
```
position: relative;
left: 200px;
bottom: 200px;
```
![](http://img.smyhvae.com/20180115_1716.png)
如果要描述上面这张图的方向,我们可以首先可以这样描述:
```
position: relative;
left: 200px;
top: 100px;
```
因为`left: 200px`等价于`right: -200px`,所以这张图其实有四种写法。
## 绝对定位
**绝对定位**定义横纵坐标。原点在父容器的左上角或左下角。横坐标用left表示纵坐标用top或者bottom表示。
格式举例如下:
```
position: absolute; /*绝对定位*/
left: 10px; /*横坐标*/
top/bottom: 20px; /*纵坐标*/
```
### 绝对定位脱标
**绝对定位的盒子脱离了标准文档流。**
所以,所有的标准文档流的性质,绝对定位之后都不遵守了。
绝对定位之后,标签就不区分所谓的行内元素、块级元素了,不需要`display:block`就可以设置宽、高了。
### 绝对定位的参考点(重要)
1如果用**top描述**,那么参考点就是**页面的左上角**,而不是浏览器的左上角:
![](http://img.smyhvae.com/20180115_2120.png)
2如果用**bottom描述**,那么参考点就是**浏览器首屏窗口尺寸**(好好理解“首屏”二字),对应的页面的左下角:
![](http://img.smyhvae.com/20180115_2121.png)
为了理解“**首屏**”二字的含义,我们来看一下动态图:
![](http://img.smyhvae.com/20180115_2200.gif)
问题:
![](http://img.smyhvae.com/20180115_2131.png)
答案:
用bottom的定位的时候参考的是浏览器首屏大小对应的页面左下角。
![](http://img.smyhvae.com/20180115_2132.png)
### 以盒子为参考点
一个绝对定位的元素,如果父辈元素中也出现了已定位(无论是绝对定位、相对定位,还是固定定位)的元素,那么将以父辈这个元素,为参考点。
如下:(子绝父相)
![](http://img.smyhvae.com/20180115_2210.png)
以下几点需要注意。
1 要听最近的已经定位的祖先元素的,不一定是父亲,可能是爷爷:
```
<div class="box1"> 相对定位
<div class="box2"> 没有定位
<p></p> 绝对定位将以box1为参考因为box2没有定位box1就是最近的父辈元素
</div>
</div>
```
再比如:
```
<div class="box1"> 相对定位
<div class="box2"> 相对定位
<p></p> 绝对定位将以box2为参考因为box2是自己最近的父辈元素
</div>
</div>
```
2不一定是相对定位任何定位都可以作为儿子的参考点
子绝父绝、**子绝父相**、子绝父固,都是可以给儿子定位的。但是在工程上,如果子绝、父绝,没有一个盒子在标准流里面了,所以页面就不稳固,没有任何实战用途。
**工程应用:**
“**子绝父相**”有意义:这样可以保证父亲没有脱标,儿子脱标在父亲的范围里面移动。于是,工程上经常这样做:
> 父亲浮动,设置相对定位(零偏移),然后让儿子绝对定位一定的距离。
3绝对定位的儿子无视参考的那个盒子的padding
下图中绿色部分是父亲div的padding蓝色部分p是div的内容区域。此时如果div相对定位p绝对定位那么
p将无视父亲的padding在border内侧为参考点进行定位
![](http://img.smyhvae.com/20180116_0812.png)
**工程应用:**
绝对定位非常适合用来做“压盖”效果。我们来举个lagou.com上的例子。
现在有如下两张图片素材:
![](http://img.smyhvae.com/20180116_1115.png)
![](http://img.smyhvae.com/20180116_1116.jpg)
要求作出如下效果:
![](http://img.smyhvae.com/20180116_1117.png)
代码实现如下:
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style type="text/css">
.box{
margin: 100px;
width: 308px;
height: 307px;
border: 1px solid #FF7E00;
position: relative; /*子绝父相*/
}
.box .image img{
width: 308px;
height: 196px;
}
.box .dtc{
display: block; /*转为块级元素才能设置span的宽高*/
width: 52px;
height: 28px;
background-image: url(http://img.smyhvae.com/20180116_1115.png);
background-position: -108px 0px; /*这里用到了精灵图*/
position: absolute; /*采用绝对定位的方式,将精灵图盖在最上层*/
top: -9px;
left: 13px;
}
.box h4{
background-color: black;
color: white;
width:308px;
height: 40px;
line-height: 40px;
position: absolute;
top: 156px;
}
</style>
</head>
<body>
<div class="box">
<span class="dtc"></span>
<div class="image">
<img src="http://img.smyhvae.com/20180116_1116.jpg" alt="">
</div>
<h4>广东深圳宝安区建安一路海雅缤纷城4楼</h3>
</div>
</body>
</html>
```
代码解释如下:
- 为了显示“多套餐”那个小图,我们需要用到精灵图。
- “多套餐”下方黑色背景的文字都是通过“子绝父相”的方式的盖在大海报image的上方的。
代码的效果如下:
![](http://img.smyhvae.com/20180116_1335.png)
### 让绝对定位中的盒子在父亲里居中
我们知道,如果想让一个**标准流中的盒子在父亲里居中**(水平方向看),可以将其设置`margin: 0 auto`属性。
可如果盒子是绝对定位的,此时已经脱标了,如果还想让其居中(位于父亲的正中间),可以这样做:
```
div {
width: 600px;
height: 60px;
position: absolute; 绝对定位的盒子
left: 50%; 首先,让左边线居中
top: 0;
margin-left: -300px; 然后向左移动宽度600px的一半
}
```
如上方代码所示我们先让这个宽度为600px的盒子左边线居中然后向左移动宽度600px的一半就达到效果了。
![](http://img.smyhvae.com/20180116_1356.png)
我们可以总结成一个公式:
> left:50%; margin-left:负的宽度的一半
## 固定定位
**固定定位**:就是相对浏览器窗口进行定位。无论页面如何滚动,这个盒子显示的位置不变。
备注IE6不兼容。
**用途1**:网页右下角的“返回到顶部”
比如我们经常看到的网页右下角显示的“返回到顶部”,就可以固定定位。
```html
<style type="text/css">
.backtop{
position: fixed;
bottom: 100px;
right: 30px;
width: 60px;
height: 60px;
background-color: gray;
text-align: center;
line-height:30px;
color:white;
text-decoration: none; /*去掉超链接的下划线*/
}
</style>
```
**用途2**顶部导航条
我们经常能看到固定在网页顶端的导航条,可以用固定定位来做。
需要注意的是假设顶部导航条的高度是60px那么为了防止其他的内容被导航条覆盖我们要给body标签设置60px的padding-top。
顶部导航条的实现如下:
```html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Document</title>
<style type="text/css">
*{
margin: 0;
padding: 0;
}
body{
/*为什么要写这个?*/
/*不希望我们的页面被nav挡住*/
padding-top: 60px;
/*IE6不兼容固定定位所以这个padding没有什么用就去掉就行了*/
_padding-top:0;
}
.nav{
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 60px;
background-color: #333;
z-index: 99999999;
}
.inner_c{
width: 1000px;
height: 60px;
margin: 0 auto;
}
.inner_c ul{
list-style: none;
}
.inner_c ul li{
float: left;
width: 100px;
height: 60px;
text-align: center;
line-height: 60px;
}
.inner_c ul li a{
display: block;
width: 100px;
height: 60px;
color:white;
text-decoration: none;
}
.inner_c ul li a:hover{
background-color: gold;
}
p{
font-size: 30px;
}
.btn{
display: block;
width: 120px;
height: 30px;
background-color: orange;
position: relative;
top: 2px;
left: 1px;
}
</style>
</head>
<body>
<div class="nav">
<div class="inner_c">
<ul>
<li><a href="#">网页栏目</a></li>
<li><a href="#">网页栏目</a></li>
<li><a href="#">网页栏目</a></li>
<li><a href="#">网页栏目</a></li>
<li><a href="#">网页栏目</a></li>
<li><a href="#">网页栏目</a></li>
<li><a href="#">网页栏目</a></li>
<li><a href="#">网页栏目</a></li>
<li><a href="#">网页栏目</a></li>
<li><a href="#">网页栏目</a></li>
</ul>
</div>
</div>
</body>
</html>
```
### 5、z-index属性
**z-index**属性:表示谁压着谁。数值大的压盖住数值小的。
有如下特性:
1属性值大的位于上层属性值小的位于下层。
2z-index值没有单位就是一个正整数。默认的z-index值是0。
3如果大家都没有z-index值或者z-index值一样那么在HTML代码里写在后面谁就在上面能压住别人。定位了的元素永远能够压住没有定位的元素。
4只有定位了的元素才能有z-index值。也就是说不管相对定位、绝对定位、固定定位都可以使用z-index值。**而浮动的元素不能用**。
5从父现象父亲怂了儿子再牛逼也没用。意思是如果父亲1比父亲2大那么即使儿子1比儿子2小儿子1也能在最上层。
针对123举例如下
这是默认情况下的例子div2在上层div1在下层
![](http://img.smyhvae.com/2015-10-03-css-32.png)
现在加一个`z-index`属性,要求效果如下:
![](http://img.smyhvae.com/2015-10-03-css-33.png)
第五条分析:
![](http://img.smyhvae.com/20180116_1445.png)
z-index属性的应用还是很广泛的。当好几个已定位的标签出现覆盖的现象时我们可以用这个z-index属性决定谁处于最上方。也就是**层级**的应用。
**层级:**
1必须有定位除去static
2`z-index`来控制层级数。
## 我的公众号
想学习<font color=#0000ff>**代码之外的技能**</font>?不妨关注我的微信公众号:**千古壹号**id`qianguyihao`)。
扫一扫,你将发现另一个全新的世界,而这将是一场美丽的意外:
![](http://img.smyhvae.com/2016040102.jpg)

View File

@@ -0,0 +1,508 @@
## 前言
> CSS已经学了一些基础内容了我们来讲解一个小案例吧。以[博雅互动](http://www.boyaa.com/)的官网首页举例。
### 版心
首页的**版心**如下:
![](http://img.smyhvae.com/20170813_1535.png)
这里我们要普及一个概念,叫“[版心](https://baike.baidu.com/item/%E7%89%88%E5%BF%83)”。**版心是页面中主要内容所在的区域。**
比如说网站左上角的logo设计图给出的左边距是143像素此时我们千万不要以为logo的左边距真的是143像素。因为设计图只是一个版心而整个页面是处于浏览器的中间浏览器的宽度是可以随时调整的。
我们量一下中间四个方形图的width是1000px所以网页版心的宽度是1000px。
### 网页的结构
从结构上来看网页分为头部导航栏、banner区、内容区、底部。
## 导航栏的制作
在此我们只讲基础知识的使用,不涉及浏览器的优化。
`class==header`这个div是顶部的通栏我们在里面放一个1000px宽的div作为通栏的版心我一般把这个版心称为`class=inner_c`c指的是center。
`class=inner_c`不需要给高,因为它可以被内容撑高。
现在我们需要在`class=inner_c`里放三个东西左侧的logo、中间的导航栏、右侧的“加入我们”。
接下来我们开始做右侧的「加入我们」「加入我们」的背景是带圆角的矩形这个圆角实现的方式有两种要么切图要么用CSS3实现IE 7、IE 8不兼容。我们暂时使用切图来实现。
我们最好把「加入我们」这个超链接`<a>`放到`div`然后设置div的margin和padding而不是直接设置`<a>`的边距。
我们起个名字叫`class=jrwm`是没有问题的,这在工作当中很常见,如果写成`class=join_us`反倒很别扭。
暂时我们的做法是:
- 1`class=jrwm_box`这个div里放一个`class=jrwm`的div。`class=jrwm`用来放绿色的背景图片。
- 2`class=jrwm`里放一个超链接,并将超链接转为块级元素。
最终,导航栏的代码如下:
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style type="text/css">
*{
margin: 0px;
padding: 0px;
}
body{
font-size: 14px;
font-family: "Microsoft YaHei","SimSun";
height: 8888px;
}
.header{
height: 58px;
background-color: #191D3A;
}
/*版心*/
.inner_c{
width: 1000px;
margin: 0 auto; /*让导航条、内容区域等部分的版心在父亲里居中*/
}
/*导航条的logo*/
.header .logo{
float: left;
margin-right: 40px;
}
.header .nav{
float: left;
}
.header .nav ul{
list-style: none; /*去掉列表前面的圆点*/
}
.header .nav ul li{
float: left;
width: 100px;
line-height: 58px; /*让行高等于这一行的高度,保证里面的文字垂直居中*/
border-left: 1px solid #252947; /*每个li之间有间隔线*/
}
.header .nav ul li.last{
border-right: 1px solid #252947;/*最后一个li的右边加间隔线*/
}
.header .nav ul li a{
display: block; /*将超链接转为块儿,可以保证其霸占父亲的整行*/
height: 58px;
text-decoration: none; /*去掉超链的下划线*/
color:#818496;
text-align: center; /*让这个div内部的文本居中*/
}
.header .nav ul li a.current{
color:white;
background: #252947;
}
.header .nav ul li a:hover{
color: white;
background: #252947;
}
.header .jrwm_box{
float: left;
height: 58px;
width: 100px;
padding-left: 48px;
padding-top: 12px;
}
/*放背景图片的div*/
.header .jrwm_box .jrwm{
height: 34px;
background-image: url(images/jrwm.png);
background-repeat: no-repeat;
text-align: center; /*让这个div内部的超链接居中*/
}
.header .jrwm_box .jrwm a{
display: block; /*将超链接转为块儿,可以保证其霸占父亲的整行*/
line-height: 34px; /*让行高为背景图片的高度,可以保证超链接的文字在背景图片里垂直居中*/
text-decoration: none; /*去掉超链的下划线*/
color: white;
}
</style>
</head>
<body>
<div class="header">
<div class="inner_c">
<div class="logo">
<img src="images/logo.png " alt="">
</div>
<div class="nav">
<ul>
<li><a href="#" class="current">首页</a></li>
<li><a href="#">博雅游戏</a></li>
<li><a href="#">博雅新闻</a></li>
<li><a href="#">关于我们</a></li>
<li><a href="#">客服中心</a></li>
<li class="last"><a href="#">投资者关系</a></li>
</ul>
</div>
<div class="jrwm_box">
<div class="jrwm">
<a href="https://www.google.com/" target="_blank">加入我们</a>
</div>
</div>
</div>
</div>
</body>
</html>
```
导航栏的效果如下:
![](http://img.smyhvae.com/20180114_1332.gif)
## banenr图
> 因为涉及到 js 的内容,这里先不讲内容区域**轮播图**的效果。
我们首先在导航条和banner图之间加一道墙`class=cl`,然后采用隔墙法对其设置`clear: both;`的属性。
然后设置banner的背景图片属性添加banner图。
## 内容区域的制作
导航栏+banner+内容区域的完整代码如下:
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style type="text/css">
*{
margin: 0px;
padding: 0px;
}
/*清除浮动的影响*/
.cl{
clear: both;
}
body{
font-size: 14px;
font-family: "Microsoft YaHei","SimSun";
height: 8888px;
}
.header{
height: 58px;
background-color: #191D3A;
}
/*版心*/
.inner_c{
width: 1000px;
margin: 0 auto; /*让导航条、内容区域等部分的版心在父亲里居中*/
}
/*导航条的logo*/
.header .logo{
float: left;
margin-right: 40px;
}
.header .nav{
float: left;
}
.header .nav ul{
list-style: none; /*去掉列表前面的圆点*/
}
.header .nav ul li{
float: left;
width: 100px;
line-height: 58px; /*让行高等于这一行的高度,保证里面的文字垂直居中*/
border-left: 1px solid #252947; /*每个li之间有间隔线*/
}
.header .nav ul li.last{
border-right: 1px solid #252947;/*最后一个li的右边加间隔线*/
}
.header .nav ul li a{
display: block; /*将超链接转为块儿,可以保证其霸占父亲的整行*/
height: 58px;
text-decoration: none; /*去掉超链的下划线*/
color:#818496;
text-align: center; /*让这个div内部的文本居中*/
}
.header .nav ul li a.current{
color:white;
background: #252947;
}
.header .nav ul li a:hover{
color: white;
background: #252947;
}
.header .jrwm_box{
float: left;
height: 58px;
width: 100px;
padding-left: 48px;
padding-top: 12px;
}
/*放背景图片的div*/
.header .jrwm_box .jrwm{
height: 34px;
background-image: url(images/jrwm.png);
background-repeat: no-repeat;
text-align: center; /*让这个div内部的超链接居中*/
}
.header .jrwm_box .jrwm a{
display: block; /*将超链接转为块儿,可以保证其霸占父亲的整行*/
line-height: 34px; /*让行高为背景图片的高度,可以保证超链接的文字在背景图片里垂直居中*/
text-decoration: none; /*去掉超链的下划线*/
color: white;
}
.banner{
height: 465px;
background: url(images/banner.jpg) no-repeat center top;
}
.content{
padding-top: 50px;
}
.content .product{
height: 229px;
border-bottom: 1px solid #DBE1E7;
}
.content .product ul{
list-style: none;
}
.content .product ul li{
float: left;
width: 218px;
margin-right: 43px;
}
.content .product ul li.last{
margin-right: 0;
width: 217px;
}
.content .product ul li img{
width: 218px;
height: 130px;
}
.content .product ul li.last img{
width: 217px;
}
.content .product ul li h3{
text-align: center;
line-height: 38px;
font-size: 14px;
font-weight: bold;
}
.content .product ul li p.djbf{
text-align: center;
line-height: 16px;
}
.content .product ul li p.djbf a{
font-size: 12px;
color:#38B774;
text-decoration: none;
background:url(images/sanjiaoxing.png) no-repeat right 5px;
padding-right: 12px;
}
</style>
</head>
<body>
<div class="header">
<div class="inner_c">
<div class="logo">
<img src="images/logo.png " alt="">
</div>
<div class="nav">
<ul>
<li><a href="#" class="current">首页</a></li>
<li><a href="#">博雅游戏</a></li>
<li><a href="#">博雅新闻</a></li>
<li><a href="#">关于我们</a></li>
<li><a href="#">客服中心</a></li>
<li class="last"><a href="#">投资者关系</a></li>
</ul>
</div>
<div class="jrwm_box">
<div class="jrwm">
<a href="https://www.google.com/" target="_blank">加入我们</a>
</div>
</div>
</div>
</div>
<!-- 在导航条和banner之间隔一堵墙 -->
<div class="cl"></div>
<div class="banner"></div>
<!-- 内容区域 -->
<div class="content inner_c">
<div class="product">
<ul>
<li>
<p><img src="images/pro1.jpg" alt="" /></p>
<h3>BPT宣传片</h3>
<p class="djbf">
<a href="#">点击播放</a>
</p>
</li>
<li>
<p><img src="images/pro2.jpg" alt="" /></p>
<h3>BPT宣传片</h3>
<p class="djbf">
<a href="#">点击播放</a>
</p>
</li>
<li>
<p><img src="images/pro3.jpg" alt="" /></p>
<h3>BPT宣传片</h3>
<p class="djbf">
<a href="#">点击播放</a>
</p>
</li>
<li class="last">
<p><img src="images/pro4.jpg" alt="" /></p>
<h3>BPT宣传片</h3>
<p class="djbf">
<a href="#">点击播放</a>
</p>
</li>
</ul>
</div>
</div>
</body>
</html>
```
代码解释:
1导航栏左侧的logo
**错误的写法:**
可能会有人直接将img标签作为logo的布局
```html
<div class="logo">
<img src="images/logo.png " alt="">
</div>
```
然后将img的样式设置为
```css
.header .logo{
float: left;
margin-right: 40px;
}
```
这样写虽然视觉效果上达到了但是搜索引擎是搜不到图片的不利于SEO。
**正确的写法:**
正确的写法是将超链接作为logo的布局里面放入文字文字可以被SEO
```html
<h1 class="logo">
<a href="#">
博雅互动-世界上最好的游戏公司
</a>
</h1>
```
然后将**logo设置为背景图**
```css
.header .logo{
float: left;
padding-left: 12px;
margin-right: 39px;
width: 174px;
height: 58px;
}
.header .logo a{
display: block;
width: 174px;
height: 58px;
background:url(images/logo.png) no-repeat;
text-indent: -999em;
}
```
由于搜索引擎是搜不到图片的,所以一定要把“博雅互动”这几个文字加上去,**然后通过`text-indent`缩进的属性把文字赶走到视线以外的地方**。这是做搜索引擎优化的一个重要的技巧。
另外背景要放在里层的a标签里不要放在外层的h1标签里。假设背景图放在h1里那么不管h1的padding有多大背景图的位置都不会变。
1内容区域“点击播放”右侧的小三角形
我们在“点击播放”的右侧放了一个三角形。这个很有技巧。
![](http://img.smyhvae.com/20180115_1356.png)
代码截取如下:
```css
.content .product ul li p.djbf a{
font-size: 12px;
color:#38B774;
text-decoration: none;
background:url(images/sanjiaoxing.png) no-repeat right center;
padding-right: 12px;
}
```
上方代码中我们在第6行给“点击播放”这个超链接加一个右padding很关键然后在第5行把小三角这个背景图放在右padding的位置就能达到想要的视觉效果。
2
导航栏+banner+内容区域的效果如下:
![](http://img.smyhvae.com/20180114_1405.png)

View File

@@ -0,0 +1,125 @@
## 隐藏盒子的几种方式
隐藏盒子,有以下几种方式:
1方式一
```
overflowhidden; //隐藏盒子超出的部分
```
2**方式二**
```
display: none; 隐藏盒子,而且不占位置(用的最多)
```
比如,点击`X`,关闭京东首页上方的广告栏。
3方式三
```
visibility: hidden; //隐藏盒子,占位置。
visibility: visible; //让盒子重新显示
```
4方式四
```
pacity: 0; //设置盒子的透明度(不建议,因为内容也会半透明),占位置
```
4方式五
```
Position/top/left/...-999px //把盒子移得远远的,占位置。
```
5方式六
```
margin-left: 1000px;
```
### 设置盒子的半透明
方式一:`pacity: 0.4`。优点是方便。缺点是:里面的内容也会半透明
方式二css3的技术来解决半透明。如下
- background: rgba(0,0,0,0.3);
- background: rgba(0,0,0,.3);
备注:`a`指的是alpha透明度。
### 给标签的形状设置为圆角矩形
```
border-radius: 50%;
border-radius: 10px 0 0 10px;
```
### 行高的问题:儿子把父亲撑开
比如对于下面这样的标签:
```
<div>
<a href=""></a>
</div>
```
前置条件如果我们给父亲div的行高设为31px然后给儿子a的行高也设置为31
结果当我们给儿子a设置了字体属性之后会发现父亲被撑高为32px了。因为font字体自身会比较大多撑出了一个像素。
解决办法:**行内元素尽量不要设置font属性**。对于行内元素而言如果它和父亲都设置了行高就不要去给自己设置font属性了。要么就不要同时设置行高。
### 背景图不能撑开盒子
高和行高都可以城开盒子,但背景图不能撑开盒子。
## JS
### 超链接`<a>`的href跳转
一个空白的超链接如下:
```
<a href=""></a>
```
当点击超链接时,由于 href 的属性值的不同,可以产生很多种情况:
```bash
href="" //刷新页面
href="#" //跳转到当前页面的顶部(不会刷新)
href="javascript:void(0)" // 什么都不做
href="javascript:;" // 什么都不做
```

View File

@@ -0,0 +1,500 @@
> 本文最初发表于[博客园](http://www.cnblogs.com/smyhvae/p/8426799.html),并在[GitHub](https://github.com/qianguyihao/Web)上持续更新**前端的系列文章**。欢迎在GitHub上关注我一起入门和进阶前端。
> 以下是正文。
## CSS3介绍
CSS3在CSS2基础上**增强**或**新增**了许多特性, 弥补了CSS2的众多不足之处使得Web开发变得更为高效和便捷。
### CSS3的现状
- 浏览器支持程度不够好,有些需要添加**私有前缀**
- 移动端支持优于PC端
- 不断改进中
- 应用相对广泛
### 应对的策略:渐进增强
- 1坚持**渐进增强**的原则:**让低版本浏览器能正常访问页面,高版本的浏览器用户体验更好**。【重要】
比如说,同样是一个头像,可能在低版本的浏览器中,头像方的;在高版本的浏览器中,头像是圆的。
- 2考虑用户群体。
- 3遵照产品的方案。
参考链接:
- [渐进增强 VS 优雅降级 | 简书](https://www.jianshu.com/p/d313f1108862)
- [渐进增强和优雅降级之间的不同(面试题目)](https://www.cnblogs.com/iceflorence/archive/2017/03/27/6625466.html)
### 浏览器的版本问题
由于CSS3普遍存在兼容性问题为了避免因兼容性带来的干扰浏览器的建议版本为
- Chrome浏览器 version 46+
- Firefox浏览器 firefox 42+
### 如何使用手册
CSS参考手册的网址<http://css.doyoe.com/>
CSS参考手册的下载链接<http://download.csdn.net/download/smyhvae/10243974>
在查看[CSS参考手册](http://download.csdn.net/download/smyhvae/10243974)时,需要注意以下符号:
![](http://img.smyhvae.com/20180206_2150.png)
比如说,`{1,4}`表示可以设置一至四个参数。
下面讲CSS3的基础知识。本文讲一下 CSS3 选择器的内容。
## CSS3 选择器
我们之前学过 CSS 的选择器,比如:
```
div 标签选择器
.box 类名选择器
#box id选择器
div p 后代选择器
div.box 交集选择器
div,p,span 并集选择器
div>p 子代选择器
* : 通配符
div+p: 选中div后面相邻的第一个p
div~p: 选中的div后面所有的p
```
CSS3新增了许多**灵活**查找元素的方法,极大的提高了查找元素的效率和**精准度**。CSS3选择器与 jQuery 中所提供的**绝大部分**选择器兼容。
### 属性选择器
属性选择器的标志性符号是 `[]`
匹配含义:
```
^:开头 $:结尾 *:包含
```
格式:
- `E[title]` 选中页面的E元素并且E存在 title 属性即可。
- `E[title="abc"]`选中页面的E元素并且E需要带有title属性且属性值**完全等于**abc。
- `E[attr~=val]` 选择具有 att 属性且属性值为:用空格分隔的字词列表,其中一个等于 val 的E元素。
- `E[attr|=val]` 表示要么是一个单独的属性值,要么这个属性值是以“-”分隔的。
- `E[title^="abc"]` 选中页面的E元素并且E需要带有 title 属性,属性值以 abc 开头。
- `E[title$="abc"]` 选中页面的E元素并且E需要带有 title 属性,属性值以 abc 结尾。
- `E[title*="abc"]` 选中页面的E元素并且E需要带有 title 属性,属性值任意位置包含abc。
比如说我们用属性选择器去匹配标签的className是非常方便的。
这里我们用class属性来举例。代码举例
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>选择器 - 属性</title>
<style>
body {
margin: 0;
padding: 0;
font-family: '微软雅黑';
background-color: #F7F7F7;
}
.wrapper {
width: 1024px;
margin: 0 auto;
}
.wrapper > section {
min-height: 300px;
margin-bottom: 30px;
box-shadow: 1px 1px 4px #DDD;
background-color: #FFF;
}
.wrapper > header {
text-align: center;
line-height: 1;
padding: 20px;
margin-bottom: 10px;
font-size: 30px;
}
.wrapper section > header {
line-height: 1;
padding: 10px;
font-size: 22px;
color: #333;
background-color: #EEE;
}
.wrapper .wrap-box {
padding: 20px;
}
form {
width: 300px;
height: 300px;
margin: 0 auto;
}
form input[type="text"] {
width: 200px;
height: 30px;
}
form input[type="password"] {
width: 200px;
height: 30px;
}
.attr1 {
}
.download {
}
.attr1 a[href="./a.rmvb"] {
color: red;
}
.attr1 a[href="./b.rmvb"] {
color: pink;
}
/* E[attr~=val] 表示的一个单独的属性值 这个属性值是以空格分隔的*/
.attr2 a[class~="download"] {
color: red;
}
/* E[attr|=val] 表示的要么一个单独的属性值 要么这个属性值是以"-"分隔的*/
.attr3 a[class|="download"] {
color: red;
}
/* E[attr*=val] 表示的属性值里包含val字符并且在“任意”位置 */
.attr4 a[class*="download"] {
color: red;
}
/* E[attr^=val] 表示的属性值里包含val字符并且在“开始”位置 */
.attr5 a[class^="download"] {
color: red;
}
/* E[attr$=val] 表示的属性值里包含val字符并且在“结束”位置 */
.attr6 a[class$="download"] {
color: red;
}
</style>
</head>
<body>
<div class="wrapper">
<header>CSS3-属性选择器</header>
<section>
<header>简介</header>
<div class="wrap-box">
<form action="">
<ul>
<li>
姓名: <input type="text">
</li>
<li>
密码: <input type="password">
</li>
<li>
性别: <input type="radio">
<input type="radio">
</li>
<li>
兴趣: <input type="checkbox" name="" id="">写代码
</li>
<li>
<input type="submit" value="提交">
</li>
</ul>
</form>
</div>
</section>
<section class="attr1">
<header>E[attr]</header>
<div class="wrap-box">
<a href="./a.rmvb" class="download download-movie">下载</a>
<a href="./b.rmvb" class="download download-movie">下载</a>
<a href="./a.mp3" class="download download-music">下载</a>
</div>
</section>
<section class="attr2">
<header>E[attr~=attr]</header>
<div class="wrap-box">
<a href="./a.rmvb" class="download download-movie">下载</a>
<a href="./b.rmvb" class="download download-movie">下载</a>
<a href="./a.mp3" class="download download-music">下载</a>
</div>
</section>
<section class="attr3">
<header>E[attr|=attr]</header>
<div class="wrap-box">
<a href="./a.rmvb" class="download">下载</a>
<a href="./b.rmvb" class="download-movie">下载</a>
<a href="./a.mp3" class="download-music">下载</a>
</div>
</section>
<section class="attr4">
<header>E[attr*=val]</header>
<div class="wrap-box">
<a href="./a.rmvb" class="download">下载</a>
<a href="./b.rmvb" class="moviedownload">下载</a>
<a href="./a.mp3" class="downloadmusic">下载</a>
</div>
</section>
<section class="attr5">
<header>E[attr^=val]</header>
<div class="wrap-box">
<a href="./a.rmvb" class="download">下载</a>
<a href="./b.rmvb" class="moviedownload">下载</a>
<a href="./a.mp3" class="downloadmusic">下载</a>
</div>
</section>
<section class="attr6">
<header>E[attr$=val]</header>
<div class="wrap-box">
<a href="./a.rmvb" class="download">下载</a>
<a href="./b.rmvb" class="moviedownload">下载</a>
<a href="./a.mp3" class="downloadmusic">下载</a>
</div>
</section>
</div>
</body>
</html>
```
最后来张表格:
![](http://img.smyhvae.com/20180207_1500.png)
### 结构伪类选择器
伪类选择器的标志性符号是 `:`
CSS中有一些伪类选择器比如`:link``:active``:visited``:hover`,这些是动态伪类选择器。
CSS3又新增了其它的伪类选择器。这一小段我们来学习CSS3中的**结构伪类选择器**:即通过**结构**来进行筛选。
**1、格式第一部分**
- `E:first-child` 匹配父元素的第一个子元素E。
- `E:last-child` 匹配父元素的最后一个子元素E。
- `E:nth-child(n)` 匹配父元素的第n个子元素E。**注意**,盒子的编号是从`1`开始算起,不是从`0`开始算起。
- `E:nth-child(odd)` 匹配奇数
- `E:nth-child(even)` 匹配偶数
- `E:nth-last-child(n)` 匹配父元素的倒数第n个子元素E。
理解:
1这里我们要好好理解**父元素**的含义,它指的是:以 E 元素的父元素为参考。
2注意以上选择器中所选到的元素的类型必须是指定的类型E如果选不中则无效。这个要好好理解具体可以看CSS参考手册中的`E:nth-child(n)`的示例。我们可以理解成:**先根据选择器找到选中的全部位置如果发现某个位置不是类型E则该位置失效**。
3另外`E:nth-child(n)`这个属性也很有意思。比如,针对下面这样一组标签:
```html
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
<li>6</li>
<li>7</li>
<li>8</li>
<li>9</li>
<li>10</li>
</ul>
```
上方代码中:
- 如果选择器写成`li:nth-child(2)`则表示第2个 `li`
- 如果选择器写成`li:nth-child(n)`,则表示**所有的**`li`。因为此时的 `n` 表示 0,1,2,3,4,5,6,7,8.....当n小于1时无效因为n = 0 也是不会选中的)
- 如果选择器写成`li:nth-child(2n)`,则表示所有的**第偶数个** li。
- 如果选择器写成`li:nth-child(2n+1)`,则表示所有的**第奇数个** li。
- 如果选择器写成`li:nth-child(-n+5)`,则表示**前5个** li。
- 如果选择器写成`li:nth-last-child(-n+5)`,则表示**最后5个** li。
- 如果选择器写成`li:nth-child(7n)`则表示选中7的倍数。。
上面列举的选择器中,我们只要记住: `n` 表示 0,1,2,3,4,5,6,7,8.....就很容易明白了。
**2、格式第二部分**
- `E:first-of-type` 匹配同类型中的第一个同级兄弟元素E。
- `E:last-of-type` 匹配同类型中的最后一个同级兄弟元素E。
- `E:nth-of-type(n)` 匹配同类型中的第n个同级兄弟元素E。
- `E:nth-last-of-type(n)` 匹配同类型中的倒数第n个同级兄弟元素E。
既然上面这几个选择器带有`type`我们可以这样理解先在同级里找到所有的E类型然后根据 n 进行匹配。
**3、格式第三部分**
- `E:empty` 匹配没有任何子节点包括空格等text节点的元素E。
- `E:target` 匹配相关URL指向的E元素。要配合锚点使用。
**举例:**
我们可以把多个伪类选择器结合起来使用,比如:
![](http://img.smyhvae.com/20180207_1340.png)
如果想把上图中,第一行的前三个 span 标红,我们可以这样使用结构伪类选择器:
```css
dt:first-child span:nth-of-type(-n+3) {
color: red;
}
```
最后来张表格:
![](http://img.smyhvae.com/20180207_1502.png)
### 伪元素选择器
伪元素选择器的标志性符号是 `::`
**1、格式第一部分**
- `E::before` 设置在 元素E 前面依据对象树的逻辑结构的内容配合content属性一起使用。
- `E::after` 设置在 元素E 后面依据对象树的逻辑结构的内容配合content属性一起使用。
`E:after``E:before `在旧版本里是伪类,在 CSS3 这个新版本里是伪元素。新版本里,`E:after``E:before`会被自动识别为`E::after``E::before`,按伪元素来对待,这样做的目的是用来做兼容处理。
举例:
```html
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<style>
/*::before 和::after 是通过 css 模拟出的html标签的效果*/
span::before{
content:"smyhvae";
color:red;
background-color: pink;
width: 50px;
height: 50px;
display: inline-block;
}
span::after{
content:"永不止步";
color:yellowgreen;
}
/*给原本的span标签设置一个默认的属性*/
span{
border: 1px solid #000;
}
</style>
</head>
<body>
<span>生命壹号</span>
</body>
</html>
```
效果如下:
![](http://img.smyhvae.com/20180207_1409.png)
**上图可以看出**
- 通过伪元素选择器就可以添加出类似于span标签的效果记得要结合 content 属性使用)。
- 通过这两个属性添加的伪元素,是**行内元素**,需要转换成块元素才能设置宽高。
**2、格式第二部分**
- `E::first-letter` 设置元素 E 里面的**第一个字符**的样式。
- `E::first-line` 设置元素 E 里面的**第一行**的样式。
- `E::selection` 设置元素 E 里面被鼠标选中的区域的样式(一般设置颜色和背景色)。
`E::first-letter` 的举例:
![](http://img.smyhvae.com/20180207_1430.png)
`E::first-line`的举例:
![](http://img.smyhvae.com/20180207_1433.png)
最后来张表格:
![](http://img.smyhvae.com/20180207_1503.png)
## 我的公众号
想学习<font color=#0000ff>**代码之外的技能**</font>?不妨关注我的微信公众号:**千古壹号**id`qianguyihao`)。
扫一扫,你将发现另一个全新的世界,而这将是一场美丽的意外:
![](http://img.smyhvae.com/2016040102.jpg)

View File

@@ -0,0 +1,861 @@
> 本文最初发表于[博客园](http://www.cnblogs.com/smyhvae/p/8430898.html),并在[GitHub](https://github.com/qianguyihao/Web)上持续更新**前端的系列文章**。欢迎在GitHub上关注我一起入门和进阶前端。
> 以下是正文。
## 前言
我们在上一篇文章中学习了[CSS3的选择器](http://www.cnblogs.com/smyhvae/p/8426799.html)本文来学一下CSS3的一些属性。
本文主要内容:
- 颜色
- 文本
- 盒模型中的 box-sizing 属性
- 处理兼容性问题:私有前缀
- 边框
- 背景属性
- 渐变
## 颜色
CSS3中有一种新的表示颜色的方式RGBA或者HSLA。
RGBA、HSLA可应用于**所有**使用颜色的地方。
**RGBA 举例**
```javascript
background-color: rgba(0, 0, 255, 0.3);
border: 30px solid rgba(0, 255, 0, 0.3);
```
解释:
- RGBA 即Red、Green、Blue、Alpha
- R、G、B 的取值范围是0~255
**HSLA 举例**
```javascript
background-color: hsla(240,50%,50%,0.4);
```
解释:
- `H` 色调,取值范围 0~360。0或360表示红色、120表示绿色、240表示蓝色。
- `S` 饱和度,取值范围 0%~100%。值越大,越鲜艳。
- `L` 亮度,取值范围 0%~100%。亮度最大时为白色,最小时为黑色。
- `A` 透明度,取值范围 0~1。
如果不知道 H 的值该设置多少,我们不妨来看一下**色盘**
![](http://img.smyhvae.com/20180207_1545.png)
推荐链接:[配色宝典](http://www.uisdc.com/how-to-create-color-palettes)
**关于设置透明度的其他方式:**
1`opacity: 0.3;` 会将整个盒子及子盒子设置透明度。也就是说,当盒子设置半透明的时候,会影响里面的子盒子。
2`background: transparent;` 可以单独设置透明度,但设置的是完全透明(不可调节透明度)。
## 文本
### text-shadow设置文本的阴影
格式举例:
```javascript
text-shadow: 20px 27px 22px pink;
```
参数解释:水平位移 垂直位移 模糊程度 阴影颜色。
效果举例:
![](http://img.smyhvae.com/20180207_1600.png)
### 举例:凹凸文字效果
text-shadow 可以设置多个阴影,每个阴影之间使用逗号隔开。我们来看个例子。
代码如下:
```html
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<style>
body {
background-color: #666;
}
div {
font-size: 100px;
text-align: center;
font-weight: bold;
font-family: "Microsoft Yahei";
color: #666;
}
/* text-shadow 可以设置多个阴影,每个阴影之间使用逗号隔开*/
.tu {
text-shadow: -1px -1px 1px #fff, 1px 1px 1px #000;
}
.ao {
text-shadow: -1px -1px 1px #000, 1px 1px 1px #fff;
}
</style>
</head>
<body>
<div class="ao">生命壹号</div>
<div class="tu">生命壹号</div>
</body>
</html>
```
效果如下:
![](http://img.smyhvae.com/20180207_1617.png)
上图中,实现凹凸文字效果的方式比较简单,给左上角放白色的阴影,右下角放黑色的阴影,就达到了凹下去的效果。
## 盒模型中的 box-sizing 属性
我们在**[之前的文章](http://www.cnblogs.com/smyhvae/p/7256371.html)**中专门讲过盒子模型。
CSS3 对盒模型做出了新的定义,即允许开发人员**指定盒子宽度和高度的计算方式**。
这就需要用到 `box-sizing`属性。它的属性值可以是:`content-box``border-box`。解释如下。
**外加模式:**css的默认方式
```javascript
box-sizing: content-box;
```
解释:此时设置的 width 和 height 是**内容区域**的宽高。`盒子的实际宽度 = 设置的 width + padding + border`。此时改变 padding 和 border 的大小,也不会改变内容的宽高,而是盒子的总宽高发生变化。
**内减模式:**【需要注意】
```javascript
box-sizing: border-box;
```
解释:此时设置的 width 和 height 是**盒子**的总宽高。`盒子的实际宽度 = 设置的 width`。此时改变 padding 和 border 的大小,会改变内容的宽高,盒子的总宽高不变。
## 处理兼容性问题:私有前缀
通过网址<http://caniuse.com/> 可以查询CSS3各特性的支持程度。
处理兼容性问题的常见方法:为属性添加**私有前缀**。
如此方法不能解决应尽量避免使用无需刻意去处理CSS3的兼容性问题。
**私有前缀的举例**
比如说我想给指定的div设置下面这样一个属性
```css
background: linear-gradient(left, green, yellow);
```
上面这个属性的作用是:添加从左到右的线性渐变,颜色从绿色变为黄色。
如果直接这样写属性,是看不到效果的:
![](http://img.smyhvae.com/20180207_1700.png)
此时,我们可以**为浏览器添加不同的私有前缀**,属性就可以生效了。
格式如下:
```html
-webkit-: 谷歌 苹果
-moz-:火狐
-ms-IE
-o-:欧朋
```
格式举例如下:
```css
background: -webkit-linear-gradient(left, green, yellow);
background: -moz-linear-gradient(left, green, yellow);
background: -ms-linear-gradient(left, green, yellow);
background: -o-linear-gradient(left, green, yellow);
background: linear-gradient(left, green, yellow);
```
效果如下:
![](http://img.smyhvae.com/20180207_1710.png)
## 边框
边框的属性很多,其中**边框圆角**和**边框阴影**这两个属性,应用十分广泛,兼容性也相对较好,且符合**渐进增强**的原则,需要重点熟悉。
### 边框圆角:`border-radius` 属性
边框的每个圆角,本质上是一个圆,圆有**水平半径**和**垂直半径**:如果二者相等,就是圆;如果二者不等, 就是椭圆。
单个属性的写法:
```
border-top-left-radius: 60px 120px; //参数解释:水平半径 垂直半径
border-top-right-radius: 60px 120px;
border-bottom-left-radius: 60px 120px;
border-bottom-right-radius: 60px 120px;
```
复合写法:
```
border-radius: 60px/120px; //参数:水平半径/垂直半径
border-radius: 20px 60px 100px 140px; //从左上开始,顺时针赋值。如果当前角没有值,取对角的值
border-radius: 20px 60px;
```
最简洁的写法:(四个角的半径都相同时)
```
border-radius: 60px;
```
举例:
```html
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<style>
.parent {
width: 400px;
}
.box {
width: 100px;
height: 100px;
float: left;
border: 1px solid rgb(144, 12, 63);
margin: 20px;
text-align: center;
line-height: 100px;
color: #fff;
font-size: 50px;
background-color: rgb(255, 141, 26);
}
/*画圆形的方式一*/
.box:nth-child(1) {
border-radius: 50px;
}
/*画圆形的方式二*/
.box:nth-child(2) {
border-radius: 50%;
}
.box:nth-child(3) {
border-radius: 100px 0 0 0;
}
.box:nth-child(4) {
border-radius: 100px/50px;
}
.box:nth-child(5) {
border-radius: 10%;
}
.box:nth-child(6) {
border-radius: 0 100px;
}
</style>
</head>
<body>
<div class="parent">
<div class="box">1</div>
<div class="box">2</div>
<div class="box">3</div>
<div class="box">4</div>
<div class="box">5</div>
<div class="box">6</div>
</div>
</body>
</html>
```
效果如下:
![](http://img.smyhvae.com/20180207_1750.png)
### 边框阴影:`box-shadow` 属性
格式举例:
```javascript
box-shadow: 水平偏移 垂直偏移 模糊程度 阴影大小 阴影颜色
box-shadow: 15px 21px 48px -2px #666;
```
参数解释:
- 水平偏移:正值向右 负值向左。
- 垂直偏移:正值向下 负值向上。
- 模糊程度:不能为负值。
效果如下:
![](http://img.smyhvae.com/20180207_2027.png)
另外后面还可以再加一个inset属性表示内阴影。如果不写则默认表示外阴影。例如
```javascript
box-shadow:3px 3px 3px 3px #666 inset;
```
效果如下:
20180207_2028.png
![](http://img.smyhvae.com/20180206_2150.png)
**注意**:设置边框阴影不会改变盒子的大小,即不会影响其兄弟元素的布局。
我们还可以设置多重边框阴影,实现更好的效果,增强立体感。
### 边框图片
边框图片有以下属性:
```javascript
/* 边框图片的路径*/
border-image-source: url("images/border.png");
/* 图片边框的裁剪*/
border-image-slice: 27;
/*图片边框的宽度*/
border-image-width: 27px;
/*边框图片的平铺*/
/* repeat :正常平铺 但是可能会显示不完整*/
/*round: 平铺 但是保证 图片完整*/
/*stretch: 拉伸显示*/
border-image-repeat: stretch;
```
我们也可以写成一个综合属性:
```javascript
border-image: url("images/border.png") 27/20px round;
```
这个属性要好好理解,我们假设拿下面这张图来作为边框图片:
![](http://img.smyhvae.com/20180207_2045.png)
![](http://img.smyhvae.com/20180207_2046.png)
这张图片将会被“切割”成**九宫格**形式,然后进行平铺。四个角位置、形状保持不变,中心位置和水平垂直向两个方向平铺:
![](http://img.smyhvae.com/20180207_2050.png)
再具体一点:
![](http://img.smyhvae.com/20180207_2051.png)
### 常见的边框图片汇总
```html
```
## 背景属性
背景属性在 CSS3 中也得到很大程度的增强,比如背景图片尺寸、背景裁切区域、背景定位参照点、多重背景等。
### 背景尺寸:`background-size`属性
`background-size`属性:设置背景图片的尺寸。
格式举例:
```javascript
/* 宽、高的具体数值 */
background-size: 500px 500px;
/* 宽高的百分比 */
background-size: 50% 50%; // 如果两个属性值相同可以简写成background-size: 50%;
background-size: 100% auto; //这个属性可以自己试验一下。
/* cover会自动调整缩放比例保证图片始终填充满背景区域如有溢出部分则会被隐藏。 */
background-size: cover;
/* contain会自动调整缩放比例保证图片始终完整显示在背景区域。 */
background-size: contain;
```
这里我们对属性值 `cover``contain`进行再次强调:
- `cover`:会自动调整缩放比例,保证图片始终**填充满**背景区域,如有**溢出部分**则会被隐藏。也就是说,保证背景图片完全覆盖盒子,但不能保证完整显示。
- `contain`:会自动调整缩放比例,保证图片始终**完整显示**在背景区域。也就是说,保证背景图片最大化地在盒子里,**等比例**显示,但不保证能铺满盒子。
### 背景原点:`background-origin` 属性
`background-origin` 属性:控制背景从什么地方开始显示。
格式举例:
```javascript
/* 从 padding-box 内边距开始显示背景图 */
background-origin: padding-box; //默认值
/* 从 border-box 边框开始显示背景图 */
background-origin: border-box;
/* 从 content-box 内容区域开始显示背景图 */
background-origin: content-box;
```
如果属性值设置成了`border-box`,那边框部分也会显示图片哦。
如下图所示:
![](http://img.smyhvae.com/20180207_2115.png)
### 背景裁剪:`background-clip`属性
格式举例:
`background-clip: content-box;` 超出的部分,将裁剪掉。属性值可以是:
- `border-box` 超出 border-box 的部分,将裁剪掉
- `padding-box` 超出 padding-box 的部分,将裁剪掉
- `content-box` 超出 content-box 的部分,将裁剪掉
假设现在有这样的属性设置:
```javascript
background-origin: border-box;
background-clip: content-box;
```
上方代码的意思是,背景图片从**边框部分**开始加载,但是呢,超出**内容区域**的部分将被裁减掉。
### 同时设置多个背景
我们可以给一个盒子同时设置多个背景,用以逗号隔开即可。可用于自适应局。
代码举例:
```html
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<style>
.box {
height: 416px;
border: 1px solid #000;
margin: 100px auto;
/* 给盒子加多个背景,按照背景语法格式书写,多个背景使用逗号隔开 */
background: url(images/bg1.png) no-repeat left top,
url(images/bg2.png) no-repeat right top,
url(images/bg3.png) no-repeat right bottom,
url(images/bg4.png) no-repeat left bottom,
url(images/bg5.png) no-repeat center;
}
</style>
</head>
<body>
<div class="box"></div>
</body>
</html>
```
实现效果如下:
![](http://img.smyhvae.com/20180207_2140.gif)
上方代码中,我们其实给盒子设置了五张小图,拼成的一张大图。当改变浏览器窗口大小时,可以自适应布局。
## 渐变
渐变是CSS3当中比较丰富多彩的一个特性通过渐变我们可以实现许多炫丽的效果有效的减少图片的使用数量并且具有很强的适应性和可扩展性。
渐变分为:
- 线性渐变:沿着某条直线朝一个方向产生渐变效果。
- 径向渐变:从一个**中心点**开始沿着**四周**产生渐变效果。
- 重复渐变。
见下图:
![](http://img.smyhvae.com/20180208_1140.png)
注意,渐变属于背景图片属性`background-image`的属性值。我们依次来看一下。
### 线性渐变
格式:
```javascript
background-image: linear-gradient(方向, 起始颜色, 终止颜色);
background-image: linear-gradient(to right, yellow, green);
```
参数解释:
- 方向可以是:`to left``to right``to top``to bottom`、角度`30deg`指的是顺时针方向30°
格式举例:
```html
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<style>
div {
width: 500px;
height: 100px;
margin: 10px auto;
border: 1px solid #000;
}
/* 语法:
linear-gradient(方向,起始颜色,终止颜色);
方向to left to right to top to bottom  角度 30deg
起始颜色
终止颜色
*/
div:nth-child(1) {
background-image: linear-gradient(to right, yellow, green);
}
/* 不写方向,表示默认的方向是:从上往下 */
div:nth-child(2) {
background-image: linear-gradient(yellow, green);
}
/* 方向可以指定角度 */
div:nth-child(3) {
width: 100px;
height: 100px;
background-image: linear-gradient(135deg, yellow, green);
}
/* 0%的位置开始出现黄色40%的位置开始出现红色的过度。70%的位置开始出现绿色的过度100%的位置开始出现蓝色 */
div:nth-child(4) {
background-image: linear-gradient(to right,
yellow 0%,
red 40%,
green 70%,
blue 100%);
}
/* 颜色之间,出现突变 */
div:nth-child(5) {
background-image: linear-gradient(45deg,
yellow 0%,
yellow 25%,
blue 25%,
blue 50%,
red 50%,
red 75%,
green 75%,
green 100%
);
}
div:nth-child(6) {
background-image: linear-gradient(to right,
#000 0%,
#000 25%,
#fff 25%,
#fff 50%,
#000 50%,
#000 75%,
#fff 75%,
#fff 100%
);
}
</style>
</head>
<body>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
</body>
</html>
```
效果如下:
![](http://img.smyhvae.com/20180207_2222.png)
**举例**:按钮
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>CSS3 渐变</title>
<style>
html, body {
height: 100%;
}
body {
margin: 0;
padding: 0;
background-color: #f8fcd4;
}
.nav {
width: 800px;
text-align: center;
padding-top: 50px;
margin: 0 auto;
}
/*设置按钮基本样式*/
.nav a {
display: inline-block;
width: 100px;
height: 30px;
text-align: center;
line-height: 30px;
font-size: 14px;
color: #fff;
text-decoration: none;
border: 1px solid #e59500;
background-color: #FFB700;
background-image: linear-gradient(
to bottom,
#FFB700 0%,
#FF8C00 100%
);
}
</style>
</head>
<body>
<div class="nav">
<a href="javascript:;">导航1</a>
<a href="javascript:;">导航2</a>
<a href="javascript:;">导航3</a>
<a href="javascript:;">导航4</a>
<a href="javascript:;">导航5</a>
<a href="javascript:;">导航6</a>
</div>
</body>
</html>
```
效果:
![](http://img.smyhvae.com/20180207_2301.png)
### 径向渐变
格式:
```
background-image: radial-gradient(辐射的半径大小, 中心的位置, 起始颜色, 终止颜色);
background-image: radial-gradient(100px at center,yellow ,green);
```
解释围绕中心点做渐变半径是150px从黄色到绿色做渐变。
中心点的位置可以是at left right center bottom top。如果以像素为单位则中心点参照的是盒子的左上角。
当然,还有其他的各种参数。格式举例:
```html
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<style>
div {
width: 250px;
height: 250px;
border: 1px solid #000;
margin: 20px;
float: left;
}
/*
径向渐变:
radial-gradient辐射的半径大小, 中心的位置,起始颜色,终止颜色);
中心点位置at left right center bottom top
*/
/*辐射半径为100px中心点在中间*/
div:nth-child(1) {
background-image: radial-gradient(100px at center, yellow, green);
}
/*中心点在左上角*/
div:nth-child(3) {
background-image: radial-gradient(at left top, yellow, green);
}
div:nth-child(2) {
background-image: radial-gradient(at 50px 50px, yellow, green);
}
/*设置不同的颜色渐变*/
div:nth-child(4) {
background-image: radial-gradient(100px at center,
yellow 0%,
green 30%,
blue 60%,
red 100%);
}
/*如果辐射半径的宽高不同,那就是椭圆*/
div:nth-child(5) {
background-image: radial-gradient(100px 50px at center, yellow, green);
}
</style>
</head>
<body>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
</body>
</html>
```
效果如下:
![](http://img.smyhvae.com/20180207_2256.png)
**举例:**利用径向渐变和边框圆角的属性,生成按钮。代码如下:
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>CSS3 渐变</title>
<style>
div:nth-child(1) {
width: 200px;
height: 200px;
margin: 40px auto;
border-radius: 100px;
background-color: yellowgreen;
}
div:nth-child(2) {
width: 200px;
height: 200px;
margin: 40px auto;
border-radius: 100px;
background-color: yellowgreen;
background-image: radial-gradient(
200px at 100px 100px,
rgba(0, 0, 0, 0),
rgba(0, 0, 0, 0.5)
);
}
</style>
</head>
<body>
<div></div>
<div></div>
</body>
</html>
```
效果如下:
![](http://img.smyhvae.com/20180208_1133.png)
上图中给第二个div设置的透明度是从0到0.5。如果设置的透明度是从0到0则样式无变化和第一个div一样。如果设置的透明度是从1到1则盒子是全黑的。
CSS3的更多属性且听下文继续。
## 我的公众号
想学习<font color=#0000ff>**代码之外的技能**</font>?不妨关注我的微信公众号:**千古壹号**id`qianguyihao`)。
扫一扫,你将发现另一个全新的世界,而这将是一场美丽的意外:
![](http://img.smyhvae.com/2016040102.jpg)

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,614 @@
## 多列布局
类似报纸或杂志中的排版方式,上要用以控制大篇幅文本。用得不多。
格式举例:
```css
.wrapper{
/* 分成几列 */
-webkit-column-count: 3;
/* 每列之间,用分割线隔开 */
-webkit-column-rule: 1px dashed red;
/* 设置列之间的间距 */
-webkit-column-gap: 60px;
/* 设置每一列的宽度 */
/* -webkit-column-width: 400px; */
/*-webkit- -moz- -ms- -o-*/
}
h4{
/* 设置跨列让h4这标题位于整个文flex-wrap本的标题而不是处在某一列之中*/
-webkit-column-span: all;
text-align: center;
}
```
备注:上面这几个属性涉及到兼容性问题,需要加私有前缀。
## flex伸缩布局
CSS3在布局方面做了非常大的改进使得我们对**块级元素**的布局排列变得十分灵活,适应性非常强。其强大的伸缩性,在响应式开中可以发挥极大的作用。
![](http://img.smyhvae.com/20180219_2035.png)
如上图所示,有几个概念需要了解一下:
- 主轴Flex容器的主轴主要用来配置Flex项目默认是水平方向从左向右。
- 侧轴:与主轴垂直的轴称作侧轴,默认是垂直方向,从上往下。
PS主轴和侧轴并不是固定不变的通过flex-direction可以互换。
### 设置伸缩布局的步骤
1指定一个盒子为伸缩布局
```javascript
display: flex;
```
2设置 `flex-direction` 属性来调整此盒的子元素的布局方式。默认的方向是水平方向。
3可互换主侧轴也可改变主侧轴的方向。
### 各属性详解
**1、`flex-direction`属性:**设置主轴方向。
- `flex-direction: row;` 设置**主轴方向**,默认是水平方向。属性值可以是:
- `row` 水平方向(默认值)
- `reverse-row` 反转
- `column` 垂直方向
- `reverse-column` 反转列
代码演示:
```html
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<style>
*{
margin: 0;
padding: 0;
list-style: none;
}
body{
background-color: #eee;
font-family: "Microsoft Yahei";
font-size:22px;
}
h3{
font-weight: normal;
}
section{
width: 1000px;
margin:40px auto;
}
ul{
background-color: #fff;
border: 1px solid #ccc;
}
ul li{
width: 200px;
height: 200px;
background-color: pink;
margin:10px;
}
section:nth-child(1) ul{
overflow: hidden; /* 清除浮动 */
}
section:nth-child(1) ul li{
float: left;
}
/* 设置伸缩盒子*/
section:nth-child(2) ul{
display: flex;
}
section:nth-child(3) ul{
/* 设置伸缩布局*/
display: flex;
/* 设置主轴方向*/
flex-direction: row;
}
section:nth-child(4) ul{
/* 设置伸缩布局*/
display: flex;
/* 设置主轴方向 :水平翻转*/
flex-direction: row-reverse;
}
section:nth-child(5) ul{
/* 设置伸缩布局*/
display: flex;
/* 设置主轴方向 :垂直*/
flex-direction: column;
}
section:nth-child(6) ul{
/* 设置伸缩布局*/
display: flex;
/* 设置主轴方向 :垂直*/
flex-direction: column-reverse;
}
</style>
</head>
<body>
<section>
<h3>传统布局</h3>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
</section>
<section>
<h3>伸缩布局 display:flex</h3>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
</section>
<section>
<h3>主轴方向 flex-direction:row</h3>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
</section>
<section>
<h3>主轴方向 flex-direction:row-reverse</h3>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
</section>
<section>
<h3>主轴方向 flex-direction:column</h3>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
</section>
<section>
<h3>主轴方向 flex-direction:column-reverse</h3>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
</section>
</body>
</html>
```
**2、justify-content**设置子元素在**主轴上的对齐方式**
- `justify-content: flex-start;` 设置子元素在**主轴上的对齐方式**。属性值可以是:
- `flex-start` 从主轴的起点对齐(默认值)
- `flex-end` 从主轴的终点对齐
- `center` 居中对齐
- `space-around` 在父盒子里平分
- `space-between` 两端对齐 平分
代码演示:
```html
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<style>
*{
margin: 0;
padding: 0;
list-style:none;}
body{
background-color: #eee;
font-family: "Microsoft Yahei";
}
section{
width: 1000px;
margin:50px auto;
}
section h3{
font-size:22px;
font-weight: normal;
}
ul{
border: 1px solid #999;
background-color: #fff;
display: flex;
}
ul li{
width: 200px;
height: 200px;
background: pink;
margin:10px;
}
section:nth-child(1) ul{
/* 主轴对齐方式:从主轴开始的方向对齐*/
justify-content: flex-start;
}
section:nth-child(2) ul{
/* 主轴对齐方式:从主轴结束的方向对齐*/
justify-content: flex-end;
}
section:nth-child(3) ul{
/* 主轴对齐方式:居中对齐*/
justify-content: center;
}
section:nth-child(4) ul{
/* 主轴对齐方式:在父盒子中平分*/
justify-content: space-around;
}
section:nth-child(5) ul{
/* 主轴对齐方式:两端对齐 平分*/
justify-content: space-between;
}
</style>
</head>
<body>
<section>
<h3>主轴的对齐方式justify-content:flex-start</h3>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
</section>
<section>
<h3>主轴的对齐方式justify-content:flex-end</h3>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
</section>
<section>
<h3>主轴的对齐方式justify-content:center</h3>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
</section>
<section>
<h3>主轴的对齐方式justify-content:space-round</h3>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
</section>
<section>
<h3>主轴的对齐方式justify-content:space-bettwen</h3>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
</ul>
</section>
</body>
</html>
```
**3、align-items**设置子元素在**侧轴上的对齐方式**
- `align-items:flex-start;` 设置子元素在**侧轴上的对齐方式**。属性值可以是:
- `flex-start` 从侧轴开始的方向对齐
- `flex-end` 从侧轴结束的方向对齐
- `baseline` 基线 默认同flex-start
- `center` 中间对齐
- `stretch` 拉伸
代码演示:
```html
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<style>
*{
margin: 0;
padding: 0;
list-style:none;
}
body{
background-color: #eee;
font-family: "Microsoft Yahei";
}
section{
width: 1000px;
margin:50px auto;
}
section h3{
font-size:22px;
font-weight: normal;
}
ul{
border: 1px solid #999;
background-color: #fff;
display: flex;
height:500px;
}
ul li{
width: 200px;
height: 200px;
background: pink;
margin:10px;
}
section:nth-child(1) ul{
/* 侧轴对齐方式 :从侧轴开始的方向对齐*/
align-items:flex-start;
}
section:nth-child(2) ul{
/* 侧轴对齐方式 :从侧轴结束的方向对齐*/
align-items:flex-end;
}
section:nth-child(3) ul{
/* 侧轴对齐方式 :居中*/
align-items:center;
}
section:nth-child(4) ul{
/* 侧轴对齐方式 :基线 默认同flex-start*/
align-items:baseline;
}
section:nth-child(5) ul{
/* 侧轴对齐方式 :拉伸*/
align-items:stretch;
}
section:nth-child(5) ul li{
height:auto;
}
</style>
</head>
<body>
<section>
<h3>侧轴的对齐方式:align-items flex-start</h3>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
</section>
<section>
<h3>侧轴的对齐方式align-items:flex-end</h3>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
</section>
<section>
<h3>侧轴的对齐方式align-items:center</h3>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
</section>
<section>
<h3>侧轴的对齐方式align-itmes:baseline</h3>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
</section>
<section>
<h3>侧轴的对齐方式align-itmes: stretch</h3>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
</section>
</body>
</html>
```
**4、`flex`属性**:设置子盒子的权重
代码演示:
```html
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<style>
*{
margin: 0;
padding: 0;
list-style:none;
}
body{
background-color: #eee;
font-family: "Microsoft Yahei";
}
section{
width: 1000px;
margin:50px auto;
}
section h3{
font-size:22px;
font-weight: normal;
}
ul{
border: 1px solid #999;
background-color: #fff;
display: flex;
}
ul li{
width: 200px;
height: 200px;
background: pink;
margin:10px;
}
section:nth-child(1) ul li:nth-child(1){
flex:1;
}
section:nth-child(1) ul li:nth-child(2){
flex:1;
}
section:nth-child(1) ul li:nth-child(3){
flex:8;
}
section:nth-child(2) ul li:nth-child(1){
}
section:nth-child(2) ul li:nth-child(2){
flex:1;
}
section:nth-child(2) ul li:nth-child(3){
flex:4;
}
</style>
</head>
<body>
<section>
<h3>伸缩比例:flex</h3>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
</section>
<section>
<h3>伸缩比例:flex</h3>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
</section>
</body>
</html>
```
## CSS Flexbox 可视化手册
可视化的截图如下:(请点开链接,查看大图)
<http://img.smyhvae.com/20190821_2101.png>
相关文章:
- 【英文原版】 CSS Flexbox Fundamentals Visual Guide<https://medium.com/swlh/css-flexbox-fundamentals-visual-guide-1c467f480dac>
- 【中文翻译】CSS Flexbox 可视化手册:<https://zhuanlan.zhihu.com/p/56046851>
## flex 相关的推荐文章
- flex 效果在线演示:<https://demos.scotch.io/visual-guide-to-css3-flexbox-flexbox-playground/demos/>
- A Complete Guide to Flexbox | 英文原版:<https://css-tricks.com/snippets/css/a-guide-to-flexbox/>
- CSS3 Flexbox 布局完全指南 | 中文翻译:<https://www.html.cn/archives/8629>

View File

@@ -0,0 +1,385 @@
## 前言
开发人员可以为自已的网页指定特殊的字体(将指定字体提前下载到站点中),无需考虑用户电脑上是否安装了此特殊字体。从此,把特殊字体处理成图片的方式便成为了过去。
支持程度比较好,甚至 IE 低版本的浏览器也能支持。
## 字体的常见格式
> 不同浏览器所支持的字体格式是不一样的,我们有必要了解一下字体格式的知识。
#### TureTpe格式(**.ttf**)
.ttf 字体是Windows和Mac的最常见的字体是一种RAW格式。
支持这种字体的浏览器有IE9+、Firefox3.5+、Chrome4+、Safari3+、Opera10+、iOS Mobile、Safari4.2+。
#### OpenType格式(**.otf**)
.otf 字体被认为是一种原始的字体格式其内置在TureType的基础上。
支持这种字体的浏览器有Firefox3.5+、Chrome4.0+、Safari3.1+、Opera10.0+、iOS Mobile、Safari4.2+。
#### Web Open Font Format格式(**.woff**)
woff字体是Web字体中最佳格式他是一个开放的TrueType/OpenType的压缩版本同时也支持元数据包的分离。
支持这种字体的浏览器有IE9+、Firefox3.5+、Chrome6+、Safari3.6+、Opera11.1+。
#### Embedded Open Type格式(**.eot**)
.eot字体是IE专用字体可以从TrueType创建此格式字体支持这种字体的浏览器有IE4+。
#### SVG格式(**.svg**)
.svg字体是基于SVG字体渲染的一种格式。
支持这种字体的浏览器有Chrome4+、Safari3.1+、Opera10.0+、iOS Mobile Safari3.2+。
**总结:**
了解了上面的知识后,**我们就需要为不同的浏览器准备不同格式的字体**。通常我们会通过字体生成工具帮我们生成各种格式的字体,因此无需过于在意字体格式之间的区别。
下载字体的网站推荐:
- <http://www.zhaozi.cn/>
- <http://www.youziku.com/>
## WebFont 的使用步骤
打开网站<http://iconfont.cn/webfont#!/webfont/index>,如下:
![](http://img.smyhvae.com/20180220_1328.png)
上图中,比如我想要「思源黑体-粗」这个字体,那我就点击红框中的「本地下载」。
下载完成后是一个压缩包压缩包链接http://download.csdn.net/download/smyhvae/10253561
解压后如下:
![](http://img.smyhvae.com/20180220_1336.png)
上图中, 我们把箭头处的html文件打开里面告诉了我们 webfont 的**使用步骤**
![](http://img.smyhvae.com/20180220_1338.png)
1第一步使用font-face声明字体
```css
@font-face {font-family: 'webfont';
src: url('webfont.eot'); /* IE9*/
src: url('webfont.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
url('webfont.woff') format('woff'), /* chrome、firefox */
url('webfont.ttf') format('truetype'), /* chrome、firefox、opera、Safari, Android, iOS 4.2+*/
url('webfont.svg#webfont') format('svg'); /* iOS 4.1- */
}
```
2第二步定义使用webfont的样式
```css
.web-font{
font-family:"webfont" !important;
font-size:16px;font-style:normal;
-webkit-font-smoothing: antialiased;
-webkit-text-stroke-width: 0.2px;
-moz-osx-font-smoothing: grayscale;}
```
3第三步为文字加上对应的样式
```html
<i class="web-font">这一分钟,你和我在一起,因为你,我会记得那一分钟。从现在开始,我们就是一分钟的朋友。这是事实,你改变不了,因为已经完成了。</i>
```
**举例:**
我们按照上图中的步骤来,引入这个字体。完整版代码如下:
```html
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<style>
p{
font-size:30px;
}
/* 如果要在网页中使用web字体用户电脑上没有这种字体*/
/* 第一步:声明字体*/
/* 告诉浏览器 去哪找这个字体*/
@font-face {font-family: 'my-web-font';
src: url('font/webfont.eot'); /* IE9*/
src: url('font/webfont.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
url('font/webfont.woff') format('woff'), /* chrome、firefox */
url('font/webfont.ttf') format('truetype'), /* chrome、firefox、opera、Safari, Android, iOS 4.2+*/
url('font/webfont.svg#webfont') format('svg'); /* iOS 4.1- */
}
/* 第二步:定义一个类名,谁加这类名,就会使用 webfont 字体*/
.webfont{
font-family: 'my-web-font';
}
</style>
</head>
<body>
<!-- 第三步:引用 webfont 字体 -->
<p class="webfont">生命壹号,永不止步</p>
</body>
</html>
```
代码解释:
1`my-web-font`这个名字是随便起的,只要保证第一步和第二步中的名字一样就行。
2因为我把字体文件单独放在了font文件夹中所以在src中引用字体资源时写的路径是 `font/...`
工程文件:
- [2018-02-20-WebFont举例.zip](http://download.csdn.net/download/smyhvae/10253565)
## 字体图标(阿里的 iconfont 网站举例)
我们其实可以把图片制作成字体。常见的做法是:把网页中一些小的图标,借助工具生成一个字体包,然后就可以像使用文字一样使用图标了。这样做的优点是:
- 将所有图标打包成字体库,减少请求;
- 具有矢量性,可保证清晰度;
- 使用灵活,便于维护。
也就是说,我们可以把这些图标当作字体来看待,凡是字体拥有的属性(字体大小、颜色等),均适用于图标。
**使用步骤如下:**(和上一段的使用步骤是一样的)
打开网站<http://iconfont.cn/>,找到想要的图标,加入购物车。然后下载下来:
![](http://img.smyhvae.com/20180220_1750.png)
压缩包下载之后解压打开里面的demo.html里面告诉了我们怎样引用这些图标。
![](http://img.smyhvae.com/20180220_1755.png)
**举例1**:(图标字体引用)
```html
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<style>
/*申明字体*/
@font-face {font-family: 'iconfont';
src: url('font/iconfont.eot'); /* IE9*/
src: url('font/iconfont.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
url('font/iconfont.woff') format('woff'), /* chrome、firefox */
url('font/iconfont.ttf') format('truetype'), /* chrome、firefox、opera、Safari, Android, iOS 4.2+*/
url('font/iconfont.svg#iconfont') format('svg'); /* iOS 4.1- */
}
.iconfont{
font-family: iconfont;
}
p{
width: 200px;
border: 1px solid #000;
line-height: 60px;
font-size:30px;
margin:100px auto;
text-align: center;
}
p span{
color:red;
}
</style>
</head>
<body>
<!-- 【重要】编码代表图标 -->
<p><span class="iconfont">&#xe628;</span>扫码付款</p>
</body>
</html>
```
效果如下:
![](http://img.smyhvae.com/20180220_1800.png)
**举例2**:(伪元素的方式使用图标字体)
如果想要在文字的前面加图标字体,我们更习惯采用**伪元素**的方式进行添加。
代码如下:
```html
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<style>
/*申明字体*/
@font-face {font-family: 'iconfont';
src: url('font/iconfont.eot'); /* IE9*/
src: url('font/iconfont.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
url('font/iconfont.woff') format('woff'), /* chrome、firefox */
url('font/iconfont.ttf') format('truetype'), /* chrome、firefox、opera、Safari, Android, iOS 4.2+*/
url('font/iconfont.svg#iconfont') format('svg'); /* iOS 4.1- */
}
p{
width: 200px;
border: 1px solid #000;
line-height: 60px;
font-size:30px;
margin:100px auto;
text-align: center;
position: relative;
}
.icon::before{
/*&#xe628;*/
content:"\e628";
/*position: absolute;*/
/*left:10px;*/
/*top:0px;*/
font-family: iconfont;
color:red;
}
span{
position: relative;
}
</style>
</head>
<body>
<p class="icon">扫码付款</p>
<span class="icon" >我是span</span>
<div class="icon">divvvvvvvvvvv</div>
</body>
</html>
```
效果如下:
![](http://img.smyhvae.com/20180220_1815.png)
工程文件:
- 2018-02-20-图标字体demo.zip
## 其他相相关网站介绍
- Font Awesome 使用介绍:<http://fontawesome.dashgame.com/>
定制自已的字体图标库:
- <http://iconfont.cn/>
- <https://icomoon.io/>
SVG素材
- <http://www.iconsvg.com/>
## 360浏览器网站案例
暂略。
这里涉及到jQuery fullPage 全屏滚动插件。
- 中文网址:http://www.dowebok.com
- 相关说明:http://www.dowebok.com/77.html
## 使用 Bootstrap 网站的图标字体
打开如下网站:<http://www.bootcss.com/p/font-awesome/>。
![](http://img.smyhvae.com/20180223_2100.png)
如上图所示,下载字体后,进行解压:
![](http://img.smyhvae.com/20180223_2105.png)
使用步骤如下:
1如图只是想要字体的话可以把`css``font`这两个文件夹拷贝到项目里。
2在html文档中的 <head> 标签里,引入 font-awesome.min.css 文件:
```html
<link rel="stylesheet" href="css/font-awesome.min.css">
```
3想在哪个标签里用这个图标直接在这个标签里加className就行className都在[网站](http://www.bootcss.com/p/font-awesome/)上列出来了)。
完整版代码如下:
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="css/font-awesome.min.css">
<style>
</style>
</head>
<body>
<span class="icon-play">播放</span>
</body>
</html>
```

View File

@@ -0,0 +1,350 @@
## Sass简介
大家都知道js 中可以自定义发量css 仅仅是一个标记语言,不是编程语言,因此不可以自定义发量、不可以引用等等。
面对返些问题,我们现在来引入 Sass简单的说他是 css 的升级版,可以自定义发量,可以有 if 语句,还可以嵌套等等,很神奇吧!那下面我们就来介绍返个神奇的 Sass。
Sass比Less的功能更强大也更复杂。
### Sass 的定义
Sass英文是 Syntactically Awesome Stylesheets Sass。最早由 Hampton Catlin 开发和设计。 一种帮助你简化 CSS 工作流程的方式,帮助你更容易维护和开发 CSS 内容。
官网是:<https://sass-lang.com/>
Sass 是这个世界上最成熟、稳定和强大的专业级 CSS 扩展语言。
Sass专注的是怎样创建优雅的样式表而不是内容。
### Sass、Compass与CSS
**关系:**
- Less/Sass是语法、Compass是框架、CSS是目标。
**Sass&Compass的好处**
- 写出更优秀的CSS。
- 解决CSS编写过程中的痛点问题比如精灵图合图、属性的浏览器前缀处理等。
- 有效组织样式、图片、字体等项目元素。
**受众群体:**
- 重构的同学写很多CSS不知如何自动化。
- 希望在项目周期内更好地组织项目内容。
## Sass的安装
sass引擎是用Ruby语言开发的但是两者的语法没有关系因此在安装 Sass 前需要先安装Rubymac下自带Ruby无需再安装Ruby
下面来讲一下 Windows 下的安装Sass的步骤。
### 第一步安装Rubywindows环境
下载地址:<http://rubyinstaller.org/downloads/>
貌似网络很慢,不一定能下载成功~
安装时,记得勾选“环境变量”:
![](http://img.smyhvae.com/20180407_2022.png)
安装完ruby之后在命令行中输入`ruby -v`查看ruby的的版本
![](http://img.smyhvae.com/20180407_2039.png)
### 关于Mac下的Ruby
刚刚说了Mac下自带Ruby但是版本肯定很老
![](http://img.smyhvae.com/20180407_2145.png)
有的时候我们可能需要使用特定版本的ruby或者在不同的ruby版本之间进行切换所以大家可以尝试安装`rvm`它是ruby的版本管理工具。官网是<https://rvm.io>
### 第二步:安装 Sass
安装完ruby之后在开始菜单中找到刚才我们安装的ruby打开Start Command Prompt with Ruby。输入`gem install sass`安装Sass。
PSRuby 是使用 gem 来管理它的各种包比如Sass。我们安装好ruby之后gem会自动安装上类似于我们安装完node之后npm也自动安装好了。
但是由于访问网络受限我们可以先切换到淘宝的镜像再安装Sass。步骤如下
1移除默认的镜像添加淘宝的镜像
```
gem sources --remove https://rubygems.org/
gem sources -a https://ruby.taobao.org/ //注意如果你系统不支持https请将淘宝源更换成gem sources -a http://gems.ruby-china.org
```
PS我测试了一下Win 7 不支持httpsMac支持https。
2查看当前使用的是哪个镜像
```
gem sources -l
```
![](http://img.smyhvae.com/20180407_2050.png)
3安装sass
紧接着输入如下命令安装Sass
```
gem install sass // 如果mac下输入这个命令时没有权限则需要在前面加上 sudo
```
系统会自动安装上最新版本的Sass。
查看sass版本的命令为:
```
sass -v
```
升级sass版本的命令为
```
gem update sass
```
你也可以运行帮助命令行来查看你需要的命令:
```
sass -h
```
![](http://img.smyhvae.com/20180407_2100.png)
参考链接:<https://www.w3cplus.com/sassguide/install.html>
## Compass 简介和安装
安装完sass之后我们在main.scss中写一些代码然后输入如下命令就可以将`scss文件`转化为`css文件`
```
sass main.scss main.css
```
然而,真正的项目开发中,我们不一定是直接使用 sass 命令,而是使用 Compass。
### Compass 简介
官网是:<http://compass-style.org/>。
Compass 是开源的CSS书写框架。
### Compass 安装
输入如下命令安装 Compass
```
gem isntall compass
```
输入如下命令查看版本:
```
compass -v
```
![](http://img.smyhvae.com/20180407_2208.png)
compass可以直接用来搭建前端项目的样式部分但并不是常用的方法。
### Compass的简单使用
通过 Compass 创建工程目录:
```
cd workspace
compass create CompassDemo
```
文件结构如下:
- /sass
- ie.scss
- print.scss
- screen.scss
- /stylesheets
- ie.css
- print.css
- screen.css
- config.rb
为了能够让文件实时编译,我们可以通过 copass watch 监听sass文件的变化
```
cd CompassDemo
compass watch
```
当.scss文件改动时会自动生成对应的.css文件。
## Sass的语法
### 两种后缀名(两种语法)
sass 有两种后缀名文件:
1`.sass`:对空格敏感。不使用大括号和分号,所以每个属性之间是通过换行来分隔。
比如:
```
h1
color: #000
background: #fff
```
这种语法是类ruby的语法和CSS的语法相比相差较大。所以在3.0版本中就引入了`.scss`的语法。
2`.scss`是css语法的超级可以使用大括号和分号。
比如:
```
h1 {
color: #000;
background: #fff;
}
```
注意:一个项目中可以混合使用两种语法,但是一个文件中不能同时使用两种语法。
**两种格式之间的转换:**
我们在工程目录下新建`main.scss`,输入如下代码:
```
*{
margin: 0;
padding: 0;
}
```
然后输入如下命令,就可以将上面的`main.scss`转化为`main.sass`
```bash
sass-convert main.scss main.sass
```
打开生成的`main.sass`,内容如下:
```
*
margin: 0
padding: 0
```
### 变量语法
Sass 是通过`$`符号来声明变量。
1我们新建一个文件`_variables.scss`,这个文件专门用来存放变量,然后在其他的文件中引入`_variables.scss`即可。
因为这个文件只需要存储变量,并不需要它编译出对应的 css 文件,所以我们给文件名的前面加了**下划线**,意思是声明为**局部文件**。
我们在这个文件中,声明两个字体变量:
```css
$font1: Braggadocio, Arial, Verdana, Helvetica, sans-serif;
$font2: Arial, Verdana, Helvetica, sans-serif;
```
2新建文件main.scss在里面引入步骤1中的变量文件
```
@import "variables"; // 引入变量文件
.div1{
font-family: $font1;
}
.div2{
font-family: $font2;
}
```
基于 Sass 的既定规则:
- 没有文件后缀名时Sass 会自动添加 .scss 或者 .sass 的后缀(具体要看已经存在哪个后缀的文件)。
- 同一目录下,局部文件和非局部文件不能重名。
对应生成的main.css文件如下
main.css
```css
/* line 9, ../sass/main.scss */
.div1 {
font-family: Braggadocio, Arial, Verdana, Helvetica, sans-serif;
}
/* line 13, ../sass/main.scss */
.div2 {
font-family: Arial, Verdana, Helvetica, sans-serif;
}
```
### 注释语法
单行注释:
```
//我是单行注释
```
块级注释:
```
/*
我是块级注释
哈哈
*/
```
二者的区别是单行注释不会出现在自动生成的css文件中。

126
02-CSS基础/22.md Normal file
View File

@@ -0,0 +1,126 @@
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<style>
label {
display: block;
vertical-align: middle;
}
label,
input,
select {
vertical-align: middle;
}
.mui-switch {
width: 52px;
height: 31px;
position: relative;
border: 1px solid #dfdfdf;
background-color: #fdfdfd;
box-shadow: #dfdfdf 0 0 0 0 inset;
border-radius: 20px;
border-top-left-radius: 20px;
border-top-right-radius: 20px;
border-bottom-left-radius: 20px;
border-bottom-right-radius: 20px;
background-clip: content-box;
display: inline-block;
-webkit-appearance: none;
user-select: none;
outline: none;
}
.mui-switch:before {
content: '';
width: 29px;
height: 29px;
position: absolute;
top: 0px;
left: 0;
border-radius: 20px;
border-top-left-radius: 20px;
border-top-right-radius: 20px;
border-bottom-left-radius: 20px;
border-bottom-right-radius: 20px;
background-color: #fff;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4);
}
.mui-switch:checked {
border-color: #64bd63;
box-shadow: #64bd63 0 0 0 16px inset;
background-color: #64bd63;
}
.mui-switch:checked:before {
left: 21px;
}
.mui-switch.mui-switch-animbg {
transition: background-color ease 0.4s;
}
.mui-switch.mui-switch-animbg:before {
transition: left 0.3s;
}
.mui-switch.mui-switch-animbg:checked {
box-shadow: #dfdfdf 0 0 0 0 inset;
background-color: #64bd63;
transition: border-color 0.4s, background-color ease 0.4s;
}
.mui-switch.mui-switch-animbg:checked:before {
transition: left 0.3s;
}
.mui-switch.mui-switch-anim {
transition: border cubic-bezier(0, 0, 0, 1) 0.4s, box-shadow cubic-bezier(0, 0, 0, 1) 0.4s;
}
.mui-switch.mui-switch-anim:before {
transition: left 0.3s;
}
.mui-switch.mui-switch-anim:checked {
box-shadow: #64bd63 0 0 0 16px inset;
background-color: #64bd63;
transition: border ease 0.4s, box-shadow ease 0.4s, background-color ease 1.2s;
}
.mui-switch.mui-switch-anim:checked:before {
transition: left 0.3s;
}
/*# sourceMappingURL=mui-switch.css.map */
</style>
<body>
<label>
<input class="mui-switch" type="checkbox"> 默认未选中</label>
<label>
<input class="mui-switch" type="checkbox" checked> 默认选中</label>
<label>
<input class="mui-switch mui-switch-animbg" type="checkbox"> 默认未选中,简单的背景过渡效果,加mui-switch-animbg类即可</label>
<label>
<input class="mui-switch mui-switch-animbg" type="checkbox" checked> 默认选中</label>
<label>
<input class="mui-switch mui-switch-anim" type="checkbox"> 默认未选中,过渡效果,加 mui-switch-anim 类即可
</label>
<label>
<input class="mui-switch mui-switch-anim" type="checkbox" checked> 默认选中</label>
</body>
</html>
```

View File

@@ -0,0 +1,29 @@
我们在div里放一个img发现
在html和html5中div的长宽是不同的后者的高度要超过几个像素。
比如说下面这个是html的。
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style type="text/css">
*{
margin: 0px;
padding: 0px;
}
</style>
</head>
<body>
<div>
<img src="/Users/smyhvae/Dropbox/img/20170813_1143.jpg" alt="">
</div>
</body>
</html>
```

View File

@@ -0,0 +1,577 @@
## CSS3 常见边框汇总
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>CSS3 边框</title>
<style>
body, ul, li, dl, dt, dd, h1, h2, h3, h4, h5 {
margin: 0;
padding: 0;
}
body {
background-color: #F7F7F7;
}
.wrapper {
width: 1000px;
margin: 0 auto;
padding: 20px;
box-sizing: border-box;
}
header {
padding: 20px 0;
margin-bottom: 20px;
text-align: center;
}
header h3 {
line-height: 1;
font-weight: normal;
font-size: 28px;
}
.main {
/*overflow: hidden;*/
}
.main:after {
content: '';
clear: both;
display: block;
}
.main .item {
width: 210px;
height: 210px;
margin: 0 30px 30px 0;
display: flex;
position: relative;
background-color: #FFF;
float: left;
box-shadow: 2px 2px 5px #CCC;
}
.main .item:after {
content: attr(data-brief);
display: block;
width: 100%;
height: 100%;
text-align: center;
line-height: 210px;
position: absolute;
top: 0;
left: 0;
color: #FFF;
font-family: '微软雅黑';
font-size: 18px;
background-color: rgba(170, 170, 170, 0);
z-index: -1;
transition: all 0.3s ease-in;
}
.main .item:hover:after {
background-color: rgba(170, 170, 170, 0.6);
z-index: 100;
}
.main .item:nth-child(4n) {
margin-right: 0;
}
/*.main .item:nth-last-child(-n+5) {
margin-bottom: 0;
}*/
/* 以上是骨架样式 */
/* 1、2、3、4 顺时针 */
.border-radius {
width: 180px;
height: 180px;
margin: auto;
border: 1px solid red;
/*border-radius: 50% 30% 20%;*/
}
.square {
border-radius: 0;
}
/*拱形*/
.item:nth-child(1) .border-radius {
border-radius: 90px;
}
/*拱形*/
.item:nth-child(2) .border-radius {
border-radius: 90px 90px 0 0;
}
/*半圆*/
.item:nth-child(3) .border-radius {
height: 90px;
border-radius: 90px 90px 0 0;
}
/*左上角*/
.item:nth-child(4) .border-radius {
/*height: 90px;*/
border-radius: 90px 0 0 0;
}
/*四分之一圆*/
.item:nth-child(5) .border-radius {
width: 90px;
height: 90px;
border-radius: 90px 0 0 0;
}
/*横着的椭圆*/
.item:nth-child(6) .border-radius {
height: 90px;
/*border-radius: 50%;*/
border-radius: 90px 90px 90px 90px / 45px 45px 45px 45px;
/*border-radius: 45px / 90px;*/
}
/*竖着的椭圆*/
.item:nth-child(7) .border-radius {
width: 90px;
border-radius: 45px 45px 45px 45px / 90px 90px 90px 90px;
}
/*半个横着的椭圆*/
.item:nth-child(8) .border-radius {
height: 45px;
border-radius: 90px 90px 0 0 / 45px 45px 0 0;
}
/*半个竖着的椭圆*/
.item:nth-child(9) .border-radius {
width: 45px;
border-radius: 45px 0 0 45px / 90px 0 0 90px;
}
/*四分之一竖着的椭圆*/
.item:nth-child(10) .border-radius {
width: 45px;
height: 90px;
border-radius: 45px 0 0 0 / 90px 0 0 0;
}
/*饼环*/
.item:nth-child(11) .border-radius {
width: 40px;
height: 40px;
border: 70px solid red;
border-radius: 90px;
}
/*圆饼*/
.item:nth-child(12) .border-radius {
width: 40px;
height: 40px;
border: 70px solid red;
border-radius: 60px;
}
/*左上角圆饼*/
.item:nth-child(13) .border-radius {
width: 60px;
height: 60px;
border: 60px solid red;
border-radius: 90px 0 0 0;
}
/*对角圆饼*/
.item:nth-child(14) .border-radius {
width: 60px;
height: 60px;
border: 60px solid red;
border-radius: 90px 0 90px 0;
}
/*四边不同色*/
.item:nth-child(15) .border-radius {
width: 0px;
height: 0px;
border-width: 90px;
border-style: solid;
border-color: red green yellow blue;
}
/*右透明色*/
.item:nth-child(16) .border-radius {
width: 0px;
height: 0px;
border-width: 90px;
border-style: solid;
border-color: red green yellow blue;
border-right-color: transparent;
}
/*圆右透明色*/
.item:nth-child(17) .border-radius {
width: 0px;
height: 0px;
border-width: 90px;
border-style: solid;
border-color: red;
border-right-color: transparent;
border-radius: 90px;
}
/*圆右红透明色*/
.item:nth-child(18) .border-radius {
width: 0px;
height: 0px;
border-width: 90px;
border-style: solid;
border-color: transparent;
border-right-color: red;
border-radius: 90px;
}
/*阴阳图前世*/
.item:nth-child(19) .border-radius {
width: 180px;
height: 0px;
border-top-width: 90px;
border-bottom-width: 90px;
border-style: solid;
border-top-color: red;
border-bottom-color: green;
/*border-right-color: red;*/
border-radius: 90px;
}
/*阴阳图前世2*/
.item:nth-child(20) .border-radius {
width: 180px;
height: 90px;
border-bottom-width: 90px;
border-style: solid;
border-bottom-color: green;
background-color: red;
/*border-right-color: red;*/
border-radius: 90px;
}
/*阴阳图今生*/
.item:nth-child(21) .border-radius {
width: 180px;
height: 90px;
border-bottom-width: 90px;
border-style: solid;
border-bottom-color: green;
background-color: red;
border-radius: 90px;
position: relative;
}
.item:nth-child(21) .border-radius::after,
.item:nth-child(21) .border-radius::before {
content: '';
position: absolute;
top: 50%;
width: 20px;
height: 20px;
/*margin: -10px 0 0 0;*/
border-width: 35px;
border-style: solid;
border-radius: 45px;
}
/*左阴阳*/
.item:nth-child(21) .border-radius::after {
background-color: red;
border-color: green;
}
/*右阴阳*/
.item:nth-child(21) .border-radius::before {
background-color: green;
border-color: red;
right: 0;
}
/*右阴阳*/
.item:nth-child(22) .border-radius {
width: 180px;
height: 90px;
border-bottom-width: 90px;
border-bottom-color: green;
border-bottom-style: solid;
background-color: red;
border-radius: 90px;
position: relative;
}
.item:nth-child(22) .border-radius::after,
.item:nth-child(22) .border-radius::before {
content: '';
position: absolute;
top: 50%;
width: 20px;
height: 20px;
border-width: 35px;
border-style: solid;
border-radius: 45px;
}
.item:nth-child(22) .border-radius::before {
border-color: green;
background-color: red;
}
.item:nth-child(22) .border-radius::after {
right: 0;
border-color: red;
background-color: green;
}
/*消息框*/
.item:nth-child(23) .border-radius {
width: 160px;
height: 80px;
background-color: red;
border-radius: 6px;
position: relative;
}
.item:nth-child(23) .border-radius::after {
content: '';
width: 0;
height: 0;
border-width: 10px;
border-style: solid;
border-color: transparent;
border-right-color: red;
position: absolute;
top: 16px;
left: -20px;
}
/*奇怪的图形*/
.item:nth-child(24) .border-radius {
width: 40px;
height: 40px;
border-width: 45px 0 45px 70px;
border-style: solid;
border-radius: 0 0 60px 0;
border-color: red;
}
/*奇怪的图形2*/
.item:nth-child(25) .border-radius {
width: 100px;
height: 40px;
border-width: 45px 20px 45px 70px;
border-style: solid;
border-radius: 60px;
border-color: red;
}
/*QQ对话*/
.item:nth-child(26) .border-radius {
width: 160px;
height: 80px;
background-color: red;
border-radius: 6px;
position: relative;
}
.item:nth-child(26) .border-radius::after {
content: '';
position: absolute;
top: 0;
right: -20px;
width: 30px;
height: 30px;
border-width: 0 0 30px 30px;
border-style: solid;
border-bottom-color: red;
border-left-color: transparent;
border-radius: 0 0 60px 0;
}
/*圆角的百分比设置 */
.item:nth-child(27) .border-radius {
width: 180px;
/*height: 180px;*/
height: 90px;
border-radius: 50%;
border-radius: 90px/45px;
/*百分比是按横竖两个对应的方向的长度进行计算*/
}
</style>
</head>
<body>
<div class="wrapper">
<header>
<h3>CSS3 边框圆角</h3>
</header>
<div class="main">
<div class="item" data-brief="整圆">
<div class="border-radius"></div>
</div>
<div class="item" data-brief="拱形">
<div class="border-radius"></div>
</div>
<div class="item" data-brief="半圆">
<div class="border-radius"></div>
</div>
<div class="item" data-brief="左上角">
<div class="border-radius"></div>
</div>
<div class="item" data-brief="四分之一圆">
<div class="border-radius"></div>
</div>
<div class="item" data-brief="横着的椭圆">
<div class="border-radius"></div>
</div>
<div class="item" data-brief="竖着的椭圆">
<div class="border-radius"></div>
</div>
<div class="item" data-brief="半个横着的椭圆">
<div class="border-radius"></div>
</div>
<div class="item" data-brief="半个竖着的椭圆">
<div class="border-radius"></div>
</div>
<div class="item" data-brief="四分之一竖着的椭圆">
<div class="border-radius"></div>
</div>
<div class="item" data-brief="饼环">
<div class="border-radius"></div>
</div>
<div class="item" data-brief="圆饼">
<div class="border-radius"></div>
</div>
<div class="item" data-brief="左上角圆饼">
<div class="border-radius"></div>
</div>
<div class="item" data-brief="对角圆饼">
<div class="border-radius"></div>
</div>
<div class="item" data-brief="四边不同色">
<div class="border-radius"></div>
</div>
<div class="item" data-brief="右透明色">
<div class="border-radius"></div>
</div>
<div class="item" data-brief="圆右透明色">
<div class="border-radius"></div>
</div>
<div class="item" data-brief="圆右红透明色">
<div class="border-radius"></div>
</div>
<div class="item" data-brief="阴阳图前世">
<div class="border-radius"></div>
</div>
<div class="item" data-brief="阴阳图前世2">
<div class="border-radius"></div>
</div>
<div class="item" data-brief="阴阳图今生">
<div class="border-radius"></div>
</div>
<div class="item" data-brief="阴阳图今生2">
<div class="border-radius"></div>
</div>
<div class="item" data-brief="消息框">
<div class="border-radius"></div>
</div>
<div class="item" data-brief="奇怪的图形">
<div class="border-radius"></div>
</div>
<div class="item" data-brief="奇怪的图形2">
<div class="border-radius"></div>
</div>
<div class="item" data-brief="QQ对话">
<div class="border-radius"></div>
</div>
<div class="item" data-brief="圆角百分比">
<div class="border-radius"></div>
</div>
</div>
</div>
</body>
</html>
```
效果如下:
![](http://img.smyhvae.com/20180208_1730.png)
## 爱心
```html
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<style>
.heart {
width: 200px;
height: 300px;
/*border: 1px solid #000;*/
margin: 100px auto;
position: relative;
}
.heart::before, .heart::after {
content: "左一半";
width: 100%;
height: 100%;
position: absolute;
background-color: red;
left: 0;
top: 0;
border-radius: 100px 100px 0 0;
transform: rotate(-45deg);
text-align: center;
line-height: 100px;
color: yellow;
font-size: 30px;
font-family: "MIcrosoft Yahei";
}
.heart::after {
content: "右一半";
left: 71px;
transform: rotate(45deg);
}
</style>
</head>
<body>
<div class="heart">
</div>
</body>
</html>
```
效果如下:
![](http://img.smyhvae.com/20180208_1737.png)
它其实是下面这两个盒子叠起来的:
![](http://img.smyhvae.com/20180208_1738.png)
改变 `.heart::after` 的 left值即可叠起来。