随笔 - 14  文章 - 13 评论 - 193 trackbacks - 0
<2009年7月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

与我联系

搜索

 

常用链接

留言簿

我的标签

随笔档案

文章分类

相册

最新评论

阅读排行榜

评论排行榜

今天在测试时发现录入数据报错,录入数据采用参数化处理,有几是个参数,一个一个测试

真TMD,发现时参数化过程导致的参数不正确,不知道是微软提供的OracleClient有问题还是Oracle的问题!~

靠,一句话真垃圾!~嘿!~

posted @ 2009-06-18 19:13 品香一郎 阅读(41) | 评论 (0)编辑

前段时间在WEBFORM中要实现产品的动态和产品的模块化功能,其中要在页面中实现产品的动态属性加载,这

就用到了动态添加table(table在这里主要是做布局),动态添加控件,但在实现过程也遇到了些小问题,在此把问题

说说,以及问题的解决方案,和大家一起分享。

 

实现动态添加table,动态添加控件分成两种行为操作:加载页面时创建加载、加载页面后创建加载

 

一。加载页面时创建加载

     什么意思呢?就是在Page_Load时就开始加载动态的控件或table,下面看看代码吧!~

 

          protected void Page_Load(object sender, EventArgs e)
          {

                     if (!IsPostBack)
                    {

 

                     }

            }

          //动态创建table,以及控件

         private void DynamicTableRow()

         {

           .........................

           //创建你要动态创建的控件或table

         }

对于这种行为操作是相对简单的了,不会出现视图加载失败的问题。

 

二。加载页面后创建加载

     举例说明吧,如我在页面上添加了一个DropDownList的控件,带入如下:

         <asp:DropDownList ID="DropDownList1" runat="server">
        <asp:ListItem>1</asp:ListItem>
        <asp:ListItem>5</asp:ListItem>
        <asp:ListItem>7</asp:ListItem>
        </asp:DropDownList>

      当选择1时要执行添加1个TextBox的控件

      当选择5时要执行添加5个TextBox的控件

      当选择7时要执行添加7个TextBox的控件

      且当点击页面上的“提交”按钮时要获取到这些创建的控件和输入的控件的值

     

      如果使用之前那种方法,你在页面上是可以看到动态加载了控件和table,但你在动态加载生成的TextBox控件中输入值,并

     点击“提交”时,发现找不到控件,且你查看页面的源文件的HTML代码页没有发现动态创建的控件,之所以这样,我上网查

    了相关的资料,好像是视图没有把动态创建的控件加载进去,我采用了一个方法去解决这个问题,就是重写了LoadViewState

     还原视图状态信息,代码如下:

         /// <summary>
    /// 重写LoadViewState,还原视图状态信息
    /// </summary>
    /// <param name="savedState"></param>
    protected override void LoadViewState(object savedState)
    {
        base.LoadViewState(savedState);
        int n = this.table.Rows.Count;
        if (ViewState["controsladded"] == null)
        {
            if (Session["ids"] != null)
            {
                DynamicTableRow(Session["ids"] as List<int>);
            }
        }
    }
      

    /// <summary>
    /// 动态控制页面table,加载一行的数据及控件,一行4列,2个属性,2个值
    /// </summary>
    private void DynamicTableRow(List<int> ids)
    {
        int num = 0;
        int nowidsCount = ids.Count;
        TableRow tr = new TableRow();
        foreach (int id in ids)
        {
            num = num + 1;
            TableHeaderCell celTh = new TableHeaderCell();
            celTh.Width = 130;

            Label thLabel = new Label();
            thLabel.ID = id.ToString() + "+label";
            thLabel.Text = NameTechnique(id);
            celTh.Controls.Add(thLabel);

            TableCell celTd = new TableCell();

            TextBox txtBox = new TextBox();
            txtBox.TextMode = TextBoxMode.MultiLine;
            txtBox.Width = 300;
            txtBox.ID = id.ToString();
            celTd.Controls.Add(txtBox);

            tr.Cells.Add(celTh);
            tr.Cells.Add(celTd);
            //控制一行显示的数据

            if (num == 2)
            {
                this.table.Rows.Add(tr);
                nowidsCount = nowidsCount - 2;
            }
            else
            {
                if (num == nowidsCount)
                {
                    if (num < 2)
                    {
                        for (int i = 1; i <= (2 - num); i++)
                        {
                            //补空列,一行必须满足有4列
                            TableHeaderCell celThNone = new TableHeaderCell();
                            celThNone.Width = 130;
                            TableCell celTd1None = new TableCell();

                            tr.Cells.Add(celThNone);
                            tr.Cells.Add(celTd1None);
                        }
                    }
                    this.table.Rows.Add(tr);
                }
            }
            if (num == 2)
            {
                tr = new TableRow();
                num = 0;
            }
        }
        ViewState["controlsadded"] = true;
    }

    以上是个人的简单总结,对这个页面的视图也没有什么研究,有个研究的朋友希望一起分享,感兴起的朋友可以一起讨论学习!~

posted @ 2009-05-26 16:32 品香一郎 阅读(147) | 评论 (1)编辑
     摘要: 1. 树形结构的设计在开发ASP.NET的项目中,有许多项目用到的树形结构,其中有些树形结构相对复杂,也有简单的,但无论是简单的树形结构还是复杂的树形结构,有着好的结构对于性能和稳定性都有着很大的作用。比如你的树结构的数据很大,如果是采用比较死的方式一次性加载进来那么你在加载这棵树的时候就是相当的耗时了,性能就大大的打了折扣。我在设计这棵树时首先加载的是一级的节点,即想要显示的最外层的节点,然后通... 阅读全文
posted @ 2009-04-09 12:46 品香一郎 阅读(2753) | 评论 (18)编辑
     摘要: 1.横向比较数据库中不同的索引机制一、引言对数据库索引的关注从未淡出我的们的讨论,那么数据库索引是什么样的?聚集索引与非聚集索引有什么不同?希望本文对各位同仁有一定的帮助。有不少存疑的地方,诚心希望各位不吝赐教指正,共同进步。二、B-Tree我们常见的数据库系统,其索引使用的数据结构多是B-Tree或者B+Tree。例如,MsSql使用的是B+Tree,Oracle及Sysbase使用的是B-Tr... 阅读全文
posted @ 2009-04-02 13:46 品香一郎 阅读(97) | 评论 (0)编辑

首先要设定要打印的区域,如下:

。。。。。。。。。
。。。。。。。
。。。。。。。。
<div id="print">
打印的区域或内容
</div>
..............
.....................
<a href="javascript:void(0)" onclick="printView('print');">打印</a>

实现打印的JS函数:
//局部打印
function printView(id)
{
    var sprnhtml = $(id).outerHTML;
    var selfhtml = window.document.body.innerHTML;//获取当前页的html

    window.document.body.innerHTML = sprnhtml;
    window.print();
    window.document.body.innerHTML=selfhtml;


    //局部打印后,当前页面打印区域外的操作都不好用了,所采用了当执行打印时重新刷新页面

      window.location.reload( );

}
如果是要页面打印,那么一句话就搞定了
function printView(id)
{
    window.print();
}

posted @ 2009-03-09 09:33 品香一郎 阅读(186) | 评论 (0)编辑
实际上Eval方法是TemplateControl的,而System.Web.UI.Page和System.Web.UI.UserControl都继承于TemplateControl,所以我们可以在Page和UserControl上直接调用个方法。   
    
     Page.Eval方法可以帮助我们更好的撰写数据绑定表达式,在ASP.NET   1.x时代,数据绑定表达式的一般形式是:   
 
 <%# DataBinder.Eval(Container,“DataItem.Name”)   %>   

     而在ASP.NET   2.0中,同样的代码,我们可以这样写: 
  

<%Eval(“Name”)%> 
  
     ASP.NET   2.0是怎么实现的呢?我们先从Eval方法来研究,通过反射.NET  fromwork   2.0类库的源代码,我们可以看到这个方法是这样实现的:
   
protected   internal   object   Eval(string   expression)   
{   
     
this.CheckPageExists();   
     
return   DataBinder.Eval(this.Page.GetDataItem(),   expression);   
}   

     第一行我们不必管,这是检查调用的时候有没有Page对象的,如果没有则会抛出一个异常。   关键是第二行:   
 
 return   DataBinder.Eval(this.Page.GetDataItem(),   expression);   
 
     Page.GetDataItem()也是2.0中新增的一个方法,用途是正是取代ASP.NET   1.x中的Container.DataItem。   
     看来不摸清楚GetDataItem()方法,我们也很难明白Eval的原理。GetDataItem的实现也很简单:
 
public   object   GetDataItem()   
{   
     
if   ((this._dataBindingContext ==  null|| (this._dataBindingContext.Count == 0))   
     {   
           
throw   new   InvalidOperationException(SR.GetString("Page_MissingDataBindingContext"));   
     }   
     
return   this._dataBindingContext.Peek();   
}   
   
     我们注意到了有一个内部对象_dataBindingContext,通过查源代码发现这是一个Stack类型的东西。所以他有Peek方法。而这一段代码很容易看懂,先判断这个Stack是否被实例化,然后,判断这个Stack里面是不是有任何元素,如果Stack没有被实例化或者没有元素则抛出一个异常。最后是将这个堆栈顶部的元素返回。   
     ASP.NET   2.0用了一个Stack来保存所谓的DataItem,我们很快就查到了为这个堆栈压元素和弹出元素的方法:Control.DataBind方法: 
 
protected   virtual   void   DataBind(bool   raiseOnDataBinding)   
{   
      
bool   flag1   =   false;//这个标志的用处在上下文中很容易推出来,如果有DataItem压栈,则在后面出栈。   
       if(this.IsBindingContainer)//判断控件是不是数据绑定容器,实际上就是判断控件类是不是实现了INamingContainer   
      {   
          
bool   flag2;   
          
object   obj1   =   DataBinder.GetDataItem(this,   out   flag2);//这个方法是判断控件是不是有DataItem属性,并把它取出来。   
           if   (flag2   &&   (this.Page   !=   null))//如果控件有DataItem   
         {   
            
this.Page.PushDataBindingContext(obj1);//把DataItem压栈,PushDataBindingContext就是调用_dataBindingContext的Push方法   
              flag1   =   true;   
         }   
      }   
      
try   
      {   
          
if   (raiseOnDataBinding)//这里是判断是不是触发DataBinding事件的。   
           {   
             
this.OnDataBinding(EventArgs.Empty);   
          }   
         
this.DataBindChildren();//对子控件进行数据绑定,如果这个控件有DataItem,则上面会将DataItem压入栈顶,这样,在子控件里面调用Eval或者GetDataItem方法,就会把刚刚压进去的DataItem给取出来。   
      }   
     
finally   
     {   
         
if(flag1)//如果刚才有压栈,则现在弹出来。   
          {   
            
this.Page.PopDataBindingContext();//PopDataBindingContext就是调用_dataBindingContext的Pop方法   
          }   
     }   
  }   
  
     至此,我们已经可以完全了解ASP.NET   2.0中GetDataIten和Eval方法运作的原理了,下一次我打算研究ASP.NET   2.0中的新的Bind语法。   
    
     有提供Bind语法资料的和提出好建议的酌情给分,up、顶等分会很少,接分者无分。 

     关于效率:
     毋庸置疑的是强类型转换Container的效率是最高的,Eval最终是调用DataBinder.Eval方法,DataBinder.Eval是采用反射来获取数据的,这显然不如强类型数据转换。   

     我们可以比较一下各种方法:   
    
((Type)   Container.DataItem).Property  
 
     这种方法效率是最高的,因为不存在任何反射。   
    
     其次是:   
 
((Type)   GetDataItem()).Property  
 
     这种方法效率差的原因在于多了一个Stack的Peek操作,当然,实际上这点儿差别可以忽略。   
    
     最后是:    Eval或者DataBinder.Eval,这两种方法都使用反射来查找属性或者索引器成员,效率大打折扣。   
    
     另外一个值得注意的问题是,所有实现了INamingContainer接口的Control,都应该实现IDataItemContainer接口,因为在Control.DataBind的时候,如果发现控件实现了INamingContainer接口,就会试图去寻找它的DataItem,如果这个控件没有实现IDataItemContainer,则DataBinder.GetDataItem方法会使用反射看看控件有没有一个叫做DataItem的属性成员,显然这不是我们希望看到的。  

     其实ASP.NET还有一个标记接口:INonBindingContainer,实现了INamingContainer接口的控件可以选择同时实现这个来命令ASP.NET不去寻找DataItem,可是很可惜,不知道微软出于什么目的,这个接口是internal的……   
    
     其实效率方面不必太重视了,Eval表达式很好看的,即使有那么极端的重视效率,GeDataItem也是不错的选择。毋庸置疑的是强类型转换Container的效率是最高的,Eval最终是调用DataBinder.Eval方法,DataBinder.Eval是采用反射来获取数据的,这显然不如强类型数据转换。   
    原文地址:http://blog.sdtv.com.cn/user1/11/1815.html
  
posted @ 2009-02-05 16:28 品香一郎 阅读(111) | 评论 (0)编辑

有时间总结了下动态添加tab页的相关知识:

     非常鄙视那些引用我文章的网站和个人网站,引用了别人的东西还带商业广告!~在此谢绝转载

    一。 首先得写个动态添加Tab页的JS操作文件,我想在网上应该能找到,喜欢自己可以写

   二 。其次是 写个动态添加Tab页的样式CSS文件,控制TAB标签等样式

   三。相关使用操作

动态添加Tab页的JS代码,起个名吧,就叫“DynamicTab.js”,代码如下:

 

//tab显示区域类
//TabZone结构为:
//参数说明:
//id:需要动态创建TabPage的区域id
//activeCSS:激活状态的tab样式
//inactiveCSS:未激活状态的tab样式
//zoneCSS:整个TabZone包含TabPage的样式
function TabZone(id,activeCSS,inactiveCSS,zoneCSS){
//激活时的标签样式类
this.activeCSS = activeCSS;
//未激活时的标签样式类
this.inactiveCSS = inactiveCSS;
//最外层显示区域
this.outerZone = $(id);
this.outerZone.className = zoneCSS;
//动态创建tab及page区域
if(this.outerZone.childElements().length == 0 ||
(this.outerZone.down() && this.outerZone.down().tagName.toLowerCase() != "ul") ||
(this.outerZone.down().next() && this.outerZone.down().next().tagName.toLowerCase() != "div")
){
var frag = document.createDocumentFragment();
var ul = document.createElement("ul");
var div = document.createElement("div");
frag.appendChild(ul);
frag.appendChild(div);
this.outerZone.innerHTML = "";
this.outerZone.appendChild(frag);
}
//内部的tab标签区域
this.innerTabZone = this.outerZone.down();
//内部的显示Pages的区域
this.innerPageZone = this.innerTabZone.next();
//保存生存期内所有添加的TabPage对象
this.tabs = new Array();
}
//向TabZone添加Tab
TabZone.prototype.addTab = function(obj){
this.tabs[this.tabs.length] = obj;
//添加事件监听
var realContext = this;
var focus =this.focus;
//使用Event.observe会使上下文环境发生变化,进而无法直接使用this被指向其他引用
//使用call改变this所指对象
Event.observe(obj.tab, 'click',function(e){focus.call(realContext,obj);});
//为未保护的tab添加关闭事件
if(!obj.protect){
var close = this.close;
Event.observe(obj.tab, 'dblclick',function(e){close.call(realContext,obj);});
}
//添加事件结束
//文档中添加tab及page
this.innerTabZone.appendChild(obj.tab);
this.innerPageZone.appendChild(obj.page);
this.focus(obj);
}
//关闭所有未保护的TabPage
TabZone.prototype.closeAll = function(){
var tabCount = this.tabs.length;
for(var i=this.tabs.length-1;i>=0;i--){
if(!this.tabs[i].protect){
this.innerTabZone.removeChild(this.tabs[i].tab);
this.innerPageZone.removeChild(this.tabs[i].page);
this.tabs.splice(i,1);
}
}
//关闭未保护的tab后处理焦点
if(tabCount > this.tabs.length && this.tabs.length > 0){
this.focus(this.tabs[0]);
}
}
//隐藏除了指定参数的tab
TabZone.prototype.hideExcept = function(obj){
for(var i=0;i0){
this.focus(this.tabs[i]);
}
else if(i > 0){
this.focus(this.tabs[i-1]);
}
return;
}
}
}
}
//tab页类
//name:tab标签名称
//src:page指向的页面地址
//protect:bool,指明tab是否可以被保护,被保护的tab不可被关闭
function TabPage(name,src,protect){
this.protect = protect==true?true:false;
//tab
this.tab = document.createElement("li");
this.tab.innerHTML = name==undefined?"untitled":name;
//page区域
this.page = document.createElement("div");
//page实际内容页面
var iframe = document.createElement("iframe");
iframe.frameBorder = 0;
iframe.src = src==undefined?"":src;
//iframe添加入page区域
this.page.appendChild(iframe);
}
动态添加Tab页的CSS样式代码,起个名吧,就叫“DynamicTab.css”,代码如下:
.TabZone
{
font-size: 12px;
width: 100%;
background: #fff;
}
.TabZone ul
{
position: relative;
display: block;
float: left;
padding: 0 0 0 0px;
padding: 0px 0px 0px 10px;
list-style: none;
height: 26px;
z-index: 99999;
background: #ebebeb url(../images/tabBackGround.gif) repeat-x top;
width: 100%;
}
.TabZone ul li
{
float: left;
display: block;
margin: 5px 3px 0 0;
padding: 0 15px;
cursor: default;
height: 20px;
line-height: 20px;
}
.TabZone ul li.ActiveCSS
{
background: url(../images/tabOn.gif) repeat-x top;
color: #38b0ff;
height: 22px;
line-height: 22px;
vertical-align: middle;
text-align: center;
border-left: solid 1px #1d4c94;
border-top: solid 1px #1d4c94;
border-right: solid 1px #1d4c94;
}
.TabZone ul li.InactiveCSS
{
color: #38b0ff;
background: url(../images/tabOut.gif) repeat-x top;
height: 22px;
line-height: 22px;
vertical-align: middle;
text-align: center;
border-left: solid 1px #1d4c94;
border-top: solid 1px #1d4c94;
border-right: solid 1px #1d4c94;
}
.TabZone div
{
position: relative;
width: 100%;
height: 100%;
z-index: 0;
margin-top: 3px;
}
.TabZone div div
{
height: 100%;
width: 100%;
}
.TabZone div div iframe
{
position: relative;
width: 100%;
height: 100%;
}

 

1.在ASP.NET 中使用动态添加Tab框架:

//引用文件

<script type="text/javascript" src="js/DynamicTab.js"></script>

//动态添加Tab的区域
<div id="tabZone"></div>
<script type="text/jscript">
        var tabZone = new TabZone("tabZone","ActiveCSS","InactiveCSS","TabZone");
        //  one.aspx 为首次加载框架时显示的页面
        tabZone.addTab(new TabPage("显示标签名字","one.aspx",true));
       
        function addTab(title,src){
            tabZone.addTab(new TabPage(title,src,false));
        }
    </script>

2.one.aspx 页面

//在one.aspx 里你可以添加任何的链接打开一个页面,然后这个页面会以动态Tab形式显示出来

     <a href="javascript:parent.addTab('动态添加页面的标签1:',two.aspx')";>详细信息1</a>

     <a href="javascript:parent.addTab('动态添加页面的标签2:',two.aspx')";>详细信息2</a>

3.two.aspx页面

这个页面当然就是一些信息了,你还可以做到三级的动态Tab链接

4.至于要实现动态加载时标签的样式效果或者更漂亮你可以在CSS上写

有问题可以一起探讨,欢迎光顾一起学习

 

 

后续--------------------

后面根据需要又添加了个关闭标签的方法,比如在删除的时候会用到,在删除某个东东后要关闭当前TAB中打开的TAB,即关闭标签页

实现如下:

1.在DynamicTab.js中添加个方法

 

//关闭指定的标签
TabZone.prototype.closeTag = function(obj){
        for(var i=0;i<this.tabs.length;i++){
            //判断TAB中的标签名是否和要关闭的标签名称相等(标签名称唯一)

            if(obj.tab.innerHTML.trim() == this.tabs[i].tab.innerHTML.trim()){
                //dom中删除对应tab
                this.innerTabZone.removeChild(this.tabs[i].tab);
                this.innerPageZone.removeChild(this.tabs[i].page);
               
                //tabs集合中删除对应tab对象
                this.tabs.splice(i,1);
               
                //控制关闭tab后焦点行为
                if(i == 0 && this.tabs.length>0){
                    this.focus(this.tabs[i]);
                }
                else if(i > 0){
                    this.focus(this.tabs[i-1]);
                }
                return;
            }
        }

}

 

 

2.在框架中添加个方法

 

        //关闭指定的标签页面

       //tagName,要关闭的标签名称

       //要关闭的页面
        function closeTab(tagName,src)
        {

            tabZone.closeTag(new TabPage(tagName,src,true));
        }

3.在实现关闭事件中调用框架的方法            

      parent.closeTab('tagName','url')

posted @ 2008-11-16 16:17 品香一郎 阅读(1934) | 评论 (32)编辑

诶呀!~好不容易在网上找到了中文电子版的,但是已图片形式显示出来的

文件又太大,整了半天都没整理出来,控件还不够了,这里上传了后面几章的内容

下面给出目录,需要的朋友可以下载,博客园的个人空间也太小了,还有几章有时间整理出来坊到CSDN上提供下载再提供链接地址,是一本很不错的书,推荐

精通CSS:高级Web标准解决方案高级Web标准解决方案02(csdn网站链接)

精通CSS:高级Web标准解决方案高级Web标准解决方案05

精通CSS:高级Web标准解决方案高级Web标准解决方案06

精通CSS:高级Web标准解决方案高级Web标准解决方案07

 

第1章 基础知识
1.1 设计代码的结构
1.1.1 使用有意义的标记
1.1.2 文档类型、DOCTYPE切换和浏览器模式
1.2 为样式找到目标
1.2.1 常用的选择器
1.2.2 通用选择器
1.2.3 高级选择器
1.2.4 层叠和特殊性
1.2.5 继承
1.3 规划、组织和维护样式表
1.3.1 对文档应用样式
1.3.2 对代码进行注释
1.3.3 样式指南
1.3.4 组织样式表以便简化维护
1.4 小结
第2章 可视化格式模型
2.1 框模型概述
2.1.1 IE/Win和框模型
2.1.2 空白边叠加
2.2 定位概述
2.2.1 视觉格式化模型
2.2.2 相对定位
2.2.3 绝对定位
2.2.4 浮动
2.3 小结
第3章 背景图像和图像替换
3.1 背景图像基础
3.2 圆角框
3.2.1 固定宽度的圆角框
3.2.2 山顶角
3.3 阴影
3.3.1 简单的CSS阴影
3.3.2 来自Clagnut的阴影方法
3.3.3 模糊阴影
3.3.4 洋葱皮阴影
3.4 图像替换
3.4.1 FIR
3.4.2 Phark
3.4.3 Gilder/Levin方法
3.4.4 IFR与sIFR
3.5 小结
第4章 对链接应用样式
4.1 简单的链接样式
4.2 让下划线更有趣
4.3 突出显示不同类型的链接
4.4 创建按钮和翻转
4.4.1 简单的翻转
4.4.2 具有图像的翻转
4.4.3 Pixy样式的翻转
4.5 已访问链接样式
4.6 纯CSS工具提示
4.7 小结
第5章 对列表应用样式和创建导航条
5.1 基本列表样式
5.2 创建垂直导航条
5.3 在导航条中突出显示当前页面
5.4 创建水平导航条
5.5 简化的“滑动门”标签页式导航
5.6 CSS图像映射
5.7 远距离翻转
5.8 对于定义列表的简短说明
5.9 小结
第6章 对表单和数据表格应用样式
6.1 对数据表格应用样式
6.1.1 表格特有的元素
6.1.2 数据表格标记
6.1.3 对表格应用样式
6.1.4 添加视觉样式
6.1.5 添加其他样式
6.2 简单的表单布局
6.2.1 有用的表单元素
6.2.2 基本布局
6.2.3 其他元素
6.2.4 修饰
6.3 复杂的表单布局
6.3.1 可访问的数据输入元素
6.3.2 多列复选框
6.3.3 表单反馈
6.4 小结
第7章 布局
7.1 让设计居中
7.1.1 使用自动空白边让设计居中
7.1.2 使用定位和负值空白边让设计居中
7.2 基于浮动的布局
7.2.1 两列的浮动布局
7.2.2 三列的浮动布局
7.3 固定宽度、流体和弹性布局
7.3.1 流体布局
7.3.2 弹性布局
7.3.3 弹性-流体混合布局
7.3.4 流体和弹性图像
7.4 faux列
7.5 小结
第8章 招数和过滤器
8.1 招数和过滤器简介
8.1.1 关于招数和过滤器的一个警告
8.1.2 明智地使用招数
8.2 过滤单独的样式表
8.2.1 IE的有条件注释
8.2.2 带通过滤器
8.3 过滤单独的规则和声明
8.3.1 子选择器招数
8.3.2 属性选择器招数
8.3.3 星号HTML招数
8.3.4 IE/Mac注释反斜线招数
8.3.5 转义属性招数
8.3.6 Tantek的框模型招数
8.3.7 修改后的简化框模型招数
8.3.8 !important和下划线招数
8.3.9 Owen招数
8.4 小结
第9章 bug和bug修复
9.1 bug捕捉
9.2 bug捕捉的基本知识
9.2.1 隔离问题
9.2.2 创建基本测试案例
9.2.3 修复问题,而不是修复症状
9.2.4 请求帮助
9.3 拥有布局
9.3.1 什么是布局
9.3.2 布局有什么效果?
9.4 常见bug及其修复方法
9.4.1 双空白边浮动bug
9.4.2 3像素文本偏移bug
9.4.3 IE 6重复字符bug
9.4.4 IE 6躲躲猫bug
9.4.5 相对容器中的绝对定位
9.4.6 停止对IE的批评
9.5 小结
实例研究1 More Than Doodles
CS1.1 关于这个实例研究
CS1.2 用后代选择器控制内容区域
CS1.2.1 XHTML
CS1.2.2 三列布局
CS1.2.3 两列布局
CS1.2.4 单列布局
CS1.2.5 隐藏不需要的列
CS1.3 对列进行浮动
CS1.3.1 计算
CS1.3.2 将列浮动到正确的位置
CS1.4 根据主体类突出显示当前页面
CS1.5 列的drop-in框
CS1.6 直角和圆角——自己决定
CS1.6.1 一般的直角
CS1.6.2 为特殊效果做准备
CS1.7 透明的定制角和边框
CS1.7.1 图像
CS1.7.2 CSS
CS1.8 使用类组合来确定操作目标
CS1.9 使用图像类和例外
CS1.9.1 默认图像
CS1.9.2 拥有的图像
CS1.9.3 比较大的图像
CS1.10 处理链接
CS1.10.1 了解边栏链接
CS1.10.2 带符号的已访问链接
CS1.10.3 突出显示外部链接
CS1.11 浮动的阴影(图库)
CS1.11.1 形成阴影
CS1.11.2 对图像进行浮动
CS1.12 小结
实例研究2 Tuscany Luxury Resorts
CS2.1 关于这个实例研究
CS2.2 流体布局
CS2.2.1 主体和容器
CS2.2.2 报头
CS2.2.3 内容和边栏
CS2.2.4 页脚
CS2.2.5 解决流体布局的问题
CS2.3 使用绝对定位对准元素
CS2.3.1 位置属性(top、bottom、left、right)
CS2.3.2 堆放次序(z-index)
CS2.4 背景图像技术
CS2.4.1 将上半部分分成三份
CS2.4.2 使背景“无懈可击”
CS2.5 图像替换
CS2.5.1 徽标图像替换
CS2.5.2 首字母大写图像替换
CS2.6 流体图像
CS2.7 为多个元素使用一个列表项
CS2.8 小结
posted @ 2008-11-05 11:13 品香一郎 阅读(1555) | 评论 (121)编辑

 

3.2.1  固定宽度的圆角框

最容易创建的是固定宽度的圆角框。它们只需要两个图像:一个图像用于框的顶部,另一个用于底部。例如,假设希望创建图3-3这样的框样式。

3-3  简单的圆角框样式

这个框的标记如下:

需要用图形软件创建两个图3-4这样的图像:一个图像用于框的顶部,另一个用于底部。这个示例以及本书中其他所有示例的代码和图像可以从www.friendsofed.com下载。

3-4  顶部和底部曲线图像

然后,将顶部图像应用于标题元素,将底部图像应用于div框的底部。因为这个框样式是单色的,所以可以在div框上添加背景颜色,从而形成框的主体。

我们不希望内容碰到框的边界,所以还需要在div中的元素上添加一些填充:

这个方法对于单色而且没有边框的简单框是有效的。但是,如果希望创建像图3-5这样更生动的样式,那么怎么办?

3-5  样式更特殊的圆角框

实际上,可以使用相同的方式,但是这一次不在框上设置背景颜色,而是设置一个重复显示的背景图像。还需要将底部曲线图像应用到另一个元素上。在这个示例中,我使用框中的最后一个段落元素:

3-6所示为生成的框。因为没有给这个框设置高度,所以它会随着文本尺寸的增加进行垂直扩展。

3-6  样式特殊的固定宽度框。框的高度会随着文本尺寸的增加而扩展

灵活的圆角框

如果加大字号,前面的示例都会垂直扩展。但是,它们不会水平扩展,因为框的宽度必须与顶部和底部图像的宽度一致。如果希望创建灵活的框,那么需要采用略有不同的方法。不用单一图像组成顶部和底部曲线,而是用两个相互重叠的图像(见图3-7)。

3-7  如何扩展顶部图像来形成灵活的圆角框

随着框尺寸的增加,大图像有更多的部分显露出来,这样就实现了框扩展的效果。这个方法有时候被称为滑动门技术sliding doors technique),因为一个图像在另一个图像上滑动,将它的一部分隐藏起来。这个方法需要更多的图像,所以必须在标记中添加两个额外的无语义元素。

这个方法需要四个图像:两个顶部图像组成顶部曲线,两个底部图像组成底部曲线和框的主体(见图3-8)。因此,底部图像的高度必须与框的最大高度相同。分别将这些图像命名为top-left.giftop-right.gifbottom-left.gifbottom-right.gif

3-8  创建灵活的圆角框所需的图像

首先,将bottom-left.gif应用于主框div,将bottom-right.gif应用于外边的div。接下来,将top-left.gif应用于内部的div,将top-right.gif应用于标题。最后,添加一些填充以便在内容周围形成一点儿空白。

在这个示例中,我以em为单位设置框的宽度,所以在浏览器中增加文本尺寸时框会伸展(见图3-9)。当然,可以用百分数设置宽度,这使框根据浏览器窗口的尺寸进行扩展或收缩。这是弹性和灵活布局背后的主要原则之一,在本书后面会进一步讨论这些原则。

3-9  灵活的圆角框会随着文本尺寸的增加进行水平和垂直扩展

 

posted @ 2008-11-05 10:20 品香一郎 阅读(960) | 评论 (1)编辑

个人学习了一个星期的CSS,也没有买什么书看,就公司的页面框架设计人员提供了一些

学习资料,再实际参与到项目中慢慢应用,主要是学了就用这样的学习效果就非常的好

还提供一些下载的DEMO提供参考学习,自己也可以下载一些模板页面的图片通过Photoshop来截图

当然还包括测量,吸色这些简单的操作,再通过CSS编码来实现图片相应的效果,希望能给初学者

提供学习的方便,感兴趣的可以交流,更多的学习

下面提供相关的学习资料:

          第一步:学习教程:教程下载

                     CSS中文手册:CSS中文手册下载

         第二步:实际应用:DEMO下载

如果你想进一步的学习,可以多做些DEMO,只有在实际应用中你才能学习到更多的知识

提供个DEMO下载的网站:http://www.52css.com/

 

posted @ 2008-11-04 13:51 品香一郎 阅读(542) | 评论 (0)编辑