主浏览器CSS HACK(IE6,IE7,IE8,IE9,Chrome,FF)

三月底,在匆匆找到工作后,立即开始了新的生活,在和程序员简单的交接后,开始了程序员的职业生涯.

昨天在对公司新做的专题页面制作工程中,我仔细的测试了IE6,IE7,IE8,Chrome,Firefox兼容性,发现没有问题,上传至服务器,刚发布完成,有同事说有个地方标题换行了,我走过去一看,的确是的,不过十分好奇的是IE9,居然会跟Chrome等浏览器解析效果不同.于是我回到我的办公桌查阅了一些关于IE9方面CSS HACK的文章.现在总结如下:

其实关于IE6,IE7,IE8的CSS HACK方式我想大家耳熟能详了,这里就不复述了,需要查看的话可以参考下面的CSS HACK文档,这里我主要说明一下IE9的做法.

你可以通过给某个样式前面加个:root,例如:

:root #element { font-size: 24px; } /* IE9 */

最后附上一篇摘自网络的关于CSS hack 文档:直接查看或下载(内含CSS HACK兼容表以及一些简单的兼容性技巧)

最后献上我经过反复测试的源码,大家也可以试试,不过注意css书写的顺序,免得出现问题.

<!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">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>ie9 css hack sample</title>
<style>
#element {
	font-size: 30px;
}
#element {
	font-weight: bold\9;/* IE */
}
#element {
	*font-size: 14px;/* IE6+7, doesn't work in IE8/9 as IE7 */
}
#element {
	_font-size: 10px;/* IE6 */
}
#element {
	font-size: 18px\0;/* IE8+9  */
}
:root #element {
	font-size: 24px;/* IE9 */
}
</style>
</head>

<body>
<div>
	<p id="element">IE font should be bolded</p>
	<p id="element">IE6 font size should be 10px</p>
	<p id="element">IE7 font size should be 14px</p>
	<p id="element">IE8 font size should be 18px</p>
	<p id="element">IE9 font size should be 24px</p>
	<p id="element">Other should be 30px</p>
	<em>This is a simple example for IE9 CSS Hack by <a href="/about">whidy</a>.</em>
</div>
</body>
</html>

http://jsfiddle.net/kingterrors/LQhEr/embedded/result,html,css/

当然有人会说,要用这么多不同的浏览器进行测试,尤其是IE9不支持XP,很麻烦,其实对于XP用户我推荐你们用Adobe的一个BrowserLab功能,之前也有过介绍,大家自己去看看,当然有装IE TESTER的朋友也可以测试多个不同的浏览器,不过XP依然不能用此软件测试IE9的效果,所以如何在XP下测试IE9的效果,那么只有用Adobe的BrowserLab,当然必须是在线的.如果大家有其他XP下测试IE9的CSS的办法欢迎发邮箱一起讨论.

最后上一张BrowserLab在线测试截图.

IE9CssHack和BrowserLab测试
IE9CssHack和BrowserLab测试

如有错误欢迎大家指正!~

PS: 随着时间的推移,对于IE9, IE10以及IE11的hack越来越不好用了,实际上,对于IE9以上的版本就不建议hack了.尽量按照WEB规范标准来做,一般是不会有错的.(2014年5月19日22:52:40)

PHPCMS V9 自定义列表分页功能实现方法

在用PHPCMS V9的过程中,可能一般人都不会在意分页功能,因为调用他实在是很简单,需要修改的估计也就是分页功能的样式了,拿系统自带的模板来看

<div id="pages" class="text-c">{$pages}</div>

我们可以修改class来自定义样式,当然有人会说,这个只能修改DIV的样式,无法修改里面的内容的样式,其实之需要看一下这段代码解析出来的实际代码就知道了,而这里的样式可以直接通过head部分内读取的CSS来代替,我就可以在CSS里面添加这样一段,为了方便测试,我直接写在head标签内:


.text-c {margin:10px 0;}
.text-c a {padding:5px;margin:0 8px;border:1px solid #ccc;background-color:#eee;}

经过测试是有效的.这里不在说这个了,重点是{$pages}输出的分页效果是固定的,如何让他能够满足自己的需求,比如最简单的系统默认是显示多少条,用上一页,下一页来表示,如果我想改成向后翻,向前翻,怎么办?我经过查找相关资料,对这个功能进行整理得出结果与大家分享出来,涉及修改到的文件只有下面两个:

\phpcms\languages\zh-cn\system.lang.php
\phpcms\libs\functions\global.func.php
\ phpcms\lib\classes\template_cache.class.php

具体怎么弄,待我慢慢与大家讲解:

首先打开system.lang.php,找到29行LANG[‘next’] = ‘下一页’;处,你可以在下面插入自定义的内容,比如向后翻,向前翻,整理效果应该是这样的,添加完后保存可以关闭了.

$LANG['page_item'] = '条';
$LANG['previous'] = '上一页';
$LANG['next'] = '下一页';
$LANG['page_item_my'] = '篇';			//自定义
$LANG['previous_my'] = '向前翻';		//自定义
$LANG['next_my'] = '向后翻';				//自定义
......


然后打开global.func.php,搜索分页函数找到找到function pages...,在这个函数后复制原函数并修改添加自己想要定义的函数,例如:

//自定义分页函数
function pages_my($num, $curr_page, $perpage = 20, $urlrule = '', $array = array(),$setpages = 10) {
	if(defined('URLRULE') && $urlrule == '') {
		$urlrule = URLRULE;
		$array = $GLOBALS['URL_ARRAY'];
	} elseif($urlrule == '') {
		$urlrule = url_par('page={$page}');
	}
	$multipage = '';
	if($num > $perpage) {
		$page = $setpages+1;
		$offset = ceil($setpages/2-1);
		$pages = ceil($num / $perpage);
		if (defined('IN_ADMIN') && !defined('PAGES')) define('PAGES', $pages);
		$from = $curr_page - $offset;
		$to = $curr_page + $offset;
		$more = 0;
		if($page >= $pages) {
			$from = 2;
			$to = $pages-1;
		} else {
			if($from <= 1) {
				$to = $page-1;
				$from = 2;
			}  elseif($to >= $pages) {
				$from = $pages-($page-2);
				$to = $pages-1;
			}
			$more = 1;
		}
		$multipage .= '<a class="a1">'.$num.L('page_item_my').'</a>';
		if($curr_page>0) {
			$multipage .= ' <a href="'.pageurl($urlrule, $curr_page-1, $array).'" class="a1">'.L('previous_my').'</a>';
			if($curr_page==1) {
				$multipage .= ' <span>1</span>';
			} elseif($curr_page>6 && $more) {
				$multipage .= ' <a href="'.pageurl($urlrule, 1, $array).'">1</a>..';
			} else {
				$multipage .= ' <a href="'.pageurl($urlrule, 1, $array).'">1</a>';
			}
		}
		for($i = $from; $i <= $to; $i++) {
			if($i != $curr_page) {
				$multipage .= ' <a href="'.pageurl($urlrule, $i, $array).'">'.$i.'</a>';
			} else {
				$multipage .= ' <span>'.$i.'</span>';
			}
		}
		if($curr_page<$pages) {
			if($curr_page<$pages-5 && $more) {
				$multipage .= ' ..<a href="'.pageurl($urlrule, $pages, $array).'">'.$pages.'</a> <a href="'.pageurl($urlrule, $curr_page+1, $array).'" class="a1">'.L('next_my').'</a>';
			} else {
				$multipage .= ' <a href="'.pageurl($urlrule, $pages, $array).'">'.$pages.'</a> <a href="'.pageurl($urlrule, $curr_page+1, $array).'" class="a1">'.L('next_my').'</a>';
			}
		} elseif($curr_page==$pages) {
			$multipage .= ' <span>'.$pages.'</span> <a href="'.pageurl($urlrule, $curr_page, $array).'" class="a1">'.L('next_my').'</a>';
		} else {
			$multipage .= ' <a href="'.pageurl($urlrule, $pages, $array).'">'.$pages.'</a> <a href="'.pageurl($urlrule, $curr_page+1, $array).'" class="a1">'.L('next_my').'</a>';
		}
	}
	return $multipage;
}

最后打开template_cache.class.php,找到

$str .= '$pages = pages($'.$op.'_total, $page, $pagesize, $urlrule);';

处,在下面添加:

$str .= '$pages_my= pages_my($'.$op.'_total, $page, $pagesize, $urlrule);';

当然如果使用过程中,发现SQL分页的不能正常使用,再在

$str .= '$r = $get_db->sql_query("'.$sql.'");$s = $get_db->fetch_next();$pages=pages($s[\'count\'], $page, $pagesize, $urlrule);';

添加这段代码:

$str .= '$r = $get_db->sql_query("'.$sql.'");$s = $get_db->fetch_next();$pages_my=pages_my($s[\'count\'], $page, $pagesize, $urlrule);';

至此大功告成,接下来,你只用在你想要的模板的分页出使用就可以了,例如开头的格式

<div id="pages" class="myListPage">{$pages_my}</div>

并写上对应的CSS就可以了.

列表中最后一个元素样式清除修改方法(jQuery)

我们在做动态网站的时候,当遇到导航条的栏目列表或某区域内文章列表等含有大量重复内容区域时,通常会用循环将他们输出,而他们节点的样式都是相同的,比如下边距,外边框的分隔样式,通过循环输出的结果就是最后一个节点依然保留着所有的样式我们是不希望他有下边距或者外边框.

例如: 导航上每个栏目标题(li)右侧可能会用竖线分隔每个栏目标题,于是最后一个栏目右侧也出现了不想要的竖线,但是这些同级的li都是循环出来的 ,我们无法单独给最后一个元素添加特殊的样式,本来有个很简单的方法,那就是使用CSS3的:first和:last选择器,但是当IE6和IE7不支持:first和:last选择器的,有个简单的方法,通过Js(本文用的jQuery)去除或修改列表或循环内容的第一个和最后一个节点的样式,可以兼容所有浏览器,是比较方便的,其实用js可以轻松实现,但是我后来发现,jQuery来处理或许更加轻松些,也是正好我最近在学习jQuery,的确很好用.在body内最后加上一小段就可以了,比如下面这个简单的例子:

<!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">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>LastChildStyleRemove</title>
<script src="http://code.jquery.com/jquery-latest.js"></script>
<style>
#mainContent {background-color:#eee;}
#mainContent ul.nav {list-style:none;font-size:12px;}
#mainContent ul.nav li {float:left;padding:5px 15px;border-left:1px solid #fff;border-right:1px solid #ddd;}
#mainContent ul.nav li a {color:#666;text-decoration:none;}
</style>
</head>
<body>
	<div id="mainContent">
		<ul class="nav">
			<li><a href="#">导航一</a></li>
			<li><a href="#">导航二</a></li>
			<li><a href="#">导航三</a></li>
			<li><a href="#">导航四</a></li>
		</ul>
		<div style="clear:both;"></div>
	</div>
</body>
<script>
	$("#mainContent ul.nav li:first-child").css("border-left", "none")
	$("#mainContent ul.nav li:last-child").css("border-right", "none")
</script>
</html>

这个例子除了用到最后一个元素样式清除,也用了首个元素样式清除,这个很好理解,这是两个方法,其实只用到一个函数css( propertyName , value  ),而关于元素选择器可以查看jQuery的例子::first-child Selector和:last-child Selector.上面的例子也很简单清晰易懂…

当然我也在网上看到有这样的javascript写法,不过相对较为复杂,内容如下:

<script language="javascript" type="text/javascript">
  function addClassName(tag,classname){
   if(!tag.className){
    tag.className=classname;
   }else{
    tag.className+=" "+classname;
   }
  }

  function addFirstChild(){
   var olitems=document.getElementsByTagName("ol");
   var ulitems=document.getElementsByTagName("ul");

   for(var i=0;i<olitems.length;i++){
    addClassName(olitems[i].getElementsByTagName("li")["0"],"first-child");
   }
   for(var i=0;i<ulitems.length;i++){
    addClassName(ulitems[i].getElementsByTagName("li")["0"],"first-child");
   }
  }
  function addLastChild(){
   var olitems=document.getElementsByTagName("ol");
   var ulitems=document.getElementsByTagName("ul");

   for(var i=0;i<olitems.length;i++){
    addClassName(olitems[i].getElementsByTagName("li")[olitems[i].children.length-1],"last-child");
   }
   for(var i=0;i<ulitems.length;i++){
    addClassName(ulitems[i].getElementsByTagName("li")[ulitems[i].children.length-1],"last-child");
   }
  }

  if(document.all && !window.opera){
   window.onload=addFirstChild;
   window.onload=addLastChild;
  }
 </script>

如果有兴趣可以尝试,至此,大家也发现实际上用jQuery并不困难,用好就有讲究了,不过最好还是打好js的基础,下次我将介绍另外一个简单的效果,关于用jQuery控制下拉菜单悬浮,我用了一个很笨的嵌套方法,有空我在写一下.今天就写到这里希望大家能有所收获.


PS: 其实这个例子就是简单介绍了jQuery的两个用法,如果动态脚本支持判断首尾元素的话,其实直接在HTML内写个判断(例如:phpcms文章列表循环不同样式制作方法),给首尾元素加个class=”first-tag”和class=”last-tag”之类的样式也是不错的选择,实际上现在已经不推荐这样的写法,因为你会发现有很多冗余的小代码,维护十分不方便,这里也就是举一反三,大家视情况来写吧( update: 2014年5月17日 )

PHPCMS无法搜索文章内容中的关键字解决

最近工作上维护公司的网站,其后台用的是PHPCMS V9,以前曾用过PHPCMS2008,用这个还算能够快速上手.不过使用过程中也有很多问题,比如这个最近网站遇到的搜索功能的问题,经常搜不到文章,除非是标题或者关键字有相同的,而文章内容部分是搜索不到的,编辑需要找相关文章来进行SEO优化也不是很方便,于是我便研究了一下PHPCMS自带的搜索功能,首先要说的是后台可以对搜索进行设置和调整的区域主要包括

  1. 模块 > 模块管理 > 全站搜索 > 模块管理 > 全站搜索
  2. 内容 > 内容相关设置 > 模型管理 > 文章模型字段管理

第一个很简单,直接查看模块配置,如果没有选中全站搜索的果断选中,这样可以避免一些搜索不到信息的情况,后面两个我也选中是了,至于选不选,看个人需要了.提交之后建议重建索引,这里需要提到的是,有时候重建索引出错,出错内容大致是这样的

MySQL Query : DELETE FROM 'phpcmsv9'.'v9_search' WHERE 'siteid' = '1'
MySQL Error : Incorrect key file for table '.\phpcmsv9\v9_search.MYI'; try to repair it
MySQL Errno : 126
Message : Incorrect key file for table '.\phpcmsv9\v9_search.MYI'; try to repair it
Need Help?

这个解决办法也十分简单,同样在后台找到 扩展 > 扩展 > 数据库工具 > 在请选择数据链接池处选择数据库后,会展现出该数据库的结构,找到v9_search和v9_search_keyword表,后面有修复,点击修复,然后重新回到重建索引处,就不会出错了.

另一方面如果有些关键字是你需要在搜索结果中显示的,比如作者,内容等等,先说如何搜索到作者吧,找到 内容 > 内容相关设置 > 模型管理 > 进入文章模型的字段管理,找到作者字段,点击修改,在下面单选选项处可以看到作为搜索条件,此选项,选择是即可.

同样的,内容字段也是这个方法,不过有个问题,内容字段的作为搜索条件处是灰色不可更改,这要怎么办是好?这种情况下,如有需要,那就要强行修改数据库内的值了,以内容字段为例,打开数据库,这里我用的phpmyadmin,找到相应数据库的表v9_model_field,找到其中name为内容(field为content)的地方,点击编辑,其中有个字段叫做issearch,当前值为0,于是我们将它修改为1即可.再次返回后台,会发现作为搜索条件已经是是了.

此时,你可以尝试搜索一些关键字,会发现问题得到解决,如果你还有什么问题,可以发电子邮件给我,我会抽时间与你一起讨论.

好了暂时写到这里,谢谢大家的关注.如果想了解sphinx全文索引可以看一个PHPCMS官方论坛的帖子,写的不错,点击进入phpcms中应用sphinx全文索引

武汉4月22晚惊现UFO,有视频有真相~

这是一个神奇的夜晚,每个人都在繁忙的工作,打游戏,玩手机,吃饭或是睡觉中.此时晚上8点钟左右,我坐在室友宿舍聊天,聊音乐,我说大冢爱的星象仪很好听,哼着突然间我仰头望去,那美丽的空中,”星星”如此耀眼闪烁,多么美好…

咦!这三颗”星星”怎么还会动,而且每颗上面有两个光点,并且是彩色变化的,于是我喊室友一起看这是什么,因为我们住在顶楼,没有障碍遮住,可以看得清楚,但是说实在的我们不知道这个物体究竟离我们有多远,而且它们绝对不是飞机,没有飞机会停留在一个地方缓慢移动将近1个多小时.室友说他也不知道这是什么,当然我敢说这也不是风筝,因为光线很亮,它更不是孔明灯,因为它有多种颜色变化,并且持续很长时间…

我时而观察,时而去做别的事情,约快9点,消失了一个,我也没有看到怎么消失的,于是去洗澡,回来,玩了会手机,往窗外看去又少了一个,此时已是9:30了,最后我也没有耐心观察下去了,睡觉了,也不知道后来怎么了…

当然作为UFO目击者,必然留下些证据,虽然我想大家恐怕不会相信,那么真相是什么,留个大家去猜疑吧.内容绝对属实.下面奉献相关资料,版权所有,如需转载请通知我.

北京时间 4月22日 晚8点左右, 武汉硚口区某处向南方天空望去,所见景象UFO(不明飞行物)…(摄影器材 NIKON D5000 50MM/F1.8)

不明飞行物

这是原始比例图,部分100%比例图片请看下图集,速度可能较慢,若无法显示,请点击此处查看大图(由于夜晚设备条件有限,无题处于运动状态,并且无三脚架,略微有点抖动,请谅解)

另外感谢金导,帮我对视频进行了简单的后期处理,请看视频<<世界末日征兆 中国中部夜空惊现UFO>>: 继续阅读“武汉4月22晚惊现UFO,有视频有真相~”