‘markup language’ Category Archives

10

CSS优化

作者: boke ,分类: markup language

本文总结了一些CSS优化的规则,包括一些简写技巧,选择器的使用,及其它注意事项。

css简写技巧

1、属性值为0,而非0px。如果属性值为0,那么可以不为其添加单位(如px、em等),例如:

padding: 10px 5px 0px 0px;

 可以写成:

padding: 10px 5px 0 0;

2、背景属性合写。背景属性可能会包含设置背景色、背景图、背景图的位置和背景图重复方式的参数,可以将这些合并写到一句里,例如:

background-image: url(bg.png);
background-position: 0 0;
background-repeat: no-repeat;

可以写成:

background: url(bg.png) no-repeat 0 0;

4、文字属性合写。和背景一样,文字属性也有很多可能会用到的属性值,来个复杂的文字样式:

font-style:italic;
font-variant:small-caps;
font-weight:bold;
font-size:12px;
line-height:1.5;
font-family:Arial, sans-serif;

 可以写成:

font:italic small-caps bold 12px/1.5 Arial, sans-serif;

4、颜色简写。css里的颜色数值使用“#”加6个16进制数表示的。这6个数两个一组,分别表示red,green,blue的值,有人说如果每对的颜色值都是各自相等的,可以简写成一个数值。例如,#ff6600,可以简写成#f60。关于这写法没找到确实的数据证明对浏览器的渲染效率是否有影响,但十六进制的颜色值默认标准是大写字母及数字组成的六位数标注。在未知情况下不希望冒险而降低了渲染的效率,所以还是建议写成#FF6600。

5、margin、padding等的简写。有些人会这样声明边框:

margin-top:5px;
margin-right:10px;
margin-bottom:5px;
margin-left:10px;

可以这样简写:

margin:5px 10px 5px 10px;

css里,像margin、padding、border-width等在写属性值时都是按照上-右-下-左的顺时针方向来写的,不要弄混顺序。像上面的例子,上下边距,左右边距分别是相等的,还可以进一步简化:

margin:5px 10px;

同理,padding、border-width等也是如此。

6、border的简写。举个例子,声明一个1像素的黑色实线边框:

border-width:1px;
border-style:solid;
border-color:#000;

可以简写成:

border:1px solid #000;

有人可能会记不清顺序,我通常这样记,“数字靠两端,字母摆中间”。

7、列表样式。用的不多,一个例子:

list-style-type:square;
list-style-position:inside;
list-style-image:url(filename.gif);

这样简写:

list-style:square inside url(filename.gir);

选择器使用

据说Mozilla样式系统的选择器是从右向左匹配的,这里有篇文章https://developer.mozilla.org/en/Writing_Efficient_CSS,看看就行,毕竟因为ie6的存在,像>,+这样的选择器我们是用不到的,关于浏览器对选择器的支持情况,可以看下http://www.masterboke.cn/2009/02/26/css-browser-support/。不管选择器是从左还是从右匹配,有三点注意一下:

1、避免使用通用选择符。想*{},#test *{}这样的选择器还是不要用。

2、不要用标签修饰id选择器。不要出现div #test{}这样的选择器,id选择器直接单独使用就行,不用再画蛇添足。

3、不要使用标签修饰class选择器。不要出现div .test{}这样的选择器。

其它注意事项

1、对css代码进行压缩。不管开发时是啥样的,呈现到用户面前时必定是压缩过的。

2、应该将CSS 放置于结构的上方(一般放置于head 元素内)。CSS 是解释型语言,ff和ie在等待CSS 传输完成之前不会渲染任何东西。放在顶部,浏览器能够有针对性的对 HTML 页面从顶到下进行解析和渲染。

3、尽量使用 <link rel=”stylesheet” href=”http://www.masterboke.cn/test.css” type=”text/css”> 的样式导入方式,而减少@import 的使用,更不要使用多层嵌套的@import 。因为在 IE 里,@import 相当于将<link> 放在页面尾部。

4、不要使用css表达式。CSS Expressions这个东西好像也只有ie里能用。

5、将css从页面里剥离,放在单独的文件里,这样能够使用缓存、压缩等策略,当然要注意不要引入过多的css文件,会增加http请求的。

6、避免使用滤镜。IE独有属性AlphaImageLoader用于修正7.0以下版本中显示PNG图片的半透明效果。这个滤镜的问题在于浏览器加载图片时它会终止内容的呈现并且冻结浏览器。在每一个元素(不仅仅是图片)它都会运算一次,增加了内存开支,因此它的问题是多方面的。完全避免使用AlphaImageLoader的最好方法就是使用PNG8格式来代替,这种格式能在IE中很好地工作。如果确实需要使用AlphaImageLoader,请使用下划线_filter又使之对IE7以上版本的用户无效。

13

document.documentElement和document.body

作者: boke ,分类: JavaScript, markup language

昨天在试.xhtml时,看网上说要得到<html>节点,在xhtml里要用document.documentElement,而在html 4里要用document.body,以前虽然知道它俩之间的区别,但还真没仔细注意过。结果我一试,不管是用xhtml还是html,不管是加DOCTYPE还是不加,document.documentElement总是<html>节点,document.body总是<body>节点。

这是咋回事呢?后来找了半天,在一个博客里看到,好像只有在IE 4以前的浏览器才认为document.body是<html>节点,具体怎样说的我也忘了,现在再找那个博客也找不到了。我也没有IE 6以前版本的浏览器,没法试,算了,就这样吧,谁还会用IE 6以前的浏览器呢?

所有的现代浏览器都认为document.documentElement可以得到<html>,document.body可以得到<body>。

不过我可没说在IE下,带DOCTYPE的文件和不带的,对documet.documentElement的解释是完全一样的。例如,我们要得到浏览器的显示区域大小,在带DOCTYPE的文件里,我们要用document.documentElement.clientWidth/document.documentElement.clientHeight来得到;而在不带DOCTYPE的文件里,这时documentElement.clientWidth/clientHeight都等于0,我们要用document.body.clientWidth/document.body.clientHeight来得到。

明白了吗?不明白的话,那咱就来点更糊涂的。

接着上面那个例子,我们现在通常使用的得到浏览器显示区域大小的函数通常可以简单的这样写:

<script type="text/javascript">
function documentHeight() {
  var de = document.documentElement;
  return window.innerHeight || ( de && de.clientHeight ) || document.body.clientHeight;
}

function documentWidth() {
  var de = document.documentElement;
  return window.innerWidth || ( de && de.clientWidth ) || document.body.clientWidth;
}
</script>

这里的window.innerWidth,document.documentElement.clientWidth,document.body.clientWidth都是啥意思呢?都是为了得到浏览器显示区域的宽,第一个是适用于非IE系的,第二个是适用于带有DOCTYPE的IE 浏览器的,第三个是适用于不带有DOCTYPE的IE 浏览器的。

怎么样?乱不?

感觉还行的话,还有更刺激的,加不加DOCTYPE,不同的浏览器,有没有设置margin,这么多种情况,排列组合一下,测试一下以上那三个值,绝对够你喝一壶的。

如果感觉乱,那就到此为止吧,我们按w3c那帮闲人的标准来,加上DOCTYPE。

12

.xhtml扩展名

作者: boke ,分类: markup language, mobile web

今天在研究手机开发时的javascript应用时,不经意间发现了个小问题,现来看一下这两个文件:

a.xhtml

<!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="application/xhtml+xml; charset=UTF-8" />
<title>1</title>
<script type="text/javascript">
window.onload = function()
{
var pp = document.documentElement.childNodes;
for (p in pp)
{
alert(pp[p]);
}
}
</script>
</head>
<body>
</body>
</html>

b.html

<!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="application/xhtml+xml; charset=UTF-8" />
<title>1</title>
<script type="text/javascript">
window.onload = function()
{
var pp = document.documentElement.childNodes;
for (p in pp)
{
alert(pp[p]);
}
}
</script>
</head>
<body>
</body>
</html>

发现两个文件的不同之处了吗?其实上面两个文件是完全一样的,除了扩展名。

由于要做手机开发,有人建议说用.xhtml这个扩展名更好一些,于是就用了。本想用js得到body这个节点,结果试了几次pp[0]都不对。

我用的是XHTML-MP 1.2的DOCTYPE,难道DOCTYPE不对?好,换成标准的xhtml的DOCTYPE,就是a.xhtml这样的,还是不对啊!

难道js代码写的有问题?(这里有段小插曲,在下篇文章详述)百度一下,再翻出以前写的看看,没问题啊!还有哪儿不对呢?

按网上和我以前的经验来说,pp[0]是<head>,pp[1]是<body>才正对呀!不管了,先把pp都alert出来看看是啥东西再说。这一alert发现问题了,多出三个[object Text],分别位于<head>前面,<head>和<body>之间,<body>之后。这种情况,甭问肯定是换行符所致,删掉,果然没问题了。

记得以前没出现这种情况,那可能就是扩展名的问题了,另存为b.html,再试,没问题了,这才恍然大悟,怪不得年前看过一个手机页面,一个换行符也没有。

来个刨根问底,查查这个.xhtml到底咋回事,百度了半天,没找到,google了半天,好像(为什么加个好像呢?答案看我2月12号的饭否)也没找到。

哪位有缘人路过提点提点,期待ing!!!

7

CSS选择器

作者: boke ,分类: markup language

重学prototype,半道研究了一下css2.1和css3的选择器,整理整理:

CSS 2.1

1. 通用选择器(Universal selector)

即星号”*”,匹配任何元素类型

2. 类型选择器(Type selectors)

h1 {font-size:19px;} /*匹配文档中所有的h1元素*/

3. 后代选择器(Descendant selectors)

<h1>I <span>am <em>boke.</em></span></h1>

h1 em {color:blue} /*匹配h1中的em元素*/

4. 子选择器(Child selectors)

 <h1>I <span>am <em>boke.</em></span></h1>

span > em {color:blue} /*匹配span中的em元素。子选择器只对儿子辈的可用,对孙子、重孙子辈等都不可用,如h1 em{color:blue}将不起作用*/

5. 相邻兄弟选择器(Adjacent sibling selectors)

<span class=”abc”>I am Peter Petrelli.</span>

<h1>I am boke.</h1>

<span class=”abc”>I am Sylar.</span>

h1 + .abc {color:blue} /*匹配与h1紧邻的后一个,类名为abc的元素。注意是后一个,“I am Peter Petrelli”是不会变蓝的。*/ 

6. 属性选择器(Attribute selectors)

<span lang=”zh-cn” title=”heroes the 4400″>Super men?</span>

  • span[title] {color:red;} /*匹配含有title属性的span*/
  • span[title="heroes the 4400"] {color:red;} /*匹配title属性的值为“heroes the 4400”的span*/
  • span[title~="heroes"] {color:red;} /*匹配title属性中含有以空格分隔的,单词为“heroes”的span*/
  • span[lang|="zh"] {color:blue;} /*匹配lang属性中含有连字符且以“zh”开头的span*/

7. 类选择器和ID选择器(Class selectors and ID selectors)

不必多言。

8. 伪类

<div><p>I am boke.</p><p>I am Hiro Makamura.</p><a href=”">I am Matt Parkman.</a></div>

  • :first-child  例如:div > p:first-child {color:red;} /*匹配div下的第一个p元素*/
  • :link and :visited  例如a:link {color:blue;} /*匹配没有被访问的超链接*/ a:visited {color:yellow} /*匹配已经被用户点击的超链接*/ 
  • :hover,:active and :focus  例如:.b:hover {color:blue;} /*匹配class=”b”的元素鼠标放上时*/ .b:active {color:red;} /*匹配class=”b”的元素鼠标按下时*/ .b:focus {color:yellow;} /*匹配class=”b”的元素得到焦点时*/
  • :lang  例如:html:lang(zh-cn) {qutoes:’?’ ‘?’}

9. 伪元素

  • :first-line  例如:p:first-line {font-size:3em;} /*匹配p元素内的第一行,注意,只作用于块元素,内联元素要设定height或width属性,或设定position为absolute,或设定display为block*/
  • :first-letter  例如:p:first-letter{font-size;2em;} /*匹配p元素内的第一个字符,注意,同first-letter*/
  • :before and :after  例如:p:before {content:”nani?”} /*设置在p之前发生的内容,注意要和content配合使用*/

CSS 3

2.1中有的不再重复,将标注 “²  ”这个符号表示

1. 通用选择器(Universal selector)²

2. 类型选择器(Type selector)² 

3. 属性选择器(Attribute selector)²

<a href=”" title=”copyright boke”>sa ku sha.</a>

  • a[title]²
  • a[title="copyright boke"]²
  • a[title~="copyright"]²
  • a[lang|="zh"]²
  • a[title^="copy"] /*匹配有title属性且属性值以“copy”开头的a元素*/
  • a[title$="ke"] /*匹配有title属性且属性值以“ke”结尾的a元素*/
  • a[title*="right"] /*匹配有title属性且属性值中包含“right”字符串的a元素*/

4. 类选择器和ID选择器(Class selectors and ID selectors)²

5. 伪类(Pseudo-classes)

  1. 动态伪类(Dynamic pseduo-classes)
    • :link and :visited²
    • :hover, :active and :focus² 
  2. 目标伪类(Target pseduo-class) :target /*简单理解成匹配被从URI中定位的锚点*/
  3. 语言伪类(Language pseudo-class)²
  4. UI元素状态伪类(UI element states pseudo-classes)
    • :enabled and :disabled  例如:.urt:disabled {color:#333;} /*匹配类为.urt且被设置成不可用(disabled)的元素*/
    • :checked  /*匹配被设置成checked的元素*/
    • :indeterminate  /*匹配checked状态不确定的元素,CSS 3还没加入,将来可能加入*/
  5. 结构伪类(Structural pseudo-classes)
    • :root  /*匹配文档的根元素,在html 4 中这个总是匹配*/
    • :nth-child() and nth-last-child()  /*按索引值匹配子元素。例如:li:nth-child(3) 匹配在ul中排第3个位置的li,li:nth-child(2n+1)和li:nth-child(odd)匹配所有奇数位置的li,li:nth-child(2n)和li:nth-child(even)匹配所有偶数位置的li。当然4n+1,4n+2,4n+3,4n+4可以四行匹配,类推。注意,第一个元素的索引是1而不是0。倒数的:nth-child()*/
    • :nth-of-type() and :nth-last-of-type() /*匹配某种类型的同级兄弟元素,括号里的参数同:nth-child()。倒数的:nth-of-type()*/
    • :first-child and :last-child /*匹配第一个和最后一个元素,例如:ul li:first-child {color:red}*/
    • :first-of-type and :last-of-type /*匹配第一个和最后一个某种类型的元素*/
    • only-of-type /*匹配一个元素其在这个元素的父元素中再也没有和它同名的元素*/
    • :empty /*例如,p:empty,匹配一个<p></p>*/
  6. 否定伪类(Negation pseudo-class) :not() /*匹配除了括号里规定的之外的元素,例如:button:not([disabled]),匹配除了属性设置为disabled之外的所有button,*:not(p),匹配除了p元素之外的所有元素*/

6. 伪元素

  • ::first-line² /*不过这里是两个“:”*/
  • ::first-letter² /*不过这里是两个“:”*/
  • ::selection /*匹配元素中被用户选中的部分,例如span::selection {color:red}*/
  • ::before and ::after² /*两个“:”*/

7. 组合选择器

<div><p class=”god”>I am boke.</p><p>I am Isaac Mendez.</p><p>I am Nathan Petrelli.</p></div>

  • 后代(Descendant combinator)² /*同2.1里的后代选择器,例如:div p {color:red;}*/
  • 子代(Child combinators)² /*同2.1里的子选择器,例如div>p{color:blue;}*/
  • 相邻兄弟(Adjacent sibling combinator)² /*同2.1里的相邻兄弟选择器,例如:.god+p{font-size:2em;}*/
  • 通用兄弟(Genetal sibling combinator) /*可以选择普通的兄弟了,例如:.god~p{color:yellow;}*/

终于写完了,等发现那里有问题再改正。有种感觉,w3c那帮闲人弄这么多东西干嘛,实际应用中真的都会用到吗,想让css取代js吗?南哈蒙理工学院(=S H I T)!

过两天再整理个Mobile Profile的。

21

手机使用AJAX

作者: boke ,分类: JavaScript, markup language, mobile web

测试一下手机浏览器对AJAX的支持:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//OMA//DTD XHTML Mobile 1.2//EN" "http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8" />
<title>title</title>
</head>
<body>
<div id="a"></div>
<div id='b'></div>
<input type="button" onclick="startXMLHttp();" value="发送GET" />
<div id="a1"></div>
<div id='b1'></div>
<input type="button" onclick="startXMLHttp1();" value="发送POST" />

<script type="text/javascript">
 //<![CDATA[
  var xmlHttp;
  function createXMLHttp()
  {
    if (window.XMLHttpRequest)
    {
      xmlHttp = new XMLHttpRequest();
    }
    else if (window.ActiveXObject)
    {
      try
      {
        xmlHttp = new ActiveXObject('Msxml2.XMLHTTP');
      }
      catch(e)
      {
        try
        {
          xmlHttp = new ActiveXObject('Microsoft.XMLHTTP');
        }
        catch(e) {};
      }
    }
  }
  
  function startXMLHttp()
  {
    createXMLHttp();
    var sendStr = "name=博科&age=23";
    sendStr = encodeURI(sendStr);
  var t1 = document.createTextNode(sendStr);
    document.getElementById('a').appendChild(t1);
    xmlHttp.onreadystatechange = doSomething;
    xmlHttp.open('GET','ajaxtest.php?'+sendStr,true);
    xmlHttp.send(null);
  }
  
  function doSomething()
  {
    
    if (xmlHttp.readyState == 4)
    {
      if (xmlHttp.status == 200)
      {
    var t2 = document.createTextNode(xmlHttp.responseText);
        document.getElementById('b').appendChild(t2);
    //document.getElementById('b').innerHTML = xmlHttp.responseText;
      }
    }
  }
  
  function startXMLHttp1()
  {
    createXMLHttp();
    var sendStr = "name=博科&age=23";
    sendStr = encodeURI(sendStr);
  var t3 = document.createTextNode(sendStr);
    document.getElementById('a1').appendChild(t3);
    xmlHttp.onreadystatechange = doSomething1;
    xmlHttp.open('POST','ajaxtest1.php',true);
    xmlHttp.setRequestHeader('Content-type','application/x-www-form-urlencoded');
    xmlHttp.send(sendStr);
  }
  
  function doSomething1()
  {
    if (xmlHttp.readyState == 4)
    {
      if (xmlHttp.status == 200)
      {
        var ret = eval('('+xmlHttp.responseText+')');
        var t4 = document.createTextNode('你的名字是'+ret.name+',年龄是'+ret.age); 
        document.getElementById('b1').appendChild(t4);
        //document.getElementById('b1').innerHTML = xmlHttp.responseText;
      }
    }
  }
 //]]>
</script>
</body>
</html>

由于是xhtml,如果服务器返回的数据里面有“&”,“<”等特殊字符,以及html标签等,就会提示解析错误,所以我们不能使用document.getElementById(‘b1′).innerHTML = xmlHttp.responseText了,这里需要注意。
推荐在服务器端将数据组装成JSON格式,然后在客户端使用createElement(),appendChild()等DOM方法生成所需的样式。