其实对 BFC(Block Formatting Contexts 块级格式化上下文) 听过很多次了,虽然每次都无意中也有用到,但是并没有深入的看看这个到底是个什么东西。今天有点时间看到了这篇文章,但是感觉理解起来有点吃力,所以总结下,按照自己的理解再写一写,一方面加深记忆,一方面,以后自己理解起来也方便。

1. 防止外边距叠加。
这里的防止外边距叠加不是两个同级(兄弟)元素之间的外边距叠加,而是防止父元素和子元素之间的外边距叠加。来个结构:

  <div class="a"></div>
  <div class="a">
    <div class="b"></div>
    <div class="b"></div>
  </div>

然后样式:

  .a, .b {
    margin:10px 0;
  }
  .a {
    width:200px;
    height:50px;
    background:red;
  }
 .b {
    width:100px;
    height:10px;
    background:blue;
  }

此时给 .a .b 都有一个

  margin:10px 0;

的外边距。但是并没有触发 .b 的 BFC 特性,此时如图所示:

对 BFC (Block Formatting Contexts) 的一点理解
例子请看:http://jsbin.com/odesoz/3/

然后给 .a 添加

  overflow:hidden;

以触发 .a 的 BFC 特性,此时结果如图所示:

对 BFC (Block Formatting Contexts) 的一点理解
红色是 .a ,蓝色是 .b ,且 .b(蓝色) 是 .a(红色) 的子元素,一目了然。
此时的例子请看:http://jsbin.com/odesoz/2/

2. 清除浮动
其实平常我们使用的清除浮动的技巧,也就是利用了 BFC 的原理。
浮动元素导致父级元素的高度塌陷,此时触发父级元素的 BFC,因为

创建了 BFC的元素就是一个独立的盒子,里面的子元素不会在布局上影响外面的元素,反之亦然,同时BFC任然属于文档中的普通流。

其实这句话挺不好理解的,按我的理解,就是这个元素触发了 BFC 然后它就需要按它的行为来,不管里面的元素是什么样子的。不管你浮动不浮动,我多大我就是多大。所以讲浮动闭合(清除)了。
到这里,其实另一点也就呼之欲出了,那是什么呢?就是 只要是可以使父级元素触发 BFC 的特性,都可以闭合浮动。这些就是闭合浮动的原理。(参考

例子可看:http://jsbin.com/odesoz/5/(清除浮动), http://jsbin.com/odesoz/7/ (未清除浮动)

3. 块级格式化上下文不会重叠浮动元素
其实也就是如果有浮动元素和 BFC 一起的话,BFC 元素,会表现为有宽高的样子。具体请看这篇文章的 3.3,因为我觉得这里写的会比我写得好。而且配图也不错。

那么到底神马是 BFC 呢? (其实这些不想写来着,网上那么多,但还是加深印象吧)

其实说的简单点,就类似于在一个环境中的好几个 display:block 的元素所产生的相互影响的原理和表现。

比较专业的说法就是:它能把一个集合中的 float, margin, clear 等等的各种元素包裹,形成的一个集合就为 BFC , BFC 中的任何都不会对 BFC 外的元素产生影响。
通俗地来说:创建了 BFC 的元素就是一个独立的盒子,里面的子元素不会在布局上影响外面的元素,反之亦然,同时 BFC 仍然属于文档中的普通流。
在普通流( Normal flow )中,在创建了块格式化上下文的元素中的子元素都会按照块格式化上下文提供的规矩来排列自己,除非自己也创建一个新的块格式化上下文。

如何触发块级格式化上下文(BFC)?

    float:left|right ,除了none
    overflow:hidden|auto|scroll(也就是除了overflow:visible;)
    position: absolute|fixed
    display:inline-block|table-cell|table
    fieldset 元素
    表格的单元格(display: table-cells,TD、TH)
    表格的标题(display: table-captions,CAPTION)
    表格元素创建的 “匿名框” 。(display:table 之后创建的匿名框 http://www.w3.org/TR/CSS21/tables.html#anonymous-boxes)

虽然 IE6 7 不支持 BFC,但是在他们中有一个类似的概念 hasLayout。触发hasLayout的条件:

    position: absolute 
    float: left|right 
    display: inline-block 
    width: 除 “auto” 外的任意值 
    height: 除 “auto” 外的任意值 (例如很多人清除浮动会用到 height: 1%  ) 
    zoom: 除 “normal” 外的任意值 (MSDN)
    writing-mode: tb-rl (MSDN)
  在 IE7 中,overflow 也变成了一个 layout 触发器:
    min-width:任何值
    min-height:任何值
    max-width:除了none之外的任何值
    max-height:除了none之外的任何值
    overflow: hidden|scroll|auto ( 这个属性在IE之前版本中没有触发 layout 的功能。 )
    overflow-x|-y: hidden|scroll|auto (CSS3 盒模型中的属性,尚未得到浏览器的广泛支持。他们在之前IE版本中同样没有触发 layout 的功能)

其他一些知识点,请参考引用文章中的那几篇引用文章。

歌词:
Hey Jude

Hey Jude, don’t make it bad.
Take a sad song and make it better.
Remember to let her into your heart,
Then you can start to make it better

Hey Jude, don’t be afraid.
You were made to go out and get her.
The minute you let her under your skin,
Then you begin to make it better.

And anytime you feel the pain, hey Jude, refrain,
Don’t carry the world upon your shoulders.
For well you know that it’s a fool who plays it cool
By making his world a little colder

nananananananananana~

Hey Jude, don’t let me down.
You have found her, now go and get her.
Remember to let her into your heart,
Then you begin to make it better.

So let it out and let it in, hey Jude, begin,
You’re waiting for someone to perform with.
And don’t you know that it’s just you, hey Jude, you’ll do,
The movement you need is on your shoulder

Hey Jude, don’t make it bad.
Take a sad song and make it better.
Remember to let her under your skin,
Then you’ll begin to make it
Better better better better better better oh~

nananananananananananana, hey Jude…

Tamas Wells,是一支来自澳洲墨尔本的 indie-pop 乐团,曲风清新、平缓而又优美。,轻快、含着些忧伤的吟唱,将人们带入那片人们自己心中含藏已久的田野,很容易让人想起从前那无忧无虑的时光。将《Valder Fields》送给大家,下午好。

http://storage.live.com/items/AE6F1995B896B65F!812?Valder Fields.mp3

目前为止,我们的例子中提到过很多次 this 以及函数了。例如 Function.prototype.apply 和 Function.prototype.call 他们都有各自的优势,但是,在讨论这门语言的其他方面之前,先来看看 this 关键字和执行上下文。

方法和函数

方法在ECMAScript规范中被定义如下:

……函数是属性的值。

注:当一个函数被当做对象的方法调用的时候,此时,函数的值就会被当做对象的值。

当被当做对象的方法调用的时候,也可以将函数当做单独的子程序,这在社区中,也是被普遍使用的。

执行上下文(Execution Context)

ECMAScript 5.1 规定,执行中的程序形成执行上下文。此执行上下文支持此语言的某些结构,而这些结构就是需要管理的范围–来自于其他部分的可见变量和函数声明。

此执行上下文包含一个引用到各种可用状态元素的处于当前逻辑范围内的被管理的程序。更多详细信息,请访问 执行上下文

全局上下文和构造函数 (this)

运行下面的代码:

function add(x, y) {
  console.log(this);
  return x + y;
}

add(1, 1);

第二行代码将会是一个全局变脸被现实:window ,但是,如果在第一行之后增加 use strict 的话,将会返回 undefined .

现在思考一下,当构造函数被执行的时候,发生了神马?

当作为 new Shape() 的结果,进入 Shape 构造函数的时候,this 的值就会使当前对象,也就是此处的 shape 。请记住下面的话,如果想写面向对象的程序的话:如果一个函数被作为一个对象的方法调用,或者使用 new 关键字,此时, this 的值就是对象的当前实例,否则就是全局上下文 window 或者 undefined 。但是此处要讨论的是,this 的值,取决于如何调用函数。

一般可能犯得错误

小心的对待嵌套在方法中的函数,例如下面的例子:

function Shape() {
  this.x = 0;
  this.y = 0;
}

Shape.prototype = {
  move: function(x, y) {
    this.x += x;
    this.y += y;

    function checkBounds() {
      if (this.x > 100) {
        console.error('Warning: Shape out of bounds');
      }
    }

    checkBounds();
  }
};

var shape = new Shape();
shape.move(101, 1);

checkBounds 函数被定义在 move 方法内部,但是 console.error 此行代码,却永远不会被运行到,这是因为 checkBounds 函数中的 this 的值是全局上下文 window 而不是此处的 shape。因为虽然函数在 move 方法内部,但执行函数的时候,函数是单独的子程序,所以 this 还是指向 window。而 window.x 没有定义,所以永远执行不到。但是此时就可能混淆,所以带来错误。

但是,我们可以将 this 赋值给其他变量,从而可以正常使用。请注意有 self 的两行代码。如何修改的。

function Shape() {
  this.x = 0;
  this.y = 0;
}

Shape.prototype = {
  move: function(x, y) {

    var self = this;

    this.x += x;
    this.y += y;

    function checkBounds() {
      if (self.x > 100) {
        console.error('Warning: Shape out of bounds');
      }
    }

    checkBounds();
  }
};

var shape = new Shape();
shape.move(101, 1);

现在,当执行 move 方法的时候,self 代替了 this,从而可以正常的执行了。

总结

使用 this 的时候,请记住以下三点:

1. 取决于函数被以何种方式调用,new MyConstructor 和 myObject.method() 将被指向其实例,而当 this 在函数中的话,将会指向 window 。
2. 严格模式下,this 将会是 undefined 而不是 window 。
3. this 可以赋值给任意合法变量,但是一般 self 用的比较多。

看到小夜MM,在论坛放了那么好的图片站源码还有数据包,嘿嘿嘿,刚好之前有做图片站的打算,所以准备了一个域名,那就偷偷的自己也弄一个,就传到 Godaddy.com 的免费空间中,反正现在也没广告了,10G 空间 300G 流量,够够用的了。程序只有 8M 多,挺好弄的,很快 FTP 就传好了,但是数据咋办呢,1.4G 的数据,VPS wget 直接拖下来也就几十分钟,但是上传咋办呢?不好弄啊,FTP 也不行,先下载到本地,再 FTP 那几十 KB 的速度上传,不累死才怪。况且有 VPS 呢,国外对国外不是更快么。

那么说干就干。也就是今天的用 SSH 登录远程服务器 A,然后在服务器 A 上的终端,通过命令行来使用 FTP 命令,将上传文件到 B 服务器。

具体步骤如下:

1. ,首先用 cd 命令,进入要上传的文件所在的目录,然后在终端中输入

ftp

即可变为 FTP 操作环境
终端显示为,此为 ftp 操作环境标志。

ftp>

2. 然后输入要登录的远端服务器地址,ip 和域名都行

ftp> open yimity.com

3. 然后终端就会有如下显示(IP 时间等,还有其他的有可能不同,差不多即可)

Connected to yimity.com (173.248.187.5).
220---------- Welcome to Pure-FTPd [privsep] [TLS] ----------
220-You are user number 5 of 50 allowed.
220-Local time is now 08:52. Server port: 21.
220-IPv6 connections are also welcome on this server.
220 You will be disconnected after 3 minutes of inactivity.
Name (yimity.com:root):  然后这里输入 FTP 用户名

4. 接下来就是输入密码

331 User yimity OK. Password required
Password:  这里输入密码,输入过程中不会有任何显示,但其实已经输入了。

5. 然后如果密码正确,就会有如下提示

230-User yimity has group access to: yimity
230 OK. Current restricted directory is /
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>

6. 登录成功后,就可以进行文件传输了。使用 put 命令。

ftp>put 0170.tar.gz 0170.tar.gz

put 命令 第一个参数是本地文件的文件名,第二个参数是远程文件的文件名。

ftp>put 0170.tar.gz /wp-content/uploads/0170.tar.gz

put 命令 第一个参数是本地文件的文件名,第二个参数是远程文件的文件名,前面加了存储的路径。

7. 退出

ftp>exit

就会退回到 VPS 终端操作环境。

一片枯黄的冬日伴随着春日逐渐返青的草地,像年幼的孩子一般,一股脑的消失在眼前,又像风骚的少妇般,扭着令人心动的丰臀,渐行渐远,慢慢的消失不见;只希望更加温暖的春日阳光早早来临,就像孩子们清澈透亮的笑声一样,传遍大街小巷,人们再也不用蜷缩在厚厚的衣物后面,悄悄的探出一只眼观看这个冰冷又死气沉沉的世界。

或许那样,当春日温暖的阳光照进我寒冷心房的时候,我就会幸福起来;当内心一个个枯黄的小草被青绿的颜色取代的时候,我就会幸福起来。当漫山遍野山花烂漫的时候,我就会幸福起来。

是否,我会真的幸福起来吗?

没有你的日子,或许还一如平常,只是偶尔溢出来的思念,谁人不知,却已被寂寞吞噬。

或许真的一如平常?还只是自欺欺人。那又为何每次走过曾经一起来的路,总会恍若隔世,却又好似昨日。

六年的时间,当思念像毛线般,逐渐绕成一个圈,我出不来,谁人也进不去。

忽然想到,你说过我是一个那么被动的孩子,我就想起来了小时候,舅舅为了我们的安全不让我们下河玩,而每当我们不听话下河被发现之后,舅舅就会用粉笔在地上画个圈,让我们都不准出去,而最后,就只有我一个人被一个粉笔画的圈给禁锢住。被别人笑,我却沉默,或许那时候就有骨子里的认真劲,答应了,就不放弃。答应了,就要做到。

可以,或许我终究还是放弃了?还是……

有时候,是不想出去,有时候是怎么也出不去。

一辈子,零零总总,还有那么多日子,有一个你;人海穿梭中,背对背的感情,却早已渐行渐远,消失不见。一辈子,不多不少,剩余了那么多的日子,没有你,茫茫前行中,背对背的感情,却一点没有减少,完好如初。

人海茫茫,看别人的感情,来来往往,熙熙攘攘,多拥挤,脚不停,心也不曾停下,身边更变换不停,难道唯一就可以动摇得那么轻易?或者,是他们醉酒没醒。还是我们在做梦?

不过,都已不再重要!

不是吗?

你要过上你好的生活,我要过我想要的生活,从一开始,6年前的你,6年后的我,或者都已注定。眼睛一闭,眼睛一睁,恍若隔世,却一辈子……

不过,你一定要幸福,我给不了你,你要给自己!