当前位置:  编程技术>WEB前端
本页文章导读:
    ▪css选择器      伪类和伪元素给链接定义样式a:link 表示尚未访问的链接,鼠标未划过和点击a:visited 表示已经访问的链接a:hover 表示鼠标划入的链接a:active 表示激活的链接,也就是鼠标点击链接的一瞬间注意.........
    ▪Ajax、Comet与Websocket      从http协议说起1996年IETF  HTTP工作组发布了HTTP协议的1.0版本 ,到现在普遍使用的版本1.1,HTTP协议经历了17 年的发展。这种分布式、无状态、基于TCP的请求/响应式、在互联网盛行的.........
    ▪用jQuery实现banner图片切换       主要运用了定时器的原理,bind,trigger应用等   <!DOCTYPE html> <html> <head>     <meta charset="utf-8">     <title>banner切换实现</title>   .........

[1]css选择器
    来源:    发布时间: 2013-11-06

伪类和伪元素

给链接定义样式

a:link 表示尚未访问的链接,鼠标未划过和点击

a:visited 表示已经访问的链接

a:hover 表示鼠标划入的链接

a:active 表示激活的链接,也就是鼠标点击链接的一瞬间

注意上面这四个链接的伪类在使用的时候要有一定的顺序,即上面列举的顺序,否则看不到效果。可以简单记为LOVE(包含link和visited首字母)和HATE(包含hover和active的首字母)。

 

给段落定义样式

:first-letter 为一行中的第一个字符创建样式

:first-line 为一段中第一行创建样式

 

更多伪类和伪元素

:before 可以在指定元素的前面添加内容。比如有一个段落p,你要在前面添加"Hello",可以用伪类表示为p:before {content: "Hello";}

:after 和:before一样,只不过实在元素的后面添加内容。

但是IE6, IE7不支持content属性。

:first-child 选取其他元素的第一个子元素,这里容易引起混淆。比如有下面的一段代码:

<ul>
<li>第一行</li>
<li>第二行</li>
<li>第三行</li>
</ul>
<p>
<ul>
<li>第一行</li>
<li>第二行</li>
<li>第三行</li>
</ul>
</p>

那么,li:frist-child将会选取所有ul标签下的第一个li标签,也就是上面两个内容为第一行的li标签,而不是选择li标签的第一个子元素

:focus 这个伪元素与链接的:hover相似,只不过:hover为链接专用,而这个可以用于其他的元素,表示当元素获得焦点时应有的样式

高级选择器

子选择器

">"可用来作为子选择器。当要选取一个元素的子元素时,可以使用这个符号。比如有下面一段代码:

<p>
<ul>
<li>第一级</li>
<li>
<ul>
<li>第二级</li>
</ul>
</li>
</ul>
</p>

p>ul 只会选择第一个ul标签,而不会选择第二个ul标签,因为它不是p标签的子元素,而是li标签的子元素。如果要达到选择这两个ul标签,可以是p ul。这样p标签下面所有的ul标签都会被选中。这种形式选取的是p标签下面的所有子孙元素。

同胞选择器

"+"可用来作为同胞选择器。在HTML中,紧挨另一个标签出现的标签被称为邻近同胞标签,如:

<body>
<h1>标题</h1>
<p>段落</p>
</body>

p标签紧邻h1标签,因此p标签为h1的同胞标签,可以通过h1+p来选择。

属性选择器

在属性选择器中,用[]包含要选择的属性,如:

img[title]

那么,所有带有title属性的img标签都会被选中,而那些没带title标签的img则不会被选中。[]括号前面可以使任何有效的选择器。

属性选择器中的属性还可以带有值。比如许多表单元素的形式都一样,如<input type = "text" />和<input type = "checkbox" />,那么input[type = "text"]可以让你只选中文本框。

其他的一些属性选择器还有:

^=  让你匹配属性"以...开始"的标签,如:a[href^= "http://"]则匹配所有以http://开头的链接。

$=  让你匹配属性"以...结束"的标签,如:a[href$=".com"]则匹配所有以".com"结尾的链接。

*=  让你匹配属性包含某一值的标签,如:a[href*= "renren"]则匹配href中包含"renren"的所有链接。

 

 

本文链接


    
[2]Ajax、Comet与Websocket
    来源:    发布时间: 2013-11-06

从http协议说起

1996年IETF  HTTP工作组发布了HTTP协议的1.0版本 ,到现在普遍使用的版本1.1,HTTP协议经历了17 年的发展。这种分布式、无状态、基于TCP的请求/响应式、在互联网盛行的今天得到广泛应用的协议,相对于互联网的迅猛发展,它似乎进步地很慢。互联网从兴起到现在,经历了门户网站盛行的web1.0时代,而后随着ajax技术的出现,发展为web应用盛行的web2.0时代,如今又朝着web3.0的方向迈进。反观http协议,从版本1.0发展到1.1,除了默认长连接之外就是缓存处理、带宽优化和安全性等方面的不痛不痒的改进。它一直保留着无状态、请求/响应模式,似乎从来没意识到这应该有所改变。

 

Ajax---脚本发送的http请求

传统的web应用要想与服务器交互,必须提交一个表单(form),服务器接收并处理传来的表单,然后返回全新的页面,因为前后两个页面的数据大部分都是相同的,这个过程传输了很多冗余的数据、浪费了带宽。于是Ajax技术便应运而生。

Ajax是Asynchronous JavaScript and XML的简称,由Jesse James Garrett 首先提出。这种技术开创性地允许浏览器脚本(JS)发送http请求。Outlook Web Access小组于98年使用,并很快成为IE4.0的一部分,但是这个技术一直很小众,直到2005年初,google在他的goole groups、gmail等交互式应用中广泛使用此种技术,才使得Ajax迅速被大家所接受。

Ajax的出现使客户端与服务器端传输数据少了很多,也快了很多,也满足了以丰富用户体验为特点的web2.0时代 初期发展的需要,但是慢慢地也暴露了他的弊端。比如无法满足即时通信等富交互式应用的实时更新数据的要求。这种浏览器端的小技术毕竟还是基于http协议,http协议要求的请求/响应的模式也是无法改变的,除非http协议本身有所改变。

 

Comet---一种hack技术

以即时通信为代表的web应用程序对数据的Low Latency要求,传统的基于轮询的方式已经无法满足,而且也会带来不好的用户体验。于是一种基于http长连接的“服务器推”技术便被hack出来。这种技术被命名为Comet,这个术语由Dojo Toolkit 的项目主管Alex Russell在博文Comet: Low Latency Data for the Browser首次提出,并沿用下来。

其实,服务器推很早就存在了,在经典的client/server模型中有广泛使用,只是浏览器太懒了,并没有对这种技术提供很好的支持。但是Ajax的出现使这种技术在浏览器上实现成为可能, google的gmail和gtalk的整合首先使用了这种技术。随着一些关键问题的解决(比如 IE 的加载显示问题),很快这种技术得到了认可,目前已经有很多成熟的开源Comet框架。

以下是典型的Ajax和Comet数据传输方式的对比,区别简单明了。典型的Ajax通信方式也是http协议的经典使用方式,要想取得数据,必须首先发送请求。在Low Latency要求比较高的web应用中,只能增加服务器请求的频率。Comet则不同,客户端与服务器端保持一个长连接,只有客户端需要的数据更新时,服务器才主动将数据推送给客户端。

Comet的实现主要有两种方式:

  • 基于Ajax的长轮询(long-polling)方式
  •   浏览器发出XMLHttpRequest 请求,服务器端接收到请求后,会阻塞请求直到有数据或者超时才返回,浏览器JS在处理请求返回信息(超时或有效数据)后再次发出请求,重新建立连接。在此期间服务器端可能已经有新的数据到达,服务器会选择把数据保存,直到重新建立连接,浏览器会把所有数据一次性取回。

      2.  基于 Iframe 及 htmlfile 的流(http streaming)方式

      Iframe是html标记,这个标记的src属性会保持对指定服务器的长连接请求,服务器端则可以不停地返回数据,相对于第一种方式,这种方式跟传统的服务器推则更接近。

    在第一种方式中,浏览器在收到数据后会直接调用JS回调函数,但是这种方式该如何响应数据呢?可以通过在返回数据中嵌入JS脚本的方式,如“<script type="text/javascript">js_func(“data from server ”)</script>”,服务器端将返回的数据作为回调函数的参数,浏览器在收到数据后就会执行这段JS脚本。

    但是这种方式有一个明显的不足之处:IE、Morzilla Firefox 下端的进度栏都会显示加载没有完成,而且 IE 上方的图标会不停的转动,表示加载正在进行。Google 的天才们使用一个称为“htmlfile”的 ActiveX 解决了在 IE 中的加载显示问题,并将这种方法应用到了 gmail+gtalk 产品中。

    Websocket---未来的解决方案

             如果说Ajax的出现是互联网发展的必然,那么Comet技术的出现则更多透露出一种无奈,仅仅作为一种hack技术,因为没有更好的解决方案。Comet解决的问题应该由谁来解决才是合理的呢?浏览器,html标准,还是http标准?主角应该是谁呢?本质上讲,这涉及到数据传输方式,http协议应首当其冲,是时候改变一下这个懒惰的协议的请求/响应模式了。

    W3C给出了答案,在新一代html标准html5中提供了一种浏览器和服务器间进行全双工通讯的网络技术Websocket。从Websocket草案得知,Websocket是一个全新的、独立的协议,基于TCP协议,与http协议兼容、却不会融入http协议,仅仅作为html5的一部分。于是乎脚本又被赋予了另一种能力:发起websocket请求。这种方式我们应该很熟悉,因为Ajax就是这么做的,所不同的是,Ajax发起的是http请求而已。 

    与http协议不同的请求/响应模式不同,Websocket在建立连接之前有一个Handshake(Opening Handshake)过程,在关闭连接前也有一个Handshake(Closing Handshake)过程,建立连接之后,双方即可双向通信。

    Opening Handshake

        客户端发起连接Handshake请求

       GET /chat HTTP/1.1

            Host: server.example.com

            Upgrade: websocket

            Connection: Upgrade

            Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==

            Origin: http://example.com

            Sec-WebSocket-Protocol: chat, superchat

            Sec-WebSocket-Version: 13

             服务器端响应:

            HTTP/1.1 101 Switching Protocols

            Upgrade: websocket

            Connection: Upgrade

            Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=

            Sec-WebSocket-Protocol: chat

    “Upgrade:WebSocket”表示这是一个特殊的 HTTP 请求,请求的目的就是要将客户端和服务器端的通讯协议从 HTTP 协议升级到 WebSocket 协议。

    “Sec-WebSocket-Key”是一段浏览器base64加密的密钥

    “Sec-WebSocket-Accept”服务器端在接收到的Sec-WebSocket-Key密钥后追加一段神奇字符串“258EAFA5-E914-47DA-95CA-C5AB0DC85B11”,并将结果进行sha-1哈希,然后再进行base64加密返回给客户端。

    “Sec-WebSocket-Protocol”表示客户端请求提供的可供选择的子协议,及服务器端选中的支持的子协议,“Origin”服务器端用于区分未授权的websocket浏览器

    “HTTP/1.1 101 Switching Protocols”中101为服务器返回的状态码,所有非101的状态码都表示handshake并未完成。

     

    Data Framing

    Websocket协议通过序列化的数据包传输数据。数据封包协议中定义了opcode、payload length、Payload data等字段。具体封包格式如下图所示:

    FIN: 标识是否为此消息的最后一个数据包,占 1 bit

    RSV1, RSV2, RSV3:  用于扩展协议,一般为0,各占1bit

    Opcode:数据包类型(frame type

        
    [3]用jQuery实现banner图片切换
        来源: 互联网  发布时间: 2013-11-06


    主要运用了定时器的原理,bind,trigger应用等


      <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8">
        <title>banner切换实现</title>
        <style type="text/css">
            /*
            * @description: banner切换样式
            * @author: lanfeng(beryl)
            * @time:2013-02-26
            */
            /* reset*/
            *{ margin: 0; padding: 0;}
            body{font:12px/1.5 Tahoma,'\5B8B\4F53',arial,Tahoma,helvetica,sans-serif; color:#333333;background-color:#ffffff;position:relative; }
            h1,h2,h3,h4,h5,h6{font-size:100%}
            address,em{font-style:normal;}
            code,kbd,pre,samp{font-family:courier new,courier,monospace;}
            ul,ol{list-style:none outside none;}
            fieldset,img{border:0;}
            img{vertical-align:middle}
            table{border-collapse:collapse;border-spacing:0;font-size:inherit;*font-size:100%;}
            input,button,textarea,select{vertical-align:middle;font:100% Helvetica,Arial,sans-serif; color:inherit}
            .clearfix:after{content:'.';display:block;height:0;clear:both;visibility:hidden;}
            .clearfix{*zoom:1;}
            .clear{font-size:0;line-height:0;height:0;clear:both;visibility:hidden;overflow:hidden;}

            .d-ftab{ width:510px; height: 180px;position: relative; margin: 100px auto;}
            .d-fShow ul li{ float: left; width: 510px; height: 180px;}
            .d-fShow{ width: 510px; height: 180px; overflow: hidden;}
            .d-fShow img{ width: 510px; height: 180px; float: left;}
            .d-fs-control{ position: absolute; width:510px; position: absolute; left: 0; bottom: 0; height: 25px; line-height: 25px;

    background: rgba(0,0,0,0.4);
            filter:progid:DXImageTransform.Microsoft.Gradient(GradientType=0,StartColorStr='#66000000',

    EndColorStr='#66000000') ;  }
            :root  .d-fs-control{filter:progid:DXImageTransform.Microsoft.Gradient(GradientType=0,StartColorStr='#66000000'

    ,EndColorStr='#66000000')\9 ;}
            .d-fs-control ul{ position: absolute; bottom:3px; right: 5px; height: 16px;}
            .d-fs-control ul li{width:16px;height:16px; background:#777675;border-radius: 2px 2px 2px 2px; float:left;margin-left:5px;

    color:#dcdcdc;text-align:center;font-weight:700;cursor:pointer;line-height:16px;filter: alpha(opacity=70); opacity: 0.7;}
            .d-fs-control ul li:hover,.d-fs-control ul li.select{background:#ffffff;color:#ff6700;}

        </style>
        <script type="text/javascript" src=/blog_article/"js/jquery-1.4.2.min.js"></script>_br/index.html>     <script type="text/javascript">
          $(function(){
            var wrap =$('.d-ftab');
              var imgs = wrap.find('.d-fShow ul >li');
              var len=imgs.length  ;
              var tabTime=100;
              var outTime=4000;
              var select='select';
              var num =0 ;
              var interval;
              var type = 'click';
              var btns=wrap.find('.d-fs-control ul>li');
        btns.bind(type,function(){
                  var _this=$(this);
                  _this.addClass('select').siblings ().removeClass('select');
                  num=_this.prevAll().length;
                  imgs.stop().eq(num).fadeTo(tabTime,1)  ;
                  imgs.not(':eq('+num+')').filter(':visible').fadeOut(tabTime) ;
                  return false;
    }).eq(num).trigger(type);
              var interFunc=function(){
                  num=(num+1)%len;
                  btns.eq(num).triggerHandler(type);
              }
              wrap.bind('mouseover',function(){
                  clearInterval(interval);
              }).bind('mouseout',function(){
                          interval=setInterval(interFunc,outTime)
                      })

          })
        </script>
    </head>
    <body>
    <div class="d-ftab">
        <div class="d-fShow">
            <ul>
                <li>
                    <a href=/blog_article/"/index.html alt="" src=/blog_article/"/index.html images/1.jpg"/>
                    </a>
                </li>
                <li >
                    <a href=/blog_article/"/index.html alt="" src=/blog_article/"/index.htmlimages/2.png">
                    </a>
                </li>
                <li>
                    <a href=/blog_article/"/index.html alt=""  src=/blog_article/"/index.htmlimages/3.jpg">
                    </a>
                </li>
                <li>
                    <a href=/blog_article/""><img/index.html alt="" src=/blog_article/"/index.htmlimages/4.jpg">
                    </a>
                </li>
                <li>
                    <a href=/blog_article/"/index.html alt="" src=/blog_article/"/index.htmlimages/5.jpg">
                    </a>
                </li>
            </ul>
        </div>
        <div class="d-fs-control">
            <ul>
                <li>1</li>
                <li>2</li>
                <li>3</li>
                <li>4</li>
                <li class="select">5</li>
            </ul>
        </div>
    </div>
    </body>
    </html>

    效果如下图:


        
    最新技术文章:
    ▪css white-space:nowrap属性用法(可以强制文字不...
    ▪IE里button设置border:none属性无效解决方法
    ▪border:none与border:0使用区别
    ▪html清除浮动的6种方法示例
    ▪三个不常见的 HTML5 实用新特性简介
    ▪css代码优化的12个技巧
    ▪低版本IE正常运行HTML5+CSS3网站的3种解决方案
    ▪CSS Hack大全-教你如何区分出IE6-IE10、FireFox、Chr...
    ▪ie6,ie7,ie8完美支持position:fixed的终极解决方案
    ▪小技巧处理div内容溢出
    ▪html小技巧之td,div标签里内容不换行
    ▪纯CSS实现鼠标放上去改变文字内容
    ▪li中插入img图片间有空隙的解决方案
    ▪CSS3中Transition属性详解以及示例分享
    ▪父div高度不能自适应子div高度的解决方案
    ▪告别AJAX实现无刷新提交表单
    ▪从零学CSS系列之文本属性
    ▪HTML 标签
    ▪CSS3+Js实现响应式导航条
    ▪CSS3实例分享之多重背景的实现(Multiple background...
    ▪用css截取字符的几种方法详解(css排版隐藏溢...
    ▪页面遮罩层,并且阻止页面body滚动。bootstrap...
    ▪CSS可以做的几个令你叹为观止的实例分享
    ▪详细分析css float 属性以及position:absolute 的区...
    ▪IE6/IE7/IE8/IE9中tbody的innerHTML不能赋值的完美解...
    ▪CSS小例子(只显示下划线的文本框,像文字一...
    ▪可以给img元素设置背景图
    ▪不通过JavaScript实现的自动滚动视差效果
    ▪div+CSS 兼容小摘
    ▪CSS的inherit与auto使用分析
     


    站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3