Learning Web Design: A Beginner’s Guide to HTML, CSS, JavaScript, and Web Graphics

Learning Web Design: A Beginner’s Guide to HTML, CSS, JavaScript, and Web Graphics

Learning Web Design: A Beginner's Guide to HTML, CSS, JavaScript, and Web Graphics

Do you want to build web pages, but have no previous experience? This friendly guide is the perfect place to start. You’ll begin at square one, learning how the Web and web pages work, and then steadily build from there. By the end of the book, you’ll have the skills to create a simple site with multi-column pages that adapt for mobile devices.

Learn how to use the latest techniques, best practices, and current web standards—including HTML5 and CSS3. Each chapter provides exercises to help you to learn various techniques, and short quizzes to make sure you understand key concepts.

This thoroughly revised edition is ideal for students and professionals of all backgrounds and skill levels, whether you’re a beginner or brushing up on existing skills.

  • Build HTML pages with text, links, images, tables, and forms
  • Use style sheets (CSS) for colors, backgrounds, formatting text, page layout, and even simple animation effects
  • Learn about the new HTML5 elements, APIs, and CSS3 properties that are changing what you can do with web pages
  • Make your pages display well on mobile devices by creating a responsive web design
  • Learn how JavaScript works—and why the language is so important in web design
  • Create and optimize web graphics so they’ll download as quickly as possible

Price: [wpramaprice asin="B00ANW18T2"]

[wpramareviews asin="B00ANW18T2"]

[wprebay kw="web+design" num="4" ebcat="-1"] [wprebay kw="web+design" num="5" ebcat="-1"]

Related Web Design Products

seo观点,维基百科seo来学习seo

seo背景

为了反对美国反盗版立法,维基百科创始人吉米·威尔士将英文版维基百科关闭24小时,以表达抗议,这种大型网站遇到这种特例情况的操作手法,很值得SEO从业者学习借鉴。

在英文维基百科“关闭”期间,任何用户访问该网站,都无法看到原有的内容,而是显示一个抗议SOPA(反网络盗版法)议案的页面,但实际上我们只要在浏览器中停用Javascript,依旧可以正常访问维基百科。

可以看出,英文维基百科并没有大幅修改原始站点的页面,也没有进行重定向跳转操作,而是通过Javascript脚本语言的方式,修改了原来网页的CSS,对原始内容做了隐藏和遮罩,并显示一段新的内容。

seo操作方式

这种修改seo操作方式,有几个好处:1)实施较为简单,只要所有页面都包含同一个Javascript文件,就只需要修改这个JS文件,即可实现“关闭网站”的操作,而不需要修改网站程序或者重建页面。2)最大的好处是,可以避免seo方面的损失,如果采用修改原始文件,或者301或302的方式跳转,会影响全站的排名,英文维基百科在Google中的排名非常高,很多关键字排名第一,如果大幅做这样的修改,很可能会让Google认为这是作弊,从而降低该网站的排名,而因为Google不抓Javascript,因此使用Javascript进行修改所带来的风险较小。

seo

当然,这也只是适合短时间(一两天)内操作,如果长时间通过Javascript修改网页内容,依旧可能会对网站排名seo造成负面影响。

什么是好的优化呢?

一流的思路+二流的态度=烂

二流的思路+一流的态度=好

一流的思路+一流的态度=成功

 

为何Safari不如Chrome?

Safari是乔布斯在2003年的Macworld大会发布的,9年过去了,08年才发展起来的Chrome用了不到Safari一半的时间远远把Safari甩在了后面,这让Safari情何以堪。Chrome的市场份额从2008年的0%开始,发展到了现在的25%,而苹果的Safari似乎一直徘徊于5%-8%之间。?

两大浏览器都是基于苹果的布局引擎Webkit,按道理Safari是占优势的,因为两者都分别是自己操作系统的默认浏览器,许多人就顺便使用了,懒得去下载别的浏览器。

而且随着OS X Lion的发布,似乎Safari重获新生,Safari是其默认浏览器,而像Chrome这样的第三方软件要开始则比较难,Safari还支持更多功能,如多点触控,Reading List(可在iOS及OS X Lion之间同步),这些都是竞争对手所不具备的,但几个月过去,Safari的增长仍旧缓慢,仅仅随着Mac的售出而增加。

而且移动设备的暴涨也应该让Safari市场份额增加才对,可是事实标明Safari市场份额仍无明显增长,而Chrome,和Android,和移动设备没有任何联系的浏览器却迅猛发展。为什么?

为何Safari不如Chrome?

许多人可能会想,这还不简单,Chrome运行于Windows操作系统,而Safari大部分时候都用于苹果自己的系统,Windows .VS. OS X,哪个使用人群广?很显然是前者,所以Chrome当然比Safari发真快,可是,实际上Safari要比Chrome更早登陆Windows。

在2007年六月,Safari for Windows Beta版就已经发布,正式版于2008年三月发布,而Chrome直到2008年的九月才发布,Chrome只用了一年的时间就超过了Safari。

既然不是Window的原因,那又是什么?

大量Benchmark测试表明Chrome不管在网页打开还是JavaScript表现方面,速度都最快。

但是,当Safari发布Windows版的时候,测试结果也是一样的,不管在Mac还是PC上测试,那时候都是最快的,如果仅仅是因为速度,那么Safari在2007年六月的表现就应该和chrome在2008年九月的时候一样。

难道Chrome胜在插件?也许,不过Safari在2010年年中的时候也有了许多插件,当然,Chrome的插件质量更好更丰富,如果这也足够让Safari落后于Chrome,那么开发商们可能早就将游戏植入Chrome,而且,Firefox也先于Chrome和Safari植入插件,现在不也败给了Chrome吗?

很多人抱怨Safari for Windows让人讨厌,自己使用过之后,觉得实际表现介于Firefox及IE之间,尽管测试结果很棒,而苹果最新版本的Safari 5.1仍在继续激怒大家。另外,Safari已经与iTunes绑定在一起有一段时间了,更有理由获得大量市场份额,但似乎很多人下载它但并不是用它。

而另一边,Google对自己的浏览器做了大量宣传,Google.com偶尔会出现Chrome让你下载。

老实说,本人也是Chrome粉丝,Chrome的许多性能是Safari所不具备的。重要的一点就是Chrome全新设计的“新建标签页”,更加可视化,用户可以更方便地管理应用程序、最常访问的网站。页面下方的功能栏上提供了“最常访问的网站”、“应用程序”小标签,点击即可在这两个页面之间进行切换,这是其它浏览器不具备的,也是它的独特之处。

其实具体为什么会这样也没有一个定论,欢迎大家踊跃发言,告诉我们您的观点。

英文原文:TC:Why Has not Safari Skyrocketed Like Chrome Has?

中文翻译:雷锋网编译。

View the original article here

Javascript 操作select控件大全(新增、修改、删除、选中、清空、判断存在等)

1判断select选项中 是否存在Value=”paraValue”的Item
2向select选项中 加入一个Item
3从select选项中 删除一个Item
4删除select中选中的项
5修改select选项中 value=”paraValue”的text为”paraText”
6设置select中text=”paraText”的第一个Item为选中
7设置select中value=”paraValue”的Item为选中
8得到select的当前选中项的value
9得到select的当前选中项的text
10得到select的当前选中项的Index
11清空select的项

js 代码
// 1.判断select选项中 是否存在Value="paraValue"的Item        
function jsSelectIsExitItem(objSelect, objItemValue) {        
    var isExit = false;        
    for (var i = 0; i < objSelect.options.length; i++) {        
        if (objSelect.options[i].value == objItemValue) {        
            isExit = true;        
            break;        
        }        
    }        
    return isExit;        
}         

// 2.向select选项中 加入一个Item        
function jsAddItemToSelect(objSelect, objItemText, objItemValue) {        
    //判断是否存在        
    if (jsSelectIsExitItem(objSelect, objItemValue)) {        
        alert("该Item的Value值已经存在");        
    } else {        
        var varItem = new Option(objItemText, objItemValue);      
        objSelect.options.add(varItem);     
        alert("成功加入");     
    }        
}        

// 3.从select选项中 删除一个Item        
function jsRemoveItemFromSelect(objSelect, objItemValue) {        
    //判断是否存在        
    if (jsSelectIsExitItem(objSelect, objItemValue)) {        
        for (var i = 0; i < objSelect.options.length; i++) {        
            if (objSelect.options[i].value == objItemValue) {        
                objSelect.options.remove(i);        
                break;        
            }        
        }        
        alert("成功删除");        
    } else {        
        alert("该select中 不存在该项");        
    }        
}    

// 4.删除select中选中的项    
function jsRemoveSelectedItemFromSelect(objSelect) {        
    var length = objSelect.options.length - 1;    
    for(var i = length; i >= 0; i--){    
        if(objSelect[i].selected == true){    
            objSelect.options[i] = null;    
        }    
    }    
}      

// 5.修改select选项中 value="paraValue"的text为"paraText"        
function jsUpdateItemToSelect(objSelect, objItemText, objItemValue) {        
    //判断是否存在        
    if (jsSelectIsExitItem(objSelect, objItemValue)) {        
        for (var i = 0; i < objSelect.options.length; i++) {        
            if (objSelect.options[i].value == objItemValue) {        
                objSelect.options[i].text = objItemText;        
                break;        
            }        
        }        
        alert("成功修改");        
    } else {        
        alert("该select中 不存在该项");        
    }        
}        

// 6.设置select中text="paraText"的第一个Item为选中        
function jsSelectItemByValue(objSelect, objItemText) {            
    //判断是否存在        
    var isExit = false;        
    for (var i = 0; i < objSelect.options.length; i++) {        
        if (objSelect.options[i].text == objItemText) {        
            objSelect.options[i].selected = true;        
            isExit = true;        
            break;        
        }        
    }              
    //Show出结果        
    if (isExit) {        
        alert("成功选中");        
    } else {        
        alert("该select中 不存在该项");        
    }        
}        

// 7.设置select中value="paraValue"的Item为选中    
document.all.objSelect.value = objItemValue;    

// 8.得到select的当前选中项的value    
var currSelectValue = document.all.objSelect.value;    

// 9.得到select的当前选中项的text    
var currSelectText = document.all.objSelect.options[document.all.objSelect.selectedIndex].text;    

// 10.得到select的当前选中项的Index    
var currSelectIndex = document.all.objSelect.selectedIndex;    

// 11.清空select的项    
document.all.objSelect.options.length = 0;

 

javascript实现的树型下拉框改进版

发现上一个版本,如果数据顺序颠倒就会出现问题,现在加以改进,原理是先顺序加载根节点,在加载每个根节点后,再遍历每个数组,看有没有以这个根节点为父节点的数组,如果有,就加载到下拉框,然后再递归看有没有以这个节点为父结点的数组,如果有,再加载到下拉框,以此类推…
代码如下:

 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml">
  <head>
   <title> javascript树型菜单 author:sclsch@188.com</title>
   <meta name="generator" content="editplus" />
   <meta name="author" content="" />
   <meta name="keywords" content="" />
   <meta name="description" content="" />
   <script type="text/javascript">
     var data =new Array();

     data[0]= {id:'0',pid:'1',text:'河北'};
     data[1]= {id:'1',pid:'-1',text:'中国'};
     data[2]= {id:'2',pid:'6',text:'莫斯科'};
     data[3]= {id:'3',pid:'0',text:'邯郸'};
     data[4]= {id:'4',pid:'0',text:'石家庄'};
     data[5]= {id:'5',pid:'3',text:'邯郸县'};
     data[6]= {id:'6',pid:'-1',text:'俄罗斯'};
     data[7]= {id:'7',pid:'5',text:'xxx sclsch@188.com'};
    function TreeSelector(item,data,rootId){
       this._data = data;
       this._item = item;
       this._rootId = rootId;
    }
    TreeSelector.prototype.createTree = function(){
        var  len =this._data.length;
        for( var i= 0;i<len;i++){
          if ( this._data[i].pid == this._rootId){
             this._item.options.add(new Option(".."+this._data[i].text,this._data[i].id));
                 for(var j=0;j<len;j++){
                   this.createSubOption(len,this._data[i],this._data[j]);

                 }
          }
       }
    }

    TreeSelector.prototype.createSubOption = function(len,current,next){
           var blank = "..";
           if ( next.pid == current.id){
                intLevel =0;
                var intlvl =this.getLevel(this._data,this._rootId,current);
                for(a=0;a<intlvl;a++)
                   blank += "..";
                blank += "├-";
                this._item.options.add(new Option(blank + next.text,next.id));

                for(var j=0;j<len;j++){
                  this.createSubOption(len,next,this._data[j]);

                }   

           }
    }
    TreeSelector.prototype.getLevel = function(datasources,topId,currentitem){

        var pid =currentitem.pid;
        if( pid !=topId)
        {
          for(var i =0 ;i<datasources.length;i++)
          {
             if( datasources[i].id == pid)
             {
                intLevel ++;
                this.getLevel(datasources,topId,datasources[i]);
             }
          }
        }
        return intLevel;
   }
   </script>
  </head>
  <body>
   <select id="myselect">
 </select>
 <script language=javascript type="text/javascript">
   var ts = new TreeSelector(document.getElementById("myselect"),data,-1);
   ts.createTree();
 </script>
  </body>
 </html>

 

javascript实现的树型下拉框

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
 <head>
  <title> new document </title>
  <meta name="generator" content="editplus" />
  <meta name="author" content="" />
  <meta name="keywords" content="" />
  <meta name="description" content="" />
  <script type="text/javascript">
    var data =new Array();
    data[0]= {id:'0',pid:'-1',text:'中国'};
    data[1]= {id:'1',pid:'0',text:'北京'};
    data[2]= {id:'2',pid:'0',text:'重庆'};
    data[3]= {id:'3',pid:'2',text:'渝中区'};
    data[4]= {id:'4',pid:'3',text:'九龙坡区'};
    data[5]= {id:'5',pid:'4',text:'高新区'};
    data[6]= {id:'6',pid:'4',text:'白市驿镇'};
    data[7]= {id:'7',pid:'2',text:'江北区'};
    data[8]= {id:'8',pid:'0',text:'上海'};
    data[9]= {id:'9',pid:'0',text:'广东省'};
    data[10]= {id:'10',pid:'9',text:'广州市'};
    data[11]= {id:'11',pid:'10',text:'广州市A区'};
    data[12]= {id:'12',pid:'10',text:'广州市B区'};
    data[13]= {id:'13',pid:'-1',text:'俄罗斯'};
    data[14]= {id:'14',pid:'13',text:'莫斯科'};
   function TreeSelector(item,data,rootId){
      this._data = data;
      this._item = item;
      this._rootId = rootId;
   }
   TreeSelector.prototype.createTree = function(){
       var  len =this._data.length;
       for( var j= 0;j<len;j++){
          var blank ="";
          var curItem = this._data[j];
         if ( curItem.pid != this._rootid){
            intLevel =0;
            var intlvl =this.getLevel(this._data,this._rootId,curItem);
            for(a=0;a<intlvl;a++)
               blank += "..";
            blank += "├-";
         }
         if(this._item != -1){
              if (blank != "")
                 blank = ".." + blank;
               else
                 blank = "..├-";
         }
        this._item.options.add(new Option(blank +curItem.text,curItem.id));
      }
   }
   TreeSelector.prototype.getLevel = function(datasources,topId,currentitem){

        var pid =currentitem.pid;
        if( pid !=topId)
        {
          for(var i =0 ;i<datasources.length;i++)
          {
             if( datasources[i].id == pid)
             {
                intLevel ++;
                this.getLevel(datasources,topId,datasources[i]);
             }
          }  
        }
        return intLevel;
   }

  </script>
 </head>
 <body>
  <select id="myselect">
</select>
<script language=javascript type="text/javascript">
  var ts = new TreeSelector(document.getElementById("myselect"),data,-1);
  ts.createTree();
</script>
 </body>
</html>