月度归档:2012年03月

ThinkPHP3.0版本引入了全新的CBD(核心+行为+驱动)架构模式

ThinkPHP3.0版本引入了全新的CBD核心Core+行为Behavior+驱动Driver)架构模式,因为从底层开始,框架就采用核心+行为+驱动的架构体系,核心保留了最关键的部分,并在重要位置设置了标签用以标记,其他功能都采用行为扩展和驱动的方式组合,开发人员可以根据自己的需要,对某个标签位置进行行为扩展或者替换,就可以方便的定制框架底层,也可以在应用层添加自己的标签位置和添加应用行。而标签位置类似于AOP概念中的“切面”,行为都是围绕这个“切面”来进行编程,如果把系统内置的核心扩展看成是一种标准模式的话,那么用户可以把这一切的行为定制打包成一个新的模式,所以在ThinkPHP里面,称之为模式扩展,事实上,模式扩展不仅仅可以替换和增加行为,还可以对底层的MVC进行替换和修改,以达到量身定制的目的。利用这一新的特性,开发人员可以方便地通过模式扩展为自己量身定制一套属于自己或者企业的开发框架,新版的模式扩展是框架扩展的集大成者,开创了新的里程碑,这正是新版的真正魅力所在。



win环境下虚拟主机配置

为了方便在自己的电脑上开发,我们在自己环境里配置一个虚拟主机,

以appserv为例(本人安的是集成环境appserv,本人安装在C 盘)

httpd.conf最后加上:

用host文件做解析

找到C:/Windows/System32/drivers/etc/hosts
在结尾加上:

记得要重启apache

在cmd运行里

net stop apache2.2

net start apache2.2

这样两个虚拟主机配好了,以此类推……

如何删除win7多余的系统启动项。

最近很困扰这个问题,前天在winxp下重安装了一个win7 ,之前是在F安装的现在我想把它安在E盘。由于把之前有win7的那个分区格式化了。可是系统中却留下了一个难以删去的系统启动项,这个可麻烦了。

网上搜了一下  :说win7已经没有像xp那么简单的boot.ini让我们修改了,取而代之的是bcdedit,开始以为这个东西很复杂,摸索了一下,发现还是蛮简单的,现在就简单的说下bcdedit的常规应用吧.
开始,运行,输入bcdedit /?可以看到帮助.对微软help比较感冒的同学可以多看看,反正我是很不感冒的说…
ok,简单的应用开始.无论是修改,删除启动菜单,实际上我们都需要做一件事,那就是在开始,运行,cmd里输入以下命令.
复制内容到剪贴板                              程序代码
bcdedit /enum >>c:list.txt

因为win7的bcdedit基本都是用id方式来代表启动名称的,如果不把这些信息输出到文档来操作,那就太麻烦了,如果不理解,没关系,照做就ok了.

现在分享给给大家这个一个方法解决吧!

 A.鼠标右键单击“开始→附件→命令提示符”,右击选择“以管理员身份运行”,这样,就打开了管理员身份的命令行程序;

      B.在“命令提示符”里输入“bcdedit.exe”并回车,可以查看到现有的两个(或者多个)启动项菜单的具体内容,找到废弃系统下resumeobject行类似{572bcd56-ffa7-11d9-aae0-0007e994107d}的代码。

          C.然后输入bcdedit / delete {代码},即可删除这个废弃的菜单。

          此方法还有一个更简单的操作方法:运行框输入cmd,再输入bcdedit /delete {ntldr} /f,回车即可。

如何按日期生成apache日志文件及限制apache日志文件大小

用到apache自带的rotatelogs小工具

语法如下:
rotatelogs [ -l ] logfile [ rotationtime [ offset ]] | [ filesizeM ]

参数解释:
-l :使用本地时间代替GMT时间作为时间基准。注意:在一个改变GMT偏移量(比如夏令时)的环境中使用-l会导致不可预料的结果。
logfile:它加上基准名就是日志文件名。如果logfile中包含”%”,则它会被视为用于strftime()的格式字符串;否则它会被自动加上以秒为单

位的”.nnnnnnnnnn”后缀。这两种格式都表示新的日志开始使用的时间。
rotationtime :日志文件滚动的以秒为单位的间隔时间。
offset :相对于UTC的时差的分钟数。如果省略,则假定为”0″并使用UTC时间。比如,要指定UTC时差为”-5小时”的地区的当地时间,则此参数

应为”-300″。
filesizeM :指定以filesizeM文件大小滚动,而不是按照时间或时差滚动。

例子:
1、按时间滚动日志文件:
错误日志:ErrorLog “|/data/apache/bin/rotatelogs 日志存放目录/%Y%m%d_error.log 86400 480”
访问日志:CustomLog “|/data/apache/bin/rotatelogs 日志存放目录/%Y%m%d_access.log 86400 480” common

其中:
/data/apache:为apache的安装目录,根据自己实际情况确定;
86400:秒,24小时,表示生成的日志文件按天滚动,也就是每天生成一个日志文件;
480:分,时间偏移。
同理可以按小时滚动日志文件,每隔一个小时,几个小时。。。生成一个日志文件。

扩展:可以写个脚本定时删除日志文件,只保留几天的日志,如果网站访问量比较大,一天会生成几十上百M甚至更大的日志文件,既占硬盘又影响服务器性能。

2、按大小滚动日志文件:
错误日志:ErrorLog “|/data/apache/bin/rotatelogs -l 日志存放目录/%Y%m%d_error.log 5M”
访问日志:CustomLog “|/data/apache/bin/rotatelogs -l 日志存放目录/%Y%m%d_access.log 5M” common

当日志文件达到5M时,滚动该日志文件。

 

apache日志管理

web服务器日志轮循比较好的方式有三种:
第一种方法是利用Linux系统自身的日志文件轮循机制:logrotate;
第二种方法是利用apache自带的日志轮循程序rotatelogs;
第三种是使用在apache的FAQ中推荐发展已经比较成熟的一个日志轮循工具cronolog。

这里我给大家带来的是用apache自带的日志轮循程序rotatelogs,并用shell脚本定期删除日志文件,只保留近3天的文件,以免日志文件占满
磁盘空间。
修改主配置文件httpd.conf
找到以下内容,并修改成:
ErrorLog /var/log/httpd/error_log
CustomLog “|/usr/local/apache2/bin/rotatelogs  /var/log/httpd/access_log 86400 400M” combined
86400    —日志滚动的时间是一天
400      —日志文件最大400M就滚动
combined —采用复合格式

然后建立清除日志文件的shell脚本,文件名为clean_log
#! /bin/bash
logdir=/var/log/httpd
cd ${logdir}
declare -i filesum=ls access_log.* | wc -l
declare -i delnum=$filesum-3
if [ “${delnum}” -ge 1 ];then
rm -rf ls -tr access_log.* | head -${delnum}
fi

chmod 755 clean_log
这样就保留了最近3天的日志文件。

建立自动化任务
01 04 * * * /usr/local/crontab/clean_log
ok,搞定,就这么简单。这样你就不用不必为日见增大的日志文件烦恼了!

vps上配置虚拟主机virtualhost

vps上配置虚拟主机(相同ip相同端口不同域名) 网站根目录放在data下的websites下的htdocs目录 日志文件放在data下的logs目录(error_log  access_log),每天自动生成一个日志以当天的日期来命名便于查找 httpd.conf文件的主要配置如下: 注意www.zzs.me是我网站的域名

下面以百度为例子配置

有关日志的说明请点击下面的链接

<a title=”如何按日期生成apache日志文件及限制apache日志文件大小” href=”http://www.zzs.me?p=667″ target=”_blank”>如何按日期生成apache日志文件及限制apache日志文件大小</a>

在搭建环境时页面出现空白问题……

在搭建环境时出现问题如下:页面出现空白

重启apache出现:

(98)Address already in use: make_sock: could not bind to address [::]:80
(98)Address already in use: make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down
Unable to open logs

 

上google把那些代码打上去一搜,大概意思是80端口占用,解决方法如下:
[root@CentOS62 ~]# /usr/local/apache2/bin/apachectl restart
httpd not running, trying to start
(98)Address already in use: make_sock: could not bind to address 1.2.3.4:80
no listening sockets available, shutting down
Unable to open logs
[root@CentOS62 ~]# vi /etc/httpd/httpd.conf
[root@CentOS62 ~]# /usr/local/apache2/bin/apachectl restart
httpd not running, trying to start
(98)Address already in use: make_sock: could not bind to address [::]:80
(98)Address already in use: make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down
Unable to open logs
[root@CentOS62 ~]# netstat -lnp | grep 80
tcp 0 0 :::80 :::* LISTEN 7264/httpd
[root@CentOS62 ~]# ps 7264
PID TTY STAT TIME COMMAND
7264 ? Sl 0:01 /usr/local/apache2/bin/httpd -k restart
[root@CentOS62 ~]# kill 7264
[root@CentOS62 ~]# ps 7264
PID TTY STAT TIME COMMAND
7264 ? Sl 0:01 /usr/local/apache2/bin/httpd -k restart
[root@CentOS62 ~]# kill -9 7264
[root@CentOS62 ~]# ps 7264
PID TTY STAT TIME COMMAND
[root@CentOS62 ~]# ps 7264
PID TTY STAT TIME COMMAND
[root@CentOS62 ~]# netstat -lnp | grep 80
tcp 0 0 :::80 :::* LISTEN 13463/httpd
[root@CentOS62 ~]# ps 13463
PID TTY STAT TIME COMMAND
13463 ? Sl 0:01 /usr/local/apache2/bin/httpd -k restart
[root@CentOS62 ~]# netstat -lnp | grep 80
tcp 0 0 :::80 :::* LISTEN 13463/httpd
[root@CentOS62 ~]# ps 13463
PID TTY STAT TIME COMMAND
13463 ? Sl 0:01 /usr/local/apache2/bin/httpd -k restart
[root@CentOS62 ~]# kill 13463
[root@CentOS62 ~]# ps 13463
PID TTY STAT TIME COMMAND
13463 ? Sl 0:01 /usr/local/apache2/bin/httpd -k restart
[root@CentOS62 ~]# kill -9 13463
[root@CentOS62 ~]# ps 13463
PID TTY STAT TIME COMMAND
[root@CentOS62 ~]# netstat -lnp | grep 80
[root@CentOS62 ~]# netstat -lnp | grep 80
[root@CentOS62 ~]# netstat -lnp | grep 80
[root@CentOS62 ~]# /usr/local/apache2/bin/apachectl start

 

经过一周折,phpinfo 解析了!!

Ext4,Ext3的特点和区别

今天装centos6.2的时候,自定义分区tf

Linux kernel 自 2.6.28 开始正式支持新的文件系统 Ext4。 Ext4 是 Ext3 的改进版,修改了 Ext3 中部分重要的数据结构,而不仅仅像 Ext3 对 Ext2 那样,只是增加了一个日志功能而已。Ext4 可以提供更佳的性能和可靠性,还有更为丰富的功能:

1. 与 Ext3 兼容。 执行若干条命令,就能从 Ext3 在线迁移到 Ext4,而无须重新格式化磁盘或重新安装系统。原有 Ext3 数据结构照样保留,Ext4 作用于新数据,当然,整个文件系统因此也就获得了 Ext4 所支持的更大容量。

2. 更大的文件系统和更大的文件。 较之 Ext3 目前所支持的最大 16TB 文件系统和最大 2TB 文件,Ext4 分别支持 1EB(1,048,576TB, 1EB=1024PB, 1PB=1024TB)的文件系统,以及 16TB 的文件。

3. 无限数量的子目录。 Ext3 目前只支持 32,000 个子目录,而 Ext4 支持无限数量的子目录。

4. Extents。 Ext3 采用间接块映射,当操作大文件时,效率极其低下。比如一个 100MB 大小的文件,在 Ext3 中要建立 25,600 个数据块(每个数据块大小为 4KB)的映射表。而 Ext4 引入了现代文件系统中流行的 extents 概念,每个 extent 为一组连续的数据块,上述文件则表示为“该文件数据保存在接下来的 25,600 个数据块中”,提高了不少效率。

5. 多块分配。 当 写入数据到 Ext3 文件系统中时,Ext3 的数据块分配器每次只能分配一个 4KB 的块,写一个 100MB 文件就要调用 25,600 次数据块分配器,而 Ext4 的多块分配器“multiblock allocator”(mballoc) 支持一次调用分配多个数据块。

6. 延迟分配。 Ext3 的数据块分配策略是尽快分配,而 Ext4 和其它现代文件操作系统的策略是尽可能地延迟分配,直到文件在 cache 中写完才开始分配数据块并写入磁盘,这样就能优化整个文件的数据块分配,与前两种特性搭配起来可以显著提升性能。

7. 快速 fsck。 以前执行 fsck 第一步就会很慢,因为它要检查所有的 inode,现在 Ext4 给每个组的 inode 表中都添加了一份未使用 inode 的列表,今后 fsck Ext4 文件系统就可以跳过它们而只去检查那些在用的 inode 了。

8. 日志校验。 日志是最常用的部分,也极易导致磁盘硬件故障,而从损坏的日志中恢复数据会导致更多的数据损坏。Ext4 的日志校验功能可以很方便地判断日志数据是否损坏,而且它将 Ext3 的两阶段日志机制合并成一个阶段,在增加安全性的同时提高了性能。

9. “无日志”(No Journaling)模式。 日志总归有一些开销,Ext4 允许关闭日志,以便某些有特殊需求的用户可以借此提升性能。

10. 在线碎片整理。 尽管延迟分配、多块分配和 extents 能有效减少文件系统碎片,但碎片还是不可避免会产生。Ext4 支持在线碎片整理,并将提供 e4defrag 工具进行个别文件或整个文件系统的碎片整理。

11. inode 相关特性。 Ext4 支持更大的 inode,较之 Ext3 默认的 inode 大小 128 字节,Ext4 为了在 inode 中容纳更多的扩展属性(如纳秒时间戳或 inode 版本),默认 inode 大小为 256 字节。Ext4 还支持快速扩展属性(fast extended attributes)和 inode 保留(inodes reservation)。

12. 持久预分配(Persistent preallocation)。 P2P 软件为了保证下载文件有足够的空间存放,常常会预先创建一个与所下载文件大小相同的空文件,以免未来的数小时或数天之内磁盘空间不足导致下载失败。 Ext4 在文件系统层面实现了持久预分配并提供相应的 API(libc 中的 posix_fallocate()),比应用软件自己实现更有效率。

13. 默认启用 barrier。 磁 盘上配有内部缓存,以便重新调整批量数据的写操作顺序,优化写入性能,因此文件系统必须在日志数据写入磁盘之后才能写 commit 记录,若 commit 记录写入在先,而日志有可能损坏,那么就会影响数据完整性。Ext4 默认启用 barrier,只有当 barrier 之前的数据全部写入磁盘,才能写 barrier 之后的数据。(可通过 “mount -o barrier=0” 命令禁用该特性。)

踏入工作圈,自勉励

工作已经有两周了。上周找到了自己中意的房子。这下可以安心的工作了。

现在唯一能做的就是努力工作,把自己武装的很强大。

生活上和工作中与同事处好关系。

 

在工作上确实有些技术问题,这是最正常的了,这些问题只能自己想办法去解决,别人真不好帮你,生活就是问题叠着问题。自己去学习。加强自己的自觉能力,自控能力。

什么时候也别忘了学习,活到老学到老,要不然就很快被时代的浪潮淘汰。通过学习争取永远踏在时代浪尖上。

sphinx全文索引教程

Sphinx是一个基于SQL的全文检索引擎,可以结合MySQL,PostgreSQL做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。Sphinx特别为一些脚本语言设计搜索API接口,如PHP,Python,Perl,Ruby等,同时为MySQL也设计了一个存储引擎插件。

Sphinx单一索引最大可包含1亿条记录,在1千万条记录情况下的查询速度为0.x秒(毫秒级)。Sphinx创建索引的速度为:创建100万条记录的索引只需 3~4分钟,创建1000万条记录的索引可以在50分钟内完成,而只包含最新10万条记录的增量索引,重建一次只需几十秒。

英文介绍:http://www.sphinxsearch.com/docs/manual-0.9.9.html

一、首先需要在服务器上安装sphinx
在Windows上安装sphinx
1.下载支持mysql的包  http://www.sphinxsearch.com/downloads/sphinx-0.9.9-win32.zip
2.解压缩 sphinx-0.9.9-win32.zip 到 D:sphinx
3.安装sphinx服务,在命令行执行命令

D:sphinxsearchd –install –config d:sphinxsphinx.conf –servicename SphinxSearch

英文参照:http://www.sphinxsearch.com/docs … #installing-windows

在Linux服务器上安装sphinx
1.下载源码包 http://www.sphinxsearch.com/downloads/sphinx-0.9.9.tar.gz

$ tar xzvf sphinx-0.9.8.tar.gz
$ cd sphinx
$ ./configure –prefix=/usr/local/sphinx –with-mysql=/usr/local/mysql
$ make
$ make install

常见问题1

/usr/local/sphinx-0.9.9/src/sphinx.cpp:20060: undefined reference to libiconv_open’
/usr/local/sphinx-0.9.9/src/sphinx.cpp:20078: undefined reference to
libiconv’
/usr/local/sphinx-0.9.9/src/sphinx.cpp:20084: undefined reference to libiconv_close’
collect2: ld returned 1 exit status
make[2]: *** [indexer] Error 1
make[2]: Leaving directory
/home/jling/sphinx-0.9.9/src’
make[1]: *** [all] Error 2
make[1]: Leaving directory `/home/jling/sphinx-0.9.9/src’
make: *** [all-recursive] Error 1

解决办法:打开configure文件,找到“#define USE_LIBICONV 1”,将注释去掉,并将1改成0。
常见问题2

error while loading shared libraries: libmysqlclient.so.16: cannot open shared object file: No such file or directory

解决办法:

64位系统ln -s /usr/local/webserver/mysql/lib/mysql/libmysqlclient.so.16.0.0 /usr/lib64/libmysqlclient.so.16
32位系统ln -s /usr/local/webserver/mysql/lib/mysql/libmysqlclient.so.16.0.0 /usr/lib/libmysqlclient.so.16

 

sphinx.conf样例

source main
{
type     = mysql    #数据库类型
sql_host    = 10.228.134.211 #数据库ip
sql_user    = admin    #数据库用户名
sql_pass    = admin    #数据库密码
sql_db     = phpcms_v9   #数据库名
sql_port    = 3306    # 数据库端口

sql_query_pre = SET NAMES utf8
sql_query_pre = REPLACE INTO v9_sphinx_counter SELECT 1, MAX(searchid) FROM v9_search
sql_query = SELECT searchid, adddate, siteid, typeid, id, data FROM v9_search
WHERE searchid>=$start AND searchid<=$end
sql_query_range  = SELECT 1,max_doc_id FROM v9_sphinx_counter WHERE counter_id=1
sql_range_step = 5000

#字符串属性设置、需要过滤、排序的时候用到
sql_attr_uint  = typeid
sql_attr_uint  = siteid
sql_attr_uint  = id
sql_attr_timestamp  = adddate
sql_query_info  = SELECT * FROM v9_search WHERE searchid=$id
}

source delta
{
type     = mysql    #数据库类型
sql_host    = 10.228.134.211 #数据库ip
sql_user    = admin    #数据库用户名
sql_pass    = admin    #数据库密码
sql_db     = phpcms_v9   #数据库名
sql_port    = 3306    # 数据库端口

sql_query_pre = SET NAMES utf8
sql_query = SELECT searchid, adddate, siteid, typeid, id, data FROM v9_search
WHERE searchid >( SELECT max_doc_id FROM v9_sphinx_counter WHERE counter_id=1 )
sql_query_post = REPLACE INTO v9_sphinx_counter SELECT 1, MAX(searchid) FROM v9_search
#字符串属性设置、需要过滤、排序的时候用到
sql_attr_uint  = typeid
sql_attr_uint  = siteid
sql_attr_uint  = id
sql_attr_timestamp  = adddate
sql_query_info  = SELECT * FROM v9_search WHERE searchid=$id
}

#主索引
index main
{
source = main
# 放索引的目录
path = D:sphinxdatamain
# 编码
charset_type = utf-8
# 指定utf-8的编码表
charset_table = 0..9, A..Z->a..z, _, a..z, U+410..U+42F->U+430..U+44F, U+430..U+44F
# 简单分词,只支持0和1,如果要搜索中文,请指定为1
ngram_len = 1
# 需要分词的字符,如果要搜索中文,去掉前面的注释
ngram_chars   = U+3000..U+2FA1F
}

#增量索引
index delta
{
source = delta
path = D:sphinxdatadelta
# 编码
charset_type = utf-8
# 指定utf-8的编码表
charset_table = 0..9, A..Z->a..z, _, a..z, U+410..U+42F->U+430..U+44F, U+430..U+44F
# 简单分词,只支持0和1,如果要搜索中文,请指定为1
ngram_len = 1
# 需要分词的字符,如果要搜索中文,去掉前面的注释
ngram_chars   = U+3000..U+2FA1F
}
indexer
{
mem_limit    = 128M
}

searchd
{
port     = 9312
log      = D:sphinxdataphpcmssearchd.log
query_log    = D:sphinxdataphpcmsquery.log
read_timeout   = 5
max_children   = 30
pid_file    = D:sphinxdataphpcmssearchd.pid
max_matches    = 2000
seamless_rotate   = 0
preopen_indexes   = 0
unlink_old    = 1
}

 

附件:设置计划任务更新索引
1.windows下
需要设置计划任务
#凌晨4点合并索引,执行merge.bat
#其余时间每分钟更新索引,执行delta.bat

merge.bat

@ECHO off
D:sphinxbinindexer.exe –config D:sphinxsphinx.conf –merge main delta –rotate
echo indexing, window will close when complete

 

delta.bat

@ECHO off
D:sphinxbinindexer.exe –config D:sphinxsphinx.conf delta –rotate
echo indexing, window will close when complete

2.linux下编辑定时任务 crontab -e

#凌晨4点合并索引,其余时间每分钟更新索引
* 0-3 * * * /usr/local/sphinx/bin/indexer –config /usr/local/sphinx/etc/sphinx.conf delta –rotate
* 6-23 * * * /usr/local/sphinx/bin/indexer –config /usr/local/sphinx/etc/sphinx.conf delta –rotate
0 4 * * * /usr/local/sphinx/bin/indexer –config /usr/local/sphinx/etc/sphinx.conf –merge main delta –rotate

各种路径、权限需要应用所在服务器一致,如:
sphinx.conf 中需要配置
sql_host 数据库主机地址
sql_user 数据库用户名
sql_pass 数据库密码
sql_db 数据库名
sql_port 数据库端口
phpcms表前缀样例中为phpcms_
索引路径 D:sphinxdatadelta

phpcmsv9_withsphinx.zip

对付CSS兼容问题的十个超级技巧

一、针对firefox ie6 ie7的css样式

现在大部分都是用!important来 hack,对于ie6和firefox测试可以正常显示,但是ie7对!important可以正确解释, 会导致页面没按要求显示!找到一个针对IE7 不错的hack方式就是使用“*+html”,现在用IE7浏览一下,应该没有问题了现在写一个CSS可以这样:

Example Source Code
#abc { color: #333; } /* Moz */
* html #abc { color: #666; } /* IE6 */
*+html #abc { color: #999; } /* IE7 */

那么在firefox下字体颜色显示为#333,IE6下字体颜色显示为#666,IE7下字体颜色显示为#999。

二、CSS布局中的居中问题

主要的样式定义如下:

Example Source Code
body {TEXT-ALIGN: center;}
#center { MARGIN-RIGHT: auto; MARGIN-LEFT: auto; }

说明:首先在父级元素定义TEXT-ALIGN: center;这个的意思就是在父级元素内的内容居中;对于IE这样设定就已经可以了。

但在mozilla中不能居中。解决办法就是在子元素定义时候设定时再加上“MARGIN-RIGHT: auto;MARGIN-LEFT: auto; ”

需要说明的是,如果你想用这个方法使整个页面要居中,建议不要套在一个DIV里,你可以依次拆出多个div,只要在每个拆出的div里定义MARGIN-RIGHT: auto;MARGIN-LEFT: auto; 就可以了。

三、盒模型

Example Source Code
#box{
;
//for ie6.0- width:500px;
//for ff+ie6.0
}
#box{
>//for ff
;
//for ff+ie6.0
width /**/:500px;
//for ie6.0-
}

四、浮动ie6产生的双倍距离

Example Source Code

#box{ float:left; ; margin:0 0 0 100px;

//这种情况之下IE会产生200px的距离 display:inline; //使浮动忽略}

这里细说一下block,inline两个元素,Block元素的特点是:总是在新行上开始,高度,宽度,行高,边距都可以控制(块元素);Inline元素的特点是:和其他元素在同一行上,…不可控制(内嵌元素);

#box{ display:block; //可以为内嵌元素模拟为块元素 display:inline; //实现同一行排列的的效果 diplay:table;

五、IE与宽度和高度的问题

IE不认得min-这个定义,但实际上它把正常的width和height当作有min的情况来使。这样问题就大了,如果只用宽度和高度,正常的浏 览器里这两个值就不会变,如果只用min-width和min-height的话,IE下面根本等于没有设置宽度和高度。比如要设置背景图片,这个宽度是 比较重要的。要解决这个问题,可以这样:
Example Source Code
#box{ ;80px; height: 35px;}
html>body #box{ ;auto; height: auto; min- 80px; min-height: 35px;}

六、页面的最小宽度

min-width是个非常方便的CSS命令,它可以指定元素最小也不能小于某个宽度,这样就能保证排版一直正确。但IE不认得这个,而它实际上把 width当做最小宽度来使。为了让这一命令在IE上也能用,可以把一个<div> 放到 <body> 标签下,然后为 div指定一个类:

然后CSS这样设计:

Example Source Code
#container{
min-;600px;
;xpression(document.body.clientWidth < 600? “600px”: “auto” );
}

第一个min-width是正常的;但第2行的width使用了Javascript,这只有IE才认得,这也会让你的HTML文档不太正规。它实际上通过Javascript的判断来实现最小宽度。

七、清除浮动

Example Source Code
.hackbox{
display:table;
//将对象作为块元素级的表格显示
}
或者
.hackbox{
clear:both;
}

或者加入:after(伪对象),设置在对象后发生的内容,通常和content配合使用,IE不支持此伪对象,非Ie 浏览器支持,所以并不影响到IE/WIN浏览器。这种的最麻烦的

Example Source Code
……#box:after{
content: “.”;
display: block;
height: 0;
clear: both;
visibility: hidden;
}

八、DIV浮动IE文本产生3象素的bug

左边对象浮动,右边采用外补丁的左边距来定位,右边对象内的文本会离左边有3px的间距.

Example Source Code
#box{
float:left;
;}
#left{
float:left;
;}
#right{
;
}
*html #left{
margin-right:-3px;
//这句是关键
}
HTML代码

<DIV id=left></DIV>
<DIV id=right></DIV>
</DIV>

九、属性选择器(这个不能算是兼容,是隐藏css的一个bug)

Example Source Code
p[id]{}div[id]{}
p[id]{}div[id]{}

这个对于IE6.0和IE6.0以下的版本都隐藏,FF和OPera作用

属性选择器和子选择器还是有区别的,子选择器的范围从形式来说缩小了,属性选择器的范围比较大,如p[id]中,所有p标签中有id的都是同样式的.

十、IE捉迷藏的问题

当div应用复杂的时候每个栏中又有一些链接,DIV等这个时候容易发生捉迷藏的问题。

有些内容显示不出来,当鼠标选择这个区域是发现内容确实在页面。

解决办法:对#layout使用line-height属性 或者给#layout使用固定高和宽。页面结构尽量简单。