588 292 RUB SBERBANK telegram - @sibbnk

PHP根据数组某个键值相同合并数组

有时候我们需要将两个数组合并,并且将某些键值再次合并成一个数组。

想了很多方法,都不理想,最后百度看了一个不错的方法,在这里分享给大家。

<?php
$a=array(
	array("username"=>"piaoyudesi","email"=>"piaoyudesi@163.com","address"=>"shenzhen","item_id"=>"10058","item_title"=>"BPS8"),
	array("username"=>"huakai","email"=>"huakai@163.com","address"=>"zhongshan","item_id"=>"10087","item_title"=>"BPS9"),
	array("username"=>"huakai","email"=>"huakai@163.com","address"=>"zhongshan","item_id"=>"10047","item_title"=>"BPS10"),
	array("username"=>"piaoyudesi","email"=>"piaoyudesi@163.com","address"=>"shenzhen","item_id"=>"10042","item_title"=>"BPS10"),
	array("username"=>"jimowenxin","email"=>"jimowenxin@163.com","address"=>"zhuhai","item_id"=>"10031","item_title"=>"BPS18")
);
$u=array();
foreach($a as $k=>&$e){
	$name=&$e['username'];
	if(!isset($u[$name])){
		$u[$name]=$e;
		unset($u[$name]['item_id'],$u[$name]['item_title']);
	}
	$u[$name]['goods'][]=array('item_id'=>$e['item_id'],'item_title'=>$e['item_title']);
}
$a=array_values($u); unset($u);
print_r($a);
=========
Array
(
    [0] => Array
        (
            [username] => piaoyudesi
            [email] => piaoyudesi@163.com
            [address] => shenzhen
            [goods] => Array
                (
                    [0] => Array
                        (
                            [item_id] => 10058
                            [item_title] => BPS8
                        )

                    [1] => Array
                        (
                            [item_id] => 10042
                            [item_title] => BPS10
                        )
                )		 
        )				 
    [1] => Array
        (
            [username] => huakai
            [email] => huakai@163.com
            [address] => zhongshan
            [goods] => Array
                (
                    [0] => Array
                        (
                            [item_id] => 10087
                            [item_title] => BPS9
                        )

                    [1] => Array
                        (
                            [item_id] => 10047
                            [item_title] => BPS10
                        )
                )		 
        )				 
    [2] => Array
        (
            [username] => jimowenxin
            [email] => jimowenxin@163.com
            [address] => zhuhai
            [goods] => Array
                (
                    [0] => Array
                        (
                            [item_id] => 10031
                            [item_title] => BPS18
                        )
                )		 
        )				 
)

 

 

think php 的 IP定位与判断来自用户还是蜘蛛爬虫

废话不多说,先上代码

//判断是否为爬虫
function ist_crawler() {
	$userAgent = strtolower($_SERVER['HTTP_USER_AGENT']);
	$spiders = array(
		'Googlebot', // Google 爬虫
		'Baiduspider', // 百度爬虫
		'Yahoo! Slurp', // 雅虎爬虫
		'YodaoBot', // 有道爬虫
		'msnbot',// Bing爬虫
		'360spider',//360爬虫
		'sosospider'//soso爬虫
		// 更多爬虫关键字
	);
	foreach ($spiders as $spider) {   //判断是否为爬虫
		$spider = strtolower($spider);
		if (strpos($userAgent, $spider) !== false) {
			return true;
		}
	}
	return false;
}

定义个函数,利用

$_SERVER['HTTP_USER_AGENT']

来判断是否是爬虫。中间可以添加更多的爬虫。

下面IP定位有两种代码。

一是自己下载IP地址库,到thinkPHP 的/MyApp/ORG/Net/

		if(ist_crawler()){  //如果是爬虫
			//print_r($userAgent);
			return false;
		}
		else{     //不是爬虫
			import('@.ORG.Net.IpLocation');// 导入IpLocation类
			$Ip = new IpLocation('UTFWry.dat');// 实例化类 
			//$ipt = get_client_ip();
			if(getenv("HTTP_X_FORWARDED_FOR")){   //判断是否来自代理
			$ipt = getenv("HTTP_X_FORWARDED_FOR");
		    }
			else if(getenv("HTTP_CLIENT_IP")){
				$ipt = getenv("HTTP_CLIENT_IP");
			}
		    else if(getenv("REMOTE_ADDR")){  //外围IP
			$ipt = getenv("REMOTE_ADDR");
		    }
			$area = $Ip->getlocation($ipt); //根据IP地址库信息
			//print_r($area);
			$try = $area[country]; 
			$try = explode("市",$try);  //分割地区数组数值
			$try =$try[0];
			$country = explode("省",$try);
			$try =$country[0];  //省份
			$cont = $country[1]; //市区
		}

二是定义接口,可以来自淘宝,百度等。

/*** 获取 IP  地理位置* 淘宝IP接口* @Return: array */
function getCity($ip)
		{
			$url="http://ip.taobao.com/service/getIpInfo.php?ip=".$ip;
			$ip=json_decode(file_get_contents($url));   
			if((string)$ip->code=='1'){
				return false;
			}
			$data = (array)$ip->data;
			return $data;   
		}
/** * 获取用户真实 IP */
function getIP()
		{
			static $realip;
			if (isset($_SERVER)){
				if (isset($_SERVER["HTTP_X_FORWARDED_FOR"])){
					$realip = $_SERVER["HTTP_X_FORWARDED_FOR"];
				} else if (isset($_SERVER["HTTP_CLIENT_IP"])) {
					$realip = $_SERVER["HTTP_CLIENT_IP"];
				} else {
					$realip = $_SERVER["REMOTE_ADDR"];
				}
			} else {
				if (getenv("HTTP_X_FORWARDED_FOR")){
					$realip = getenv("HTTP_X_FORWARDED_FOR");
				} else if (getenv("HTTP_CLIENT_IP")) {
					$realip = getenv("HTTP_CLIENT_IP");
				} else {
					$realip = getenv("REMOTE_ADDR");
				}
			}


			return $realip;
		}

if(ist_crawler()){
			$cont = "厦门市" ;
			return $cont;
		} 
		else{
		$ip = getIP();
		$address = getCity($ip);
		$try =$address['region'];  //省份
		$cont = $address['city']; //市区
		}

最后

$this->assign('try',$try);
$this->assign('cont',$cont);

在模板输出变量就好了!

JavaScript:try…catch…的运用!

最近在研究js,有用到try…catch…就百度搜索了下! 看到这个文章!转载!

程序开发中,编程人员经常要面对的是如何编写代码来响应错误事件的发生,即例外处理(exception handlers)。如果例外处理代码设计得周全,那么最终呈现给用户的就将是一个友好的界面。否则,就会让访问者对莫名的现象感到真正的“意外”。

一、什么是例外处理

当JavaScript程序在运行中发生了诸如数组索引越界、类型不匹配或者语法错误时,JavaScript解释器就会引发例外处理。ECMAScript定义了六种类型的错误,除此之外,我们可以使用Error对象和throw语句来创建并引发自定义的例外处理信息。

二、例外处理技术的优点

通过运用例外处理技术,我们可以实现用结构化的方式来响应错误事件的发生,让例外处理代码与正常脚本代码科学分离,最终使我们能够集中精力编写完成主要功能的核心程序。

三、使用 try…catch…finally 执行例外处理

在JavaScript中,我们使用try…catch…finally语句来执行例外处理,即通过它来捕捉错误发生后导致的例外或者执行throw语句产生的例外。它的基本语法如下:

try {
// 此处是可能产生例外的语句
} catch(error) {
// 此处是负责例外处理的语句
} finally {
// 此处是出口语句
}

上述代码中,try块中的语句首先被执行。如果运行中发生了错误,控制就会转移到位于catch块中语句,其中括号中的error参数被作为例外变量传递。否则,catch块的语句被跳过不执行。无论是发生错误时catch块中的语句执行完毕,或者没有发生错误try块中的语句执行完毕,最后将执行finally块中的语句。

下面我们来看一个例子:

<script language=”javascript”>
try {
document.writeln(“开始执行try块语句 —> “)
document.writeln(“还没有发生例外 —> “)
alert((prompt(“输入一个值:”,””)))
} catch(err) {
document.writeln(“捕捉到例外,开始执行catch块语句 —>”);
document.writeln(“错误名称: ” + err.name+” —> “);
document.writeln(“错误信息: ” + err.message+” —> “);
} finally {
document.writeln(“开始执行finally块语句”)
}
</script>

我们输入abc,然后确定,输出结果如下:

“开始执行try块语句 —> 还没有发生例外 —> 捕捉到例外,开始执行catch块语句 —> 错误名称: TypeError —> 错误信息: ‘abc’ 未定义 —> 开始执行finally块语句”

上述例程以try块语句开始,当输出信息“还没有发生例外”后,弹出输入对话框,要求用户输入一个数值,当我们输入非法的信息”abc”后,就引发了一个例外,所以剩下的try块中的语句将被跳过而开始执行catch块语句。Catch块开始的err参数作为这个例外的错误对象,它具有name和message两个属性。最后,执行finally块的语句。

我们看到,由于没有错误发生,当try块的语句执行完毕后,catch块语句被跳过,出现一个窗口显示输入的数值,最后执行了finally块的语句。

四、try…catch…finally的变形

try…catch…finally语句有两种变形应用,即try…catch或者try…finally。

try…catch这种结构最常见,它的执行过程是:当没有例外发生执行完毕try块语句后或者发生例外执行完catch块语句后,控制将转移到整个try…catch结构后面的语句。请看下面的例子:

try {
document.writeln(“Beginnng the try block”)
document.writeln(“No exceptions yet”)
// Create a syntax error
(“6 + * 3”)
document.writeln(“Finished the try block with no exceptions”)
} catch(err) {
document.writeln(“Exception caught, executing the catch block”)
document.writeln(“Error name: ” + err.name)
document.writeln(“Error message: ” + err.message)
}
document.writeln(“Executing after the try-catch statement”)

如果是try…finally结构,那么当发生例外时,由于没有catch块语句来捕捉错误,所以最终finally块的语句也不会被执行。因此,这种结构在实际应用中很少见。

五、例外的表现形式:Error对象

在JavaScript,例外是作为Error对象出现的。Error对象有两个属性:name属性表示例外的类型,message属性表示例外的含义。根据这些属性的取值,我们可以决定处理例外的方式,比如:

function Text() {
try {
alert((prompt(“Enter JavaScript to uate:”,””)))
} catch(err) {
if(err.name == “SyntaxError”) alert(“Invalid expression”)
else alert(“Cannot uate”)
}
}

上面的代码将对用户输入的内容进行表达式求值,然后显示出来。如果在求值过程中发生了SyntaxErroe类型错误,那么就会显示给用户“Invalid expression”的信息;否则,用户得到信息“Cannot uate”。

Error.name的取值一共有六种,如下:
Error:()的使用与定义不一致
RangeError:数值越界
ReferenceError:非法或不能识别的引用数值
SyntaxError:发生语法解析错误
TypeError:操作数类型错误
URIError:URI处理函数使用不当

六、定制例外信息

上述的六种Error类型基本上覆盖了脚本程序运行时所可能发生的错误。除了这些类型以外,我们还可以使用Error构造器来自定义例外类型,其语法如下:

myError = new Error(msg)

其中msg参数表示所定义的新例外的message属性值。同时,我们还可以创建新的对象类型以作为Error的子类型:

function MyError(msg) {
this.name = “MyError”
this.message = msg
}
MyError.prototype = new Error;

然后,我们就可以创建自定义错误子类的实例:

myError = new MyError(“My error message”)

七、触发例外

创建一个Error对象后,就可以使用throw语句来触发相应的例外。Throw的语法如下:

throw errObj

errObj必须是一个Error对象或者Error的子类型。在try块代码中触发一个例外后,控制将直接转入catch块。

下面的代码中,在try块中触发了一个例外,设置例外信息为“oops”,然后控制转移到catch块:

var s
try {
s = “one “
throw new Error(“oops”)
s += “two”
} catch(err) {
s += err.message
}
s += ” three”
alert(s)

编写代码来触发例外的优点很多,比如有利于自定义错误类型,快速转入catch块执行,以及下面要介绍的在嵌套例外中将错误传递到外层。

八、嵌套例外处理

JavaScript支持多层次的嵌套例外处理。一般情况下,我们可以在内部例外处理的catch代码块中捕捉并处理错误,然后再次触发例外,这样就可进一步在外部例外处理的catch代码块中做更加深入的处理。下面来看看一个嵌套例外处理的例子:

var inner;
var outer;
try {
document.writeln(“Beginning outer try block, no exceptions yet”);
try{
document.writeln(“Beginning inner try block, no exceptions yet”);
// 生成一个引用错误
document.writeln(undefinedVariable)
document.writeln(“Finished inner try block with no exceptions”);
} catch(inner) {
// 内部例外处理
document.writeln(“Exception caught, beginning inner catch block”);
document.writeln(“Error type: ” + inner.name);
document.writeln(“Error message: ” + inner.message);
throw inner;
document.writeln(“No exceptions thrown in inner catch block”);
} finally {
document.writeln(“Executing inner finally block”);
}
document.writeln(“Finished outer try block with no exceptions”);
} catch(outer) {
// 外部例外处理
document.writeln(“Exception caught, beginning outer catch block”);
document.writeln(“Error type: ” + outer.name);
document.writeln(“Error message: ” + outer.message);
} finally {
document.writeln(“Executing outer finally block”);
}

执行后的输出结果如下:

Beginning outer try block, no exceptions yet
Beginning inner try block, no exceptions yet
Exception caught, beginning inner catch block
Error type: ReferenceError
Error message: undefinedVariable is not defined
Executing inner finally block
Exception caught, beginning outer catch block
Error type: ReferenceError
Error message: undefinedVariable is not defined
Executing outer finally block

嵌套例外处理的好处在于使我们能够很好地分阶段处理错误,内部例外处理可以负责解决由错误引发的脚本代码问题,外部例外处理则用于负责提供给用户的反馈信息或者对例外信息进行日志记录。

九、结语

本文详细讨论了JavaScript语言的一个很重要的特征“例外处理”,Web开发人员应该很好地掌握它并在实际应用中灵活处理,从而使包含脚本代码的HTML页面真正地不出例外、善解人意。

CSS3 ::selection 选择器

u=1821132567,1125631962&fm=23&gp=0

::selection 选择器匹配被用户选取的选取是部分。

只能向 ::selection 选择器应用少量 CSS 属性:color、background、cursor 以及 outline。

IE Firefox Chrome Safari Opera
 u=1821132567,1125631962&fm=23&gp=0  13667845605787  u=655622312,3131975357&fm=90&gp=0  13667275416467  u=4155554963,1159645623&fm=23&gp=0

IE9+、Opera、Google Chrome 以及 Safari 中支持 ::selection 选择器。

Firefox 支持替代的 ::-moz-selection。

实例

使被选中的文本成为红色:

 <style>
*{margin:0; padding:0; list-style:none;}
.box{width:200px; margin:0 auto; line-height:30px;}
::selection{color:red;}
</style>
<div class="box">
 <ul>
 <li>HTML5</li>
 <li>CSS3</li>
 <li>Javascript</li>
 </ul>
</div>

运用这个选择器 使网站更具独特性!

jquery.mmenu.js实现侧边导航非常适用于手机版站

IT分享jquerymobile抽屉菜单mmenu

最近在做一个页面,用到一个插件适用于网站目录导航,所以把它分享出来。

jQuery.mmenu 实现了类似手机上经常使用的抽屉式菜单,如下图所示:

jquery.mmenu.js实现侧边导航非常适用于手机版站

IT分享jquerymobile抽屉菜单mmenu

下面是使用教程:

首先是引用文件

<link type="text/css" rel="stylesheet" href="../src/css/jquery.mmenu.all.css" />

<script type="text/javascript" src="../src/js/jquery-1.8.2/jquery-1.8.2.js"></script>
<script type="text/javascript" src="../src/js/jquery.mmenu.min.all.js"></script>

然后创建html

<div id="page">
			<div class="header">
				<a href="#menu"></a>
				Demo
			</div>
			<div class="content">
				<p><strong>This is a demo.</strong><br />
					Click the menu icon to open the menu.</p>
				<p>For more demos, a tutorial, documentation and support, please visit <a href="http://mmenu.frebsite.nl" target="_blank">mmenu.frebsite.nl</a></p>			
			</div>
			<nav id="menu">
				<ul>
					<li><a href="#">Home</a></li>
					<li><a href="#about">About us</a>
						<ul>
							<li><a href="#about/history">History</a></li>
							<li><a href="#about/team">The team</a>
								<ul>
									<li><a href="#about/team/management">Management</a></li>
									<li><a href="#about/team/sales">Sales</a></li>
									<li><a href="#about/team/development">Development</a></li>
								</ul>
							</li>
							<li><a href="#about/address">Our address</a></li>
						</ul>
					</li>
					<li><a href="#contact">Contact</a></li>
				</ul>
			</nav>
		</div>

最后绑定脚本事件:

<script type="text/javascript">
			$(function() {
				$('nav#menu').mmenu();
			});
		</script>

脚本事件可以写一些其他的,在官方有,可以去看。

支持功能:

1、基本的滑动:支持左 上 右方向的抽出

2.支持查询

3.支持在每个菜单上显示个数。

下面分享官方地址:http://mmenu.frebsite.nl/

下载地址:http://mmenu.frebsite.nl/download.html

DIV+CSS图片背景切割减少请求次数

CSS切割图片,使用一张包含很多ico等图片的素材使用在不同的元素里。CSS切割真正意义上的并不是切割,而是利用CSS的属性取图片其中的一部分显示出来。这样的好处就是大大减少了网页打开的时间,提高了网站体验度。

CSS实现一张大图切割的方式有两种,一种是作为某一个元素的背景图片,另外一种是利用img的属性。

1、img元素属性clip的rect。用法说明:

img{ 
    position:absolute; 
    clip:rect(20px 100px 50px 20px); 
}

clip的4个参数,分别是对应图片img的左上角为坐标起点,第1个参数y1是定位的y坐标(垂直方向)的起点,第二个参数x1定位的x坐标(水平方向)的起点 ,第三个y2定位的y坐标(垂直方向)的终点 ,第四个x2定位的x坐标(水平方向)的终点 。

2、用CSS中background属性。事例代码:

background:transparent url(123.jpg) no-repeat scroll -140px -20px;

transparent表示透明无颜色 

-140px 表示水平位置在图片的-140px处(以图片的左上角为0,0) 

-20px 表示垂直位置在图片的-20px处(以图片的左上角为0,0) 

DIV+CSS图片背景切割减少请求次数 (转载网络)

CSS3 Media Queries

Media Queries直译过来就是“媒体查询”,在我们平时的Web页面中head部分常看到这样的一段代码:

  <link href="css/reset.css" rel="stylesheet" type="text/css" media="screen" /> <link href="css/style.css" rel="stylesheet" type="text/css" media="all" /> <link href="css/print.css" rel="stylesheet" type="text/css" media="print" /> 

或者这样的形式:

  <style type="text/css" media="screen"> @import url("css/style.css"); </style> 

不知道大家留意没有,其中两种方式引入CSS样式都有一个共同的属性“media”,而这个“media”就是用来指定特定的媒体类型,在HTML4和CSS2中充许你使用“media”来指定特定的媒体类型,如屏幕(screen)和打印(print)的样式表,当然还有其他的,比如说“TV”,“handheld”等,其中“all”表示的是支持所有媒体介质。有关于更多的Media类型,可以点击这里

上面简单说了一下HTML4和CSS2的“Media Queries”,而今天的主要是来学习CSS3中的”Media Queries”的更多使用方法和相关知识,下面我们开始进入今天的主题。CSS3中的Media Queries增加了更多的媒体查询,同时你可以添加不同的媒体类型的表达式用来检查媒体是否符合某些条件,如果媒体符合相应的条件,那么就会调用对应的样式表。换句简单的说,“在CSS3中我们可以设置不同类型的媒体条件,并根据对应的条件,给相应符合条件的媒体调用相对应的样式表”。现在最常见的一个例子,你可以同时给PC机的大屏幕和移动设备设置不同的样式表。这功能是非常强大的,他可以让你定制不同的分辨率和设备,并在不改变内容的情况下,让你制作的web页面在不同的分辨率和设备下都能显示正常,并且不会因此而丢失样式。

首先来看一个简单的实例:

  <link rel="stylesheet" media="screen and (max-width: 600px)" href="small.css" /> 

上面的media语句表示的是:当页页宽度小于或等于600px,调用small.css样式表来渲染你的Web页面。首先来看media的语句中包含的内容:

1、screen:这个不用说大家都知道,指的是一种媒体类型;

2、and:被称为关键词,与其相似的还有not,only,稍后会介绍;

3、(max-width:600px):这个就是媒体特性,说得通俗一点就是媒体条件。

前面这个简单的实例引出两个概念性的东西,一个就是媒体类型(Media Type)和 媒体特性(Media Query),首先一起来理解一下这两个概念:

一、媒体类型(Media Type)

媒体类型(Media Type)在css2中是一个常见的属性,也是一个非常有用的属性,可以通过媒体类型对不同的设备指定不同的样式,在css2中我们常碰到的就是all(全部),screen(屏幕),print(页面打印或打邱预览模式),其实在媒体类型不止这三种,w3c总共列出了10种媒体类型

页面中引入媒体类型方法也有多种:

1、link方法引入

   <link rel="stylesheet" type="text/css" href="../css/print.css" media="print" /> 

2、xml方式引入

  <?xml-stylesheet rel="stylesheet" media="screen" href="css/style.css" ?> 

3、@import方式引入

@import引入有两种方式,一种是在样式文件中通过@import调用别一个样式文件;另一种方法是在<head></head>中的<style>…</style>中引入,单这种使用方法在ie6-7都不被支持 如

样式文件中调用另一个样式文件:

   @import url("css/reset.css") screen; @import url("css/print.css") print;

在<head></head>中的<style>…</style>中调用:

  <head> <style type="text/css"> @import url("css/style.css") all; </style> </head> 

4、@media引入

这种引入方式和@import是一样的,也有两种方式:

样式文件中使用:

   @media screen{
     选择器{ 属性:属性值;
     } }

在<head>>/head>中的<style>…</style>中调用:

  <head> <style type="text/css"> @media screen{
           选择器{ 属性:属性值;
	   } } </style> </head> 

以上几种方法都有其各自的利弊,在实际应用中我建议使用第一种和第四种,因为这两种方法是在项目制作中是常用的方法,对于他们的具体区别,我就不说了,想了解的大家可以去找度娘或G爸,他们能帮你解决。

二、媒体特性(Media Query)

前面有简单的提到,Media Query是CSS3 对Media Type的增强版,其实可以将Media Query看成Media Type(判断条件)+CSS(符合条件的样式规则),常用的特性w3c共列出来13种。具体的可以参阅:Media features。为了更能理解Media Query,我们在次回到前面的实例上:

  <link rel="stylesheet" media="screen and (max-width: 600px)" href="small.css" /> 

转换成css中的写法为:

  @media screen and (max-width: 600px) {
    选择器 { 属性:属性值;
    } }

其实就是把small.css文件中的样式放在了@media srceen and (max-width;600px){…}的大括号之中。在语句上面的语句结构中,可以看出Media query和css的属性集合很相似,主要区别在:

1、Media query只接受单个的逻辑表达式作为其值,或者没有值;

2、css属性用于声明如何表现页页的信息;而Media Query是一个用于判断输出设备是否满足某种条件的表达式;

3、Media Query其中的大部分接受min/max前缀,用来表示其逻辑关系,表示应用于大于等于或者小于等于某个值的情况

4、CSS属性要求必须有属性值,Media Query可以没有值,因为其表达式返回的只有真或假两种

常用的Media Query如下表所示:

CSS3 Media Queries

兼容的浏览器:

CSS3 Media Queries

下面我们一起来看看Media Queries的具体使用方式

一、最大宽度Max Width

  <link rel="stylesheet" media="screen and (max-width:600px)" href="small.css" type="text/css" /> 

上面表示的是:当屏幕小于或等于600px时,将采用small.css样式来渲染Web页面。

二、最小宽度Min Width

   <link rel="stylesheet" media="screen and (min-width:900px)" href="big.css" type="text/css" /> 

上面表示的是:当屏幕大于或等于900px时,将采用big.css样式来渲染Web页面。

三、多个Media Queries使用

   <link rel="stylesheet" media="screen and (min-width:600px) and (max-width:900px)" href="style.css" type="text/css" /> 

Media Query可以结合多个媒体查询,换句话说,一个Media Query可以包含0到多个表达式,表达式又可以包含0到多个关键字,以及一种Media Type。正如上面的其表示的是当屏幕在600px-900px之间时采用style.css样式来渲染web页面。

四、设备屏幕的输出宽度Device Width

   <link rel="stylesheet" media="screen and (max-device-width: 480px)" href="iphone.css" type="text/css" /> 

上面的代码指的是iphone.css样式适用于最大设备宽度为480px,比如说iPhone上的显示,这里的max-device-width所指的是设备的实际分辨率,也就是指可视面积分辨率

五、iPhone4

   <link rel="stylesheet" media="only screen and (-webkit-min-device-pixel-ratio: 2)" type="text/css" href="iphone4.css" /> 

上面的样式是专门针对iPhone4的移动设备写的。

六、iPad

  <link rel="stylesheet" media="all and (orientation:portrait)" href="portrait.css" type="text/css" /> <link rel="stylesheet" media="all and (orientation:landscape)" href="landscape.css" type="text/css" /> 

在大数情况下,移动设备iPad上的Safari和在iPhone上的是相同的,只是他们不同之处是iPad声明了不同的方向,比如说上面的例子,在纵向(portrait)时采用portrait.css来渲染页面;在横向(landscape)时采用landscape.css来渲染页面。

七、android

  /*240px的宽度*/ <link rel="stylesheet" media="only screen and (max-device-width:240px)" href="android240.css" type="text/css" /> /*360px的宽度*/ <link rel="stylesheet" media="only screen and (min-device-width:241px) and (max-device-width:360px)" href="android360.css" type="text/css" /> /*480px的宽度*/ <link rel="stylesheet" media="only screen and (min-device-width:361px) and (max-device-width:480px)" href="android480.css" type="text/css" /> 

我们可以使用media query为android手机在不同分辨率提供特定样式,这样就可以解决屏幕分辨率的不同给android手机的页面重构问题。

八、not关键字

  <link rel="stylesheet" media="not print and (max-width: 1200px)" href="print.css" type="text/css" /> 

not关键字是用来排除某种制定的媒体类型,换句话来说就是用于排除符合表达式的设备。

九、only关键字

  <link rel="stylesheet" media="only screen and (max-device-width:240px)" href="android240.css" type="text/css" /> 

only用来定某种特定的媒体类型,可以用来排除不支持媒体查询的浏览器。其实only很多时候是用来对那些不支持Media Query但却支持Media Type的设备隐藏样式表的。其主要有:支持媒体特性(Media Queries)的设备,正常调用样式,此时就当only不存在;对于不支持媒体特性(Media Queries)但又支持媒体类型(Media Type)的设备,这样就会不读了样式,因为其先读only而不是screen;另外不支持Media Qqueries的浏览器,不论是否支持only,样式都不会被采用。

十、其他

在Media Query中如果没有明确指定Media Type,那么其默认为all,如:

  <link rel="stylesheet" media="(min-width: 701px) and (max-width: 900px)" href="medium.css" type="text/css" /> 

另外还有使用逗号(,)被用来表示并列或者表示或,如下

  <link rel="stylesheet" type="text/css" href="style.css" media="handheld and (max-width:480px), screen and (min-width:960px)" /> 

上面代码中style.css样式被用在宽度小于或等于480px的手持设备上,或者被用于屏幕宽度大于或等于960px的设备上。

关于Media Query的使用这一节就介绍到此,最后总体规纳一下其功能,个人认为就是一句话:Media Queries能在不同的条件下使用不同的样式,使用页面达到不同的渲染效果。


转载:W3CPLUS

图片下方出现缝隙解决方法

今天在做一个手机网页时,发现一个奇怪的问题,代码没问题,可是预览时总是发现图片下方和div边框之间有一条4px的空隙,最后还是得以解决。

最简单的办法是固定高度:

<div style="width: 900px;height: 75px;margin-top: 0px;"><img src="images/top.jpg" width="900" height="75"></div>

一个可以使用display属性解决:

<div style="float: left;"> <img src="images/picture1.jpg" style="border:4px solid #191919;display:block;" width="553" height="179" /> </div>

另一个可以用vertical-align属性解决:

<div style="float: left;"> <img id="pic1" src="images/picture1.jpg" style="border:4px solid #191919;vertical-align:top;" width="553" height="179" /> </div> 

使用margin-bottom属性解决:

<div style="width: 900px;height: 75px;margin-top: 0px;"> <img src="images/top.jpg" style="margin-bottom: -4px;"  width="900" height="75"> </div>

使用字体大小属性font-size解决:

<div style="width: 900px;height: 75px;margin-top: 0px;font-size:0"> <img src="images/top.jpg" width="900" height="75"> </div>

我几种方法都试了下,发现在手机上有时还会有一点点缝隙,最后 我使用margin-bottom:-5px;多剪去1px,这样就完美显示了

margin-bottom: -5px;

CSS解决图片下面有空隙的简单方法

在用CSS制作网页过程中可能会碰到图片下面有空隙的问题,本文给出了最为简单的解决方法。

解决方法:在图片的css中加 vertical-align:bottom; 效果

例如:

0

演示代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>解决图片下有空隙</title>
</head>
<body>
<style>
*{margin:0px;padding:0px;}
#l1 {float:left;background:#000;padding:20px;margin:50px;}
#l1 ul li {list-style:none;}
#l1 ul li img {vertical-align:bottom; display:block;}
</style>
<div id="l1">
   <ul>
    <li><img src="图片地址1" /></li>
    <li><img src="图片地址2" /></li>
    <li><img src="图片地址3" /></li>
    <li><img src="图片地址4" /></li>
   </ul>
</div>
</body>
</html>

zbp已有模块内容的更新(重建)的两种方法

都是以插件的形式实现,以侧栏标签云模块为例

一、对原有模块内容的重写。

(1)首先挂接接口 

 Add_Filter_Plugin('Filter_Plugin_Zbp_Load','BuildModule_Populartags');

(2)接口函数的编写

//热门标签模块重建(开始)
function BuildModule_Populartags()
{
    global $zbp;
    $zbp->RegBuildModule('tags', 'BuildModule_Populartags');
    $s = '';
    $i = $zbp->modulesbyfilename['tags']->MaxLi;
    if ($i == 0)
        $i = 25;
    $array  = $zbp->GetTagList('*', '', array(
        'tag_Count' => 'DESC'
    ), $i, null);
    $array2 = array();
    foreach ($array as $tag) {
        $array2[$tag->ID] = $tag;
    }
    ksort($array2);
     
    foreach ($array2 as $tag) {
        $s .= ' <a href="' . $tag->Url . '" title="' . $tag->Count . '个话题" style="font-size:12px"> ' . $tag->Name . ' </a>';
    }
     
    return $s;
}
//重建热门标签模块结束

启用方法:进入模块管理的tags列表,点击提交就可以移到侧栏使用了。

二、对原有模块内容的直接替换。

(1)挂接接口:

Add_Filter_Plugin('Filter_Plugin_Index_Begin','Tblogpublished');
Add_Filter_Plugin('Filter_Plugin_Search_Begin','Tblogpublisheds');

(2)替换函数的编写:

function Tblogpublished(){
    global $zbp;
    if(isset($zbp->modulesbyfilename['tags'])){
    $zbp->modulesbyfilename['tags']->Content =Tblog_Get_tags();
    }
}
function Tblogpublisheds(){
    global $zbp;
    if(isset($zbp->modulesbyfilename['tags'])){
    $zbp->modulesbyfilename['tags']->Content =Tblog_Get_tags();
    }  
}

(3)新的标签云内容的编写:

function Tblog_Get_tags(){
global $zbp;
$zbp->header .='<script src="'.$zbp->host.'zb_users/plugin/ttyb_newlypublished/js/3D-Tags.js" type="text/javascript"></script>';
$zbp->header .= "<link rel="stylesheet" href="{$zbp->host}zb_users/plugin/ttyb_newlypublished/css/3dstyle.css" type="text/css" />rn";
$s = '';
$s.= '<div id="div1">';
    $i = $zbp->modulesbyfilename['tags']->MaxLi;
    if ($i == 0) $i = 25;
    $array = $zbp->GetTagList('*', '', array('tag_Count' => 'DESC'), $i, null);
    $array2 = array();
    foreach ($array as $tag) {
        $array2[$tag->ID] = $tag;
    }
    ksort($array2);
    $clor123=array("tblogred","tblogblack","tblogblue","tblogorange","tblogpink","tblogpurple");
    foreach ($array2 as $tag) {
        $s .= '<a href="' . $tag->Url . '"  class="'.$clor123[rand(0,5)].'" >' . $tag->Name . '(' . $tag->Count . ')</a>';
    }
$s.= '</div>';  
    return $s;
}

+-比较前面两个方法:

到这里已经全部介绍完两种方法,在这里来比较下两个方法:

相同点:

(1)都是可以实现模块内容的更新。

(2)显示数量等可以到模块管理面设置。

不同点:

(1)第一种方法:可以实现启用的时候必须要到模块管理里面管理重写提交下或者新建的tag的时候才能使用(相对tags来说,别的类似),第二种方法可以。

(2)第二种方法的动态内容的实现比较灵活。比如对于新建的模块内容是动态的,要实现动态的更换就会很麻烦。需要来回重写模块。那就费事了。(有点过了。要是介绍新建模块就好了。呵呵,以后介绍。)(可以忽略第二条。)