未来往事
本文主要介绍Thinkpad E430/431 Win8系统改为Win7系统的步骤:
自微软公司发布Win8系统以后,越来越多的电脑厂商都把Win8系统出厂预装到笔记本当中,联想Thinkpad E430系列笔记本也不例外,由于Win8系统的操作界面发生了很多改变,有很多人还不太喜欢使用电脑出厂预装的Win8系统,所以想要把Thinkpad E431笔记本中出厂预装的Win8换成Win7系统。

对于笔记本电脑装系统,相信很多人都不陌生,但就有很多朋友问我,为什么我用U盘或是光盘对出厂预装了Win8系统的电脑安装系统,在按F12选择U盘或光盘启动的时候,老是进不去,画面闪动一下,又回到原来的界面,这是什么原因造成了的呢? 
有些人开始怀疑这是U盘或光盘坏了,或者是PE没有做好等原因,但拿到其它电脑上去,又成正常启动,这到底是那里出问题了呢?   其实这不是你的U盘或PE出问题了,而是笔记本电脑预装Win8系统,采用了UEFI接口的原因,所以才会有一些PE无法兼容导致进不去,如果我们想要把预装的Win8系统换成Win7系统,我们只需要更改一下BIOS即可。
  
Win8换Win7更改BIOS的方法一: 
按开电源键,即可不停地按F1键,进入BIOS操作界面,按向右的方向键,选择“Security”,然后再按向下的方向键,选择最下面的“Secure Boot”,按回车键进入;
把“Secure Boot"中的“Enabled”按回车键更改成“Disabled”;
按Esc键返回上一级菜单,再按向右方向键,选择“Startup”,把“UEFI/Legacy Boot”中的“UEFI Only”改成“Both”即可,按“Fn+F10”保存,然后就可以和其它电脑一样正常安装系统了。

Win8换Win7更改BIOS的方法二:  
 同样是按电源键后,不停地按F1进入BIOS操作界面,按向右方向键
选择“Restart”,然后再把“- OS Optimized Defaults”中的“Enabled”改成“Disabled”,在更改过程中,会弹出提示,我们选择YES即可;
然后再按“Fn+F9”重置BIOS设置,重置完成以后,按再“Fn+F10”保存设置即可,这时就同没有预装Win8系统的电脑重装系统的方法是一样的了。 

 注:你可以根据自己需要,随意选择上面其中一种更改BIOS中UEFI接口的方法,只要执行了上面其中某种方法的操作,即可顺种地通过U盘或光盘启动来更换Win8操作系统。 

常见错误:
Win8系统换Win7以后,画面卡在“正在启动Windows” ?
出厂预装Win8系统换成Win7,必须更换BIOS中的UEFI接口,然后再重装系统。但系统通过ghost导入到电脑硬盘当中,重启时,画面就一直卡在“正在启动Windows”处,这是什么原因造成的呢?其实这主要是因为分区表错误的原因造成的,我们只需要运行PE系统的中DiskGenius分区工具,选择中电脑硬盘,再点文件边上的硬盘,在下拉菜单中点击“重建主引导记录(MBR)”即可,然后再按正常操作对电脑硬盘进行重新分区并重装系统即可。

详细说明信息参考本博客其他类似文章
ASUS S200E Win8系统改为Win7系统
GPT与MBR分区表格式类型转换
网页倒计时代码 倒计时代码 网站运行时间代码 网站已运行天数代码
1、jQuery.countdown插件
显示格式:50 周 01 天 07 小时 18 分 41 秒(秒为跑秒)
一个页面可以有多个倒计时实例,可以停止和开始,它没有提供太多的功能,但时间格式和输出的尺寸都可以自定义。
目前最新版v2.0.4,官方地址http://hilios.github.io/jQuery.countdown/
例如:
输出结果:50 周 01 天 07 小时 18 分 41 秒

输出结果:00 days 00:08:21

输出结果: 89 时 20 分 12 秒

注意:如果需要一共还有多少天数用%D,参数说明:
Y: "years"
m: "months"
w: "weeks"
d: "days"
D: "totalDays"

H: "hours"
M: "minutes"
S: "seconds"


2、显示格式:距离结束时间还有:00天05小时25分30秒(秒为跑秒)


3、 显示格式:已运行0 年 1 天 0 小时 4 分钟 35 秒(秒为跑秒)

Tmail登录失败问题 不指定

Rinald 本站原创 Mail服务器 2014/01/14 23:45
之前安装的是Tmail5.0.1,最近邮件服务器有时登录提示登录失败,有时在登录状态下刷新时提示MySQL链接数超出等,时好时坏,经过查找发现tmail安装完成后没有创建my.cnf配置文件,于是重新创建了一份MySQL配置文件my.cnf并对MySQL的连接数做了适当配置后,发现问题没有再次出现过。
关于MySQL寻找my.cnf配置文件的顺序过程可以参考本博客相关文章。

CSS样式优先级 不指定

Rinald 本站原创 WEB前端 2014/01/14 23:33
一、CSS样式选择器优先级
ID选择器(形如#divMain{})  >  类(形如.divSpecial{})  >  标签(形如body{})

二、CSS文件的优先级
1、标有”!important”的规则有最高优先级
一个样式规则可以有一个”important”附带标签,表示该样式规则具有最高优先级。例如下面例子中,前景色被标为important。
注意:这种声明容易引起混乱,因此通常使用得较少。

2、创作者规则优先级高于浏览者规则
浏览器允许浏览者创建样式规则以覆盖系统缺省值。在此情况下,由网页创作者明确设定得样式优先级较高,而浏览者设置得样式规则优先级较低。

3、更特殊得规则优先于不够特殊的规则
在决定特殊性时,selector中的ID属性有最高优先级。基于ID selector的优先级可通过计数Selector中类属性的数量确定,数量越多优先级越高。假如规则仍然无法确定优先级,则HTML元素名的数量决定了特殊性。

4、在同一个级别的情况下,最后指定的规则有优先权
假如两个或更多的规定在应用了前三个规定具有相同优先级,则后给出的规则优先于早先给出的规则。
如果在网页的HEAD标记中同时使用了STYLE标记符(指定嵌入式样式)和LINK标记符(指定链接式样式),并且这两个样式指定中同时应用了具有同一优先级别的样式,则STYLE标记符和LINK标记符的先后顺序将决定样式的优先级。

例如,如果在LINK所链接的样式表(mycss.css)中定义了以下一条样式规则:

同时在嵌入式样式定义中也定义了一条规则:

在网页中的样式定义如下所示:
由于style标记符中定义的样式后出现,因此它具有更高的优先级,所以网页中H1标记符的内容将显示为黄色(yellow)。同样,如果将link标记符的位置移动到标记符之后,则网页中H1标记符的内容将显示为红色(red)。

另外,由于直插式样式(使用html标记的style属性设置的样式)的位置最接近于样式作用的标记符,因此它通常具有高优先级。

MySQL子查询常见格式 晴

Rinald 本站原创 MySQL 2014/01/14 23:17
MySQL常见的几种子查询形式
mysql从4.1版开始支持子查询功能,在此版本前,可以用join写连表查询来进行替代,但不推荐这么写,相当的麻烦。mysql子查询的几种常见写法:
该句法可分为加关键词和不加关键词的写法,当不加关键词的时候,子查询语句返回的是一个离散值(注意是一个),查询语句将以子查询语句的结果作为自己 where子句的条件进行查询,该句法可以在子查询语句前加入any、all、some等关键字,此时子查询语句返回的是一组离散值。any则表示,查询语句是以子查询返回的值作为一个范围,在此值范围内进行查询,其与in关键字相像;all关键不太好了解,表示起全部匹配啥的。

该 句法相当的明了,就是查询语句的where子句是以子查询语句的结果作为其范围的,与上一种语法的any相似;

该语句的执行实质是:子查询语句的执行所得的结果与查询的结果集匹配,若能找到匹配的返回真,否则返回假,并且两边的结果集都是一组离散值;

该语句比较蹩脚,其执行是这样的:当子查询进行操作,有返回结果的时候,该语句才会执行,而且有多少个结果,语句就执行几次;

该句法,在平时用的比较少,而且并不好理解。其实是这么一回事,通过子查询执行的结果来构造一张新的表(这个表是一张衍生数据表,是一张虚拟的表),其用来作为主句的查询的对象,该句法功能非常强大,在一些复杂的查询中会经常用到。

子查询虽然挺方便,但其有不少缺点,其不支持limit,而且经实验证明其执行效率相当不理想,在一般的情况下,还是不推荐是用子查询。
本文介绍了PHP会话控制,主要阐述以下几点内容:
会话控制的产生背景/概念
cookie的维护与生命周期(有效时间)
session的维护与生命周期(回收机制)
cookie与session之间的区别与联系
问题1:禁用cookie后session为什么会失效?
问题2:IE浏览器下丢失session,每次刷新页面,都会生成新的sessionID(Firefox浏览器正常)
session、cookie简单实例

▶ 本文最后更新:2014-01-23(更新内容‘问题2’

● 理解会话控制的概念
理解一个概念就需要理解他的背景及产生的原因,这里引入WEB环境及其HTTP协议。会话控制产生的背景:
阅读过HTTP协议相关资料的同学都会知道HTTP协议是WEB服务器与客户端(浏览器)相互通信的协议,它是一种无状态协议,所谓无状态,指的是不会维护http请求数据,http请求是独立的,不持久的。也就是说HTTP协议没有一个内建的机制来维护两个事务之间的状态或者说是关系吧。当一个用户在请求一个页面后再去请求另外一个页面时,HTTP将无法告诉我们这两个请求是否来自同一个用户。

由此我们就会觉得很奇怪了,平时我们在论坛逛帖子或电商网站购物时,只要我们在这个站点内,不论我们怎么跳转,从一个页面跑到另一个页面,网站总会记得我是谁,比如告诉你购买了哪些东西。这是怎么做到的呢,估计大家猜到了,这就是运用了HTTP会话控制。在网站中跟踪一个变量,通过对变量的跟踪,使多个请求事物之间建立联系,根据授权和用户身份显示不同的内容、不同页面。

PHP Session会话控制:
PHP的session会话是通过唯一的会话ID来驱动的,会话ID是一个加密的随机数字,由PHP生成,在会话的生命周期中都会保存在客户端。我们知道客户端(也就是浏览器)保存数据的地方只有cookie,所以PHP的会话ID一般保存在用户机器的cookie中。了解cookie后我们知道,浏览器是可以禁用cookie的,这样会话就会失效。所以PHP会话控制还有一种模式,就是在URL中传递会话ID。如果在浏览网站时我们稍加留心的话,有些URL中有一串看起来像随机数字的字符串,那么其实很有可能就是URL形式的会话控制。

讲到这里,有些人可能会有疑问了,客户端只是保存一个会话ID,那么会话控制中保存的会话变量比如你购物时买的物品列表等,它们是存放在哪个地方的呢?很显然,会话变量是在服务器端使用的,那么这些会话变量必定存放在服务器端。默认情况下,会话变量保存在服务器的普通文件中(也可以自己配置使用数据库来保存,可以Google一下),会话ID的作用就像是一把钥匙,在服务器端保存会话的文件中找到该会话ID对应的会话变量,比如购买物品的列表。

那么会话控制的整个过程可能就像这个样子,用户登录或者第一次浏览某个站点的页面时,该站点会生成一个PHP的会话ID并通过cookie发送到客户端(浏览器)。当用户点击该站点的另一个页面时,浏览器开始连接这个URL。在连接之前,浏览器会先搜索本地保存的cookie,如果在cookie中有任何与正在连接的URL相关的cookie,就将它提交到服务器。而刚好在登陆或第一次连接时,已经产生了一个与该网站URL相关的cookie(保存的会话ID),所以当用户再次连接这个站点时,站点就可以通过这个会话ID识别出用户,从服务器的会话文件中取出与这个会话ID相关的会话变量,从而保持事务之间的连续。


接下来我们了解下两个重要的概念:cookie和session
● 关于cookie的维护与生命周期
cookie是在服务器端被创建并写回到客户端浏览器,浏览器接到响应头中关于写cookie的指令则在本地临时文件夹中
创建了一个cookie文件,其中保存了你的cookie内容,cookie内容的存储是键值对的方式,键和值都只能是字符串。例如:
文件:Cookie:administrator@localhost/
内容格式:voteID100101localhost/15361167667230343893360385046430343691*

cookie的创建:
setcookie()函数设置cookie,函数原型如下
setcookie(name, value, expire, path, domain);
注释:cookie标题头必须在发送其他标题头之前发送,否则就无效(这是cookie的限制,而不是PHP的限制)。在发送 cookie 时,cookie 的值会自动进行 URL 编码,在取回时进行自动解码(为防止 URL 编码,请使用 setrawcookie() 取而代之)。

cookie的维护:
cooke有四个标识符:cookie的name,domain,path,secure标记。要想在将来改变这个cookie的值,需要发送另一个具有相同cookie name,domain,path的Set-Cookie消息头,这将以一个新

的值来覆盖原来cookie的值。然而,如果仅仅只是改变这些选项的某一个也会创建一个完全不同的cookie,如只是更改了name值。

cookie失效时间:
可以设置过期时间,如果不设置则是会话级别的,即关闭浏览器就会消失。当cookie创建时包含了失效日期,这个失效日期则关联了以name-domain-path-secure为标识的cookie。要改变一个cookie的失效日期,你必须指定同样的组合。当改变一个cookie的值时,你不必每次都设置失效日期,因为它不是cookie标识信息的组成部分。例如:
在cookie上的失效日期并没有改变,因为cookie的标识符是相同的。实际上,只有你手工的改变cookie的失效日期,否则其失效日期不会改变。这意味着在同一个会话中,一个会话cookie可以变成一个持久化cookie(一个可以在多个会话中存在的),反之则不可。为了要将一个持久化cookie变为一个会话cookie,你必须删除这个持久化cookie,这只要设置它的失效日期为过去某个时间之后再创建一个同名的会话cookie就可以实现。

需要记得的是失效日期是以浏览器运行的电脑上的系统时间为基准进行核实的。没有任何办法来来验证这个系统时间是否和服务器的时间同步,所以当服务器时间和浏览器所处系统时间存在差异时这样的设置会出现错误。

cookie自动删除:
cookie会被浏览器自动删除,通常存在以下几种原因:
会话cooke(Session cookie)在会话结束时(浏览器关闭)会被删除
持久化cookie(Persistent cookie)在到达失效日期时会被删除,如:
如果浏览器中的cookie限制到达,那么cookies会被删除以为新建cookies创建空间。

● 关于session的维护与生命周期
+阅读全文

如何面对生活 晴

Rinald 九九文章网 随笔/分享 2013/12/25 12:48
  人活在这个世上,不可能都是一帆风顺的,有时遇到困难,有时遇到挫折,有时遇到变故,有时遇到不顺心的人和事,这些都是人生前进中的正常现象。但是,有的人遇到这些现象时,心烦意乱,痛苦不堪,悲观失望,甚至失去面对生活的勇气。
  
  当你遇到不顺时,它会让你的头脑更加理性,让你面对不顺时,不是悲观失望,而是反思自己的做事方法,做人原则,让你有则改之,无则加勉,更上一层楼。
  
  如果没有人陪,学着一个人听音乐看书写字。这是个好习惯。
  
  不要对人随便发脾气。
  
  如果一个人怠慢你,请你离开他。不懂得珍惜你的人不要为之不舍,更不必继续付出你的友情,爱情。
  
  如果可以不抽烟,别抽。如果可以不喝酒,别喝。
  
  再郁闷也不要去泡酒吧。一个孤独的人手握高脚杯和抽烟,会更添寂寞感和忧伤。
  
  闲下来的时候,放一段柔情音乐,翻阅几页好书,然后睡个懒觉,快哉。心情不好的时候也可以睡一觉。
  
  从现在开始,聪明一点,不要问别人想不想你?爱不爱你?若是要想你,爱你自然会对你说,但是从你的嘴里说出来,别人会很骄傲和不在乎你。
  
  有固定的消遣场所,比如固定的咖啡馆,书店。让那个人地方的服务生认识你,这样,你会在孤单时有个温暖的去处。
  
  不要为了任何人任何事折磨自己。比如不吃饭,哭泣,自闭,抑郁,这些都是傻瓜做的事。当然,偶然傻一下有必要,人生不必时时聪明。
  
  任何情况下,背后不说他人是非。如果一定要说,说好话。
  
  一定要有几个异性朋友,没有非份之想。就是关键时候,帮你出出主意。
  
  学会承受痛苦,有些话适合烂在心里,有些痛苦,适合无声无息的忘记。当经历过,你长大了,自己知道就好。很多改变,不需要你说,别人会看得到。
版本:PHP4, PHP5
string implode ( string $glue , array $pieces )
string implode ( array $pieces )
implode() 函数将一个一维数组元素合为一个字符串,并返回该字符串。其内容为由 glue 分割开的数组的值。

参数说明:
glue:默认为空的字符串
pieces:你想要转换的数组
备注:4.3.0开始glue 变为可选参数。

范例:

输入内容过滤 PHP 不指定

Rinald 本站原创 PHP 2013/12/01 22:36
PHP内容过滤方法,过滤没用的信息比较严格,有用的可能也输入不进去,可以从网上找找其他的过滤方法:
iframe高度随页面内容自适应高度,当页面高度变动时iframe高度也自动变化
浏览器兼容:IE6++、Firefox全系列、Chrome全系列、(其他版本浏览器未做测试,期待你测试评论反馈以完善本文,谢谢)

同域环境下实现方法:
方法一:仅修改iframe父页面(iframeA.php),iframe子页面内容(iframeB.php)不用添加其他js或额外代码
iframe父页面(iframeA.php)添加代码如下:
<iframe width="100%" height="0" id="frame_content" src="http://fity.cn/iframeB.php" scrolling="no" frameborder="0" onload="this.height=this.contentWindow.document.documentElement.scrollHeight"></iframe>

<script type="text/javascript">
function reinitIframe(){
var iframe = document.getElementById("frame_content");
try{
var bHeight = iframe.contentWindow.document.body.scrollHeight;
var dHeight = iframe.contentWindow.document.documentElement.scrollHeight;
var height = Math.max(bHeight, dHeight);
iframe.height =  height;
}catch (ex){}
}
window.setInterval("reinitIframe()", 200);
</script>

方法二:修改iframe子页面内容(iframeB.php),iframe父页面(iframeA.php)不需要加入js代码
iframe父页面(iframeA.php)添加代码如下:
<IFRAME border=0 marginWidth=0 frameSpacing=0 marginHeight=0 src="http://fity.cn/iframeB.php" frameBorder=0 noResize scrolling="no" width=100% height=100% vspale="0" id="childFrame" ></IFRAME>
iframe子页面(iframeB.php)代码范例如下:
<!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="zh-cn">
<head>
<script language="javascript" type="text/javascript">
function IFrameResize(){
//alert(this.document.body.scrollHeight); //弹出当前页面的高度
var obj = parent.document.getElementById("childFrame"); //取得父页面IFrame对象
//alert(obj.height); //弹出父页面中IFrame中设置的高度
obj.height = this.document.body.scrollHeight; //调整父页面中IFrame的高度为此页面的高度
}
window.setInterval("IFrameResize()", 200);//这里的时间可以设置短一些,时间越短高度变动时抖动越不明显
</script>
</head>
<body onload="IFrameResize()">
<div id='main' style='background:#FFF;width:100%;'>
测试数据
<br/>
测试数据
<br/>
测试数据
<br/>
http://fity.cn
</div>
</div>
</body>
</html>
注意:这里需要定义body onload属性


跨域环境下实现方法:
iframe若是跨域,不能直接用JS来控制,只能通过一个中间代理,我们这里选择在iframe的子页面(iframeB.php)中加一个与iframe父页面(iframeA.php)同域的页面(iframeC.php);这样页面iframeC.php就能和父页面iframeA.php进行无障碍的通讯了;因为子页面iframeB.php页面嵌入iframeC.php,所以页面iframeB.php可以改写页面iframeC.php的href值,这里给出一个例子,假设域名对应文件如下:
引用
iframeA.php  位于http://fity.cn域上
iframeB.php   位于http://www.household114.com域上
iframeC.php  位于http://fity.cn域上

实现方式:
+阅读全文

discuz楼层错乱一楼不显示处理 不指定

Rinald 本站原创 Discuz 2013/11/30 23:52
discuz楼层错乱1楼主题内容不显示问题解决

任何数据库应用都存在分页性能问题,mysql的性能问题似乎更大些。Discuz7.2(以下简称dz7.2)和Discuz X2(简称X2)的抢楼机制基本相同,抢楼与普通帖子(盖楼)是不同的处理机制。到了Discuz X2.5(简称X2.5)就把抢楼与盖楼机制统一。
引用来源:X2.5的新程序架构

由以上信息可以看出Discuz!X2.0及更早版本与Discuz!X2.5对抢楼及盖楼的机制并不相同、数据结构也相应的存在差距。为了解决这一问题,我们同时首先需要了解下discuz数据表以下几个常见字段:
tid:主题id
pid:帖子id
position:显示位置
first:是否是首贴


Discuz!X2.0及更早版本主题抢楼盖楼数据表:
forum_post 帖子表
forum_postposition帖子排楼顺序表,用来存储论坛帖子的排序,该表采用 (tid, position) 两个字段联合做自增主键,在高并发情况下,效率自然不高。(题外话,补充一点:该表不宜修改为InnoDB,建议新增了一列自增ID做主键,该主键和业务完全没有任何关系,仅用做自增主键。)
forum_postposition表的存储内容格式:
点击在新窗口中浏览此图片
在抢楼帖中假设forum_post表中first字段为1且该帖pid与forum_postposition表中pid相等且forum_postposition表中position字段为1对应则为1楼。


Discuz!X2.5及更高版本主题抢楼盖楼数据表:
forum_postpositin帖子排楼顺序表:取消了forum_postpositin表,在 post主表中增加 position 字段保存每个帖子的楼号。
forum_post 帖子表中多了一个position字段,如图:
点击在新窗口中浏览此图片
至此,你应该知道如何解决或处理该问题了。该问题在Discuz!X2.5及更高版本中很少遇见或几乎不会遇见,原因上述内容已经提到。

扩展阅读

先不分析X2.5固定楼号的利弊,就谈谈从dz7.2到X2.5对楼层处理机制以及变化的优缺点。
dz7.2用 postposition表来实现抢楼楼号排序,顺便也实现了对高楼层分页性能优化;X2 postpositon表只用来抢楼,对于高楼层主题分页优化没看到相关处理;X2.5对post主表添加楼号字段来让所有帖子的楼号固定,从而解决分页性能问题,也一并解决了抢楼问题。

从抢楼为主,附加高楼层分页到所有楼层分页为主,附带实现了抢楼,这个变化说明随着discuz功能增加对于分页性能的需求也变大,另外一个显示原因是那些长期使用discuz系统的大站数据也越来越大,大于1000万帖子的不是少数,他们对分页性能提高的需求更迫切。

看似Discuz!X2.5及更高版本的处理方式更好,但或许是因为缺乏DBA的支持,Discuz因为mysql的弱智低能带来的称重包袱而导致开发正走向歧路,具体可以参阅Discuz上这篇帖子《从Discuz7.2/X2盖楼机制到DiscuzX2.5盖楼抢楼合一分析Discuz!X的mysql技术包袱》


高级CSS样式选择器 不指定

Rinald 本站原创 WEB前端 2013/11/12 16:56
CSS选择器,CSS样式选择器,CSS选择器详解,高级CSS选择器,高级CSS选择器参考手册,CSS选择器参考指南

我们知道CSS 2 开始引入了属性选择器。属性选择器可以根据元素的属性及属性值来选择元素。简单的说即在 CSS 中,选择器是一种模式,用于选择需要添加样式的元素。本文主要描述CSS样式表中选择器的一些用法,当然你可能已经对CSS样式选择器不在生疏,但是通过本文你将能更好的掌握CSS样式的一些高级选择器使用。

CSS是对网页设计师可用的最强大的工具之一,你也许已经掌握了id、class、后台选择器这些基本的css选择器。但这远远不是css的全部。本文向大家介绍一些常见的高级CSS样式选择器,包括我们最头痛的浏览器兼容性问题。掌握了它们,才能真正领略css的巨大灵活性。

在深入研究高级CSS选择器之前,理解CSS优先级是如何工作很重要,这样我们就知道如何适当的使用我们的选择器并避免浪费大量的时间来调试一些只要我们注意到优先级的话就很容易被搞定的问题。当我们写CSS的时候我们必须注意有些选择器在级联(cascade)上会高于其它选择器,我们写在最后面的选择器将不一定会覆盖前面我们写在同一个元素的样式。选择器的优先级别规则:一般而言,选择器越特殊,它的优先级越高。也就是选择器指向的越准确,它的优先级就越高。通常我们用1表示标签名选择器的优先级,用10表示类选择器的优先级,用100标示ID选择器的优先级。在本文中也会在相关选择器中进行标注。

一、基本选择器(兼容浏览器:IE6+、Firefox、Chrome、Safari、Opera)
*  通用元素选择器,匹配任何元素,在页面上的每一个元素上起作用
h4  标签选择器,匹配所有使用h4标签的元素.优先级仅仅比*高
.textbox  class(类)选择器,匹配所有class属性中包含textbox的元素,class选择器与id选择器的不同是class选择器能作用于期望样式化的一组元素
#mainWrapper  id选择器,匹配所有id属性等于mainWrapper的元素。id是我们最常用的css选择器之一。id选择器的优势是精准,高优先级(优先级基数为100,远高于class的10),作为javascript脚本钩子的不二选择,同样缺点也很明显优先级过高,重用性差,所以在使用id选择器前,我们最好问下自己,真的到了非用id选择器的地步?
例如:


二、多元素的组合选择器/扩展选择器(兼容浏览器:IE7+、Firefox、Chrome、Safari、Opera)
E,F  多元素选择器/群组选择器,同时匹配所有E元素或F元素,E和F之间用逗号分隔,如div,span,img{}(值得注意的是兼容IE6+)
E F  后代元素选择器--这也是我们最常用的一种选择器。要留意的点是,这种方式的选择器将选取其下所有匹配的子元素,无视层级,所以有的情况是不宜使用的。匹配所有属于E元素后代的F元素,E和F之间用空格分隔(值得注意的是兼容IE6+)
E > F  子元素选择器,匹配所有E元素的子元素F,与后代选择器E F不同的是,子选择器只对E下的直接子级F起作用
E + F  毗邻元素选择器,匹配所有紧随E元素之后的同级元素F(只匹配第一个元素)
例如:


三、属性选择器(兼容浏览器:IE7+、Firefox、Chrome、Safari、Opera)
属性选择器(Attribute selector)让你可以基于属性来定位一个元素。你可以只指定该元素的某个属性,这样所有使用该属性——而不管它的值——的这个元素都将被定位,也可以更加明确并定位在这些属性上使用特定值的元素 —— 这就是属性选择器展示它们的威力的地方。

CSS 2.1 属性选择器 (注意:由于博客程序问题,value值需要有双引号,下同)
E[att]  匹配所有具有att属性的E元素,不考虑它的值。(注意:E元素在此处可以省略,比如 [cheacked] 。以下同);
E[att=value]  匹配所有att属性等于 value 的E元素,即:该属性有指定的确切的值;
E[att~=value]  匹配所有att属性具有多个空格分隔的值、其中一个值等于 value 的E元素,即:该属性的值必须是一系列用空格隔开的多个值,(比如,class= title featured home ),而且这些值中的一个必须是指定的值 value ;
E[att|=value]   匹配所有att属性具有多个连字号分隔(hyphen-separated)的值、属性的值就是 value 或者以 value 开始并立即跟上一个 - 字符,也就是 value- 。(比如lang= zh-cn );

CSS 3 属性选择器
E[att^= value ]  属性att的值以 value 开头的元素,即:该属性的值以指定值开始。
E[att$= value ]  属性att的值以 value 结尾的元素,即:该属性的值包含指定的值(而无论其位置)
E[att*= value ]  属性att的值包含 value 字符串的元素,即:该属性的值以指定的值结束。
例如:


四、 CSS 2.1中的伪类(兼容浏览器:IE7+、Firefox、Chrome、Safari、Opera)
E:first-child   匹配父元素的第一个子元素。
E:link  匹配所有未被点击的链接标签。
E:visited  匹配所有已被点击的链接标签。
E:active  匹配鼠标已经其上按下、还没有释放的E元素
E:hover  匹配鼠标悬停其上的E元素,即:当鼠标划过时E元素的样式。需要注意的是,在IE6中:hover只能用于链接元素。
E:focus  匹配获得当前焦点的E元素--最常用于表单元素
E:lang(c)  匹配lang属性等于c的E元素
例如:


五、CSS 2.1中的伪元素/伪对象 [兼容性:IE6、IE7与IE8(怪异模式Quirks mode)不支持此伪元素,兼容浏览器IE9+、Firefox、Chrome、Safari、Opera]
E::first-line  匹配E元素的第一行
E::first-letter  匹配E元素的第一个字母
E::before  在E元素之前插入生成的内容
E::after  在E元素之后插入生成的内容
例如:


六、CSS 3的同级元素通用选择器(兼容浏览器:IE7+、Firefox、Chrome、Safari、Opera)
E ~ F 相邻选择器,与前面提到的E+F不同的是,E~F匹配与E相同级别的所有F元素,而E+F只匹配第一个。
例如:


七、CSS 3中与用户界面有关的伪类(兼容浏览器:IE9+、Firefox、Chrome、Safari)
E:enabled   匹配表单中激活的元素(比如,文本输入框)和 checked 或unchecked 状态(radio单选按钮和checkbox复选框)
E:disabled  匹配表单中禁用的元素(同上)
E:checked  匹配处于选定状态的界面元素(同上)
E::selection   定义用户鼠标已选择内容的样式
例如:


八、CSS 3中的结构性伪类(兼容浏览器:IE9+、Firefox、Chrome、Safari)
E:root   匹配文档的根元素,对于HTML文档,就是HTML元素
E:nth-child(n)  匹配其父元素的第n个子元素,第一个编号为1
E:nth-last-child(n)   匹配其父元素的倒数第n个子元素,第一个编号为1
E:nth-of-type(n)   与:nth-child()作用类似,不同的是它匹配的不是某个序列元素,而是元素类型
E:nth-last-of-type(n)  与:nth-last-child() 作用类似,但是仅匹配使用同种标签的元素
E:last-child  匹配父元素的最后一个子元素,等同于:nth-last-child(1)
E:first-of-type  匹配父元素下使用同种标签的第一个子元素,等同于:nth-of-type(1)
E:last-of-type   匹配父元素下使用同种标签的最后一个子元素,等同于:nth-last-of-type(1)
E:only-child  匹配父元素下仅有的一个子元素,等同于:first-child:last-child或 :nth-child(1):nth-last-child(1),这个伪类用的比较少
E:only-of-type  匹配父元素下使用同种标签的唯一一个子元素,等同于:first-of-type:last-of-type或 :nth-of-type(1):nth-last-of-type(1)
E:empty  匹配一个不包含任何子元素的元素,注意,文本节点也被看作子元素
例如:


九、CSS 3的反选伪类/否定伪类选择器(兼容浏览器:IE9+、Firefox、Chrome、Safari)
E:not(value)   否定伪类选择器用来在匹配元素时排除某些元素,匹配不符合当前选择器的任何元素
例如:


十、CSS 3中的 :target 伪类(不支持IE全系列)
E:target  匹配文档中特定 id 点击后的效果
例如:


扩展阅读:
1、如何写出简洁、高效的CSS?
• 不要在ID选择器前使用标签名
  一般写法:DIV#divBox
  更好写法:#divBox
  解释: 因为ID选择器是唯一的,加上div反而增加不必要的匹配。
• 不要再class选择器前使用标签名
  一般写法:span.red
  更好写法:.red
  解释:同第一条,但如果你定义了多个.red,而且在不同的元素下是样式不一样,则不能去掉
• 尽量少使用层级关系
  一般写法:#divBox p .red{color:red;}
  更好写法:.red{..}
• 使用class代替层级关系
  一般写法:#divBox ul li a{display:block;}
  更好写法:.block{display:block;}

2、样式表中定义CSS兼容IE6、IE7、FF


PS:另一点,我们在使用javascript类库的选择器时,例如jquery,要尽可能的使用这些原生的css3选择器,因为类库的选择器引擎会通过浏览器内置解析它们,这样会获得更快的速度。

CSS3选择器W3C参考手册:
http://www.w3school.com.cn/cssref/css_selectors.asp
DiscuzX游客查看帖子提示没有找到帖子解决方法
兼容版本:X2/X2.5/X3/X3.1
故障描述:常见为从X2/2.5升级到X3新版本后遇到该错误

排查思路:
1、检查后台相关权限配置是否允许游客查看帖子(或数据表中的记录是否也正常)
2、关闭所有的插件、关闭伪静态后测试
3、后台->站长->数据库->升级、优化、校验,根据结果对相关数据表进行处理
4、重新升级帖子表(如果pre_forum_post和pre_forum_post_bak同时存在,将forum_post_bak命名为fourm_post重新升级)
5、检查程序文件table_forum_post/forum_viewthread.php
启用Gzip压缩后访问文章页面报如下错误信息:
引用
内容编码错误
您尝试查看的页面无法显示,因为它使用了无效的或者不支持的压缩格式

排查思路:
1.后台关闭所有的插件,然后测试
2.模板切换到默认模板,然后测试
经排查未来往事博客在启用Gzip压缩后遇到这个错误是由于插件addcopyright下entrycontentend.php文件引起的,经分析该文件引起该错误的原因为该文件在php结束符后存在几行空白行,删除后恢复正常!

关于Nginx启用Gzip模块可以参考本博这篇文章《Nginx启用Gzip压缩模块

Nginx启用Gzip压缩模块 不指定

Rinald 本站原创 Apache/Nginx 2013/11/07 18:05
Nginx的gzip模块是内置的,在http中添加如下配置
gzip on;
gzip_min_length  5k;
gzip_buffers     4 16k;
gzip_http_version 1.0;
gzip_comp_level 3;
gzip_types       text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
gzip_vary on;

注  释:
gzip on|off
# 默认值: gzip off
# 开启或者关闭gzip模块

gzip_static on|off
# nginx对于静态文件的处理模块
# 该模块可以读取预先压缩的gz文件,这样可以减少每次请求进行gzip压缩的CPU资源消耗。该模块启用后,nginx首先检查是否存在请求静态文件的gz结尾的文件,如果有则直接返回该gz文件内容。为了要兼容不支持gzip的浏览器,启用gzip_static模块就必须同时保留原始静态文件和gz文件。这样的话,在有大量静态文件的情况下,将会大大增加磁盘空间。我们可以利用nginx的反向代理功能实现只保留gz文件。
# 可以google"nginx gzip_static"了解更多

gzip_comp_level 4
# 默认值:1(建议选择为4)
# gzip压缩比/压缩级别,压缩级别 1-9,级别越高压缩率越大,当然压缩时间也就越长(传输快但比较消耗cpu)。

gzip_buffers 4 16k
# 默认值: gzip_buffers 4 4k/8k
# 设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流。 例如 4 4k 代表以4k为单位,按照原始数据大小以4k为单位的4倍申请内存。 4 8k 代表以8k为单位,按照原始数据大小以8k为单位的4倍申请内存。
# 如果没有设置,默认值是申请跟原始数据相同大小的内存空间去存储gzip压缩结果。

gzip_types mime-type [mime-type ...]
# 默认值: gzip_types text/html (默认不对js/css文件进行压缩)
# 压缩类型,匹配MIME类型进行压缩
# 不能用通配符 text/*
# (无论是否指定)text/html默认已经压缩
# 设置哪压缩种文本文件可参考 conf/mime.types
+阅读全文
第12页 / 共34页 第一页 « 上一页 7 8 9 10 11 12 13 14 15 16 下一页 » 最后页 [ 显示模式: 摘要 | 列表 ]