分类目录归档:技术

左侧Tab切换页面实现

最近在玩着做一个小站,目前的状态正处于设计阶段(再小的东西都需要设计一下的),在Photoshop中做好图转化成页面,页面中有个部分需要实现左侧Tab页面切换的效果,做了下代码实验,最终实现,分享出来供需要的人取用。

设计的最终效果图如下所示:

左侧可以切换的页面

左侧可以切换的页面

之所以选择使用Tab页面切换来显示页面中的内容是因为要显示的内容属于同一类型,内容能在该类型中很清晰的分组,这样有利于用户在浏览的时候有更好的比较跟选择,能在同一块显示区域显示更多的内容,有较好的体验,这仅仅是自己的想法,不一定正确。(btw:在网上称为滑动门在目前的网站中比较常见,这让我想起前不久还在职的时候经历的一个项目,决策者放佛迷恋这种效果,于是说能用滑动门都用滑动门,于是乎…)。

1、设计到页面的转换

首先PS中设计出上图,然后开始切图,主要切出左侧Tab页面即可,因为右边内容区域可设置容器的border来达到最终效果,切出52×32的图,有两个,切好后如下所示。

然后就开始形成最终要用的页面,  主要想法是左侧Tab条跟右侧内容区域,两个float:left;跟整个的con大小匹配,然后用js完成在左侧tab按钮条选择切换的时候应用不同的样式即可,考虑到IE跟Firefox的像素差距注意使用!important,在选择到Tab页的时候,让tab的图像向右偏移一个像素(px),使用对象不可层叠(position取值为relative)将内容区域的边线遮住,然后加上调试,形成最终代码如下。

2、测试页面代码

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
  <HEAD>
    <TITLE>tab test</TITLE>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <META NAME="Generator" CONTENT="EditPlus">
    <META NAME="Author" CONTENT="">
    <META NAME="Keywords" CONTENT="">
    <META NAME="Description" CONTENT="">
    <link rel="stylesheet" type="text/css" href="style.css" />
  </HEAD>
<BODY>
  <div id="con">
    <ul id="tabs">
      <li style="margin-top:25px;" class="selectTab">
        <a href="javascript:void(0)" onclick="selectTab('tabContent0',this)">tab1</a>
      </li>   
      <li><a href="javascript:void(0)" onclick="selectTab('tabContent1',this)">tab2</a></li>
    </ul>
    <div id="tabContent">
      <div id="tabContent0" class="tabContent selectTab">
        <p>tab1 contents</p>
      </div>
      <div id="tabContent1" class="tabContent"><p>tab2 contents</p></div>
    </div>
 </div>
</BODY> 
<script type="text/javascript">
  function selectTab(thisContent,thisObj) {
    thisObj.blur();
    var tab = document.getElementById("tabs").getElementsByTagName("li");
    var tablength = tab.length;
    for(i=0; i<tablength; i++) {
      tab[i].className = "";
    }
    thisObj.parentNode.className = "selectTab";
    for(i=0; j=document.getElementById("tabContent"+i); i++) {
      j.style.display = "none";
    }
    document.getElementById(thisContent).style.display = "block";
  } 
</script>
</HTML>

3、相关的样式文件

#con{width:439px !important;width:440px;height:402px;float:left;}
#con #tabs{height:400px;width:52px;margin:0;padding:0;float:left;}
#con #tabs li {float:left;background:url(tabnormal.png) no-repeat; height:32px; list-style-type:none;width:52px;margin-top:8px;text-indent:12px;font-size:14px;}
#con #tabs li a { text-decoration:none; float:left; background:url(tabnormal.png) no-repeat;height:32px;line-height:32px;color:#000;}
#con #tabs li.selectTab {background:url(tabselect.png) no-repeat;position:relative;height:32px;width:52px;right:-1px;}
#con #tabs li.selectTab a {background:url(tabselect.png) no-repeat;color:#7979b3; height:32px; line-height:32px;}
#tabContent {background-color:#fff; border:1px solid #0087ae;float:left;width:384px !important;width:382px;height:400px;} 
.tabContent {margin:10px 0 0 10px;color:#474747; width:360px; display:none}
#tabContent div.selectTab{display:block}

 

页面客户端简易柱状图的实现

对于统计的的结果很多时候会采用一些图表进行显示,这样一方面给人的视觉上有很直观的表现,另一方面比起数字来说有很强的对比性及友好性,其中柱状图是常用到的一种图表。

在页面客户端展现柱状图目前多采用图片,其实现方式包括直接由服务器的脚本生成、一些类库、Flash等,对于简单的柱状图其实也可以使用CSS结合Javascript来完成.

1、最终效果

柱状图(效果中颜色跟高度随机)

柱状图(效果中颜色跟高度随机)

2、页面代码

<!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>
  <title>Histogram</title>
  <style type="text/css">
    #Histogram{
      width:300px;
      height:150px;
      position:relative;
      border-left:1px solid #000;
      border-bottom:1px solid #000;
    }
    #Histogram ul {
      width:300px;
      height:150px;
      margin:0;
      padding:0;
    }
    #Histogram ul li {
      position:absolute;
      width:12px;
      height:120px;
      bottom:0px;
      padding:0 !important;
      margin:0 !important;
      text-align:center;
      font-weight:bold;
      color:#fff;
      line-height:2.5em;
    }
  </style>
  <script language="javascript" type="text/javascript">
    function getRandomColor() {
      var str = "0123456789abcdef";
      var sColor = "#";
      for(var i=0;i<6;i++) {
        sColor = sColor + str.charAt(Math.random()*str.length);
      }
      return sColor;
    }
    function setResults() {
      var oRes = document.getElementById("Histogram");
      var tmpString = "";
      tmpString += "<ul>";
      for (var i=0; i<10; i++) {
        tmpString+="<li style=\"left:"+(30+(20*i))+"px;background:"+getRandomColor()+";height:"+Math.random()*120+"px;\">"+i+"</li>";
      }
      tmpString+="</ul>";
      oRes.innerHTML = tmpString;
      oRes.style.display="block";
    }
  </script>
</head>
<body onload="setResults();">
  <div id="Histogram"></div>
</body>
</html>

一个简单的AJAX+PHP+Mysql的应用

最近开始PHP语言及Ajax的学习,做个小小的练习记录下来,类似于学习其他语言的”Hello World!“。

1、任务描述

学习XMLHttpRequest对象,通过XMLHttpRequest对象向服务器发出请求,通过服务器端脚本(PHP)获取返回的MySQL中的数据。

2、结构描述

服务器端

请求处理页(SimpleResponse.php)、解析页(parser.php)、模版页(template\template1.html)、数据处理页(sql.php),请求处理页根据选择的模版使用解析页提供的功能对数据进行处理,返回需要的数据。

客户端

测试页(SimpleResponse.html)

3、部分程序代码

3.1 sql.php

<?
  /* 帐号密码等设定 请使用自己的数据库处理代码*/
  $host = "localhost";
  $user = "root";
  $pass = "";
  $database = "test";
  
  function sql_query($query) {
    global $host,$user,$pass,$database;
    $conn=@mysql_connect( $host, $user, $pass );
    $result=@mysql_db_query( $database, $query, $conn);
    @mysql_data_seek($result,0);
    while($row=@mysql_fetch_row($result)) {
      $output[] = $row;
    }
    @mysql_free_result($result);
    @mysql_close($conn);
    return $output;
  }
......

3.2 parser.php

<?
  /*************************************
  功能说明:解析网页模板,并替换标记输出 
  $filename  文件名及位置
  $parser_array  格式为  $array['key']=value
  ***********************************/
 
  function flag_parser($filename,$parser_array) {
    $handle = fopen ($filename, "r");
    $buffer = fread ($handle, filesize ($filename));
    fclose ($handle);
    while(list($key,$value)=each($parser_array)) {
      $buffer = str_replace($key,$value,$buffer);
    }
    return $buffer;
  } 
?>

3.3 template\template1.html

<table width="100%" border="0" cellpadding="0" cellspacing="2" bgcolor="#FFEAFF">
 <tr>
 <td width="10%" bgcolor="#CCCCCC">{ID}</td>
 <td width="30%" bgcolor="#CCCCCC">{Title}</td>
 <td width="40%" bgcolor="#CCCCCC">{Des}</td>
 <td width="20%" bgcolor="#CCCCCC">{Date}</td>
 </tr>
</table>

3.4 simpleResponse.php

<?
 $page = "template/template1.html";
 include(‘sql.php’);
 include(‘parser.php’);
 $sql = "SELECT * FROM `ajaxdatas`";
 $data = sql_query($sql);
 for($i=0;$i<count($data);$i++)
 {
 $array['{ID}'] = $data[$i][0];
 $array['{Title}'] = $data[$i][1];
 $array['{Des}'] = $data[$i][2];
 $array['{Date}'] = $data[$i][3];
 $result .= flag_parser($page,$array);
 }
 echo $result;
?>

3.5 测试页(SimpleResponse.html)

<?xml version="1.0" encoding="gb2312"?>
<!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=gb2312" />
<title>Simple XMLHttpRequest</title>
 <script language="JavaScript" type="text/JavaScript">
 var xmlHttp;
 
 function createXMLHttpRequest()
 {
 if (window.ActiveXObject)
 {
 xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
 }
 else if (window.XMLHttpRequest)
 {
 xmlHttp = new XMLHttpRequest();
 }
 }
 function startRequest()
 {
 createXMLHttpRequest();
 xmlHttp.onreadystatechange = handleStateChange;
 xmlHttp.open("POST","SimpleResponse.php",true);
 xmlHttp.send(null);
 }
 function handleStateChange()
 {
 if (xmlHttp.readyState == 4)
 {
 if (xmlHttp.status == 200)
 {
 document.getElementById("results").innerHTML = xmlHttp.responseText;
 }
 }
 }
 </script>
</head>
<body>
<table width="100%" border="0" cellpadding="0" cellspacing="2" bgcolor="#FF9900">
 <tr> 
 <td bgcolor="#FFFFFF"> 
 <div id="results">Click Button Get Datas </div></td>
 </tr>
 <tr> 
 <td bgcolor="#99FF00"> 
 <form action="#">
 <div align="center"> 
 <input type="button" value="Get MySQL Datas" onclick="startRequest();" />
 </div>
 </form></td>
 </tr>
</table>
</body>
</html>

网页布局与设计

制作网页缘于制作自己的Homepage,如果追朔起来要到1999年了,当时一个在一家公司专职做网页的朋友告诉我,做网页的第一步是要会用表格,于是从表格开始了Web Page的制作,整个页需要用表格来进行布局加上表嵌套完成页布局,跟PS或者其他设计工具展现的效果达到一致,从而完成整个Web Page的设计跟制作,中间像各种字体的展现风格(e.g.: font size、color…)以及其他的风格(e.g. :margin、padding),总之整个Web Page包罗万象,从整体页面的布局到内容及内容表现风格全部都体现在整个页中,看起来让人头晕眼花,随着计算机软件开发及基于Web Page开发语言的的发展,逐渐出现了新的Web标准,逐渐的将结构、表现、动作加以分离,形成了新的网页设计布局方法(Div+CSS)。

一直以来从事的工作并不是职业网页开发人员,陆续也听到这种新的设计方法,也大体上了解怎么使用,但一直没有好好钻研一下,昨天抽出一天时间好好看了看这部分的内容,记录下来加以总结。

理解新的Web标准首先要理解的应该就是将表现跟结构分离了,以一个例子来说明:

Example:制作一个页面来说明Delphi中循环语句While的应用说明。

While 语法 while Expression do Statement

说明

while语句的作用跟标准的pascal中一样,当Expression表达式为True时,Delphi便会重复执行Statement语句。一旦Expression为False,Statement就不再执行了。  相关信息:Boolean类型、Continue、Break、Do、For。

采用Table进行布局代码如下

<table width="100%" border="0" cellspacing="0" cellpadding="0">
 <tr>
 <td><h1><font color="#660000">While</font></h1></td>
 </tr>
 </table>
 <table width="100%" border="0" cellspacing="0" cellpadding="0">
 <tr>
 <td height="1" bgcolor="#000066"></td>
 </tr>
 </table>
 <table width="100%" border="0" cellspacing="0" cellpadding="0">
 <tr> 
 <td><font color="#000099">语法</font></td>
 </tr>
 <tr> 
 <td><font color="#FF6600">while Expression do Statement</font> </td>
 </tr>
 <tr> 
 <td><font color="#000099">说明</font></td>
 </tr>
 <tr> 
 <td><font color="#FF6600">while语句的作用跟标准的pascal中一样,当Expression表达式为True时,Delphi便会重复执行Statement语句。一旦Expression为False,Statement就不再执行了。</font></td>
 </tr>
 <tr> 
 <td><font color="#000099">相关信息</font></td>
 </tr>
 <tr>
 <td><font color="#FF6600">Boolean类型、Continue、Break、Do、For</font></td>
 </tr>
 </table>

而采用Div+CSS的方法达到与使用Table同样效果,首先分析整个内容的结构

1级标题: While

2级标题1: 语法

语法正文:while Expression do Statement

2级标题2: 说明

说明正文:while语句的作用跟标准的pascal中一样……

2级标题3:相关信息

相关信息正文:Boolean类型、Continue、Break、Do、For…

分析最终展现界面得到Web页内容

<h1>While</h1>
 <h2>语法</h2>
 <div id="content">while Expression do Statement</div>
 <h2>说明</h2>
 <div id="content">while语句的作用跟标准的pascal中一样……</div>
 <h2>相关信息</h2>
 <div id="content">Boolean类型、Continue、Break、Do、For</div>

针对该Web页面定义CSS样式

h1{
 font:16px Arial;
 color:#660000;
 border-bottom:1px solid #000066
 }
 h2{
 font:14px Arial;
 color:#000099;
 }
 #content{
 width:auto;
 font-size:12px Arial;
 color:#FF6600;
 }

同样的道理,对于设计比较复杂的呈现风格,进行分析逐渐层层分离,最终都可以采用Div+CSS或者Div嵌套+CSS来完成结构跟表现的分离,这样的好处是当页面的表现发生改变的时候而内容不变的情况下可以轻松调整表现风格,同时也使得整个页面的结构比较清晰。

CSS语言有专门的教程跟讨论帖子,具体深入使用可参考相应的教材。

一个小小小小工具的总结

经常会因为重新做系统忘记备份Favorites目录中的链接,新做完系统后链接就丢失了,昨天晚上闲来就写了个很小小小的工具用于记录Favorites目录中的链接,保存在Xml文件中,并显示在TreeView中,并可打开TreeView中的链接节点。

1、当前用户的Favorites目录搜索获取链接信息

采用递归搜索,使用几个API函数就能完成,主要涉及的API函数为FindFirst、FindNext、GetPrivateProfilestring、ShGetSpecialFolderLocation、ShGetPathfromIDList等,具体使用可参照MSDN。

2、将链接信息保存在xml文件,可以将链接的信息保存在字符串中,直接保存成xml文件,注意保存的时候字符编码采用UTF8格式,否则TXMLDocument处理时会出错,默认的为Ansi,将String转换为UTF8保存即可。

<urls>
 <urlCategory Name="Category Name">
 <urlCategory Name="Category Name">
 <url Name="Url Title">urlPath(e.g. http://www.google.com)</url>
 …
 </urlCategory>
 <url Name="Url Title">urlPath(e.g. http://www.google.com)</url>
 …
 </urlCategory>
 …
 </urls>

3、读取xml文件显示在TreeView中,节点urlCategory为TreeView目录节点,只需获取其Name属性,url为TreeView超链接节点,需要获取Name属性及其节点的value,这里在TreeView显示的是Name属性。需要针对TTreeView进行小小的改造,针对TTreeNode定义TTreeHintNode如下。

TTreeHintNode=class(TTreeNode)
 public:
 constructor Create(AOwner: TTreeNodes);
 procedure Assign(Source: TPersistent); override;
 function GetNodeHint(Node:TTreeNode):string;
 procedure SetNodeHint(Node:TTreeNode;value:string);
 ……