今年开始树立目标做到每年进步,我的人生还好迷茫。
总的目标还是赚钱。没有钱万万不能嘛。
第一年制定还是经验不足,不过首先还是要把锻炼自己放到第一位,只有自己不断都提高,才能取得成功,然后要注意自己都身体,身体是革命都本钱,找到一个适合自己的方向去努力并做出一定都成绩来,好了先这样吧,希望大家都能赚钱。穷人现在生活好辛苦。
博客
-
09年制定目标
-
元旦少量祝福短信词
又是新的一年,新的一年要努力啦,首先对自己的朋友们祝福下吧,短信是最快捷的方式,祝福词自己编?能力有限,简单写几句没什么诚意啊,还是不要了网上找了些给朋友发吧,哈哈。
1愿你享有期望中的全部喜悦,每一件微小的事物都能带给你甜美的感受和无穷的快乐,愿你新年快乐!
2送你一份100%纯情奶糖:成分=真心+思念+快乐,有效期=一生,营养=温馨+幸福+感动,制造商:真心朋友!祝你元旦快乐,万事如意!
3新年好!衷心祝福你:上帝保佑你!真主关心你!菩萨爱护你!要云得云,要雨得雨.花天酒地,黄金遍地.
4感谢你的关怀,感谢你的帮助,感谢你对我做的一切……请接受我新春的祝愿,祝你平安幸福。
5这一季有我最深的思念.就让风捎去满心的祝福,缀满你甜蜜的梦境.祝你拥有一个灿烂的新年!
6但愿我寄予您的祝福是最新鲜最令你百读不厌的,祝福你新年快乐,万事如意!
7每一年的今天,都是一个全新的开始,任世事变幻,时光流转.幸福、平安、快乐、健康永远伴随你左右.
8每年的这个时候,祝福就会象海洋涌向你,希望我的祝福象一叶轻舟,载你乘风破浪,到达成功的彼岸!新年快乐!
9愿新年的钟声,敲响你心中快乐的音符,幸运与平安,如春天的脚步紧紧相随!春华秋实,我永远与你同在!
10元旦佳节到,向你问个好;身体倍健康,心情特别好;好运天天交,口味顿顿妙;家里出黄金,墙上长钞票。 -
PageRank更新
今天google终于更新了PR,我的小博很荣幸的更新到了3,但是很不幸的说这次更新很多站被降权了,一些PR5的站被降到了3 4。我的其他站也很不幸被降权了。现在想从网上混是很难的说,往往好好做站PR也就是3-4 ,我的博客每天更新1-2篇日志,就有幸能够更新到3,但是不幸的事用来赚钱的站却都被降权了,混日子越来越不可行了,还是要好好做站啊。
-
扫雷游戏规则与技巧
扫雷玩法
在“游戏”菜单上,单击“开局”。
要启动计时器,请单击游戏区中的任何方块。
注意通过单击即可挖开方块。如果挖开的是地雷,则您输掉游戏。
如果方块上出现数字,则表示在其周围的八个方块中共有多少颗地雷。
要标记您认为可能有地雷的方块,请右键单击它。
游戏区包括雷区、地雷计数器和计时器。策略与技巧
如果无法判定某方块是否有雷,请用右键单击两次给它标记一个问号 (?)。以后,您可以用鼠标右键单击方块一次将该方块标记为地雷或者或用鼠标右键单击方块两次去掉标记。
如果某个数字方块周围的地雷全都标记完,可以指向该方块并同时点击鼠标左右键,将其周围剩下的方块挖开。如果编号方块周围地雷没有全部标记,在同时使用两个按钮单击时,其他隐藏或未标记的方块将被按下一次(即闪烁一下)。
寻找常见的数字组合,这通常会指示地雷的常见组合。例如,在一组未挖开的方块的边上相邻的三个数字 2-3-2 表示这三个数旁边有一排有三个地雷。 -
粘粘世界一款颇受欢迎的独立游戏
粘粘世界是一款新开发的游戏,不过网上看到的数据说正版率10%现在单击游戏可能真的是不好活了,90%都是在用盗版,我在网上找了找玩了一下还是比较有意思的,建议玩玩,下载地址就不提供啦,不能支持盗版,哈哈虽然自己试玩过的也是下载到的。
粘粘世界攻略心得
CHAPTER 1 夏天
1.GOing UP
基本操作关~只需要用鼠标点击一只黑色的豆包~把它拖上去~
在离支架一定范围内~豆包会建立一个新的支点~只需要到达管道口就可以勒~管道会把连接的豆包都吸进去~
画面的右下角 X of Y~其中X是指过关时管道需要吸入的豆包数~Y是指最小过关豆包数~
2.Smill Divide
睡觉的豆包:只要有活动的豆包靠近就会被吵醒
将豆包的支架延伸到悬崖对面即可~注意加强悬崖地方的支撑
3.Hang Low
白色的豆包:使用方法和黑豆包一样~但是具有更强的延展性~也具有更强的支持力
只要让白豆包构成支架垂下来~吵醒下面的一群豆包~然后再将支架往上搭~到达管道口即可
4.IMPALE STICKY
和之前比加强了难度~豆包不能碰到上面的锯齿和下面的池塘~注意支架加强后面的重心和悬崖部分的支撑~
5.FLYING MACHINE
红色的豆包:豆包小气球~可以系在有支点的地方(钉子。螺丝。豆包支架等)~可以带动起一定的重量~到飞起来~可以重复使用
将红豆包系在钉子上~让路障向上提升~然后将剩下的红豆包系在支架上~让支架飞到管道口即可
6.FISTY’S BOG
……好丑的蛤蟆……额
本关有一定难度~将黑豆包用来延长支架~红豆包系在支点上~保持平衡到达对面的管道即可~
小技巧:气球不要系在最后一个支点~这样上升速度过快很容易被上面的刺刺到~~将气球系在倒数第二个支点上~容易保持平衡~
死蛤蟆死蛤蟆死蛤蟆……
7.TOWER OF GOO
……搭吧搭吧……搭到管道口就过关勒……注意基础打好就行了
8.LVY TOWERS
绿色的豆包:可以重复利用的豆包
用绿豆包往上搭支架~不够勒就把下面的绿豆包拆勒放上去就行
9.TUMBLER
挺简单的~多试几次就过勒
10.CHAIN
先搭一边的支架~把下面的豆包吵醒~再把支架拆勒搭另一边~两边的豆包都吵醒勒就可以从中间搭支架到达管道口即可
11.ODE TO THE BRIDGE BUILDER
不是很难~可以从悬崖的墙壁上寻找支点~到达另一段即可
12.REGURGITATION PUMPING STATION
SUCCULENT……豆包汁……?
首先将支架往两边延伸~固定住~让它不要在果汁里飘来荡去~~然后将支架往上搭~够到黄色的转盘~再往上搭一点~差不多了就可以动手把底下的绿豆包拆了~
然后继续往上……一定程度勒转盘会带动支架往上走走走……就到勒火山口~(喷豆包汁的火山- -)
最后嘛……注意勒悬崖两边的白色物体其实是伪装的气球!!!日哦!玩的时候卡勒好久~无意间发现的……隐藏得这么深- -!
过关动画…美丽的果汁火山口…豆包子被气球带着……冉冉飞向夕阳……CHAPTER 2 秋天
1.DROOL
透明的豆包:很重~一次只能粘一条线~只能垂直向下~不能重复利用
将透明豆包从悬崖上吊下来~吵醒下面的绿豆包~然后用绿豆包搭成通道到达管道口即可
2.FLY AWAY LITTLE ONES
把三个红豆包粘在五边形支架的三个不同支点上~然后移动最左边的到右边的一个空支点~这样可以实现支架的移动~
3.BLUSTERY DAY
北风那个吹……
用透明豆包连出一条线~然后将气球系上~注意不能碰到右边那个大风车~
在过大风车的上端靠右的支点多系几个气球~然后再将豆包延长下来~~豆包就会被西北风呼呼地刮到管道口了~
4.WELCOMING UNIT
先把半空云中的红豆包系在齿轮顶上那个路障上~~让路障抬起~然后用绿豆包附在齿轮上做支架把黑豆包转移过去~最后用气球吊起支架~到达管道口
5.BEAUTY SCHOOL
……很震撼的豆包:很大很圆很…嘴角还长着个痣- -!…被碾压后会变成无数个……小口红……豆包
把气球系在大豆包前的支架上~让它滚下来吵醒绿豆包~
6.LEAP HOLE
注意拆的顺序~先拆上面的~拆成一条线再拆下面的~
7.WHISTLER
用技巧2~在空白处单击鼠标左键~制造点噪音~让豆包都集中到左边~让管子垂下来~
8.VOLCANIC PERCOLATOR DAY SPA
额……红色大豆包的亲戚……黄色大豆包……
用绿豆包在黄色大豆包的底下搭支架~不断把它往上顶~~它出了口后会顺流而上~被顶上的齿轮碾碎~
9.BEAUTY AND THE ELECTRIC TENTACLE
系绳子的方法和前面大同小异~把绳子系到一定长度~再把气球系在红色大豆包左边~它就会往右滚~滚到对面的悬崖
10.THE RED CARPET
这关嘛……绕了个小弯~首先用白豆包延伸绿豆包支架的两边~让两边头都靠在悬崖的墙壁上~搭成桥梁~
再将剩下的白豆包在箭头上方那个台上不断的搭支架~~将箭头那块往下压~让红色大豆包滚到对面去~剩下就不说勒
11.GENETIC SORTING MACHINE
上方的通道标明了性别……先把黄色大豆包顶上去~让它被碾碎~填满下方带刺的小池~再顶红色大豆包~让它滚下去~又滚上去……下面不说勒 过关动画……囧囧的眼神……
CHAPTER 3 冬天
1.BURNING MAN
深红色豆包:火柴噢~头头碰到火会被点着~然后相连的深红色豆包都会烧起来
把深红色豆包搭成支架~连到右下角的火源~炸掉箱子……汗……效果很不错……露出管道口
2.SECOND HAND SMOKE
这关注意点火的时候支架要连上顶上~顶上那片也要烧了~~
3.SUPER FUSE CHALLENGE TIME
在火柴烧到上面之前~速度的搭支架到达通道口~
4.UPPER SHAFT
这关操作起来有一定难度~~先将上面的绿豆包~拆拆卸卸~延长~
到达中间~就是两边有东西的那段~~然后将下方的火柴延长~点火把两边的墙炸勒~再搭支架够到管道口~~这关的支架搭起来很有难度~要耐心啊~~注意加强后方的重心~
5.MISTY’S LONG BONY ROAD
这蛤蟆还真死勒……
和CHAPTER 1的蛤蟆关差不多~~骷髅头是不怕刺的~用它支撑在下方~
这里有个小技巧~加强一下蛤蟆的舌头~这样一开始的骷髅就可以后一格噢~同时多利用噪音
功能~让豆包往后集中~这样才可以搭得更远
6.THE THIRD WHEEL
黄色豆包:可以粘在物体上~但是不能被刺到~
用绿豆包往上搭支架~用黄豆包把支架粘在转盘上~转到顶上的时候速度的换地方~粘到另外一个转盘上~吵醒睡觉的骷髅~
这里建议大家把多余的绿豆包拿下来~放在支架里~
然后看准顶上那个带刺的转盘~有几个平滑的突起~~把黄豆包粘上去~~转动的时候把骷髅粘在旁边~防止被刺到~后面不说勒
7.WATER LOCK
把黄豆包连支架粘在转盘内部靠中间~然后等沉到水底~而转盘缺口露在水面时松开~多试几次~就能到转盘外部~然后粘在转盘口突起的地方~等它自然被吸进去就可以了
8.YOU HAVE TO EXPLODE THE HEAD
可以选择从左边或者右边搭支架~小心不要太靠近火源~然后让支架连上靠近的炸弹~这个有一定难度~~基础一定要打好~连上炸弹后~再点燃火柴~剩下不说了~
9.INCINERATION DESTINATION
先用白色豆包在上面支撑一下~会好很多~
之后把两个炸弹一边一个~~再用火柴引下面的火源就可以了
10.PRODUCT LAUNCHER
放开绿豆包~碾碎黑色大豆包~用火柴引上面的火源~
过关动画…………豆包也会打手枪……?CHAPTER 4 空间
1.Hell WORLD
风格一变~单击绿豆包~往上拽会出来一个箭头~~把箭头指向想到达的地方~豆包会发射出去~
小技巧:不要刚好对准目的~要将箭头往上一些~这样才能安全上垒~箭头拽的长短关系到发射力度
2.BULLETIN BOARD SYSTEM
调整角度多试几次就可以了
3.GRAPE VINE VIRUS
这关把绿豆包发射进水里~会变成红豆包~~这关需要一定数量的红豆包~把红豆包发射到最上层后~对准绳子的最后一个支点跳过去~可以连成一个新的支点~将绳子放下来长到管道口即可
小技巧:接红豆包的同时多发射些绿豆包到绳子上~这样可以保持绳子的平衡~在绳子的正下方制造噪音也可以
4.GRAPHIC PROCESSING UNIT
不说勒~人造地球卫星……先发射红豆包~再发射绿豆包~多试几次
5.ROAD BLOCKS
这关也很简单~把箱子搭成支架~让悬崖右边的豆包先到箱子上再到悬崖左边即可
6.GRACEFUL FAILURE
抽积木的游戏……把箱子抽勒让最上面的三脚架丢下来~
小技巧1移动2个正方积木的时候~先把一个推到最中间~支撑住~然后去掉另外一个~再去掉支撑的~
7.ALICE AND BOB AND THE THIRD PARTY
呵呵~女人说话男人听~这关需要两个步骤~先把下面的红豆包连到管道 这个应该不难
难后就是搭积木了~把两个长条积木垫在齿轮上方挡住齿轮~注意别让齿轮把积木打碎了~再在每个斜坡的尽头至少垫两块积木~挡住绿豆包~不让他们滑下去
然后在最高处一直搭积木~直至挡住绿豆包~绿豆包就会一直滑下来了
8.THE SERVER FARM
注意在左下方加强平衡即可
9.MOM’S COMPUTER
这关的豆包是装饰用的~过关方法是点击右边的两个按钮~会丢出方块~搭方块到顶上~到达MOM’SCOMPUTER即可~
可以问它一堆问题……真的和MOM一样啰嗦……然后问最后一个问题怎么出去~MOM说会发个邮件~就出现勒最后一关~
10.DELEVERANCE 36 MOVES
一开始不能进~先点击屏幕右下角有个邮件提示的图标~然后进去的左边那个屏幕接收邮件~即开启最后一关~
难点:最下面的绳子不好点~要先把豆包发射到绳子靠下面的地方~然后再往上发射~点着绳子~EPILOGUE 5 春天
这是所有世界中最高的大陆~这也是最后的三个挑战~是非常难的哦~你将不得不在完成之后离开~不过没
关系~我们永远都在一起~我能看见你~你的签名啊!
1.INFESTY THE WORM
这关还是比较简单的~三个高地~在左边用气球把大桥吊起来~随风飘到右边的高地~注意慢慢加长大桥就好了~最后记得要让气球均匀的吊着大桥哦~
2.WEATHER VANE
见过吊车吗?~这关就是让你搭个吊车- -b~先搭个吊车底座一定要搭的结实~叫醒气球豆包以后~搭个吊车悬臂让气球豆包吊着(我把红气球豆包都用上了)~然后让悬臂下垂下垂下垂~OK~
3.HORIZONTAL TRANSPORTATION INNOVATION COMMITTEE
比较简单的一关~一边用气球吊着一边不停的往上垒呀垒~垒呀垒呀垒~直到用完所有的豆包~这时你的大桥(竖着的)要是没有超过那片插着木牌的云彩的话~咳咳~重来吧~
放开气球一下~让大桥倒下~在倒的时候最好再把气球粘上~防止惯性下坠~呵呵~~~(我过关以后还有两个豆包在睡觉呢~真是-_-!)~~~
4.OBSERVATORY OBSERVATION STATION
热~辣死他~玩~~~
本关是最难的一关~目的是用红色会飞的豆包把望远镜吊起来~看似容易~实则很难~不仅要找对吊的位置
粘粘世界如何窗口玩
Alt+Enter -
网页版贪吃蛇
功能:蛇吃食物有四种情况:走到的地方有食物;走到的地方没有食物;走到的地方是墙壁;走到的地方是自己的身体。吃到食物后,蛇的身体会变长;碰到墙壁或咬到自己 Game Over,询问是否重新开始。
整个游戏是在一个<div>框子(地图)里展开的,蛇有地图里的一系列<div>构成,初始状态(刚刚打开页面)蛇是一个<div>框,蛇头和蛇尾是在一起的,就是这个<div>框,以后吃了食物后<div>个数会变多,蛇就会长长。食物用一个<span>框表示,初始时和蛇一样其位置是随机产生的。蛇和食物的坐标用<div>和<span>的绝对位置表示。
算法的关键是当蛇移动到新的位置后,判断前述的几种情况,做出相应的处理。而二维数组 Map[][] 就是判断的依据。二维数组 Map[][]通过其元素的值来表示蛇身、食物和空地。蛇身、食物和空地的值分别为’S’、’F’ 和 ‘0′。
用 Javascript 编程和其他语言的一个大的区别就是键盘的控制代码不同。js是通过 Key=event.keyCode 语句获取键盘码,再在多分支 switch 结构里分别处理。看完这些代码就会对浏览器里的键盘控制有所了解了。
当然该段代码的最大价值还是让我们了解到网页游戏的大概写法,而算法其实是最重要的,把一个游戏的设想变为一堆包含许多的函数的结构化的代码,是值得我们借鉴和学习的。这里的难点是确定蛇是怎么移动的。
代码里有我的注释,结合我的以上大概分析介绍差不多能看懂了。
题外问题:
本人在调试的时候打算给原来的代码加一段地图内方格显示功能,就写了个ShowGrid()函数,采用代码生成方格。但由于在2层循环内完成方格显示,效率十分低下,生成15*10的方格需要大约6秒。生成30*20 的方格竟然需要几分钟。基本不能采用此方法。改进以后,不是生成多个包含单个单元格的表格,而是生成一个包含若干单元格的表格,结果效率有巨大的提高。
改进后,有如下功能:
– 可改变单元格数;
– 可控制暂停;
– 速度控制功能;
– 蛇头、蛇身和蛇尾形状美化;
– 可控制显示和隐藏背景图片、方格线;
– 修正了长度等于或大于2节的蛇体,按倒退键时结束游戏的错误;进一步改进建议:
– 控制蛇头的方向,可用动画图片代替蛇头。
– 蛇身和蛇尾也可用图片代替。
– 增加声音;
– 增加换肤功能:背景、方格、蛇的皮肤可定制;
– 自动演示功能;
……<HTML>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=gb2312″>
<title>贪吃蛇</title>
<style>
body{font-size: 12px;}.food
{
background: url(”images/food1.gif”) no-repeat;
/*background-color:green;*/
overflow:hidden;
position:absolute;
}.snake_head
{
background-color: red;
border:3px solid gold;
position:absolute;
}.snake_body
{
background-color: orange;
border:2px dotted white;
position:absolute;
}.snake_tail
{
background-color: peachpuff;
border:2px dotted white;
position:absolute;
}.grid
{
border-style:solid;
border-color:#0000ff;
border-top-width:0;
border-right-width:1;
border-bottom-width:1;
border-left-width:0;
padding:0;
}.mainmap
{
position:absolute;
border-style:outset;
border-color:#0000ff;
border-width:5;
}.table
{
position:absolute;
overflow:hidden;
border-collapse:collapse;
}
</style>
</head><BODY>
<div id=”help”>
红色方块表示蛇头,按方向键控制蛇吃食物<br><br>
行数:
<select id=”rows”>
<option>25</option>
<script language=”javascript”>
for(var ct=10;ct<=30;ct++)
document.write(’<option>’ + ct + ‘</option>’);
</script>
</select>
<br>
列数:
<select id=”cells”>
<option>30</option>
<script language=”javascript”>
for(var ct=10;ct<=40;ct++)
document.write(’<option>’ + ct + ‘</option>’);
</script>
</select>
<br>
<button onclick=”reCreateMap()”> 设置 </button>
<br><br>
【初始化:】F5 功能键<br>
【暂停:】S 字母键<br><br>
【显示/隐藏网格:】G 字母键<br><br>
【加速:】PageUP 键<br>
【减速:】PageDown 键<br>
</div>
【速度:】<span id=”speed” style=”color:red”></span><br><br><div id=”mapxy”></div>
<div
<br><br>
蛇只能吃食物,<br>不能触墙,<br>也不能咬自己
</div><script langyage=”javascript”>
var Rows = document.getElementById(’rows’).options[0].text;
var Cells = document.getElementById(’cells’).options[0].text;
var Num = 20; //正方形格子的边长
var SpeedUp = 5000;
var Times = 200;
var Start = 0;
var ShowGrid = true;
var ShowBackground = true;var BorderWidth = 5;
var MainMap = null;
var AllDiv = new Array();
var AllSpan = new Array();
var Sx = Sy = 0;
var Map = null;
var GoX,GoY,LastX,LastY;
var moving = null;
var AllDiv=null, AllSpan=null;//重新创建地图
function reCreateMap()
{
Rows = document.getElementById(’rows’).options[document.getElementById(’rows’).selectedIndex].text;
Cells = document.getElementById(’cells’).options[document.getElementById(’cells’).selectedIndex].text;
document.body.removeChild(MainMap);
CreateMap();
}//创建地图
function CreateMap()
{
BW = eval(Cells * Num + 2 * BorderWidth); //宽度
BH = eval(Rows * Num + 2 * BorderWidth); //高度
//document.body.innerHTML+=’<div id=MainMap style=position:absolute;left:’+(document.body.clientWidth-BW)/2+’;top:’+(document.body.clientHeight-BH)/2+’;width:’+BW+’;height:’+BH+’;border-width:’+BorderWidth+’;></div>’
MainMap = document.createElement(’div’);
MainMap.className = ‘mainmap’;
if(ShowBackground)
MainMap.style.backgroundImage = “url(’images/bgpic.jpg’)”;
MainMap.style.left = (document.body.clientWidth – BW) / 2;
MainMap.style.top = (document.body.clientHeight – BH) / 2;
MainMap.style.width = BW;
MainMap.style.height = BH;
document.body.appendChild(MainMap);//创建全局数组Map[]
/*
Map = new Array() //创建全局数组Map[]
for(y=0; y<Rows; y++)
{
Map[y]=new Array() //创建全局二维数组Map[][],初始值为’0′
for(x=0; x<Cells; x++)
Map[y][x] = ‘0′ //’0′值表示“空地”
}
*/
Map = new Array();
for(y = 0; y < Rows; y++)
{
//创建全局二维数组Map[][],初始值为’0′
Map.push(new Array());
for( x = 0; x < Cells; x++)
Map[y].push(’0′); //’0′值表示“空地”
}
//显示地图内格子
if (ShowGrid)
MainMap.appendChild(CreateGrid(’ ‘));//创建全局变量Sx,赋予随机数
Sx = parseInt(Math.random() * Cells);//创建全局变量Sy,赋予随机数
Sy = parseInt(Math.random() * Rows);//生成蛇 – div
CreateSnake();//生成食物 – span
CreatFood();//创建全局数组AllDiv,保存着蛇身各节<div>。AllDiv[0]为蛇尾。MainMap是div的ID
AllDiv = MainMap.getElementsByTagName(’div’); //等价于AllDiv = MainMap.all.tags(’DIV’)
//创建全局数组AllSpan,始终只有一个元素AllSpan[0]
AllSpan = MainMap.getElementsByTagName(’span’); //等价于AllSpan = MainMap.all.tags(’SPAN’)
}//创建地图内格子(Rows*Cells 大小的 Table)
function CreateGrid(celltext)
{
var table = document.createElement(’table’);
table.className = ‘table’;
table.style.left = 0;
table.style.top = 0;
table.setAttribute(’id’,’grid’);
table.setAttribute(’border’,’0′); //table.border = ‘0′;
table.setAttribute(’cellspacing’,’0′);
table.setAttribute(’cellpadding’,’0′);
var tbody = document.createElement(”tbody”);
table.insertBefore(tbody, null);
for (var i=0; i<Rows; i++)
{
var tr = document.createElement(’tr’);
for(var j=0; j<Cells; j++)
{
var td = document.createElement(’td’);
td.className = ‘grid’;
td.width = Num; //td.style.width = Num;
td.height = Num; //td.style.height = Num;
var text = document.createTextNode(celltext);
td.insertBefore(text, null);
tr.insertBefore(td, null);
}
tbody.insertBefore(tr, null);
}
return table;
}//创建蛇的位置,赋予值’S’
function CreateSnake()
{
//<div>表示蛇身,通过调用本函数,可以累加到若干个,蛇身变长
//注意 y 和 x 是“蛇”<div> 的自定义属性。一直保存着蛇身体各节的Map坐标,与Map[][]联系
//初始时,蛇头、蛇尾是同一个位置
var div = document.createElement(’div’);
div.className = ’snake_head’;
div.setAttribute(’x’,Sx);
div.setAttribute(’y’,Sy);
div.style.left = Sx * Num;
div.style.top = Sy * Num;
div.style.width = Num;
div.style.height = Num;
MainMap.appendChild(div);Map[Sy][Sx] = ‘S’; //Snake首字母
//蛇身长度
//document.all.mapxy.innerHTML = AllDiv.length;
if (AllDiv!=null)
{
if (AllDiv.length>1)
{
AllDiv[0].className = ’snake_tail’; //蛇尾
for (var i=1;i<AllDiv.length-1;i++) //蛇身
AllDiv[i].className = ’snake_body’;
}
}
}//创建食物的位置,赋予初始值’F’
//食物的初始位置不能与蛇的初始位置相同,只能在空地放置食物。
//若随机产生的2位置相同,则递归执行,直到不相同为止
function CreatFood()
{
Fx = parseInt(Math.random() * Cells);
Fy = parseInt(Math.random() * Rows);
if(Map[Fy][Fx] == ‘0′) //如果是空地
{
MainMap.appendChild(CreatSpan(Fx * Num,Fy * Num,Num));
Map[Fy][Fx] = ‘F’; //Food首字母
}
else
{
CreatFood(); //递归
}
}//生成食物的span
function CreatSpan(l,t,num)
{
var span = document.createElement(’span’);
span.style.left = l;
span.style.top = t;
span.style.width = num;
span.style.height = num;
span.className = ‘food’;
return span;
}//主移动–判断蛇头前面的是什么
function Move()
{
//自动行走,Map[Sy][Sx]为蛇头前面位置
Sx += GoX;
Sy += GoY;//碰墙,重新开始
if(Sy < 0 || Sy >= Rows)
{
Move1();
}
else
{
SnakeFront = Map[Sy][Sx];
switch(SnakeFront)
{
case ‘0′: //蛇前是空地
Move2();
break;
case ‘F’: //蛇前面是食物
Move3();
break;
case ‘S’: //蛇前面是自己的身体
Move1();
break;
default: //啥都不是就是超出地图范围game over
Move1();
}
}
}//重新开始
function Move1()
{
if(confirm(”Game Over,重新开始?”))
{
//window.location.reload();
reCreateMap();
Start = 0;
}
else
window.close();
}//蛇行走到的当前位置是空地时
function Move2()
{
//蛇走开后,把原位置设置为’0′,表示是空地
//把蛇数组当前元素删除,在下面的 CreateSnake()语句重新生成
Map[AllDiv[0].getAttribute(’y’)][AllDiv[0].getAttribute(’x’)] = ‘0′;
var fatherNode = AllDiv[0].parentNode; //AllDiv[0].removeNode(true);
fatherNode.removeChild(AllDiv[0]);//在新的位置生成蛇的<div>
CreateSnake();
//再次移动
moving = setTimeout(’Move()’,Times);
}//蛇行走到的当前位置是食物时
function Move3()
{
//蛇数组当前元素不删除,<div>累加一次,蛇长长一节
CreateSnake();
//把食物数组当前元素删除,在下面的 CreatFood()语句重新生成
var parentNode = AllSpan[0].parentNode; //AllSpan[0].removeNode(true)
parentNode.removeChild(AllSpan[0]);
//再次随机生成食物
CreatFood();
//再次移动
moving = setTimeout(’Move()’,Times);
}//蛇行加速
function oTimes(step)
{
if(step>0 && Times>30)
Times -= step;
if(step<0 && Times<400)
Times -= step;
document.getElementById(’speed’).innerHTML = Times;
//If(Times > 5) setTimeout(’oTimes()’, SpeedUp);
}//绑定键盘事件
document.onkeydown = KeyDown;//按键
function KeyDown(e)
{
if(e)
Key = e.keyCode;
else
Key = window.event.keyCode
switch(Key)
{
case 37: //左方向键
Dir(-1,0);
break
case 39: //右方向键
Dir(1,0);
break
case 38: //上方向键
Dir(0,-1);
break
case 40: //下方向键
Dir(0,1);
break
case 33: //PageUp – speed up
oTimes(5);
break;
case 34: //PageDown – speed down
oTimes(-5);
break;
case 66: // B – Show/Hidden Background
ShowBackground = !ShowBackground;
if(ShowBackground)
{
MainMap.style.backgroundImage = “url(’images/bgpic.jpg’)”;
//MainMap.style.backgroundRepeat=”repeat-x repeat-y”;
//MainMap.style.backgroundRepeat=”no-repeat”;
}
else
MainMap.style.backgroundImage = “url(”)”;
break;
case 71: // G – Show/Hidden Grid
ShowGrid = !ShowGrid;
if(ShowGrid)
MainMap.appendChild(CreateGrid(’ ‘));
else
MainMap.removeChild(document.getElementById(’grid’));
break;
case 83: // s – stop
clearTimeout(moving);
Start = 0;
break;
}
return false
}function Dir(x,y)
{
GoX = x;
GoY = y;
if( Start == 0 )
{
LastX = x;
LastY = y;
clearTimeout(moving);
Start = 1;
Move();
}
else
{
/* 增加的反方向判断 */
//检查上次行动方向和本次行动方向,如果方向正好相反那么还是保持上次的前进方向
if (GoX + LastX == 0 && GoY + LastY == 0)
{
GoX = LastX;
GoY = LastY;
}
else
{ //如果不一样则记住本次的行动方向
LastX = GoX;
LastY = GoY;
}
}
}//绘制地图
CreateMap();
document.getElementById(’speed’).innerHTML = Times;
</script>
</BODY>
</HTML> -
什么职业最赚钱?2008年中国十大高薪职业排行榜
什么工作最赚钱?
第一,销售人才稳居榜首优秀的销售人员月薪可达万元以上。
上榜理由:好的销售人才每个行业都非常抢手。营销人才约占所有招聘职业类别的10%至15%。
第二,房地产稳居收入前三甲房地产从业人员月薪在8000-10000元左右。
上榜理由:随着奥运概念和世博概念的渐渐清晰,房产业越烧越热。未来4到5年北京市将投资2800亿元用于奥运工程等。今年建筑及房地产业人才缺口达6.4万人。
第三,金融行业魅力不减金融行业经理人,月薪7000元左右。
上榜理由:外资银行不断进入,合资基金公司逐渐增加,银行和基金对人才的需求增加较快,人才的争夺也十分激烈。
第四,物流业“钱途”愈来愈好运输/物流行业经理人,月薪7000元左右。
上榜理由:目前,我国物流人才供不应求,用人单位对物流职业认证的品牌、培训质量、教学优势和证书的含金量都很关注。
第五,IT业复苏回暖人才势头难挡计算机行业经理人,月薪6000元以上。
上榜理由:我国软件业发展势头强劲,计算机人才的需求每年将增加100万。
第六,咨询业行情走高,MBA有优势资深顾问月薪在8000元左右。
上榜理由:咨询机构注册登记数量猛增,咨询业人才奇缺,高学历的咨询人员更是大受欢迎。
第七,网络游戏业人员奇缺但潜力巨大月薪约8000元,少有人问津。
上榜理由:到2006年,中国网络游戏用户总数将达到4490万,网络游戏的市场规模将超过80亿元,有望成为全球最大的网络游戏软件市场。
第八,医药人才骤然升温平均月薪可达4500元。
上榜理由:人口的老龄化和生活的日益富裕,将使医疗卫生成为21世纪初最赚钱的职业之一。
第九,网络传媒职位需求增加平均月薪在4000-5000元,高的有1万元以上。
上榜理由:网络技术的飞速发展,促使了网络编辑职位的需求增加。
第十,教师成了职场上的“香饽饽”高校教师月薪5000元以上。
上榜理由:如今教师平均工资,尤其是大学教师工资已成倍增长,成为“高收入者”。
-
临时电子邮件10 分钟邮箱
每天都会收到大量的垃圾邮件,当然目前是在使用gmail他的放垃圾邮件功能还是不错的,最近一段时间已经较少使用我的邮箱注册东西,收到邮件也相对少了很多,但是每月的垃圾邮件数还是超过千余封,于是我找到了一个生成临时邮箱地址的网站,在注册一些并不是常用并需要填写邮箱帐号的地方是不错的选择。
-
饭岛爱自杀身亡
原名:大久保松惠
昵称: 爱珍(あいちん)
出生日期: 1972年10月31日
血型: A型
身高:163 cm
体重: 43 kg
三围: 34-22-33
血型: A型饭岛爱简历
· 1972年10月31日,出生在东京都江东区龟户,1992年出道。
· 1992年,参加东京电视台深夜节目《东京情色派》在该节目中自掀裙子露出丁字裤,被称为”丁字裤女王”而成名,踏入日本演艺圈。
·2000年10月,出版半自传性的小说《柏拉图式性爱》,在日本畅销百万本。同时,她还是《周刊朝日》专栏《饭岛爱的锦糸町风印花税生活》的执笔。
·2001年,在张卫健主演的TVB连续剧《齐天大圣孙悟空》中扮演蜘蛛精。
·2007年3月3日,因花粉症、背部刺痛、肾功能失调与膀胱炎等健康问题而退出日本演艺圈。
·2008年2月24日,在个人博客上表示感染了幽门螺杆菌,同时表示近两个月为了对抗精神疾病在服用抗抑郁剂。
·2008年12月24日,被发现死于东京的家中。 -
nicetranslator—支持36种语言在线互译
nicetranslator 是一个支持36种语言互相翻译的在线免费翻译工具。
无需注册,输入想要翻译的文本,nicetranslator 会自动识别其语种,选择目标语种,按”enter”即可翻译,支持在36种语言中互相翻译,支持的语种包括:阿拉伯语,保加利亚语,加泰罗尼亚语,中文,克罗地亚,捷克,丹麦,英国,荷兰,菲律宾,芬兰语,法语,德语,希腊语,希伯来语,印地语,印度尼西亚语,意大利语,日语,韩语,立陶宛,拉脱维亚语,挪威语,葡萄牙语,波兰语,俄语,罗马尼亚语,塞尔维亚语,斯洛伐克语,斯洛文尼亚语,西班牙语,瑞典语,乌克兰语和越南语。
-
免费的虚拟光驱软件Alcohol 52%
说到虚拟光驱,知名的Daemon Tools是当仁不让,不过我是要介绍另外一款这款是Alcohol 120%的免费版,我在使用也是非常不错的,允许使用6个虚拟光驱我想这个对个人是足够了的,并且这个是免费的。
Alcohol 52% 看到这个软件的名称一定会让你想到 Alcohol 120%,没错,其实在Alcohol 120% 软件中便包含有Alcohol 52% 的功能了,简单来说Alcohol 52% 是不包含光碟刻录功能的,它可以让您虚拟模拟出CD/DVD光驱,如此你便可用它所模拟出的CD/DVD虚拟光驱来做任何CD/DVD光驱所能做的事.
主要特色:
1.可以虚拟出31部的虚拟 CD/DVD 光驱
2.虚拟 CD/DVD 光驱的速度可以达到 200X Speed
3.可支持CD格式有: CD-DA, CD+G, CD-ROM, CD-XA, Video CD, Photo CD, Mixed Mode, Multi-session CD 格式
4.可支持DVD格式有: DVD-ROM, DVD-Video, DVD-Audio格式
5.支持目前所有的 ATAPI & SCSI Drivers :CD-R, CD-RW, DVD-RAM, DVD-R, DVD-RW, DVD+RW
6.支持 IEEE-1394 (Firewire) and USB protocols -
div+css布局入门
div+css布局入门
你正在学习CSS布局吗?是不是还不能完全掌握纯CSS布局?通常有两种情况阻碍你的学习:
第一种可能是你还没有理解CSS处理页面的原理。在你考虑你的页面整体表现效果前,你应当先考虑内容的语义和结构,然后再针对语义、结构添加CSS。这篇文章将告诉你应该怎样把HTML结构化。
另一种原因是你对那些非常熟悉的表现层属性(例如:cellpadding,、hspace、align=”left”等等)束手无策,不知道该转换成对应的什么CSS语句。当你解决了第一种问题,知道了如何结构化你的HTML,我再给出一个列表,详细列出原来的表现属性用什么CSS来代替。
结构化HTML
我们在刚学习网页制作时,总是先考虑怎么设计,考虑那些图片、字体、颜色、以及布局方案。然后我们用Photoshop或者Fireworks画出来、切割成小图。最后再通过编辑HTML将所有设计还原表现在页面上。
如果你希望你的HTML页面用CSS布局(是CSS-friendly的),你需要回头重来,先不考虑”外观”,要先思考你的页面内容的语义和结构。
外观并不是最重要的。一个结构良好的HTML页面可以以任何外观表现出来,CSS Zen Garden是一个典型的例子。CSS Zen Garden帮助我们最终认识到CSS的强大力量。
HTML不仅仅只在电脑屏幕上阅读。你用photoshop精心设计的画面可能不能显示在PDA、移动电话和屏幕阅读机上。但是一个结构良好的HTML页面可以通过CSS的不同定义,显示在任何地方,任何网络设备上。
开始思考
首先要学习什么是”结构”,一些作家也称之为”语义”。这个术语的意思是你需要分析你的内容块,以及每块内容服务的目的,然后再根据这些内容目的建立起相应的HTML结构。
如果你坐下来仔细分析和规划你的页面结构,你可能得到类似这样的几块:
标志和站点名称
主页面内容
站点导航(主菜单)
子菜单
搜索框
功能区(例如购物车、收银台)
页脚(版权和有关法律声明)
我们通常采用DIV元素来将这些结构定义出来,类似这样:
<div id=”header”></div>
<div id=”content”></div>
<div id=”globalnav”></div>
<div id=”subnav”></div>
<div id=”search”></div>
<div id=”shop”></div>
<div id=”footer”></div>
这不是布局,是结构。这是一个对内容块的语义说明。当你理解了你的结构,就可以加对应的ID在DIV上。DIV容器中可以包含任何内容块,也可以嵌套另一个DIV。内容块可以包含任意的HTML元素—标题、段落、图片、表格、列表等等。
根据上面讲述的,你已经知道如何结构化HTML,现在你可以进行布局和样式定义了。每一个内容块都可以放在页面上任何地方,再指定这个块的颜色、字体、边框、背景以及对齐属性等等。
使用选择器是件美妙的事
id的名称是控制某一内容块的手段,通过给这个内容块套上DIV并加上唯一的id,你就可以用CSS选择器来精确定义每一个页面元素的外观表现,包括标题、列表、图片、链接或者段落等等。例如你为#header写一个CSS规则,就可以完全不同于#content里的图片规则。
另外一个例子是:你可以通过不同规则来定义不同内容块里的链接样式。类似这样:#globalnav a:link或者 #subnav a:link或者#content a:link。你也可以定义不同内容块中相同元素的样式不一样。例如,通过#content p和#footer p分别定义#content和#footer中p的样式。从结构上讲,你的页面是由图片、链接、列表、段落等组成的,这些元素本身并不会对显示在什么网络设备中(PDA还是手机或者网络电视)有影响,它们可以被定义为任何的表现外观。
一个仔细结构化的HTML页面非常简单,每一个元素都被用于结构目的。当你想缩进一个段落,不需要使用blockquote标签,只要使用p标签,并对p加一个CSS的margin规则就可以实现缩进目的。p是结构化标签,margin是表现属性,前者属于HTML,后者属于CSS。(这就是结构于表现的相分离.)
良好结构的HTML页面内几乎没有表现属性的标签。代码非常干净简洁。例如,原先的代码<table width=”80%” cellpadding=”3″ border=”2″ align=”left”>,现在可以只在HTML中写<table>,所有控制表现的东西都写到CSS中去,在结构化的HTML中,table就是表格,而不是其他什么(比如被用来布局和定位)。
亲自实践一下结构化
上面说的只是最基本的结构,实际应用中,你可以根据需要来调整内容块。常常会出现DIV嵌套的情况,你会看到”container”层中又有其它层,结构类似这样:
<div id=”navcontainer”>
<div id=”globalnav”>
<ul>a list</ul>
</div>
<div id=”subnav”>
<ul>another list</ul>
</div>
</div>
嵌套的div元素允许你定义更多的CSS规则来控制表现,例如:你可以给#navcontainer一个规则让列表居右,再给#globalnav一个规则让列表居左,而给#subnav的list另一个完全不同的表现。
用CSS替换传统方法
下面的列表将帮助你用CSS替换传统方法:
HTML属性以及相对应的CSS方法
HTML属性 CSS方法 说明
align=”left”
align=”right” float: left;
float: right; 使用CSS可以浮动 任何元素:图片、段落、div、标题、表格、列表等等
当你使用float属性,必须给这个浮动元素定义一个宽度。
marginwidth=”0″ leftmargin=”0″ marginheight=”0″ topmargin=”0″ margin: 0; 使用CSS, margin可以设置在任何元素上, 不仅仅是body元素.更重要的,你可以分别指定元素的top, right, bottom和left的margin值。
vlink=”#333399″ alink=”#000000″ link=”#3333FF” a:link #3ff;
a:visited: #339;
a:hover: #999;
a:active: #00f;
在HTML中,链接的颜色作为body的一个属性值定义。整个页面的链接风格都一样。使用CSS的选择器,页面不同部分的链接样式可以不一样。
bgcolor=”#FFFFFF” background-color: #fff; 在CSS中,任何元素都可以定义背景颜色,不仅仅局限于body和table元素。
bordercolor=”#FFFFFF” border-color: #fff; 任何元素都可以设置边框(boeder),你可以分别定义top, right, bottom和left
border=”3″
cellspacing=”3″ border-width: 3px; 用CSS,你可以定义table的边框为统一样式,也可以分别定义top, right, bottom and left边框的颜色、尺寸和样式。
你可以使用 table, td or th 这些选择器.
如果你需要设置无边框效果,可以使用CSS定义: border-collapse: collapse;
<br clear=”left”>
<br clear=”right”>
<br clear=”all”>
clear: left;
clear: right;
clear: both;
许多2列或者3列布局都使用 float属性来定位。如果你在浮动层中定义了背景颜色或者背景图片,你可以使用clear属性.
cellpadding=”3″
vspace=”3″
hspace=”3″ padding: 3px; 用CSS,任何元素都可以设定padding属性,同样,padding可以分别设置top, right, bottom and left。padding是透明的。
align=”center” text-align: center;
margin-right: auto; margin-left: auto;
Text-align 只适用于文本.
象div,p这样的块级怨毒可以通过margin-right: auto; 和margin-left: auto;来水平居中
一些令人遗憾的技巧和工作环境
由于浏览器对CSS支持的不完善,我们有时候不得不采取一些技巧(hacks)或建立一种环境(Workarounds)来让CSS实现传统方法同样的效果。例如块级元素有时侯需要使用水平居中的技巧,盒模型bug的技巧等等。所有这些技巧都在Molly Holzschlag的文章《Integrated Web Design: Strategies for Long-Term CSS Hack Management》中有详细说明。
另外一个关于CSS技巧的资源站点是Big John和Holly Bergevin的”Position is Everything”。
XHTML下css+div布局总结
xml(extensible Markup Language)的出现,结构化文档和数据有了一个通用的、科适应的格式,不仅仅应用在web上,也可以应用在任何地方。标准称为可能。
XHTML是The Extensible HyperText Markup Language可扩展标识语言的缩写。在HTML4.0的基础上,用XML的规则对其进行扩展,得到了XHTML。它实现HTML向XML的过渡。
CSS是Cascading Style Sheets层叠样式表的缩写。纯CSS布局与结构式XHTML相结合能帮助设计师分离外观与结构,使站点的访问及维护更加容易。
1)为页面添加正确的DOCTYPE
DOCTYPE是document type的简写。主要用来说明你用的XHTML或者HTML是什么版本。浏览器根据你 DOCTYPE定义的DTD(文档类型定义)来解释页面代码。
XHTML1.0提供了三种DOCTYPE可选择:
(1)过渡型(Transitional )–使用非常普遍。
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd“>
(2)严格型(Strict )
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Strict//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1 -strict.dtd”>
(3)框架型(Frameset )
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Frameset//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd“>
2)设定一个名字空间(Namespace)
直接在DOCTYPE声明后面添加如下代码:
<html XMLns=”http://www.w3.org/1999/xhtml” >
一个namespace是收集元素类型和属性名字的一个详细的DTD,namespace声明允许你通过一个在线地址指向来识别你的namespace。只要照样输入代码就可以。3)声明你的编码语言
为了被浏览器正确解释和通过标识校验,所有的XHTML文档都必须声明它们所使用的编码语言。代码如下:
<meta http-equiv=”Content-Type” content=”text/html; charset=GB2312″ />
这里声明的编码语言是简体中文GB2312,你如果需要制作繁体内容,可以定义为BIG5。
4)用小写字母书写所有的标签
XML对大小写是敏感的,所以,XHTML也是大小写有区别的。所有的XHTML元素和属性的名字都必须使用小写。否则你的文档将被W3C校验认为是无效的。例如下面的代码是不正确的:5)为图片添加 alt 属性
为所有图片添加alt属性。alt属性指定了当图片不能显示的时候就显示供替换文本,这样做对正常用户可有可无,但对纯文本浏览器和使用屏幕阅读机的用户来说是至关重要的。只有添加了alt属性,代码才会被W3C正确性校验通过。注意的是我们要添加有意义的alt属性,象下面这样的写法毫无意义:
<img src=”logo.gif” alt=”logo.gif”>
正确的写法:
<img src=”logo.gif” alt=”互动力工作室标志,点击返回首页”>6)给所有属性值加引号
在HTML中,你可以不需要给属性值加引号,但是在XHTML中,它们必须被加引号。还必须用空格分开属性。
例:<hr width=”75%”size=”7″/> 这也是不正确的7)关闭所有的标签
在XHTML中,每一个打开的标签都必须关闭。空标签也要关闭,在标签尾部使用一个正斜杠 “/”来关闭它们自己。例如:
<br />8)收藏夹小图标
例如:首先制作一个16×16的icon图标,命名为favicon.ico,放在根目录下。然后将下面的代码嵌入head区:
<link rel=”icon” href=”/favicon.ico” type=”image/x-icon” />
<link rel=”shortcut icon” href=”/favicon.ico” type=”image/x-icon” />9)用CSS定义元素外观
用css布局的一个好处是可以批量对页面进行修改,它能将文档结构和表现层分离开来,减轻工作量和服务器的负荷,增加站点的扩展能力和应用。css是不区别空格和大小写的,下面是一些基础的归纳
(1)颜色值
颜色值可以用RGB值写,例如:color : rgb(255,0,0),也可以用十六进制写,就象上面例子color:#FF0000。如果十六进制值是成对重复的可以简写,效果一样。例如:#FF0000可以写成#F00。但如果不重复就不可以简写,例如#FC1A1B必须写满六位。
(2)定义字体
web标准推荐如下字体定义方法:
body { font-family : “Lucida Grande”, Verdana, Lucida, Arial, Helvetica, 宋体,sans-serif; }
字体按照所列出的顺序选用。如果用户的计算机含有Lucida Grande字体,文档将被指定为Lucida Grande。没有的话,就被指定为Verdana字体,如果也没有Verdana,就指定为Lucida字体,依此类推,;
Lucida Grande字体适合Mac OS X;
Verdana字体适合所有的Windows系统;
Lucida适合UNIX用户
“宋体”适合中文简体用户;
如果所列出的字体都不能用,则默认的sans-serif字体能保证调用;
(3)群选择器
当几个元素样式属性一样时,可以共同调用一个声明,元素之间用逗号分隔,:
p, td, li { font-size : 12px ; }
(4)派生选择器
可以使用派生选择器给一个元素里的子元素定义样式,例如这样:
li strong { font-style : italic; font-weight : normal;}
就是给li下面的子元素strong定义一个斜体不加粗的样式。
(5)id选择器
用CSS布局主要用层”div”来实现,而div的样式通过”id选择器”来定义。例如我们首先定义一个层
<div id=”menubar”></div>
然后在样式表里这样定义:
#menubar {MARGIN: 0px;BACKGROUND: #FEFEFE;COLOR: #666;}
其中”menubar”是你自己定义的id名称。注意在前面加”#”号。
id选择器也同样支持派生,例如:
#menubar p { text-align : right; margin-top : 10px; }
这个方法主要用来定义层和那些比较复杂,有多个派生的元素。
(6)类别选择器
在CSS里用一个点开头表示类别选择器定义,例如:
.14px {color : #f60 ;font-size:14px ;}
在页面中,用class= “类别名”的方法调用:
<span class=”14px”>14px大小的字体</span>
这个方法比较简单灵活,可以随时根据页面需要新建和删除。
(7)定义链接的样式
CSS中用四个伪类来定义链接的样式,分别是:a:link、a:visited、a:hover和a : active,例如:
a:link{font-weight : bold ;text-decoration : none ;color : #c00 ;}
a:visited {font-weight : bold ;text-decoration : none ;color : #c30 ;}
a:hover {font-weight : bold ;text-decoration : underline ;color : #f60 ;}
a:active {font-weight : bold ;text-decoration : none ;color : #F90 ;}
以上语句分别定义了 “链接、已访问过的链接、鼠标停在上方时、点下鼠标时”的样式。注意,必须按以上顺序写,否则显示可能和你预想的不一样。记住它们的顺序是”LVHA”。
(8)组合使用选择器创造精致的设计效果
用漂亮的图案代替普通无序列表前沉闷的黑点。站点http://marine.happycog.com/
先用css规则告诉类别属性inventory的无序列表。
ul.inventory{
list-style:disc url(/images/common/lister2.gig) inside;}
它的调用标记:
<ul class=”inventory”>
<li><a href=”/angelfish”>Angelfish</a>(67 items)</li>
<li><a href=”/angeld”>Angels/Frogfish</a>(35 items)</li>
<li><a href=”/anthias”>Angelfish</a>(5526 items)</li>
<li><a href=”/basslets”>Angelfish</a>(15 items)</li>
<ul>
(9)缩写是按照顺时针的顺序
margin:25px 0 25px 0;
(10)行高
line-height:150% 说明行距为正常的150%
10)结构化代码div(division)、id、class
用它们来书写紧凑的xhtml,更明智的使用css.
(1)结构化id标签,与class的有区别:
如果你的属性页面包含了一个div,它的id为”content”,它就不可能有另外一个div或者其他元素拥有相同的名字。相反,class属性可以在意个页面中一次又一次地使用。
(2)id的规则
一个id值必须用一个字母或者下划线开头,它不能用一个数字进行开头,然后跟随字母、数字和下划线。空格和连字符-都是不允许的。11)制作好的网站可以到w3c进行标准校正
http:validator.w3.org
http://jigsaw.w3.org/css-validator/
网页设计DIV+CSS–第1天:选择什么样的DOCTYPE
前言
大家好!这个系列文章是按阿捷自己制作这个站点的过程编写的。之前阿捷也一直没有制作过一个真正符合web标准的网站。现在边参考国外资料边制作,同时把过程中的心得和经验记录下来,希望对大家有点帮助。好了,让我们开始吧
第一天
开始制作符合标准的站点,第一件事情就是声明符合自己需要的DOCTYPE。
查看本站首页原代码,可以看到第一行就是:
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd“>
打开一些符合标准的站点,例如著名web设计软件开发商Macromedia,设计大师Zeldman的个人网站,会发现同样的代码。而另一些符合标准的站点(例如k10k.net)的代码则如下:
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Frameset//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd“>
那么这些代码有什么含义?一定要放置吗?
什么是DOCTYPE
上面这些代码我们称做DOCTYPE声明。DOCTYPE是document type(文档类型)的简写,用来说明你用的XHTML或者HTML是什么版本。
其中的DTD(例如上例中的xhtml1-transitional.dtd)叫文档类型定义,里面包含了文档的规则,浏览器就根据你定义的DTD来解释你页面的标识,并展现出来。
要建立符合标准的网页,DOCTYPE声明是必不可少的关键组成部分;除非你的XHTML确定了一个正确的DOCTYPE,否则你的标识和CSS都不会生效。
XHTML 1.0 提供了三种DTD声明可供选择:
* 过渡的(Transitional):要求非常宽松的DTD,它允许你继续使用HTML4.01的标识(但是要符合xhtml的写法)。完整代码如下:
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd“>
* 严格的(Strict):要求严格的DTD,你不能使用任何表现层的标识和属性,例如<br>。完整代码如下:
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Strict//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd“>
* 框架的(Frameset):专门针对框架页面设计使用的DTD,如果你的页面中包含有框架,需要采用这种DTD。完整代码如下:
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Frameset//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd“>
我们选择什么样的DOCTYPE
理想情况当然是严格的DTD,但对于我们大多数刚接触web标准的设计师来说,过渡的DTD(XHTML 1.0 Transitional)是目前理想选择(包括本站,使用的也是过渡型DTD)。因为这种DTD还允许我们使用表现层的标识、元素和属性,也比较容易通过W3C的代码校验。
注:上面说的”表现层的标识、属性”是指那些纯粹用来控制表现的tag,例如用于排版的表格、背景颜色标识等。在XHTML中标识是用来表示结构的,而不是用来实现表现形式,我们过渡的目的是最终实现数据和表现相分离。
打个比方:人体模特换衣服。模特就好比数据,衣服则是表现形式,模特和衣服是分离的,这样你就可以随意换衣服。而原来HTML4中,数据和表现是混杂在一起的,要一次性换个表现形式非常困难。呵呵,有点抽象了,这个概念需要我们在应用过程中逐步领会。
补充
DOCTYPE声明必须放在每一个XHTML文档最顶部,在所有代码和标识之上。
网页设计DIV+CSS–第2天:什么是名字空间
DOCTYPE声明好以后,接下来的代码是:
<html xmlns=”http://www.w3.org/1999/xhtml” lang=”gb2312″>
通常我们HTML4.0的代码只是<html>,这里的”xmlns”是什么呢?
这个”xmlns”是XHTML namespace的缩写,叫做”名字空间”声明。名字空间是什么作用呢?阿捷自己的理解是:
由于xml允许你自己定义自己的标识,你定义的标识和其他人定义的标识有可能相同,但表示不同的意义。当文件交换或者共享的时候就容易产生错误。为了避免这种错误发生,XML采用名字空间声明,允许你通过一个网址指向来识别你的标识。例如:
小王和小李都定义了一个<book>标识,如果小王的名字空间是”http://www.xiaowang.com“,小李的名字空间是”http://www.xiaoli.com“,那么当两个文档交换数据时,也不会混淆<book>标识,因为它属于不同的名字空间。
更通俗的解释是:名字空间就是给文档做一个标记,告诉别人,这个文档是属于谁的。只不过这个”谁”用了一个网址来代替。
XHTML是HTML向XML过渡的标识语言,它需要符合XML文档规则,因此也需要定义名字空间。又因为XHTML1.0不能自定义标识,所以它的名字空间都相同,就是”http://www.w3.org/1999/xhtml“。如果你还不太理解也不要紧,目前阶段我们只要照抄代码就可以了。
后面的lang=”gb2312″,指定你的文档用简体中文。
网页设计DIV+CSS–第3天:定义语言编码
第三步是定义你的语言编码,类似这样:
<meta http-equiv=”Content-Type” content=”text/html; charset=gb2312″ />
为了被浏览器正确解释和通过W3C代码校验,所有的XHTML文档都必须声明它们所使用的编码语言,我们一般使用gb2312(简体中文),制作多国语言页面也有可能用Unicode、ISO-8859-1等,根据你的需要定义。
通常这样定义就可以了。但是要补充说明的是,XML文档并不是这样定义语言编码的,XML的定义方式如下:
<?xml version=”1.0″ encoding=”gb2312″?>
你在Macromedia.com的首页代码第一行就可以看见类似的语句,这也是W3C推荐使用的定义方法。那为什么我们不直接采用这种方法呢?原因是一些浏览器对标准的支持不完善,不能正确理解这样的定义方法,比如IE6/windows。所以在目前过渡方案下,我们依然推荐使用meta方式。当然,你可以两种方法都写。
看本站源代码,你会发现语言编码定义的地方还多一句:
<meta http-equiv=”Content-Language” content=”gb2312″ />
这是针对老版本浏览器写的,以保证各种浏览器都能正确解释页面。
注意:在上面声明语句的最后,你看到有一个斜杠”/”,这和我们以前的HTML4.0的代码写法不同。原因是XHTML语法规则要求所有的标识都必须有开始和结束。例如<body>和</body>、<p>和</p>等,对于不成对的标识,要求在标识最后加一个空格,然后跟一个”/”。例如<br>写成<br />、<img>写成<img />,加空格的原因是避免代码连在一起浏览器不识别。
网页设计DIV+CSS–第4天:调用样式表
用web标准设计网站,过渡的方法主要是采用XHTML+CSS,css样式表是必不可少的。这就要求所有网页设计师必须熟练掌握CSS,如果你以前不常用,那么现在就开始学习吧。要制作符合web标准的网站,不懂CSS是设计不出漂亮的页面的。
事实上,所有表现的地方都需要用CSS来实现。我们以前都习惯用table来定位和布局,现在要改用DIV来定位和布局。这是思维方式的变化,一开始有些不习惯。呵呵,任何变革都会有阻力的,为了享受标准带来的”益处”,放弃一些老的传统做法是值得的。
外部调用样式表
在以前,我们通常采用2种方法使用样式表:
* 页面内嵌法:就是将样式表直接写在页面代码的head区。类似这样:
<style type=”text/css”> <!– body { background : white ; color : black ; } –> </style>
* 外部调用法:将样式表写在一个独立的.css文件中,然后在页面head区用类似以下代码调用。
<link rel=”stylesheet” rev=”stylesheet” href=”css/style.css” type=”text/css” media=”all” />
在符合web标准的设计中,我们使用外部调用法,好处不言而喻,你可以不修改页面只修改.css文件而改变页面的样式。如果所有页面都调用同一个样式表文件,那么改一个样式表文件,可以改变所有文件的样式。
双表法调用样式表
查看某些符合标准站点的原代码,你可能看到,在调用样式表的地方有如下2句:
<link rel=”stylesheet” rev=”stylesheet” href=”css/style.css” type=”text/css” media=”all” /> <style type=”text/css” media=”all”>@import url( css/style01.css );</style>
为什么要写两次呢?
实际上一般情况下用外联法调用(就是第一句)就足够了。我这里使用双表调用只是一种示例。其中的”@import”命令用于输入样式表。而”@import”命令在netscape 4.0版本浏览器是无效的。也就是说,当你希望某些效果在netscape 4.0浏览器中隐藏,在4.0以上或其它浏览器中又显示的时候,你可以采用”@import”命令方法调用样式表。
网页设计DIV+CSS–第5天:head区的其他设置
这些技巧主要讲meta标签设置的,其实与符合web标准关系不大,只要注意在最后加”/”关闭标签就可以,但是既然是入门教程,就写得详细一点吧。
收藏夹小图标
如果你将本站加入收藏夹,可以看到在收藏夹网址之前的IE图标变成了本站特别的图标。要实现这样效果很简单,首先制作一个16×16的icon图标,命名为favicon.ico,放在根目录下。然后将下面的代码嵌入head区:
<link rel=”icon” href=”/favicon.ico” type=”image/x-icon” />
<link rel=”shortcut icon” href=”/favicon.ico” type=”image/x-icon” />
为搜索引擎准备的内容
代码如下,替换成你自己站点的内容就可以:
* 允许搜索机器人搜索站内所有链接。如果你想某些页面不被搜索,推荐采用robots.txt方法
<meta content=”all” name=”robots” />
* 设置站点作者信息
<meta name=”author” content=”ajie@netease.com,阿捷” />
* 设置站点版权信息
<meta name=”Copyright” content=”www.w3cn.org,自由版权,任意转载” />
* 站点的简要介绍(推荐)
<meta name=”description” content=”新网页设计师。web标准的教程站点,推动web标准在中国的应用” />
* 站点的关键词(推荐)
<meta content=”designing, with, web, standards, xhtml, css, graphic, design, layout, usability, ccessibility, w3c, w3, w3cn, ajie” name=”keywords” />
先介绍这么多。补充说明,前面花了5节都是讲head区的代码,实际页面内容还一字未提,呵呵,不要急,其实head区是非常重要的,看一个页面的head的代码就可以知道设计师是否够专业。
网页设计DIV+CSS–第6天:XHTML代码规范
在开始正式内容制作之前,我们必须先了解一下web标准有关代码的规范。了解这些规范可以帮助你少走弯路,尽快通过代码校验。
1.所有的标记都必须要有一个相应的结束标记
以前在HTML中,你可以打开许多标签,例如<p>和<li>而不一定写对应的</p>和</li>来关闭它们。但在XHTML中这是不合法的。XHTML要求有严谨的结构,所有标签必须关闭。如果是单独不成对的标签,在标签最后加一个”/”来关闭它。例如:
<br /><img height=”80″ alt=”网页设计师” src=”../images/logo_w3cn_200x80.gif” width=”200″ />
2.所有标签的元素和属性的名字都必须使用小写
与HTML不一样,XHTML对大小写是敏感的,<title>和<TITLE>是不同的标签。XHTML要求所有的标签和属性的名字都必须使用小写。例如:<BODY>必须写成<body> 。大小写夹杂也是不被认可的,通常dreamweaver自动生成的属性名字”onMouseOver”也必须修改成”onmouseover”。
3.所有的XML标记都必须合理嵌套
同样因为XHTML要求有严谨的结构,因此所有的嵌套都必须按顺序,以前我们这样写的代码:
<p><b></p>/b>
必须修改为:
<p><b></b>/p>
就是说,一层一层的嵌套必须是严格对称。
4.所有的属性必须用引号””括起来
在HTML中,你可以不需要给属性值加引号,但是在XHTML中,它们必须被加引号。例如:
<height=80>
必须修改为:
<height=”80″>
特殊情况,你需要在属性值里使用双引号,你可以用”,单引号可以使用',例如:
<alt=”say'hello'”>
5.把所有<和&特殊符号用编码表示
* 任何小于号(<),不是标签的一部分,都必须被编码为& l t ;
* 任何大于号(>),不是标签的一部分,都必须被编码为& g t ;
* 任何与号(&),不是实体的一部分的,都必须被编码为& a m p;
注:以上字符之间无空格。
6.给所有属性赋一个值
XHTML规定所有属性都必须有一个值,没有值的就重复本身。例如:
<td nowrap> <input type=”checkbox” name=”shirt” value=”medium” checked>
必须修改为:
<td nowrap=”nowrap”> <input type=”checkbox” name=”shirt” value=”medium” checked=”checked”>
7.不要在注释内容中使”–“
“–“只能发生在XHTML注释的开头和结束,也就是说,在内容中它们不再有效。例如下面的代码是无效的:
<!–这里是注释———–这里是注释–>
用等号或者空格替换内部的虚线。
<!–这里是注释============这里是注释–>
以上这些规范有的看上去比较奇怪,但这一切都是为了使我们的代码有一个统一、唯一的标准,便于以后的数据再利用。
网页设计DIV+CSS–第7天:CSS入门
在了解XHTML代码规范后,我们就要进行CSS布局。首先先介绍一些CSS的入门知识。如果你已经很熟悉了,可以跳过这一节,直接进入下一节。
CSS是Cascading Style Sheets(层叠样式表)的缩写。是一种对web文档添加样式的简单机制,属于表现层的布局语言。
1.基本语法规范
分析一个典型CSS的语句:
p {COLOR:#FF0000;BACKGROUND:#FFFFFF}
* 其中”p”我们称为”选择器”(selectors),指明我们要给”p”定义样式;
* 样式声明写在一对大括号”{}”中;
* COLOR和BACKGROUND称为”属性”(property),不同属性之间用分号”;”分隔;
* “#FF0000″和”#FFFFFF”是属性的值(value)。
2.颜色值
颜色值可以用RGB值写,例如:color : rgb(255,0,0),也可以用十六进制写,就象上面例子color:#FF0000。如果十六进制值是成对重复的可以简写,效果一样。例如:#FF0000可以写成#F00。但如果不重复就不可以简写,例如#FC1A1B必须写满六位。
3.定义字体
web标准推荐如下字体定义方法:
body { font-family : “Lucida Grande”, Verdana, Lucida, Arial, Helvetica, 宋体,sans-serif; }
* 字体按照所列出的顺序选用。如果用户的计算机含有Lucida Grande字体,文档将被指定为Lucida Grande。没有的话,就被指定为Verdana字体,如果也没有Verdana,就指定为Lucida字体,依此类推,;
* Lucida Grande字体适合Mac OS X;
* Verdana字体适合所有的Windows系统;
* Lucida适合UNIX用户
* “宋体”适合中文简体用户;
* 如果所列出的字体都不能用,则默认的sans-serif字体能保证调用;
4.群选择器
当几个元素样式属性一样时,可以共同调用一个声明,元素之间用逗号分隔,: p, td, li { font-size : 12px ; }
5.派生选择器
可以使用派生选择器给一个元素里的子元素定义样式,例如这样:
li strong { font-style : italic; font-weight : normal;}
就是给li下面的子元素strong定义一个斜体不加粗的样式。
6.id选择器
用CSS布局主要用层”div”来实现,而div的样式通过”id选择器”来定义。例如我们首先定义一个层
<div id=”menubar”></div>
然后在样式表里这样定义:
#menubar {MARGIN: 0px;BACKGROUND: #FEFEFE;COLOR: #666;}
其中”menubar”是你自己定义的id名称。注意在前面加”#”号。
id选择器也同样支持派生,例如:
#menubar p { text-align : right; margin-top : 10px; }
这个方法主要用来定义层和那些比较复杂,有多个派生的元素。
6.类别选择器
在CSS里用一个点开头表示类别选择器定义,例如:
.14px {color : #f60 ;font-size:14px ;}
在页面中,用class=”类别名”的方法调用:
<span class=”14px”>14px大小的字体</span>
这个方法比较简单灵活,可以随时根据页面需要新建和删除。
7.定义链接的样式
CSS中用四个伪类来定义链接的样式,分别是:a:link、a:visited、a:hover和a : active,例如:
a:link{font-weight : bold ;text-decoration : none ;color : #c00 ;}
a:visited {font-weight : bold ;text-decoration : none ;color : #c30 ;}
a:hover {font-weight : bold ;text-decoration : underline ;color : #f60 ;}
a:active {font-weight : bold ;text-decoration : none ;color : #F90 ;}
以上语句分别定义了”链接、已访问过的链接、鼠标停在上方时、点下鼠标时”的样式。注意,必须按以上顺序写,否则显示可能和你预想的不一样。记住它们的顺序是”LVHA”。
呵呵,看了这么多,有点头晕吧,实际上CSS的语法规范还有很多,这里列的只是一些常用的,毕竟我们是循序渐进,不可能一口吃成胖子:)
网页设计DIV+CSS–第8天:CSS布局入门
CSS布局与传统表格(table)布局最大的区别在于:原来的定位都是采用表格,通过表格的间距或者用无色透明的GIF图片来控制文布局版块的间距;而现在则采用层(div)来定位,通过层的margin,padding,border等属性来控制版块的间距。
1.定义DIV
分析一个典型的定义div例子:
#sample{ MARGIN: 10px 10px 10px 10px;
PADDING:20px 10px 10px 20px;
BORDER-TOP: #CCC 2px solid;
BORDER-RIGHT: #CCC 2px solid;
BORDER-BOTTOM: #CCC 2px solid;
BORDER-LEFT: #CCC 2px solid;
BACKGROUND: url(images/bg_poem.jpg) #FEFEFE no-repeat right bottom;
COLOR: #666;
TEXT-ALIGN: center;
LINE-HEIGHT: 150%; WIDTH:60%; }
说明如下:
* 层的名称为sample,在页面中用
就可以调用这个样式。
* MARGIN是指层的边框以外留的空白,用于页边距或者与其它层制造一个间距。”10px 10px 10px 10px”分别代表”上右下左”(顺时针方向)四个边距,如果都一样,可以缩写成”MARGIN: 10px;”。如果边距为零,要写成”MARGIN: 0px;”。注意:当值是零时,除了RGB颜色值0%必须跟百分号,其他情况后面可以不跟单位”px”。MARGIN是透明元素,不能定义颜色。
* PADDING是指层的边框到层的内容之间的空白。和margin一样,分别指定上右下左边框到内容的距离。如果都一样,可以缩写成”PADDING:0px”。单独指定左边可以写成”PADDING-LEFT: 0px;”。PADDING是透明元素,不能定义颜色。
* BORDER是指层的边框,”BORDER-RIGHT: #CCC 2px solid;”是定义层的右边框颜色为”#CCC”,宽度为”2px”,样式为”solid”直线。如果要虚线样式可以用”dotted”。
* BACKGROUND是定义层的背景。分2级定义,先定义图片背景,采用”url(../images/bg_logo.gif)”来指定背景图片路径;其次定义背景色”#FEFEFE”。”no-repeat”指背景图片不需要重复,如果需要横向重复用”repeat-x”,纵向重复用”repeat-y”,重复铺满整个背景用”repeat”。后面的”right bottom;”是指背景图片从右下角开始。如果没有背景图片可以只定义背景色BACKGROUND: #FEFEFE
* COLOR用于定义字体颜色,上一节已经介绍过。
* TEXT-ALIGN用来定义层中的内容排列方式,center居中,left居左,right居右。
* LINE-HEIGHT定义行高,150%是指高度为标准高度的150%,也可以写作:LINE-HEIGHT:1.5或者LINE-HEIGHT:1.5em,都是一样的意思。
* WIDTH是定义层的宽度,可以采用固定值,例如500px,也可以采用百分比,象这里的”60%”。要注意的是:这个宽度仅仅指你内容的宽度,不包含margin,border和padding。但在有些浏览器中不是这么定义的,需要你多试试。
下面是这个层的实际表现:
这里是演示内容,这里是演示内容,这里是演示内容,这里是演示内容,这里是演示内容,这里是演示内容,这里是演示内容,这里是演示内容,
这里是演示内容,这里是演示内容,
这里是演示内容,这里是演示内容,
这里是演示内容…
我们可以看到边框是2px的灰色,背景图片在右下没有重复,内容距离上和左边框20px,内容居中,一切和预想的一样。hoho,虽然不好看,但它是最基本的,掌握了它,你就已经学会一半的CSS布局技术了。就是这样,不算难吧!(另一半是什么?另一半是层与层之间的定位。我会在后面逐步讲解。)
2.CSS2盒模型
自从1996年CSS1的推出,W3C组织就建议把所有网页上的对像都放在一个盒(box)中,设计师可以通过创建定义来控制这个盒的属性,这些对像包括段落、列表、标题、图片以及层
。盒模型主要定义四个区域:内容(content)、边框距(padding)、边界(border)和边距(margin)。上面我们讲的sample层就是一个典型的盒。对于初学者,经常会搞不清楚margin,background-color,background-image,padding,content,border之间的层次、关系和相互影响。这里提供一张盒模型的3D示意图,希望便于你的理解和记忆。3.辅助图片一律用背景处理
用XHTML+CSS布局,有一个技术一开始让你不习惯,应该说是一种思维方式与传统表格布局不一样,那就是:所有辅助图片都用背景来实现。类似这样:
BACKGROUND: url(images/bg_poem.jpg) #FEFEFE no-repeat right bottom;
尽管可以用直接插在内容中,但这是不推荐的。这里的”辅助图片”是指那些不是作为页面要表达的内容的一部分,而仅仅用于修饰、间隔、提醒的图片。例如:相册中的图片、图片新闻中的图片,上面的3d盒模型图片都属于内容的一部分,它们可以用元素直接插在页面里,而其它的类似logo,标题图片,列表前缀图片都必须采用背景方式或者其他CSS方式显示。
这样做的原因有2点:
* 将表现与结构彻底相分离(参考阅读另一篇文章:《理解表现与结构相分离》),用CSS控制所有的外观表现,便于改版。
* 使页面更具有易用性,更有亲和力。例如:盲人使用屏幕阅读机,用背景技术实现的图片就不会被朗读出来。网页设计DIV+CSS–第9天:第一个CSS布局实例
接下来开始要真正设计布局了。和传统的方法一样,你首先要在脑海里有大致的轮廓构想,然后用photoshop把它画出来。你可能看到有关web标准的站点大都很朴素,因为web标准更关注结构和内容,实际上它与网页的美观没有根本冲突,你想怎么设计就怎么设计,用传统表格方法实现的布局,用DIV也可以实现。技术有一个成熟的过程,把DIV看成和TABLE一样的工具,如何运用就看你的想象力了。
注:在实际应用过程中,DIV在有些地方的确不如表格方便,比如背景色的定义。但任何事情都有得有失,取舍在于你的价值判断。好,不罗嗦了,我们开始:
1.确定布局
w3cn的最初设计草图如下:用表格的设计方法的话,一般都是上中下三行布局。用DIV的话,我考虑使用三列来布局,成为这样。
2.定义body样式
先定义整个页面的body的样式,代码如下:
body { MARGIN: 0px;
PADDING: 0px;
BACKGROUND: url(../images/bg_logo.gif) #FEFEFE no-repeat right bottom;
FONT-FAMILY: ‘Lucida Grande’,’Lucida Sans Unicode’,’宋体’,’新宋体’,arial,verdana,sans-serif;
COLOR: #666;
FONT-SIZE:12px;
LINE-HEIGHT:150%; }
以上代码的作用在上一天的教程有详细说明,大家应该一看就明白。定义了边框边距为0;背景颜色为#FEFEFE,背景图片为bg_logo.gif,图片位于页面右下角,不重复;定义了字体尺寸为12px;字体颜色为#666;行高150%。
3.定义主要的div
初次使用CSS布局,我决定采用固定宽度的三列布局(比自适应分辨率的设计简单,hoho,别说我偷懒,先实现简单的,增加点信心嘛!)。分别定义左中右的宽度为200:300:280,在CSS中如下定义:/*定义页面左列样式*/
#left{ WIDTH:200px;
MARGIN: 0px;
PADDING: 0px;
BACKGROUND: #CDCDCD;
}
/*定义页面中列样式*/
#middle{ POSITION: absolute;
LEFT:200px;
TOP:0px;
WIDTH:300px;
MARGIN: 0px;
PADDING: 0px;
BACKGROUND: #DADADA;
}
/*定义页面右列样式*/
#right{ POSITION: absolute;
LEFT:500px;
TOP:0px;
WIDTH:280px;
MARGIN: 0px;
PADDING: 0px;
BACKGROUND: #FFF; }
注意:定义中列和右列div我都采用了POSITION: absolute;,然后分别定义了LEFT:200px;TOP:0px;和LEFT:500px;TOP:0px;这是这个布局的关键,我采用了层的绝对定位。定义中间列距离页面左边框200px,距离顶部0px;定义右列距离页面左边框500px,距离顶部0px;。
这时候整个页面的代码是:
<!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” lang=”gb2312″>
<head>
<title>欢迎进入新《网页设计师》:web标准教程及推广</title>
<meta http-equiv=”Content-Type” content=”text/html; charset=gb2312″ />
<meta http-equiv=”Content-Language” content=”gb2312″ />
<meta content=”all” name=”robots” />
<meta name=”author” content=”ajie(at)netease.com,阿捷” />
<meta name=”Copyright” content=”www.w3cn.org,自由版权,任意转载” />
<meta name=”description” content=”新网页设计师,web标准的教程站点,推动web标准在中国的应用.” />
<meta content=”web标准,教程,web, standards, xhtml, css, usability, accessibility” name=”keywords” />
<link rel=”icon” href=”/favicon.ico” type=”image/x-icon” />
<link rel=”shortcut icon” href=”http://www.w3cn.org/favicon.ico” type=”image/x-icon” />
<link rel=”stylesheet” rev=”stylesheet” href=”css/style01.css” type=”text/css” media=”all” />
</head>
<body>
<div id=”left”>页面左列</div>
<div id=”middle”>页面中列</div>
<div id=”right”>页面右列</div>
</body>
</html>
这时候页面的效果仅仅可以看到三个并列的灰色矩形,和一个背景图。但是我希望高度是满屏的,怎么办呢?
4.100%自适应高度?
为了保持三列有同样的高度,我尝试在#left、#middle和#right中设置”height:100%;”,但发现完全没有预想的自适应高度效果。经过一番尝试后,我只好给每个div一个绝对高度:”height:1000px;”,并且随着内容的增加,需要不断修正这个值。难道没有办法自适应高度了吗?随着阿捷自己学习的深入,发现一个变通的解决办法,实际上根本不需要设置100%,我们已经被table思维禁锢太深了,这个办法在下一节的学习中详细介绍。
网页设计DIV+CSS–第10天:自适应高度
如果我们想在3列布局的最后加一行页脚,放版权之类的信息。就遇到必须对齐3列底部的问题。在table布局中,我们用大表格嵌套小表格的方法,可以很方便对齐三列;而用div布局,三列独立分散,内容高低不同,就很难对齐。其实我们完全可以嵌套div,把三列放进一个DIV中,就做到了底部对齐。下面是实现例子(白色背景框模拟一个页面):
Body
这里是#header{ MARGIN: 0px; BORDER: 0px; BACKGROUND: #ccd2de; WIDTH: 580px; HEIGHT: 60px;}
这里是#mainbox { MARGIN: 0px; WIDTH: 580px; BACKGROUND: #FFF; }包含了#menu,#sidebar和#content
这里是#menu{ FLOAT: right; MARGIN: 2px 0px 2px 0px; PADDING:0px 0px 0px 0px; WIDTH: 400px; BACKGROUND: #ccd2de; }
这里是#sidebar{ FLOAT: left; MARGIN: 2px 2px 0px 0px; PADDING: 0px; BACKGROUND: #F2F3F7; WIDTH: 170px; },背景颜色用的是#main的背景色
这里是#content{ FLOAT: right; MARGIN: 1px 0px 2px 0px; PADDING:0px; WIDTH: 400px; BACKGROUND: #E0EFDE;}
这里是主要内容,根据内容自动适应高度
这里是主要内容,根据内容自动适应高度
这里是主要内容,根据内容自动适应高度
这里是#footer{ CLEAR: both; MARGIN: 0px 0px 0px 0px; PADDING: 5px 0px 5px 0px; BACKGROUND: #ccd2de; HEIGHT: 40px; WIDTH: 580px; }。
这个例子的页面主要代码如下:
<div id=”header”></div>
<div id=”mainbox”>
<div id=”menu”></div>
<div id=”sidebar”></div>
<div id=”content”></div>
</div>
<div id=”footer”></div>
具体样式表都写在相应版块里了。重点在于#mainbox层嵌套了#menu,#sidebar和#content三个层。当#content的内容增加,#content的高度就会增高,同时#mainbox的高度也会撑开,#footer层就自动下移。这样就实现了高度的自适应。
另外值得注意的是:#menu和#content都是浮动在页面右面”FLOAT: right;”,#sidebar是浮动在#menu层的左面”FLOAT: left;”,这是浮动法定位,还可以采用绝对定位来实现这样的效果。
这个方法存在另一个问题,就是侧列#sidebar的背景无法百分之百。一般的解决办法就是用body的背景色来填充满。(不能使用#mainbox的背景色,因为在Mozilla等浏览器中#mainbox的背景色失效。)
好了,主要的框架已经搭建完毕,剩下的工作只是往里面添砖加瓦。如果你希望尝试其他布局,推荐看看以下文章:
* CSS布局16例
* onestab:三栏复合布局演示
* onestab:自由伸展的三栏式版面
Tips:[onestab 的”P.I.E”专题] 还有更多精彩介绍,推荐去看看。
网页设计DIV+CSS–第11天:不用表格的菜单
布局初步搭建起来,我开始填充里面的内容。首先是定义logo图片:
样式表:#logo {MARGIN: 0px;padding:0px;WIDTH: 200px;HEIGHT:80px;}
页面代码:<div id=”logo”><a title=”网页设计师” href=”http://www.w3cn.org/” ><img height=”80″ alt=”链接到w3cn.org首页” src=”images/logo_w3cn_200x80.gif” width=”200″ /></a></div>
以上代码现在应该容易理解。先在CSS定义了一个logo的层,然后在页面中调用它。需要说明的是,为了使网页有更好的易用性,web标准要求大家给所有的、属于正式内容的图片,加一个alt属性。这个alt属性是用来说明图片的作用(当图片不能显示的时候就显示替换文字),所以不要只写成无意义的图片名称。
接下来是定义菜单。
1.不用表格的菜单(纵向)
我们先来看菜单的最终效果:
* 什么是网站标准
* 使用标准的好处
* 怎样过渡
* 相关教程
* 工具
* 资源及链接
通常方法我们至少嵌套2层表格来实现这样的菜单,间隔线采用在td中设置背景色并插入1px高的透明GIF图片实现;背景色的交替效果采用td的onmouseover事件实现。但查看本菜单的页面代码,你会看到只有如下几句:
<div id=”menu”>
<ul>
<li><a title=”网站标准” href=”http://www.w3cn.org/webstandards.html“>什么是网站标准</a></li>
<li><a title=”标准的好处” href=”http://www.w3cn.org/benefits.html“>使用标准的好处</a></li>
<li><a title=”怎样过渡” href=”http://www.w3cn.org/howto.html“>怎样过渡</a></li>
<li><a title=”相关教程” href=”http://www.w3cn.org/tutorial.html“>相关教程</a></li>
<li><a title=”工具” href=”http://www.w3cn.org/tools.html“>工具</a></li>
<li><a title=”资源及链接” href=”http://www.w3cn.org/resources.html“>资源及链接</a></li>
</ul>
</div>
没有用任何table,而用的是无序列<li>,整个菜单的效果实现的秘密完全在于id=”menu”,我们再来看CSS中关于menu的定义:
(1)首先定义了menu层的主要样式:
#menu {
MARGIN: 15px 20px 0px 15px; /*定义层的外边框距离*/
PADDING:15px; /*定义层的内边框为15px*/
BACKGROUND: #dfdfdf; /*定义背景颜色*/
COLOR: #666; /*定义字体颜色*/
BORDER:#fff 2px solid; /*定义边框为2px白色线条*/
WIDTH:160px; /*定义内容的宽度为160px*/
}
(2)其次定义无序列表的样式:
#menu ul {
MARGIN: 0px;
PADDING: 0px;
BORDER: medium none; /*不显示边框*/
LINE-HEIGHT: normal;
LIST-STYLE-TYPE: none;}
#menu li {BORDER-TOP: #FFF 1px solid; MARGIN: 0px;}
说明:这里用的是id选择器的派生方法定义(参考第7天:CSS入门的介绍)了在menu层中的子元素<ul>和<li>的样式。LIST-STYLE-TYPE: none一句表示不采用无序列表的默认样式,即:不显示小圆点(我们后面用自己的图标来代替小圆点)。BORDER-TOP: #FFF 1px solid;则定义了菜单之间的1px间隔线。
(3)定义onmouseover效果
#menu li a {
PADDING:5px 0px 5px 15px;
DISPLAY: block;
FONT-WEIGHT: bold;
BACKGROUND: url(images/icon_dot_lmenu.gif) transparent no-repeat 2px 8px;
WIDTH: 100%;
COLOR: #444;
TEXT-DECORATION: none;
}
#menu li a:hover { BACKGROUND: url(images/icon_dot_lmenu2.gif) #C61C18 no-repeat 2px 8px;
COLOR: #fff; }
解释如下:
* “display:block;”表示将标签a当作块级元素来显示,使得链接变成一个按钮;
* “BACKGROUND: url(images/icon_dot_lmenu.gif) transparent no-repeat 2px 8px;”这一句定义了替代li的小圆点的图标。”transparent”指背景为透明,”2px 8px”指定图标的位置是距左边2px,距上边8px。这一句也可以拆分写成四句:”BACKGROUND-IMAGE: url(images/icon_dot_lmenu.gif); BACKGROUND-POSITION: 2px 8px; BACKGROUND-REPEAT: no-repeat; BACKGROUND-COLOR: transparent;”
* “#menu li a:hover”定义了当鼠标移动到链接上以后的颜色变化和小图标变化。
ok,不用表格的菜单就这样实现了。大家可以明显感觉到,原来写在HTML里的表现样式全部剥离放到CSS文件里去了。页面代码节约了大半。通过CSS要修改菜单样式就很简单了。
2.不用表格的菜单(横向)
上面是纵向的菜单,如果要显示横向菜单,用li也可以吗?当然是可以的,下面给出代码,效果就在本页顶部:
页面代码
<div id=”submenu”>
<ul>
<li id=”one”><a title=”首页” href=”http://www.w3cn.org/”>Home</a></li>
<li id=”two”><a title=”关于我们” href=”http://www.w3cn.org/aboutus.html“>关于我们</a></li>
<li id=”three”><a title=”网站标准” href=”http://www.w3cn.org/webstandards.html“>网站标准</a></li>
<li id=”four”><a title=”标准的好处” href=”http://www.w3cn.org/benefits.html“>标准的好处</a></li>
<li id=”five”><a title=”怎样过渡” href=”http://www.w3cn.org/howto.html“>怎样过渡</a></li>
<li id=”six”><a title=”相关教程” href=”http://www.w3cn.org/tutorial.html“>相关教程</a></li>
<li id=”seven”><a title=”工具” href=”http://www.w3cn.org/tools.html“>工具</a></li>
<li id=”eight”><a title=”资源及链接” href=”http://www.w3cn.org/resources.html“>资源及链接</a></li>
<li id=”nine”><a title=”常见问题” href=”http://www.w3cn.org/faq.html“>常见问题</a></li>
</ul>
</div>
样式表代码
#submenu {
MARGIN: 0px 8px 0px 8px;
PADDING: 4px 0px 0px 0px;
BORDER: #fff 1px solid;
BACKGROUND: #dfdfdf;
COLOR: #666;
HEIGHT:25px; }#submenu ul {
CLEAR: left;
MARGIN: 0px;
PADDING:0px;
BORDER: 0px;
LIST-STYLE-TYPE: none;
TEXT-ALIGN: center;
DISPLAY:inline;
}#submenu li {
FLOAT: left;
DISPLAY: block;
MARGIN: 0px;
PADDING: 0px;
TEXT-ALIGN: center}#submenu li a {
DISPLAY: block;
PADDING:2px 3px 2px 3px;
BACKGROUND: url(images/icon_dot_lmenu.gif) transparent no-repeat 2px 8px;
FONT-WEIGHT: bold;
WIDTH: 100%;
COLOR: #444;
TEXT-DECORATION: none;
}#submenu li a:hover {
BACKGROUND: url(images/icon_dot_lmenu2.gif) #C61C18 no-repeat 2px 8px;
COLOR: #fff; }#submenu ul li#one A { WIDTH: 60px}
#submenu ul li#two A { WIDTH: 80px}
#submenu ul li#three A { WIDTH: 80px}
#submenu ul li#four A { WIDTH: 90px}
#submenu ul li#five A { WIDTH: 80px}
#submenu ul li#six A { WIDTH: 80px}
#submenu ul li#seven A { WIDTH: 60px}
#submenu ul li#eight A { WIDTH: 90px}
#submenu ul li#nine A { WIDTH: 80px}
以上代码不逐一分析了。横向菜单的关键在于:定义<li>样式时的”FLOAT: left;”语句。另外注意UL定义中的DISPLAY:inline;一句表示将li强制作为内联对象呈递,从对象中删除行,通俗讲就是li不换行。实现横向排列。你也可以象例子中定义每个子菜单的宽度,控制菜单的间隔。好了,你也可以动手试试,用li实现各种各样的菜单样式。
Tips:如果你子菜单的宽度总和大于层的宽度,菜单会自动折行,利用这个原理可以实现单个无序列表的2列或者3列排版,这是原来HTML很难实现的。
感谢zhuweiwei指出横向菜单的bug,本文7月6日修正。
网页设计DIV+CSS–第12天:校验及常见错误
辛苦了好多天,我们努力学习使用XHTML+CSS来重新设计我们的网站。那么我们如何知道自己制作的页面真的符合web标准?W3C和一些志愿者网站提供了在线校验程序,来帮助我们检查页面是否符合标准,并提供了修正错误的帮助信息。这些校验非常有用,是我调试页面第一步要做的事情。
1.XHTML校验
* 校验网址:http://validator.w3.org/
* 校验方式:网址校验、文件上传校验
校验成功,会显示”This Page Is Valid XHTML 1.0 Transitional!”,如图:校验失败,会显示更多校验选项和错误信息,如图:
一般选择”Show Source”和”Verbose Output”可以帮助你找到错误代码所在行和错误原因。
XHTML校验常见错误原因对照表
* No DOCTYPE Found! Falling Back to HTML 4.01 Transitional–未定义DOCTYPE。
* No Character Encoding Found! Falling back to UTF-8.–未定义语言编码。
* end tag for “img” omitted, but OMITTAG NO was specified–图片标签没有加”/”关闭。
* an attribute value specification must be an attribute value literal unless SHORTTAG YES is specified–属性值必须加引号。
* element “DIV” undefined—DIV标签不能用大写,要改成小写div。
* required attribute “alt” not specified—图片需要加alt属性。
* required attribute “type” not specified—JS或者CSS调用的标签漏了type属性。
其中最最常见的错误就是标签的大小写问题了。通常这些错误都是关联的,比如忘记了一个</li>其他<li>标签都会报错,所以不要看到一堆的错误害怕,通常解决了一个错误,其他的错误也都没有了。如果你的页面通过XHTML1.0校验,可以在页面上放置这么一个图标: 代码如下:
<p> <a href=”http://validator.w3.org/check/referer”><img src=”http://www.w3.org/Icons/valid-xhtml10” alt=”Valid XHTML 1.0!” height=”31″ width=”88″ /></a> </p>
2.CSS2校验
* 校验网址:http://jigsaw.w3.org/css-validator/
* 校验方式:网址校验、文件上传校验、直接贴入代码校验
校验成功,会显示”恭喜恭喜,此文档已经通过样式表校验! “,hoho,校验信息支持中文噢。如图:校验失败,会显示两类错误:错误和警告。错误表示一定要修正,否则无法通过校验;警告表示有代码不被W3C推荐,建议修改。
CSS2校验常见错误原因对照表
* (错误)无效数字 : color909090 不是一个 color 值 : 909090 —十六进制颜色值必须加”#”号,即#909090
* (错误)无效数字 : margin-topUnknown dimension : 6pixels —pixels不是一个单位值,正确写法6px
* (错误)属性 scrollbar-face-color 不存在 : #eeeeee — 定义滚动条颜色是非标准的属性
* (错误)值 cursorhand不存在 : hand是非标准属性值,修改为cursor:pointer
* (警告)Line : 0 font-family: 建议你指定一个种类族科作为最后的选择 –W3C建议字体定义的时候,最后以一个类别的字体结束,例如”sans-serif”,以保证在不同操作系统下,网页字体都能被显示。
* (警告)Line : 0 can’t find the warning message for otherprofile –表示在代码中有非标准属性或值,校验程序无法判断和提供相应的警告信息。
同样,通过检验后,可以放置一个CSS校验通过图标,代码如下:
<p> <a href=”http://jigsaw.w3.org/css-validator/“> <img style=”border:0;width:88px;height:31px” src=”http://jigsaw.w3.org/css-validator/images/vcss” alt=”Valid CSS!” /> </a> </p>
CSS的十八般技巧
最近,经常有朋友问我一些工作中遇到的CSS问题。他们总是不能很好的控制CSS,影响CSS的效率发挥。我来分析总结一下错误所在,帮助大家更加容易使用CSS。
本文总结了我开始使用CSS布局方法以来所有的技巧和兼容方案,我愿意把这些与你分享,我会重点解释一些新手容易犯的错误(包括我自己也犯过的),如果你已经是CSS高手,这些经验技巧可能已经都知道,如果你有更多的,希望可以帮我补充。
一.使用css缩写
使用缩写可以帮助减少你CSS文件的大小,更加容易阅读。css缩写的主要规则请参看《常用css缩写语法总结》,这里就不展开描述。
二.明确定义单位,除非值为0
忘记定义尺寸的单位是CSS新手普遍的错误。在HTML中你可以只写width=”100″,但是在CSS中,你必须给一个准确的单位,比如:width:100px width:100em。只有两个例外情况可以不定义单位:行高和0值。除此以外,其他值都必须紧跟单位,注意,不要在数值和单位之间加空格。
三.区分大小写
当在XHTML中使用CSS,CSS里定义的元素名称是区分大小写的。为了避免这种错误,我建议所有的定义名称都采用小写。
class和id的值在HTML和XHTML中也是区分大小写的,如果你一定要大小写混合写,请仔细确认你在CSS的定义和XHTML里的标签是一致的。
四.取消class和id前的元素限定
当你写给一个元素定义class或者id,你可以省略前面的元素限定,因为ID在一个页面里是唯一的,而clas s可以在页面中多次使用。你限定某个元素毫无意义。例如:
div#content { /* declarations */ }
fieldset.details { /* declarations */ }
可以写成
#content { /* declarations */ }
.details { /* declarations */ }
这样可以节省一些字节。
五.默认值
通常padding的默认值为0,background-color的默认值是transparent。但是在不同的浏览器默认值可能不同。如果怕有冲突,可以在样式表一开始就先定义所有元素的margin和padding值都为0,象这样:
* {
margin:0;
padding:0;
}
六.不需要重复定义可继承的值
CSS中,子元素自动继承父元素的属性值,象颜色、字体等,已经在父元素中定义过的,在子元素中可以直接继承,不需要重复定义。但是要注意,浏览器可能用一些默认值覆盖你的定义。
七.最近优先原则
如果对同一个元素的定义有多种,以最接近(最小一级)的定义为最优先,例如有这么一段代码
Update: Lorem ipsum dolor set
在CSS文件中,你已经定义了元素p,又定义了一个class”update”
p {
margin:1em 0;
font-size:1em;
color:#333;
}
.update {
font-weight:bold;
color:#600;
}
这两个定义中,class=”update”将被使用,因为class比p更近。你可以查阅W3C的《 Calculating a selector’s specificity》 了解更多。
八.多重class定义
一个标签可以同时定义多个class。例如:我们先定义两个样式,第一个样式背景为#666;第二个样式有10 px的边框。
.one{width:200px;background:#666;}
.two{border:10px solid #F00;}
在页面代码中,我们可以这样调用
<div class=”one two”></div>
这样最终的显示效果是这个div既有#666的背景,也有10px的边框。是的,这样做是可以的,你可以尝试一下。
九.使用子选择器(descendant selectors)
CSS初学者不知道使用子选择器是影响他们效率的原因之一。子选择器可以帮助你节约大量的class定义。我们来看下面这段代码:
<div id=”subnav”>
<ul>
<li class=”subnavitem”> <a href=”#” class=”subnavitem”>Item 1</a></li>>
<li class=”subnavitemselected”> <a href=”#” class=”subnavitemselected”> Item 1</a> </li>
<li class=”subnavitem”> <a href=”#” class=”subnavitem”> Item 1</a> </li>
</ul>
</div>
这段代码的CSS定义是:
div#subnav ul { /* Some styling */ }
div#subnav ul li.subnavitem { /* Some styling */ }
div#subnav ul li.subnavitem a.subnavitem { /* Some styling */ }
div#subnav ul li.subnavitemselected { /* Some styling */ }
div#subnav ul li.subnavitemselected a.subnavitemselected { /* Some styling */ }
你可以用下面的方法替代上面的代码
<ul id=”subnav”>
<li> <a href=”#”> Item 1</a> </li>
<li class=”sel”> <a href=”#”> Item 1</a> </li>
<li> <a href=”#”> Item 1</a> </li>
</ul>
样式定义是:
#subnav { /* Some styling */ }
#subnav li { /* Some styling */ }
#subnav a { /* Some styling */ }
#subnav .sel { /* Some styling */ }
#subnav .sel a { /* Some styling */ }
用子选择器可以使你的代码和CSS更加简洁、更加容易阅读。
十.不需要给背景图片路径加引号
为了节省字节,我建议不要给背景图片路径加引号,因为引号不是必须的。例如:
background:url(“images/***.gif”) #333;
可以写为
background:url(images/***.gif) #333;
如果你加了引号,反而会引起一些浏览器的错误。
十一.组选择器(Group selectors)
当一些元素类型、class或者id都有共同的一些属性,你就可以使用组选择器来避免多次的重复定义。这可以节省不少字节。
例如:定义所有标题的字体、颜色和margin,你可以这样写:
h1,h2,h3,h4,h5,h6 {
font-family:”Lucida Grande”,Lucida,Arial,Helvetica,sans-serif;
color:#333;
margin:1em 0;
}
如果在使用时,有个别元素需要定义独立样式,你可以再加上新的定义,可以覆盖老的定义,例如:
h1 { font-size:2em; }
h2 { font-size:1.6em; }
十二.用正确的顺序指定链接的样式
当你用CSS来定义链接的多个状态样式时,要注意它们书写的顺序,正确的顺序是::link :visited :hover :active。抽取第一个字母是”LVHA”,你可以记忆成”LoVe HAte”(喜欢讨厌)。为什么这么定义,可以参考Eric Meyer的《Link Specificity》。
如果你的用户需要用键盘来控制,需要知道当前链接的焦点,你还可以定义:focus属性。:focus属性的效果也取决与你书写的位置,如果你希望聚焦元素显示:hover效果,你就把:focus写在:hover前面;如果你希望聚焦效果替代:hover效果,你就把:focus放在:hover后面。
十三.清除浮动
一个非常常见的CSS问题,定位使用浮动的时候,下面的层被浮动的层所覆盖,或者层里嵌套的子层超出了外层的范围。
通常的解决办法是在浮动层后面添加一个额外元素,例如一个div或者一个br,并且定义它的样式为clear: both。这个办法有一点牵强,幸运的是还有一个好办法可以解决,参看这篇文章《How To Clear Floats Without Structural Markup》(注:本站将尽快翻译此文)。
上面2种方法可以很好解决浮动超出的问题,但是如果当你真的需要对层或者层里的对象进行clear的时候怎么办?一种简单的方法就是用overflow属性,这个方法最初的发表在《Simple Clearing of Floats》,又在《Clearance》和《Super simple clearing floats》中被广泛讨论。
上面那一种clear方法更适合你,要看具体的情况,这里不再展开论述。另外关于float的应用,一些优秀的文章已经说得很清楚,推荐你阅读:《Floatutorial》、《Containing Floats》和《Float Layouts》
十四.横向居中(centering)
这是一个简单的技巧,但是值得再说一遍,因为我看见太多的新手问题都是问这个:CSS如何横向居中?你需要定义元素的宽,并且定义横向的margin,如果你的布局包含在一个层(容器)中,就象这样:
你可以这样定义使它横向居中:
#wrap {
width:760px; /* 修改为你的层的宽度 */
margin:0 auto;
}
但是IE5/Win不能正确显示这个定义,我们采用一个非常有用的技巧来解决:用text-align属性。就象这样:
body {
text-align:center;
}
#wrap {
width:760px; /* 修改为你的层的宽度 */
margin:0 auto;
text-align:left;
}
第一个body的text-align:center; 规则定义IE5/Win中body的所有元素居中(其他浏览器只是将文字居中) ,第二个text-align:left;是将#warp中的文字居左。
十五.导入(Import)和隐藏CSS
因为老版本浏览器不支持CSS,一个通常的做法是使用@import技巧来把CSS隐藏起来。例如:
@import url(“main.css”);
然而,这个方法对IE4不起作用,这让我很是头疼了一阵子。后来我用这样的写法:
@import “main.css”;
这样就可以在IE4中也隐藏CSS了,呵呵,还节省了5个字节呢。想了解@import语法的详细说明,可以看这里《centricle’s css filter chart》
十六.针对IE的优化
有些时候,你需要对IE浏览器的bug定义一些特别的规则,这里有太多的CSS技巧(hacks),我只使用其中的两种方法,不管微软在即将发布的IE7 beta版里是否更好的支持CSS,这两种方法都是最安全的。
* 1.注释的方法
o (a)在IE中隐藏一个CSS定义,你可以使用子选择器(child selector):
html>body p {
/* 定义内容 */
}
o (b)下面这个写法只有IE浏览器可以理解(对其他浏览器都隐藏)
* html p {
/* declarations */
}
o (c)还有些时候,你希望IE/Win有效而IE/Mac隐藏,你可以使用”反斜线”技巧:
/* \*/
* html p {
declarations
}
/* */
* 2.条件注释(conditional comments)的方法
另外一种方法,我认为比CSS Hacks更加经得起考验就是采用微软的私有属性条件注释(conditional comments)。用这个方法你可以给IE单独定义一些样式,而不影响主样式表的定义。就象这样:
<!–[if IE]>
<link rel=”stylesheet” type=”text/css” href=”ie.css” />
<![endif]–>
十七.调试技巧:层有多大?
当调试CSS发生错误,你就要象排版工人,逐行分析CSS代码。我通常在出问题的层上定义一个背景颜色,这样就能很明显看到层占据多大空间。有些人建议用border,一般情况也是可以的,但问题是,有时候border 会增加元素的尺寸,border-top和boeder-bottom会破坏纵向margin的值,所以使用background更加安全些。
另外一个经常出问题的属性是outline。outline看起来象boeder,但不会影响元素的尺寸或者位置。只有少数浏览器支持outline属性,我所知道的只有Safari、OmniWeb、和Opera。
十八.CSS代码书写样式
在写CSS代码的时候,对于缩进、断行、空格,每个人有每个人的书写习惯。在经过不断实践后,我决定采用下面这样的书写样式:
selector1,
selector2 {
property:value;
}
当使用联合定义时,我通常将每个选择器单独写一行,这样方便在CSS文件中找到它们。在最后一个选择器和大括号{之间加一个空格,每个定义也单独写一行,分号直接在属性值后,不要加空格。
我习惯在每个属性值后面都加分号,虽然规则上允许最后一个属性值后面可以不写分号,但是如果你要加新样式时容易忘记补上分号而产生错误,所以还是都加比较好。
最后,关闭的大括号}单独写一行。
WEB打印实例教程
做Web开发的人员一定都会面临一个共同的难题,那就是打印。的确,相对于Windows桌面应用程序来讲,Web应用程序的打印有种种限制,技术人员在项目开发过程中经常会遇到用户这样或那样的需求. 做过桌面应用开发的人都会非常熟悉水晶报表、Active Report之类的报表控件,它们不仅有简单灵活的设计界面,更具有非常强大的报表功能,能满足各种报表的打印需求。而Web应用则因为其特殊的呈现方式,只能寻求其他的解决方案。现在我们来分析一下目前已经成形的Web打印方案:
现有的Web打印控制技术分成几种方案:
一.自定义控件完成打印
利用IE 自带的WebBrowser 控件实现打印
利用第三方控件实现打印
1、自定义控件方式
自定义控件方式就是利用VB 或VC 等工具生成COM 组件,用定义好的打印格式来分析打印源文件从而实现打印。只有将生成的组件下载并注册到客户机上,才能实现在客户端的
打印。
难点主要是定义打印格式、如何来分析打印源文件。现有的比较好的方法是利用XML 技术来全面的解决问题,利用XML 可以非常容易地定义打印目标的文本、表格等内容的格式。
但对程序员的开发要求高,难度比较大。
2、利用WebBrowser 实现Web打印
WebBrowser是IE 内置的浏览器控件,无需用户下载。本文档所讨论的是有关IE6.0 版本 的WebBrowser 控件技术内容。与其相关的技术要求有:打印文档的生成、页面设置、打印操作的实现等几个环节。
(一)、打印文档的生成
1、客户端脚本方式
客户端脚本分为VBScript、JavaScript、JScript 几种脚本语言。在IE 下开发应用使用的语法为JScript 的语法,由于它和JavaScript 几乎没有什么区别,所以也可以称其为JavaScript(下面简写为JS)。一般情况下,主要使用JS 来实现DOM 文档的分析,DOM 为微软提出的一种Web文档模型,主要用来实现Web脚本编程。
利用JS 可以分析源页面的内容,将欲打印的页面元素提取出来,实现打印。通过分析源文档的内容,可以生成打印目标文档。
优点:客户端独立完成打印目标文档的生成,减轻服务器负荷;
缺点:源文档的分析操作复杂,并且源文档中的打印内容要有约定;
2、服务器端程序方式
服务器端程序方式,主要是利用后台代码从数据库中读取打印源,生成打印目标文档。当的页面生成时,还应适当考虑使用CSS 来实现强制分页控制。
优点:可以生成内容非常的丰富的打印目标文档,目标文档的内容的可控性强。由于打印内容是从数据库中获取的,所以生成操作相对简单;
缺点:服务器端负载比较大;
(二)、页面设置
页面设置主要是指设置打印文档的页边距、页眉、页脚、纸张等内容。页面设置将直接影响到打印文档版面的生成效果,所以它和打印文档的生成有着密切的关系。比如:表格的
行数、大小、位置、字体的大小等。
现有的技术是利用IE6.0 内置的打印模板方式来控制页面设置,其可以对打印目标文档产生非常大的影响。打印模板可以控制页边距、页眉、页脚、奇偶页等内容,并可以将用户的设置取得,还可以将设置发送到服务器端。
打印模板技术可以自定预览窗口和打印格式,最大限度地影响目标文档和打印效果。
(三)、打印操作的实现
此功能的实现主要是利用WebBrowser控件的函数接口来实现打印、打印预览(默认的)、
页面设置(默认的)。
<object ID=’WebBrowser1′ WIDTH=0 HEIGHT=0
CLASSID=’CLSID:8856F961-340A-11D0-A96B-00C04FD705A2′>
//打印
WebBrowser1.ExecWB(6,1);
//打印设置
WebBrowser1.ExecWB(8,1);
//打印预览
WebBrowser1.ExecWB(7,1);
3、一个实例项目采用的打印方案
服务器端程序方式、打印预览接口调用,下面为例, 主要参考项目中的:
pageErrorPrint.aspx.vb 文件
主调用页
function PrintPage(iPageIndex,strQuery)
{
var strURL;
strURL = “PageErrorPrint.aspx?PageIndex=” + iPageIndex + “&QueryString=” +
strQuery;
winPrint=window.open(strURL,””,”left=2000,top=2000,fullscreen=3″);
}
打印页HTML 源中的预览控制
<SCRIPT language=”javascript”>
document.write(“<object ID=’WebBrowser’ WIDTH=0 HEIGHT=0
CLASSID=’CLSID:8856F961-340A-11D0-A96B-00C04FD705A2′></object>”);
WebBrowser.ExecWB(7,1);
window.opener=null;
window.close();
</SCRIPT>
程序头
‘首先声明表格容器
Protected WithEvents phContainer As System.Web.UI.WebControls.PlaceHolder
‘每个表格中的记录数量
Private Const ItemPerTable As Integer = 20
关键的实现部分
‘创建一个符合打印要求的表格
tabPagePrint = NewPrintTable()
‘将表头添加到此表格中
Call AddTableTitle(tabPagePrint)
‘初始化记录器
i = 0
iItemIndex = iStartPoint
For Each clsItem In clsAllData.ErrorCollection
If i > 0 And i Mod ItemPerTable = 0 Then
‘添加表格控件到页面中
phContainer.Controls.Add(tabPagePrint)
‘在页面中添加一个换行符
Call AddPageBreak()
‘创建新一轮的表格
tabPagePrint = NewPrintTable()
Call AddTableTitle(tabPagePrint)
End If
‘将记录添加到表格中
Call AddItemToTable(iItemIndex, tabPagePrint, clsItem)
iItemIndex = iItemIndex + 1
i = i + 1
Next
‘添加表格控件到页面中
phContainer.Controls.Add(tabPagePrint)
支持函数
‘功能:添加页的换行符
Private Sub AddPageBreak()
Dim ltBreak As LiteralControl
ltBreak = New LiteralControl(“<p style=’page-break-before:always’>”)
phContainer.Controls.Add(ltBreak)
End Sub
二、利用IE自身打印
这种方式比较简单,也常用的打印方式,只需要将报表页面设计好,用户通过IE菜单中的打印功能完成打印。优点是简单,容易实现,缺点是不灵活,不能控制分页,不能控制好页眉和页脚。
三、将报表导出成Word,Excel或PDF形式打印
这种方式需要将页面导出成Office文档或pdf,最低的要求是客户端已经安装用以打开Word、Excel或Pdf文档的软件。这种方式可以通过水晶报表组件或其他一些第三方控件非常容易地实现。导出成Pdf形式后打印质量和效果都很好,导出成Word或Excel后用户可以自定义打印的内容和格式。
总之,现有的打印方案各有所长,在开发过程中应根据用户的需求作选择,利用IE打印简单,容易实现,在用户需求简单或打印内容较少的情况下采用此方案比较适宜。利用自定义控件打印可以实现完全自定义,但需要较高的技术要求和开发周期。利用导出的方式则可以满足用户需要一点自定义或打印内容有多页的需求。
————————————————————-
1、控制”纵打”、横打”和”页面的边距。
(1)<script defer>
function SetPrintSettings() {
// — advanced features
factory.printing.SetMarginMeasure(2) // measure margins in inches
factory.SetPageRange(false, 1, 3) // need pages from 1 to 3
factory.printing.printer = “HP DeskJet 870C”
factory.printing.copies = 2
factory.printing.collate = true
factory.printing.paperSize = “A4”
factory.printing.paperSource = “Manual feed”
// — basic features
factory.printing.header = “This is MeadCo”
factory.printing.footer = “Advanced Printing by ScriptX”
factory.printing.portrait = false
factory.printing.leftMargin = 1.0
factory.printing.topMargin = 1.0
factory.printing.rightMargin = 1.0
factory.printing.bottomMargin = 1.0
}
</script>
(2)
<script language=”javascript”>
function printsetup(){
// 打印页面设置
wb.execwb(8,1);
}
function printpreview(){
// 打印页面预览
wb.execwb(7,1);
}
function printit()
{
if (confirm(‘确定打印吗?’)) {
wb.execwb(6,6)
}
}
</script>
</head>
<body>
<OBJECT classid=”CLSID:8856F961-340A-11D0-A96B-00C04FD705A2″
height=0 id=wb name=wb width=0></OBJECT>
<input type=button name=button_print value=”打印”
onclick=”javascript:printit()”>
<input type=button name=button_setup value=”打印页面设置”
onclick=”javascript:printsetup();”>
<input type=button name=button_show value=”打印预览”
onclick=”javascript:printpreview();”>
<input type=button name=button_fh value=”关闭”
onclick=”javascript:window.close();”>
————————————————
关于这个组件还有其他的用法,列举如下:
WebBrowser.ExecWB(1,1) 打开
Web.ExecWB(2,1) 关闭现在所有的IE窗口,并打开一个新窗口
Web.ExecWB(4,1) 保存网页
Web.ExecWB(6,1) 打印
Web.ExecWB(7,1) 打印预览
Web.ExecWB(8,1) 打印页面设置
Web.ExecWB(10,1) 查看页面属性
Web.ExecWB(15,1) 好像是撤销,有待确认
Web.ExecWB(17,1) 全选
Web.ExecWB(22,1) 刷新
Web.ExecWB(45,1) 关闭窗体无提示
2、分页打印
<HTML>
<HEAD>
<STYLE>
P {page-break-after: always}
</STYLE>
</HEAD>
<BODY>
<%while not rs.eof%>
<P><%=rs(0)%></P>
<%rs.movenext%>
<%wend%>
</BODY>
</HTML>
3、ASP页面打印时如何去掉页面底部的路径和顶端的页码编号
(1)ie的文件-〉页面设置-〉讲里面的页眉和页脚里面的东西都去掉,打印就不出来了。
(2)<HTML>
<HEAD>
<TITLE> New Document </TITLE>
<META NAME=”Generator” CONTENT=”EditPlus”>
<META NAME=”Author” CONTENT=”YC”>
<script language=”VBScript”>
dim hkey_root,hkey_path,hkey_key
hkey_root=”HKEY_CURRENT_USER”
hkey_path=”\Software\Microsoft\Internet Explorer\PageSetup”
‘//设置网页打印的页眉页脚为空
function pagesetup_null()
on error resume next
Set RegWsh = CreateObject(“WScript.Shell”)
hkey_key=”\header”
RegWsh.RegWrite hkey_root+hkey_path+hkey_key,””
hkey_key=”\footer”
RegWsh.RegWrite hkey_root+hkey_path+hkey_key,””
end function
‘//设置网页打印的页眉页脚为默认值
function pagesetup_default()
on error resume next
Set RegWsh = CreateObject(“WScript.Shell”)
hkey_key=”\header”
RegWsh.RegWrite hkey_root+hkey_path+hkey_key,”&w&b页码,&p/&P”
hkey_key=”\footer”
RegWsh.RegWrite hkey_root+hkey_path+hkey_key,”&u&b&d”
end function
</script>
</HEAD>
<BODY>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/><p align=center>
<input type=”button” value=”清空页码” onclick=pagesetup_null()> <input type=”button” value=”恢复页吗” onclick=pagesetup_default()><br/>
</p>
</BODY>
</HTML>
4、浮动帧打印
<SCRIPT LANGUAGE=javascript>
function button1_onclick() {
var odoc=window.iframe1.document;
var r=odoc.body.createTextRange();
var stxt=r.htmlText;
alert(stxt)
var pwin=window.open(“”,”print”);
pwin.document.write(stxt);
pwin.print();
}
</SCRIPT>
4、用FileSystem组件实现WEB应用中的本地特定打印
<script Language=VBScript>
function print_onclick //打印函数
dim label
label=document.printinfo.label.value //获得HTML页面的数据
set objfs=CreateObject(“Scripting.FileSystemObject”) //创建FileSystem组件对象的实例
set objprinter=objfs.CreateTextFile (“LPT1:”,true) //建立与打印机的连接
objprinter.Writeline(“__________________________________”) //输出打印的内容
objprinter.Writeline(“| |”)
objprinter.Writeline(“| 您打印的数据是:”&label& ” |”)
objprinter.Writeline(“| |”)
objprinter.Writeline(“|_________________________________|”)
objprinter.close //断开与打印机的连接
set objprinter=nothing
set objfs=nothing // 关闭FileSystem组件对象
end function
</script>
服务器端脚本:
<%………
set conn=server.CreateObject (“adodb.connection”)
conn.Open “DSN=name;UID=XXXX;PWD=XXXX;”
set rs=server.CreateObject(“adodb.recordset”)
rs.Open(“select ……”),conn,1,1
……….%> //与数据库进行交互
HTML页面编码:
<HTML>
………
<FORM ID=printinfo NAME=”printinfo” >
<INPUT type=”button” value=”打印>>” id=print name=print > //调用打印函数
<INPUT type=hidden id=text1 name=label value=<%=………%>> //保存服务器端传来的数据
………
</HTML> -
永远的毁灭公爵什么时候发布
今天又发布了一张图片,作为圣诞的礼物吧,这个已经跳票跳的太久了,甚至已经不在那么期待他的发布了,对游戏的兴趣也不像以前那样了,失去的那份感觉永远也找不到了,淡淡的伤感。
以前的玩家已经多半成家,为生活忙碌。dos版的毁灭公爵理我也太远了。我想这些东西只有在记忆中存留了。
-
网上流传的大压缩比的秘密
之前看过很大的文件可以压缩的到很小,最近从网上看到了一个方法可以让压缩软件压缩出大的压缩比来
fsutil file createnew test.txt 102400000 这样就建立了一个100M的文件。
这样的文件内容里面全是空的,但是这些都全重复内容,在用rar压缩的时候这样的文件就可以压缩出很高的压缩比。
-
windows2003服务器配置
平台: windows 2003
安装过程: 默认安装(2003系统自身默认不安装任何服务)对象:
多人共同利用终端服务登陆,可视化浏览自己的文件目录.无权浏览其他用户信息以及更改系统设置.具体方向:
一.系统环境设置->目的:防止对系统不熟悉的用户,例如:利用gpedit.msc删除”开始”中多余菜单;禁用一些桌面操作以及其他设置;注册表中系统优化以及安全设置;
二.系统服务安全->包括WEB服务;FTP服务;数据库服务;游戏服务
三.系统权限设置
四.系统组件调试->利用探针逐步测试主机环境,提供全面的服务
五.端口过滤设置->windows2003放火墙设置;BlackIce设置
六.安全测试目录:
一.系统环境设置
1.删除”开始”菜单中多余的选项;
“开始”->”运行” 输入: gpedit.msc
<1>”计算机配置”
->”Windows设置”
->”安全设置”
->”帐户策略”
[密码策略]
[帐户锁定策略]
->”本地策略”
[审核策略]
[用户权限分配]->”从网络访问此计算机”
->”安全选项”
“允许系统在未登陆前关机”
“不显示上次登陆名”
“不需要按crtl…”
“不允许SAM帐户的匿名枚举”
“不允许SAM帐户和共享的匿名枚举”
“网络访问:可远程访问注册表路径” 例如:将此处添写为olylinux
“网络访问:可远程访问的注册表路径和子路径 例如:将此处添写为olylinux
->”管理模板”
->”windows组件”
->”Internet Explorer”
“安全区域:仅使用计算机设置”
“安全区域:禁止用户更改策略”
“安全区域:禁止用户添加或删除站点”
->”终端服务” :
“强制删除远程桌面墙纸”
“从[开始]菜单删除”windows安全性”项”
[客户端]
“不允许保存密码”
->”windows install”
“日志记录”
->”系统”
“在登陆时不显示”管理您的服务器”页”
“显示”关闭事件跟踪程序”(禁用)
->磁盘配额”
“启用磁盘配额”
“强制磁盘配额限制”
“超出磁盘配额限制时将事件记录到日志中”
<2>”用户配置”
->”管理面板”
->”Windows 资源管理器”
“从”工具”菜单删除”文件夹选项”菜单”
“从windows资源管理器中删除”文件菜单”
“删除”映射网络驱动器”和”断开网络驱动器”
“从window资源管理器上删除搜索按钮”
“删除”硬件”选项卡”
“”网上邻居”中没有”我附近的计算机”
“网上邻居”中不含”整个网络”
“不要将已删除的文件移到”回收站””
“从”我的电脑”删除共享文档”
“关闭windows+x热键”
->”终端服务”
[客户端]
“不允许保存密码”
->”任务栏和[开始]菜单”
“从[开始]菜单删除用户文件夹”
“从[开始]菜单删除公用程序组”
“从「开始」菜单中删除“我的文档”图标”
“从「开始」菜单中删除“文档”菜单”
“从设置菜单删除程序” (如果要使用”控制面板”可设置为”未配置”)
“从[开始]菜单删除”网络连接”
“从[开始]菜单中删除“收藏夹”菜单”
“从[开始]菜单中删除”搜索”菜单”
“从[开始]菜单删除”帮助”命令”
“从[开始]菜单中删除”运行”菜单”
“从「开始」菜单中删除“图片收藏”图标”
“从「开始」菜单中删除“我的音乐”图标”
“阻止更改”任务栏和[开始]菜单”设置”
“禁止访问任务栏的上下文菜单”
“不要保留最近打开文档的记录”
“退出时清除最近打开的文档的记录”
“关闭个性化菜单”
“关闭用户跟踪”
“阻止在人物栏上对项目分组”
“锁定任务栏”
“删除[开始]菜单项目上的”气球提示””
“从[开始]菜单中删除附加的程序列表”
“从[开始]菜单中删除常用程序列表”
“从[开始]菜单中删除所有程序列表”
“不在任务栏显示任何自定义工具栏”
“从”开始”菜单中删除”设置程序访问和默认””
->”桌面”
“从桌面删除回收站”
“禁止添加,拖.放和关闭任务栏的工具栏”
“禁止调整桌面工具栏”
->”控制面板”
“禁用控制面板” (禁止后,也可以防止终端用户从开始菜单进入控制面板)2.注册表设置
<1>.WebShell
入侵者上传文件后.需要利用WebShell来执行可执行程序.或者利用WebShell进行更加方便的文件操作.
对应措施:取消相应服务和功能
一般WebShell用到以下组件
WScript.Network
WScript.Network.1
WScript.Shell
WScript.Shell.1
Shell.Application
Shell.Application.1
在注册表中将以上键值改名
将这些键值下CLSID中包含的字串
如{72C24DD5-D70A-438B-8A42-98424B88AFB8}
到/HKEY_CLASSES_ROOT/CLSID下找到以这些字串命名的键值全部删除
<2>.隐藏重要文件/目录,可修改注册表实现完全隐藏
HKEY_LOCAL_MACHINE \ SOFTWARE\Microsoft \ Windows \ Current-Version \ Explorer \ Advanced \ Folder \ Hi-dden \ SHOWALL”
鼠标右击 “CheckedValue”,选择修改,把数值由1改为0
<3>.防止SYN洪水攻击
HKEY_LOCAL_MACHINE\SYSTEM \ CurrentControlSet \ Services \ Tcpip \ Parameters
新建DWORD值,名为SynAttackProtect,值为2
EnablePMTUDiscovery REG_DWORD 0
NoNameReleaseOnDemand REG_DWORD 1
EnableDeadGWDetect REG_DWORD 0
KeepAliveTime REG_DWORD 300,000
PerformRouterDiscovery REG_DWORD 0
EnableICMPRedirects REG_DWORD 0
<3>.禁止响应ICMP路由通告报文
HKEY_LOCAL_MACHINE\SYSTEM \ CurrentControlSet \ Services \ Tcpip \ Parameters \ Interfaces \ interface
新建DWORD值,名为PerformRouterDiscovery 值为0
<4>.防止ICMP重定向报文的攻击
HKEY_LOCAL_MACHINE\SYSTEM \ CurrentControlSet \ Services \ Tcpip \ Parameters
将EnableICMPRedirects 值设为0
<5>.不支持IGMP协议
HKEY_LOCAL_MACHINE\SYSTEM \ CurrentControlSet \ Services \ Tcpip \ Parameters
新建DWORD值,名为IGMPLevel 值为0
<6>.修改终端服务端口
HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Terminal Server \ Wds \ rdpwd \ Tds \ tcp 找 PortNumber
HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Terminal Server \ WinStations \ RDP-Tcp 找 PortNumber
<7>.禁止IPC空连接
可以利用net use命令建立空连接,进而入侵,还有net view,nbtstat这些都是基于空连接的,禁止空连接就好了.打开注册表,
找到 Local_Machine \ System \ CurrentControlSet \ Control \ LSA-RestrictAnonymous 把这个值改成”1”即可.
<8>.更改TTL值
可以根据ping回的TTL值来大致判断你的操作系统,如:
TTL=107(WINNT);
TTL=108(win2000);
TTL=127或128(win9x);
TTL=240或241(linux);
TTL=252(solaris);
TTL=240(Irix);
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters:DefaultTTL REG_DWORD 0-0xff(0-255
十进制,默认值128) .改成一个莫名其妙的数字如258.
<9>.更改终端端口
3.系统设置
<1>.帐号
“将administrator改名,例子中改为olylinux$”
“取消所有除管理员olylinux$外所有用户属性中的 [远程控制->启用远程控制]/[拒绝拨入]
“设置”终端服务妻配置,只允许 administrators和remote desktop Users”
“将guest改名为administrator并且修改复杂密码”
“除了管理员 olylinux$ 和 网站来宾帐号 , IUSER 以及 IWAM 以及 ASPNET 用户外,禁用其他一切用户.包括 SQL DEBUG 以及 TERMINAL USER 等等”
“除了管理员 olylinux$ 外其他用户都属于 guests 组”
“终端用户都属于remote desktop Users组
<2>.服务
Computer Browser 维护网络计算机更新,禁用;
Distributed File System 局域网管理共享文件,禁用;
Distributed linktracking client 用于局域网更新连接信息,禁用;
Error reporting service 禁止发送错误报告,禁用;
Microsoft Serch 提供快速的单词搜索,禁用;
NTLMSecuritysupportprovide,telnet服务和Microsoft Serch用的,禁用;
PrintSpooler 如果没有打印机可禁用;
Remote Registry 禁止远程修改注册表;
Remote Desktop Help Session Manager 禁止远程协助;
Task scheduler 允许程序在指定时间运行,禁用;
Routing and Remote Access 在局域网以及广域网环境中为企业提供路由服务,禁用;
Removable storage 管理可移动媒体,驱动程序和库,禁用;
Com+ Event System 提供事件的自动发布到订阅COM组件,禁用;
Alerter 通知选定的用户和计算机管理警报,禁用;
Messenger 传输客户端和服务器之间的 NET SEND 和 警报器服务消息,禁用;
Telnet 允许远程用户登录到此计算机并运行程序,禁用;
TCP/IP NetBIOS Helper 禁用;
Workstation 如果服务器不用作域控,我们也可以禁用;(建议 先给所有帐号设置 拒绝远程拨入)
<3>系统
1.关闭137、138、139、445端口
这几个端口都是为共享而开的,是NetBios协议的应用,一般上网用户是不需要别人来共享你的内容的,而且也是漏洞最多的端口。关闭的方法很多,最近从网上学了一 招非常好用,一次全部关闭上述端口。
开始-> 控制面板-> 系统-> 硬件-> 设备管理器-> 查看-> 显示隐藏的设备-> 非即插即用驱动程序-> Netbios over Tcpip。
二.系统服务安全
1.WEB服务
<1>.删除 c:/inetpub
<2>.删除IIS不必要的映射
<3>.每个网站建立各自的访问帐号,并对其WEB目录设置权限,如果是asp.net,还必须给web目录设置aspnet用户权限
<4>.在应用程序配置里,设置调试为向客户端发送自定义的文本信息,这样能对于有ASP注入漏洞的站点,可以不反馈程序报错的信息,能够避免一定程度的攻击.
[当排除问题时,可以先暂时设置默认,便于查找问题;不推举设置]
<5>.自定义HTTP错误选项里,有必要定义下譬如404,500等错误,不过有有时候为了调试程序,好知道程序出错在什么地方,建议只设置404就可以了.
[不推举设置]
<6>.一个应用池最好放十个网站,在应用程序池可以适当设置下“内存回收”:这里的最大虚拟内存为:1000M,最大使用的物理内存为256M,
这样的设置几乎是没限制这个站点的性能.
<7>.在网站或论坛中往往存在类似 uploadfiles/ 或其他需要存在上传文件的目录额外给写的权限,并且在IIS里给这个目录无脚本运行权限,这样即使网站程序出现漏洞.
<8>.防止ACCESS数据库被下载:所在目录在IIS里不给执行脚本权限.然后在IIS里加设置一个映射规律,这里用任意一个dll文件来解析.mdb后缀名的映射,
只要不用asp.dll来解析就可以了.
<9>.IIS6.0要注意的一个问题.”网站” 主目录->配置->选项 “启用父路径”
<10>.为IIS安装 IISSCAN 防护软件,本文最后有其配置文件简要说明,可剩<1>~<8>大多设置,很好的工具.
2.ftp服务
server-u 6.0.2 中文破解版
<1>.不要设置为服务启动即可
<2>.如果非要设置成服务启动(方便): 安装到非系统盘;设置独立服务帐号;安装以及信息目录权限除去”完全控制””取得所有权”外全部给予;
安全设置:
选中“Block “FTP bounce”attack and FXP ” :
当使用FTP协议进行文件传输时,客户端首先向FTP服务器发出一个“PORT”命令,
该命令中包含此用户的IP地址和将被用来进行数据传输的端口号,服务器收到后,利用命令所提供的用户地址信息建立与用户的连接.
大多数情况下,上述过程不会出现任何问题,但当客户端是一名恶意用户时,可能会通过在PORT命令中加入特定的地址信息,
使FTP服务器与其它非客户端的机器建立连接.虽然这名恶意用户可能本身无权直接访问某一特定机器,但是如果FTP服务器有
权访问该机器的话,那么恶意用户就可以通过FTP服务器作为中介,仍然能够最终实现与目标服务,器的连接。这就是FXP,
也称跨服务器攻击,选中后就可以防止发生此种情况.
选中”禁用反超时调度”
选中”高级”->”启用安全”
防止Serv_U6.0.0.2权限提升的方法:(此处为转载)
[在网上看到有不少用Serv_U6.0.0.2提升权限的文章,原来默认的管理帐号密码为l@$ak#.lk;0@P,端口为43958
在ServUDaemon.ini中加上LocalSetupPortNo=12315,可改变默认的管理端口,同时在gpedit.msc中做好IP安全策略,即增加12315端口的阻止,如果不改默认端口,就增加43958端口的阻止,如果”使用设置更改密码”的按钮,即在ServUDaemon.ini中加上LocalSetupPassword=ah6A0ED50ADD0A516DA36992DB43F3AA39
之类的MD5密码,如果对方用ASP木马得到你的ServUDaemon.ini文件,基本上你的系统就完了,解决方案有几个,一是把Serv_U的安装目录权限设为只有ADMIN用户可完全控制,并对GUSETS用户组的拒绝,这样IIS帐号就无法得到ServUDaemon.ini文件,二是用UD之类的十六进制工具修改SU.EXE文件,找到l@$ak#.lk;0@P这个,修改成强密码”这是谁设的密码,什么版本都一样,我晕”,如果不设置LocalSetupPassword的话,默认的空密码就是程序中的l@$ak#.lk;0@P,三是阻止43958端口的访问,方法还有好多,要结合整个系 统来设定]-(测试机端口改为40623,并且在BlackIce中做了端口阻止)
3.MSSQL/MYSQL数据库
MSSQL数据库
操作特例:
<1>如何利用远程来导入备份的数据库(恢复数据库):
环境:
A 为需要恢复的SQL数据库 DATA
B 为预备要恢复到A的SQL数据库 DATA
1.首先在B中将 DATA 生成 SQL脚本
利用查询分析器远程以A 中SQL数据库DATA的所有者登陆
打开B机中DATA生成的SQL脚本,保存,点击”对号”
2.在B中利用导出功能,按照提示默认将数据库导入到A中即可.
安全:
删除有安全隐患的扩展:
exec sp_dropextendedproc ‘xp_cmdshell’ [删除此项扩展后,将无法远程连接数据库]
exec sp_dropextendedproc ‘xp_dirtree’ [删除此项扩展后,将无法新建或附加数据库]
exec sp_dropextendedproc ‘xp_enumgroups’
exec sp_dropextendedproc ‘xp_fixeddrives’ [删除此项扩展后,将无法还原数据库]
exec sp_dropextendedproc ‘xp_loginconfig’
exec sp_dropextendedproc ‘xp_regaddmultistring’
exec sp_dropextendedproc ‘xp_regdeletekey’
exec sp_dropextendedproc ‘xp_regdeletevalue’
exec sp_dropextendedproc ‘xp_regread’ [删除此项扩展后, 还原数据库辅助]
exec sp_dropextendedproc ‘xp_regremovemultistring’
exec sp_dropextendedproc ‘xp_regwrite’
exec sp_dropextendedproc ‘xp_enumerrorlogs’
exec sp_dropextendedproc ‘xp_getfiledetails’
exec sp_dropextendedproc ‘xp_regenumvalues’
恢复扩展
exec sp_addextendedproc ‘xp_cmdshell’, ‘xplog70.dll’
exec sp_addextendedproc ‘xp_dirtree’, ‘xpstar.dll’
exec sp_addextendedproc ‘xp_enumgroups’, ‘xplog70.dll’
exec sp_addextendedproc ‘xp_fixeddrives’, ‘xpstar.dll’
exec sp_addextendedproc ‘xp_loginconfig’, ‘xplog70.dll’
exec sp_addextendedproc ‘xp_regaddmultistring’, ‘xpstar.dll’
exec sp_addextendedproc ‘xp_regdeletekey’, ‘xpstar.dll’
exec sp_addextendedproc ‘xp_regdeletevalue’, ‘xpstar.dll’
exec sp_addextendedproc ‘xp_regread’, ‘xpstar.dll’
exec sp_addextendedproc ‘xp_regremovemultistring’, ‘xpstar.dll’
exec sp_addextendedproc ‘xp_regwrite’, ‘xpstar.dll’
exec sp_addextendedproc ‘xp_enumerrorlogs’, ‘xpstar.dll’
exec sp_addextendedproc ‘xp_getfiledetails’, ‘xpstar.dll’
exec sp_addextendedproc ‘xp_regenumvalues’, ‘xpstar.dll’mysql数据库
为其建立独立服务帐户,属于GUESTS组,服务中进行设置;在其安装目录添加此用户,并设置[修改]读取和运行][列出文件夹目录][读取][写入],去掉高级中”允许父项的….”对钩,选择”用在此显示的…”对钩,应用.启动MYSQL,此时便以此帐户运行.三.系统权限设置
1.系统分区 (以下所有针对目录权限操作后,都是去掉高级中”允许父项的….”对钩,选择”用在此显示的…”对钩,应用.)
支持环境:asp;asp.net;php
/ (根权限)
administrators 应用到:该文件夹,子文件夹及文件
权限:完全控制;
CREATOR OWNER 应用到:只有子文件夹及文件
权限:完全控制 (此操作在”高级”中设置)
SYSTEM 应用到:该文件夹,子文件夹及文件
权限:完全控制
设置: 用在此显示的可以应用到子对象的项目替代所有子对象的权限项目
/Program Files\Common Files
添加
everyone 读取和运行
列出文件夹目录
读取
/windows
添加
Users 读取和运行
列出文件夹目录
读取
/windows/temp
去掉users 遍历文件夹/运行文件
创建文件/写入数据
创建文件夹/附加数据
[然后进入高级将“遍历文件夹/运行文件”去掉”]
/windows/Microsoft.NET [如果你要运行aspx网站]
给users组加 遍历文件夹/运行文件
创建文件/写入数据
创建文件夹/附加数据
/php [假如在C:\下有此目录”支持PHP”]安装PHP时注意要将DLL文件全部COPY到SYSTEM32下.
添加
IIS匿名用户所属组 读取和运行
列出文件夹目录
读取
设置终端帐户
例如,
1.C:\Documents and Settings 目录权限为:
administrator 权限为: 完全控制
systen 权限为:完全控制
Remote Desktop Users 权限为: 高级->
应用于:只有该文件夹
权限:列出文件夹/读取数据
读取属性
读取扩展属性
读取权限
选择 用在此显示。。。。。 应用
2.设置完1后,开始 利用建立的 合租帐户登陆。会在 C:\Documents and Settings 下自动生成 用户目录
这是我们查看权限 其中包括 administrators组 system组 合租帐户
3.细化 合租用户 目录权限
adminisrators组 权限: 完全控制
删除sysrem组
合租用户 权限: 高级->
应用于:只有该文件夹
权限:列出文件夹/读取数据
读取属性
读取扩展属性
读取权限
选择 用在此显示。。。。。 应用
4.进入 合租用户 目录中 , 给 桌面 添加 合租用户 权限 为 应用于:该文件夹,子文件夹及文件
权限:列出文件夹/读取数据
读取属性
读取扩展属性
读取权限
用户文件目录权限及上层权限设置:[假设e为用户文件目录]
例如:E:\wwwroot\合租用户文件 这里给 E:\ 管理员用户 应用到:该文件夹,子文件夹及文件
权限:完全控制
Remote Desktop Users 应用到:该文件夹,子文件夹及文件
权限:列出文件夹/读取数据
读取属性
读取扩展属性
读取权限
作用:可以让终端用户删除建立自己的文件,根权限作用.
E:\wwwroot\合租用户文件 这里给 管理员用户 应用到:该文件夹,子文件夹及文件
权限:完全控制
合租用户文件 :应用到:该文件夹,子文件夹及文件
列出文件夹/读取数据
读取属性
读取扩展属性
读取权限
说明:这里将终端组权限去掉了,其他user-?目录都去掉,防止彼此间互相访问
E:\wwwroot\合租用户文件\www 这里给 管理员用户 应用到:该文件夹,子文件夹及文件
权限:完全控制
iis-user-1 应用到:该文件夹,子文件夹及文件
权限:给予除去”完全控制””遍历文件夹/运行文件””删除子文件夹及文件””取得所有权”的所有权限
合租用户 应用到:只有子文件夹及文件
权限:给予除去”完全控制””遍历文件夹/运行文件””取得所有权”的所有权限
合租用户 应用到:只有该文件夹
权限:给予除去”完全控制””遍历文件夹/运行文件””删除子文件夹及文件””删除””更改权限””取得所有权”的所有权限
ASP.NET 应用到:该文件夹,子文件夹及文件
权限:给予除去”遍历文件夹/运行文件””删除子文件夹及文件””取得所有权”的所有权限
IIS_WPG 同上
2.其他分区
都以administrators 设置: 用在此显示的可以应用到子对象的项目替代所有子对象的权限项目 设置 / 目录
网站所在目录赋予来宾帐号权限
3.特别工具权限设置(设置完以上权限后,此脚本必须运行,安全性会更有提高)
写一个批处理文件如下
Cacls.exe %SystemRoot%\System32\cmd.exe /e /R system users
Cacls.exe %SystemRoot%\System32\net.exe /e /R system users
Cacls.exe %SystemRoot%\System32\net1.exe /e /R system users
Cacls.exe %SystemRoot%\System32\tftp.exe /e /R system users
Cacls.exe %SystemRoot%\System32\at.exe /e /R system users
Cacls.exe %SystemRoot%\System32\telnet.exe /e /R system users
cacls.exe %SystemRoot%\System32\shell32.dll /e /R users
cacls.exe %SystemRoot%\System32\netstat.exe /e /R system users
cacls.exe %SystemRoot%\System32\nbtstat.exe /e /R system users
cacls.exe %SystemRoot%\System32\reged32t.exe /e /R system users
cacls.exe %SystemRoot%\regedit.exe /e /R system users
cacls.exe %SystemRoot%\System32\attrib.exe /e /R system users
cacls.exe %SystemRoot%\System32\ftp.exe /e /R system users
cacls.exe %SystemRoot%\System32\cscript.exe /e /R system users
cacls.exe %SystemRoot%\System32\ddeshare.exe /e /R system users
cacls.exe %SystemRoot%\System32\debug.exe /e /R users
cacls.exe %SystemRoot%\System32\ddeshare.exe /e /R users
cacls.exe %SystemRoot%\System32\hostname.exe /e /R system users
cacls.exe %SystemRoot%\System32\msppcnfg.exe /e /R system users
cacls.exe %SystemRoot%\System32\mstsc.exe /e /R system users
cacls.exe %SystemRoot%\System32\netsh.exe /e /R system users
cacls.exe %SystemRoot%\System32\nslookup.exe /e /R system users
cacls.exe %SystemRoot%\System32\regedt32.exe /e /R system users
cacls.exe %SystemRoot%\System32\regsvr32.exe /e /R system users
cacls.exe %SystemRoot%\System32\sc.exe /e /R users
cacls.exe %SystemRoot%\System32\shadow.exe /e /R users
cacls.exe %SystemRoot%\System32\share.exe /e /R system users
cacls.exe %SystemRoot%\System32\cacls.exe /e /R system users
(这里有users的原因是因为/windows有此组权限,如果不去掉的话,终端用户依然可以进入cmd)
让终端用户登陆后,看吧,很好的效果哦,呵呵四.系统组件调试
利用阿讲最新探针,测试环境.常用组件:
FSO组件:
安装与删除方法:
windows98系统
在DOS命令行状态输入以下命令:
关闭命令:RegSvr32 /u C:\WINDOWS\SYSTEM\scrrun.dll
打开命令:RegSvr32 C:\WINDOWS\SYSTEM\scrrun.dll
win2000系统:
在CMD命令行状态输入以下命令:
关闭命令:RegSvr32 /u C:\WINNT\SYSTEM32\scrrun.dll
打开命令:RegSvr32 C:\WINNT\SYSTEM32\scrrun.dll
win2003:
运行regsvr32 scrrun.dll即可。
如果想关闭FSO组件,请运行 regsvr32 /u scrrun.dll即可。
Aspjpeg1.5组件:
说明:支持 JPEG, GIF, BMP, TIFF , PNG 格式. 输出格式为 JPEG.
输入来源可以是磁盘,内存或者记录集(recordset).
图片可以输出到磁盘,内存或者http流.
支持三种更改大小方式: nearest-neighbor, bilinear, and bicubic.
可以在图片之上添加图片或者文字.
支持图中图.
支持复制,反转,旋转,锐化,灰度调节.
可以调节压缩比率,以得到最佳输出效果和大小.
从jpeg图片中抽取EXIF 和 IPTC数据.
安装与删除方法:
1.有EXE安装程序,直接安装即可.
2.通过DLL安装方法:(转载)
如果以前装过其他版本的aspjpeg,需要先停止iis(net stop iisadmin /y),卸载原来的组件(regsvr32 /u c:/windows/system32/aspjpeg.dll),然后重起iis (net start w3svc)
从aspjpeg1.4的安装目录复制aspjpeg.dll到系统文件加的system32目录
运行regsvr32 c:/windows/system32/aspjpeg.dll (根据你的系统改你的目录)
aspjpeg的文档中说需要官方提供的序列号才能正常使用,如果安装过程中有输入序列号
在asp中运行下面的命令更改序列号(如果没有输入过,需要在注册表中添加如下项:HKEY_LOCAL_MACHINE\Software\Persits Software\AspJpeg\RegKey)
程序代码: [ 复制代码 ] [ 运行代码 ]
Set Jpeg = Server.CreateObject(“Persits.Jpeg”)
Jpeg.RegKey = “你的序列号”
可以用下面的方式查看是否注册成功:
程序代码: [ 复制代码 ] [ 运行代码 ]
Set Jpeg = Server.CreateObject(“Persits.Jpeg”)
Response.Write Jpeg.Expires
我没有注册,运行了这则代码,得到的结果是2005-1-19 19:15:49。意思好像是可以使用到1月19日。
如果注册成功得到的应该是9/9/9999。我用48958-77556-02411注册以后得到了9999-9-9这个结果:)操作系统时间显示方式有所不同。
以下是aspjpeg1.4的安装文件,dll文件和序列号
直接安装只要在aspjpeg1.4.exe安装过程中输入序列号即可,但是可能会出现ntfs目录访问权限的问题,需要手动设置安装目录对Everyone有访问权限。(olylinux:我这里是最底users组权限,正常)
ADODB.Stream组件
说明:无组件上传
安装与删除方法:
regsvr32 “C:\Program Files\Common Files\System\ado\msado15.dll”
regsvr32 /u “C:\Program Files\Common Files\System\ado\msado15.dll”
JMail.SmtpMail组件
说明:Dimac JMail 邮件收发
安装方法:利用阿江探针->组件 就有其相关信息,下载安装即可.
CDONTS组件
说明:感觉是辅助JMAIL的,具体我也不清楚
安装删除方法:
2003也能用的,只不过,得找个cdonts.dll(组件文件,可以复制2000里的)
将该文件拷贝至 C:\WINDOWS\system32 下;开始 -> 运行 -> Regsvr32 cdonts.dll; 确认
删除 Regsvr32 /u cdonts.dll杀毒软件问题
MACFEE 杀毒软件造成IIS站点‘请求的资源在使用中’运行regsvr32 jscript.dll和 regsvr32 vbscript.dll重新注册JAVA脚本和VB脚本的动态链接库后一切正常以下为urlscan配置
[options]
UseAllowVerbs=1 ; If 1, use [AllowVerbs] section, else use the
; [DenyVerbs] section.UseAllowExtensions=0 ; If 1, use [AllowExtensions] section, else use
; the [DenyExtensions] section.NormalizeUrlBeforeScan=1 ; If 1, canonicalize URL before processing.
VerifyNormalization=1 ; If 1, canonicalize URL twice and reject request
; if a change occurs.AllowHighBitCharacters=0 ; If 1, allow high bit (ie. UTF8 or MBCS)
; characters in URL.AllowDotInPath=0 ; If 1, allow dots that are not file extensions.
RemoveServerHeader=0 ; If 1, remove the ‘Server’ header from response.
EnableLogging=1 ; If 1, log UrlScan activity.
PerProcessLogging=1 ; If 1, the UrlScan.log filename will contain a PID
; (ie. UrlScan.123.log).AllowLateScanning=0 ; If 1, then UrlScan will load as a low priority
; filter.PerDayLogging=1 ; If 1, UrlScan will produce a new log each day with
; activity in the form ‘UrlScan.010101.log’. [这里已经改为1,返回IIS默认错误页]UseFastPathReject=1 ; If 1, then UrlScan will not use the
; RejectResponseUrl or allow IIS to log the request.LogLongUrls=0 ; If 1, then up to 128K per request can be logged.
; If 0, then only 1k is allowed.;
; If UseFastPathReject is 0, then UrlScan will send
; rejected requests to the URL specified by RejectResponseUrl.
; If not specified, ‘/<Rejected-by-UrlScan>’ will be used.
;RejectResponseUrl=
;
; LoggingDirectory can be used to specify the directory where the
; log file will be created. This value should be the absolute path
; (ie. c:\some\path). If not specified, then UrlScan will create
; the log in the same directory where the UrlScan.dll file is located.
;LoggingDirectory=C:\WINDOWS\system32\inetsrv\urlscan\logs
;
; If RemoveServerHeader is 0, then AlternateServerName can be
; used to specify a replacement for IIS’s built in ‘Server’ header
;AlternateServerName=
[RequestLimits]
;
; The entries in this section impose limits on the length
; of allowed parts of requests reaching the server.
;
; It is possible to impose a limit on the length of the
; value of a specific request header by prepending “Max-” to the
; name of the header. For example, the following entry would
; impose a limit of 100 bytes to the value of the
; ‘Content-Type’ header:
;
; Max-Content-Type=100
;
; To list a header and not specify a maximum value, use 0
; (ie. ‘Max-User-Agent=0’). Also, any headers not listed
; in this section will not be checked for length limits.
;
; There are 3 special case limits:
;
; – MaxAllowedContentLength specifies the maximum allowed
; numeric value of the Content-Length request header. For
; example, setting this to 1000 would cause any request
; with a content length that exceeds 1000 to be rejected.
; The default is 30000000.
;
; – MaxUrl specifies the maximum length of the request URL,
; not including the query string. The default is 260 (which
; is equivalent to MAX_PATH).
;
; – MaxQueryString specifies the maximum length of the query
; string. The default is 2048.
;MaxAllowedContentLength=30000000
MaxUrl=260
MaxQueryString=2048[AllowVerbs]
;以下为网站中表单或注册功能的提交方式(允许的)如果有其他提交方式,可以在[DenyVerbs]下多余的提交方式前加分号,然后在补充到下面
; The verbs (aka HTTP methods) listed here are those commonly
; processed by a typical IIS server.
;
; Note that these entries are effective if “UseAllowVerbs=1”
; is set in the [Options] section above.
;GET
HEAD
POST[DenyVerbs]
;
; The verbs (aka HTTP methods) listed here are used for publishing
; content to an IIS server via WebDAV.
;
; Note that these entries are effective if “UseAllowVerbs=0”
; is set in the [Options] section above.
;PROPFIND
PROPPATCH
MKCOL
DELETE
PUT
COPY
MOVE
LOCK
UNLOCK
OPTIONS
SEARCH[DenyHeaders]
;
; The following request headers alter processing of a
; request by causing the server to process the request
; as if it were intended to be a WebDAV request, instead
; of a request to retrieve a resource.
;Translate:
If:
Lock-Token:
Transfer-Encoding:[AllowExtensions]
;此下为允许的扩展名,但必须建立在[DenyExtensions]中扩展名加“;”的前提下,即忽略的前提下]
; Extensions listed here are commonly used on a typical IIS server.
;
; Note that these entries are effective if “UseAllowExtensions=1”
; is set in the [Options] section above.
;.htm
.html
.txt
.jpg
.jpeg
.gif
.asp
.php
.aspx[DenyExtensions]
;此下全部为不允许的扩展名
; Extensions listed here either run code directly on the server,
; are processed as scripts, or are static files that are
; generally not intended to be served out.
;
; Note that these entries are effective if “UseAllowExtensions=0”
; is set in the [Options] section above.
;
; Also note that ASP scripts are denied with the below
; settings. If you wish to enable ASP, remove the
; following extensions from this list:
; .asp
; .cer
; .cdx
; .asa
;; Deny ASP requests [这里是不允许访问的扩展名,可以加“;”号去掉,然后[AllowExtensions]下添加允许]
;.asp
.cer
.cdx
;.asa; Deny executables that could run on the server
.exe
.bat
.cmd
.com; Deny infrequently used scripts
.htw ; Maps to webhits.dll, part of Index Server
.ida ; Maps to idq.dll, part of Index Server
.idq ; Maps to idq.dll, part of Index Server
.htr ; Maps to ism.dll, a legacy administrative tool
.idc ; Maps to httpodbc.dll, a legacy database access tool
.shtm ; Maps to ssinc.dll, for Server Side Includes
.shtml ; Maps to ssinc.dll, for Server Side Includes
.stm ; Maps to ssinc.dll, for Server Side Includes
.printer ; Maps to msw3prt.dll, for Internet Printing Services
.cer
.cdx
.mdb; Deny various static files
.ini ; Configuration files
.log ; Log files
.pol ; Policy files
.dat ; Configuration files[DenyUrlSequences]
.. ; Don’t allow directory traversals
./ ; Don’t allow trailing dot on a directory name
\ ; Don’t allow backslashes in URL
: ; Don’t allow alternate stream access
% ; Don’t allow escaping after normalization
& ; Don’t allow multiple CGI processes to run on a single request -
防止DDOS,也可以防止70%的SYN半连接攻击
做传奇时候的文章,也是有些时间没看了 现在发布上来吧
首先声明.这样设置后,可以防止DDOS,也可以防止70%的SYN半连接攻击|
首先对你机器做以下的设置 !
用本地安全策略封掉所有不属于传奇开放端口,封的方法见网络上,很多,
就是封3000的办法 ! 你传奇服务器内部可以访问,.但不对外,
然后打开 7000. 7100 7200 端口 ! (记得不要封掉)
然后去下载个硬件防火墙软件模拟工具 ! (哈哈,有这个吗 ?)
名字叫MapPort 端口影射工具 !
打开,输入第一组隐射组
7000 – > 30000(LoginGate)
7100 – > 31000(SelChrGate)
7200 – > 32000(RunGate)
简单的说明下,在这里,7000 7100 7200 只做对外开放的端口,不是传奇真正的端口,
被软件影射后,传奇真正的端口就变为 30000(LoginGate) ,31000(SelChrGate),32000(RunGate)
因为这些端口只作为内部访问,外部访问是用软件从7000 7100 7200 端口隐射进来的,所以可以正常工
作
记得传奇哪三个网关的端口也要改
这样设置就完毕了,.
打开MapPort 我们对其进行设置 !
在安全中,可以设置: 最大连接, 单个IP连接, 黑名单设置 !
最大连接:
7000 – > 30000(LoginGate) 设置为 40 单个IP连接设置为:20
7100 – > 31000(SelChrGate) 设置为 30 单个IP连接设置为:20
7200 – > 32000(RunGate) 设置为 1000 单个IP连接设置为:20
这样我们可以有效的防止DDOS,或其他的变种攻击 !
防御SYN攻击!
在黑名单中可以设置封IP段,这个要麻烦点 !
依次加入不存在的IP地址:
193.0.0.1 – 193.255.255.254
194.0.0.1 – 194.255.255.254
66.0.0.1 – 66.255.255.254
30.0.0.1 – 30.255.255.254
这个只作为参考,还有很多,自己加进去
依照你自己的思维能力加进不存在或根本没这个IP连接你的地址! 都写进去 (不要怕,虽然多,但可以保
存)
设置完毕后,你可以下载一个打击傲盾盗板防火墙测试下,
我测试为:
没这样做,攻击7000端口 ! CPU在一会时间持续100% 游戏暴卡,鼠标不能流畅的动起来,
在运行中输入 NETSTAT -A 提示系统资源不足 !
按照设置后攻击 :7000端口,
攻击,CPU资源不动 ! 游戏正常 !
查看日志,可以看到被阻拦的IP地址 !
还有,这个可以按照你的标准,可以在三个端口封玩家IP地址 ! -
yeswan武林三国的安装与卸载
这个论坛插件是一款WEB游戏,可以让开论坛的站长赚钱的一款插件,虽然本人没有玩这款游戏,但是WEB游戏也是一种趋势,越来越多的人会加入进来的,昨天也安装了这款插件,但是不小心输入错误API码,无奈查看yeswan.php文件(我安装的是DISCUZ),发现这款插件是有卸载命令的,并且找到了这款插件的配置文件,但是鉴于多种论坛的多种配置文件的存放我并不清楚,就只说下安装与卸载,我认为这个是通用的。
在说明文件中介绍的安装方法
安装
1.复制相应字符集的yeswan.php文件到您论坛的根目录下
2.访问安装地址:http://您的论坛地址/yeswan.php?action=install
3.正确填写并提交表单在提交的action中,其实是可以使用uninstall来进行卸载的
if($_GET[‘action’] == ‘install’ || $_GET[‘action’] == ‘uninstall’) {
if($yw_userinfo[‘isadmin’] != 1) {
exit(‘您没有权限安装/卸载此插件’);
}访问卸载地址:http://您的论坛地址/yeswan.php?action=uninstall
-
圣诞节,你会祷告嘛?
以前每到圣诞都会去教堂,但是目的只是去那里游玩,因为圣诞夜的教堂会有很多人,我从来没有做过祷告,因为那是我还未相信。今年的圣诞马上就要来了,我还是要去教堂的,但是我依然没有相信,或许是我仍然试图依靠自己的力量寻找生命的方向,或许是认为老的时候信主会比较划算。但是我并不否认,我不是一个无神论者。下面是抄来的祈祷词大家看下吧。
祷告是信心的体现,藉此把生命交给耶稣基督。
祷告,就是对神说话。神认识你 。对祂来说,最重要的是你的心,你的恳切。你可以这样祷告:
“主耶稣,我感谢你的爱,感谢你来到这个世界,以及为我而死。我承认,直到今日,我试图依靠自己的力量寻找生命的方向;我承认我在你面前是罪人。现在,我愿信靠你,我愿接受你引领我的生命。感谢你宽恕我的罪,请你造就我,让我成为你所喜悦的。感谢你回应我的祷告,感谢你来到我生命中。阿门。”
你愿意如此向神祷告吗?
如果你愿意的话,现在就向祂祷告,
而耶稣基督就会如同祂所承诺的,来到你的生命当中。 -
禁用wordpress文章版本管理功能和删除已有的历史记录文章版本
禁用 WordPress 文章版本管理功能
之前是用 define(‘WP_POST_REVISIONS’, false);
不过2.7更新出来WPchina.org的写法是
/**
* WordPress 版本管理功能
*
* 对于绝大多数网友而言,并不需要版本管理功能。你可以在这里关闭此功能。
* 当参数 n = -1 时,保留所有文章/页面的修订版本;这是默认值;
* 当参数 n = 0 时,保留0次文章/页面的修订版本,即关闭该功能;
* 当参数 n > 0 时,保留n次文章/页面的修订版本。
*
* @added by WPChina.org
*/
define(‘WP_POST_REVISIONS’, ‘-1’);删除 WordPress 已有的文章版本历史
这个是比较头疼的问题,虽然关闭了版本但是以前的文章版本却还是存在的,在网上找到SQL语句,可以删除历史文章版本,经过使用确实能够删除。
DELETE FROM wp_postmeta WHERE post_id IN (SELECT id FROM wp_posts WHERE post_type = ‘revision’);
DELETE FROM wp_term_relationships WHERE object_id IN (SELECT id FROM wp_posts WHERE post_type=’revision’);
DELETE FROM wp_posts WHERE post_type=’revision’;
另外需要注意的是MYSQL4是不能用的,我的空间恰恰是MYSQL4,无奈之前把数据库搬到自己电脑上去升级。MYSQL4到MYSQL5是挺容易的 MYSQL5到MYSQL4却费了半天劲,首先需要去掉一个 SQL_MODE=”NO_AUTO_VALUE_ON_ZERO”; 另外MYSQL4是不支持编码的 WORDPRESS是UTF8的编码 所以还要去掉DEFAULT CHARSET=utf8 ,至此删除干净历史遗留问题,心情顺畅。
-
SNS社区里面的小游戏
今天安装了一款SNS源码,里面带了一些小游戏,买卖好友,抢车位,都是我比较喜欢玩的,不过可能因为天生不喜交友,拉了半天SNS里面只有几个人,要是我做交友社区会怎么样呢,想想就愁人啊,呵呵。做个小广告吧,在我的这篇文章里做个我SNS社区的链接,至于在哪里就不明着写出来了,说不定哪天就关张大吉了,虽然我很希望它能火起来。