首頁(yè)

前端常用class命名

周周

頭:header

內(nèi)容:content/container

尾:footer

導(dǎo)航:nav

側(cè)邊欄:sidebar

欄目:column

頁(yè)面外圍控制整體布局寬度:wrapper

左中右:left center right

登錄條:loginbar

標(biāo)志:logo

版心:banner

頁(yè)面主體:main

熱點(diǎn):hot

新聞:news

下載:download

子導(dǎo)航:subnav

菜單:menu

子菜單:submenu

搜索:search

友情鏈接:friendlink

頁(yè)腳:footer

版權(quán):copyright

滾動(dòng):scroll

標(biāo)簽頁(yè):tab

文章列表:list

提示信息:msg

小技巧:tips

欄目標(biāo)題:title

加入:joinUS

指南:guide

服務(wù):service

注冊(cè):regsiter

狀態(tài):status

投票:vote

合作伙伴:partner

懶加載封裝實(shí)現(xiàn)

周周

1.什么是懶加載?
         當(dāng)訪問一個(gè)頁(yè)面的時(shí)候,先把img元素背景圖片路徑替換成一張?zhí)娲鷪D片的路徑(這樣就只需請(qǐng)求一次,占位圖),將圖片的真實(shí)路徑存儲(chǔ)在img自定義屬性中,只有當(dāng)圖片出現(xiàn)在瀏覽器的可視區(qū)域內(nèi)時(shí),才設(shè)置圖片正真的路徑,讓圖片顯示出來。這就是圖片懶加載。
2.為什么要用懶加載?
       很多頁(yè)面,內(nèi)容很豐富,頁(yè)面很長(zhǎng),圖片較多。比如說各種商城頁(yè)面。這些頁(yè)面圖片數(shù)量多,而且比較大,少說百來K,多則上兆。要是頁(yè)面載入就一次性加載完畢,提高首屏加載速度,可以減輕服務(wù)器壓力,節(jié)約流量,用戶體驗(yàn)好。
3.懶加載實(shí)現(xiàn)封裝?

    lazyLoad由四個(gè)函數(shù)組成,init(初始化函數(shù)),checkShow(判斷圖片是否加載),shouldShow(將要展示的圖片),showImg(展示圖片)。

(1)初始化函數(shù)(init)  由于滾動(dòng)事件太消耗性能,所以用定時(shí)器替換,不是滾動(dòng)就觸發(fā),而是滾動(dòng)后200毫秒后觸發(fā)。

                var timer;
                function init(){
                    $(window).on("scroll",function(){
                        if(timer){
                            clearTimeout(timer);
                        }
                        timer = setTimeout(function(){
                            checkShow();  //
                        },200);
                    });
                }

(2)判斷”圖片是否加載“(checkshow)函數(shù),如果圖片有isload屬性,就說明圖片已經(jīng)加載過了,直接return。如果圖片沒有isload屬性,進(jìn)入將要展示圖片shouldshow函數(shù)

                function checkShow(){
                    $lazyLoad.each(function(){
                        $cur = $(this);
                        if($cur.attr('isLoaded')){
                            return;
                        }
                        if(shouldShow($cur)){
                            showImg($cur);
                        }
                    });
                }

(3)將要展示圖片shouldshow函數(shù),獲取屏幕可視寬度,滾動(dòng)高度,要展示的元素到文檔的高度,如果元素到文檔的高度小于屏幕的可視高度加上滾動(dòng)高度,說明元素已在可視區(qū)內(nèi),返回true,否則返回false。

               function shouldShow ($node){
                    var scrollH = $(window).scrollTop(),
                        windowH = $(window).height(),
                        top = $node.offset().top;
                    if(top < windowH + scrollH){
                        return true;
                    } else {
                        return false;
                    }

                }

(4)“展示圖片”函數(shù),將元素的src屬性替換為自定義屬性data-src(真正圖片的地址)。

                function showImg ($node){
                    $node.find("img").attr("src",$node.data("src"));
                    $node.attr("isLoaded",true);
                }

(5)函數(shù)返回一個(gè)對(duì)象

              return {
                        init : init
           }

      這樣就實(shí)現(xiàn)懶加載封裝了!

js中常見的位置屬性-offset,scroll,client系列

周周

前言
       Javascript中的offset、scroll、client系列都是比較常用的坐標(biāo)屬性,也是比較容易混淆的知識(shí)點(diǎn)。
offset家族
       offset家族一般在節(jié)點(diǎn)對(duì)象里面使用。
       offsetParent
             1.    如果當(dāng)前元素的父級(jí)元素沒有進(jìn)行css定位(position為absolute或relative),offsetParent為body。
             2.    如果當(dāng)前元素的父級(jí)元素中有css定位(position為absolute或relative),offsetParent取最近的那個(gè)父級(jí)元素。
       offsetLeft/Top計(jì)算規(guī)則:
             標(biāo)準(zhǔn)流、浮動(dòng)、非脫標(biāo)定位
              offsetLeft = 自己的margin+offsetParent的margin、padding、border
              脫標(biāo)定位
              offsetLeft = 自己的left + margin-left
        注意:與stlye.left的區(qū)別
              offsetLeft只可讀,不可寫。也就是說,通過offsetLeft只能獲取元素的左偏移值,而無法去設(shè)置元素的左偏移值。
               stlye.left可讀可寫,但是通過style.left獲取元素的偏移值,是一個(gè)帶單位的字符串,例如“100px”。

            (offsetTop同理)

        offsetWidth(和offsetHeight:

        其實(shí)就是一個(gè)元素的實(shí)際寬度 = width+padding+border

client家族】

        clientWidth (clientHeight) = width+padding

              該屬性指的是元素的可視部分寬度和高度

              假如元素有padding有滾動(dòng),且滾動(dòng)是顯示的

              clientWidth = width + padding - 滾動(dòng)軸寬度

       clientTop(clientLeft):

             這一對(duì)屬性是用來讀取元素的border的寬度和高度的

             clientTop = border-top 的 border-width

             clientLeft = border-left 的 border-width

【scroll家族】

150537.jpg.png

  如上圖所示
       scrollWidth(和scrollHeight
          無滾動(dòng)軸時(shí):scrollWidth = clientWhidth = width + padding
          有滾動(dòng)軸時(shí):scrollWidth = 實(shí)際內(nèi)容的寬度 + padding
       scrollTop(和scrollLeft
           這對(duì)元素是可讀寫的,指的是當(dāng)元素其中的內(nèi)容超出其寬高的時(shí)候,元素被卷起的寬度和高度
【事件里面的clientX,offsetX,screenX


  • event.clientX:設(shè)置或獲取鼠標(biāo)指針位置相對(duì)于當(dāng)前窗口的 x 坐標(biāo),其中客戶區(qū)域不包括窗口自身的控件和滾動(dòng)條
  • event.clientY:設(shè)置或獲取鼠標(biāo)指針位置相對(duì)于當(dāng)前窗口的 y 坐標(biāo),其中客戶區(qū)域不包括窗口自身的控件和滾動(dòng)條
  • vent.offsetX:設(shè)置或獲取鼠標(biāo)指針位置相對(duì)于觸發(fā)事件的對(duì)象的 x 坐標(biāo)
  • event.offsetY:設(shè)置或獲取鼠標(biāo)指針位置相對(duì)于觸發(fā)事件的對(duì)象的 y 坐標(biāo)
  • event.screenX 設(shè)置或獲取獲取鼠標(biāo)指針位置相對(duì)于用戶屏幕的 x 坐標(biāo)。
  • event.screenY設(shè)置或獲取鼠標(biāo)指針位置相對(duì)于用戶屏幕的 y 坐標(biāo)。


【window系列】
  • window.innerHeight指的是瀏覽器窗口顯示html文檔的可視區(qū)域的高度
  • window.outerHeight指的是瀏覽器窗口的高度 ,包括了工具欄,地址欄等等高度

       window.screen包含了屏幕的信息
  • window.screen.width   電腦屏幕的整個(gè)寬度
  • window.screen.availWidth   電腦屏幕除去菜單條之后的寬度
  • window.screen.left   瀏覽器窗口的左上角距離電腦屏幕最左側(cè)的距離




12條鮮有人知的css事實(shí)

周周

      此文為譯文,在這篇文章中提到了12條我們前端人員在日常工作中不是特別熟悉而又確實(shí)可以使用或者瀏覽器是可以很好支持的CSS技巧,熟知這些點(diǎn),對(duì)我們深入研究CSS有很好的幫助。在本文中,用括號(hào)的方式加了一些簡(jiǎn)單的算是注釋的個(gè)人理解。    原文地址:http://www.sitepoint.com/12-little-known-css-facts-the-sequel/

1、 border-radius屬性可以使用'/'(斜杠)標(biāo)簽 

      不管你信不信,下邊是有效的border-radius代碼:

.box {
border-radius: 35px 25px 30px 20px / 35px 25px 15px 30px;

    }

    如果你之前沒有見過這些,這里你可能會(huì)有一些困惑,所以這里有規(guī)范的解釋:

   “如果斜杠/前后都設(shè)了值,那么斜杠前面的值就設(shè)定橫向的圓角半徑值,而斜杠后面的值就是設(shè)定縱向的半徑值。如果沒有斜杠的話,就把橫向跟縱向的值設(shè)定為相等?!?/span>

763731149396848.png

圖片注釋:“border-top-left-radius: 55pt 25pt 的兩個(gè)值定義了這個(gè)圓角的曲率(彎曲度) ”  所以,斜杠在值中的作用是讓你創(chuàng)建不對(duì)稱(橫向跟縱向值)的圓角曲率

2、使用bolder、lighter相關(guān)關(guān)鍵字進(jìn)行font-weight屬性的定義

    正常來說你所看到的font-weight 屬性的定義,它的值要么是normal要么是bold。你也偶爾能看到整數(shù)以整百為增量的值:100,200、、最大到900.
     然而,bolder跟lighter這兩個(gè)值經(jīng)常會(huì)被忘記。

         根據(jù)規(guī)范定義,這兩個(gè)關(guān)鍵詞指定了比繼承值更粗或更細(xì)的值。它的出現(xiàn)會(huì)讓你在處理一個(gè)比簡(jiǎn)單的‘bold’更粗一點(diǎn)或者比正常文本更細(xì)一點(diǎn)的多種權(quán)重的字號(hào)的時(shí)候表現(xiàn)的更加明顯。(這塊可能會(huì)有點(diǎn)難理解,其實(shí)這里是跟字體本身有關(guān)聯(lián)的,如果你的字體,比如例子中用到的‘Exo 2’字體中,因?yàn)檫@個(gè)字體最細(xì)為100,bolder一下就變成400,再bolder一下是700,其實(shí)它這個(gè)bolder跟lighter是有個(gè)固定跳到的數(shù)值的,只會(huì)匹配到400,700,900這樣的值里,當(dāng)你的繼承值為100、200或300,bolder一下,這個(gè)bolder的值都會(huì)是400,繼承值為900,800,lighter一下,這個(gè)值都一樣會(huì)是700,所以兩個(gè)關(guān)鍵字其實(shí)是只會(huì)是400、700、900三個(gè)值的。)

3、關(guān)于outline-offset屬性
    outline 屬性由于它能夠幫助調(diào)試而被眾所周知(它不影響頁(yè)面流)。規(guī)范上增加了一個(gè)outline-offset屬性,它的作用完全跟它名字所表示的一樣--讓你定義它的外框線應(yīng)該距離元素本身的偏移量。
    需要注意的就是,雖然outline屬性是一個(gè)簡(jiǎn)寫屬性,但它不包含outline-offset屬性,所以你每次都需要再單獨(dú)定義outline-offset。

     outline-offset屬性唯一的缺點(diǎn)就是,它在IE瀏覽器(即使是IE11)中不起效。

4、關(guān)于table-layout屬性

    你可能會(huì)想,這是很老的信息了。我對(duì)display: table很熟悉,最早用來實(shí)現(xiàn)垂直居中的一種方法。但那不是我想說,注意我要說的是table-layout屬性,而不是display屬性。
    table-layout屬性不像CSS的其他屬性那樣容易解釋,所以我們還是先來看看規(guī)范是如何解釋的:
    "根據(jù)這個(gè)算法,table的橫向布局不依賴于單元格的內(nèi)容;它僅僅依賴于表格的寬度、列的寬度以及邊框和單元格的間距"
    這可能也是W3C規(guī)范史上第一次出現(xiàn)這樣很難理解的東西

5、vertical-align屬性用在表格跟非表格中的時(shí)候表現(xiàn)不一樣
    如果你在2000年或者更早就開始接觸網(wǎng)站編程,或者你處理過很多HTML電子郵件的話,那么你可能會(huì)認(rèn)為vertical-align 屬性是對(duì)老的HTML4中valign屬性一個(gè)在HTML5里過時(shí)的,不符合功能要求的標(biāo)簽)的一個(gè)標(biāo)準(zhǔn)升級(jí)。
    但在CSS中vertical-align 并不是起到那樣的作用。除開表格,我認(rèn)為這個(gè)屬性更牛逼的地方并不在于表格中的表現(xiàn)。
    所以,這個(gè)屬性被應(yīng)用于常規(guī)的元素跟表格單元的時(shí)候有什么不一樣的地方呢?
    當(dāng)vertical-align 不是應(yīng)用在表格單元的時(shí)候,它遵循下邊這些基本規(guī)則:

  • 它只在inline或inline-block元素中起效。
  • 它對(duì)元素中的內(nèi)容不起效,但能改變?cè)撛叵鄬?duì)于其他inline或inline-block元素的對(duì)齊。
  • 它受文本/字體屬性(比如行高line-height)或者相鄰inline或inline-block元素的大小設(shè)置的影響。

6、偽元素::first-letter比你想象中更靈活

    偽元素::first-letter可以給元素的第一個(gè)字母定義樣式,讓你實(shí)現(xiàn)在印刷中多年前就有的段落效果(drop-cap 印刷的書本中經(jīng)常能看到的段落中的第一個(gè)字比其他字號(hào)要大的效果)。
    有個(gè)好消息就是瀏覽器快要出一個(gè)關(guān)于元素的首字母構(gòu)成的標(biāo)準(zhǔn)了。我最早在 Matt Andrews的twitter上看到有關(guān)這個(gè)推文,雖然他僅僅是發(fā)推文吐槽::first-letter選擇器很糟糕。

7、你可以在HTML class列表中使用無效字符作為分隔符
    這個(gè)概念是Ben Everard在2013年的時(shí)候提出,而且我認(rèn)為它值得推廣一下。Ben的觀點(diǎn)是用斜杠去將他的HTML類名進(jìn)行分組,以便他的代碼能夠更好地閱讀或?yàn)g覽。他的觀點(diǎn)認(rèn)為,轉(zhuǎn)義斜杠是一個(gè)無效字符,瀏覽器會(huì)無視它。
    所以你的HTML實(shí)例可能是這樣的:

<div class="col col-4 col-8 c-list bx bx--rounded bx--transparent"> 使用斜杠后,變成這樣: <div class="col col-4 col-8 / c-list / bx bx--rounded bx--transparent"> 你也可以使用任何字符(無效的或者空字符)去實(shí)現(xiàn)同樣的效果: <div class="col col-4 col-8 ** c-list ** bx bx--rounded bx--transparent">[/font]
<div class="col col-4 col-8 || c-list || bx bx--rounded bx--transparent">
 
<div class="col col-4 col-8 && c-list && bx bx--rounded bx--transparent">

8、動(dòng)畫重復(fù)的次數(shù)可以是帶小數(shù)的值

   在寫CSS關(guān)鍵幀動(dòng)畫的時(shí)候,你應(yīng)該可以用animation-iteration-count 屬性來定義動(dòng)畫重復(fù)執(zhí)行的次數(shù):

.example {
animation-iteration-count: 3;
}

     這個(gè)例子中的整數(shù)值將會(huì)讓這個(gè)動(dòng)畫重復(fù)執(zhí)行3次。但你可能不知道這里我們可以使用小數(shù)值:

.example {
animation-iteration-count: .5;
}

   在這個(gè)案例中,這個(gè)動(dòng)畫將執(zhí)行半次(它會(huì)在第一次動(dòng)畫循環(huán)的中途停止)

9、動(dòng)畫名稱會(huì)在動(dòng)畫的簡(jiǎn)寫方式中影響動(dòng)畫的使用
      有些開發(fā)者可能已經(jīng)發(fā)現(xiàn)了這一點(diǎn),在規(guī)范中對(duì)這個(gè)也有個(gè)提醒。比方說,你有以下的動(dòng)畫代碼:

@keyframes reverse {
from {
left: 0;
}
  to {
left: 300px;
}
}
  .example {
animation: reverse 2s 1s;
}

    注意這里我使用reverse作為動(dòng)畫的名稱。簡(jiǎn)單來看,這并沒什么不妥,但要注意當(dāng)我們?cè)谟蒙厦娴拇a作為一個(gè)例子時(shí)發(fā)生了什么:
    這段動(dòng)畫并不起效,因?yàn)椤畆everse’是animation-direction屬性的一個(gè)關(guān)鍵字。任何的動(dòng)畫名稱在匹配到一個(gè)簡(jiǎn)寫語(yǔ)法中的關(guān)鍵字值的時(shí)候都會(huì)發(fā)生這樣的情況。但在普通寫法中這樣的情況不會(huì)發(fā)生(animation-name這樣單獨(dú)的動(dòng)畫名稱寫法的時(shí)候)。
    動(dòng)畫命名在簡(jiǎn)寫語(yǔ)法中包含了任何定時(shí)功能的關(guān)鍵字 (比如infinite, alternate, running, paused 等等)都會(huì)被阻斷。

10、使用樣式選取元素列表中元素的范圍
    我不知道是誰首先這樣用的,但我第一次是在Gunnar Bittersmann 的這個(gè)demo 中看到的。比如說有一個(gè)20個(gè)元素的有序列表,你想選擇第7到14個(gè)元素。這里你可以使用一個(gè)選擇器來實(shí)現(xiàn):

ol li:nth-child(n+7):nth-child(-n+14) {
background: lightpink;

}

    這個(gè)代碼使用了鏈?zhǔn)浇Y(jié)構(gòu)的偽類表達(dá)式。雖然表達(dá)式有點(diǎn)難理解,但你可以通過表達(dá)式中的數(shù)字看到你想要選中的范圍。
    更詳細(xì)地解釋這個(gè)工作的原理:在鏈?zhǔn)浇Y(jié)構(gòu)的第一部分,表達(dá)式為“選中第七個(gè)元素及后面的所有元素”。第二部分的意思是“選取第十四個(gè)元素及前面的所有元素”。但由于兩部分是鏈接在一起的,每一個(gè)限制前一個(gè)的范圍。所以鏈?zhǔn)浇Y(jié)構(gòu)的第二部分不允許第一部分超過第十四個(gè)元素,然而第一部分又不允許第二部分選取到第七個(gè)元素之前的元素。

11、偽元素也適用于一些空元素
    如果你跟我一樣,嘗試過把偽元素附加到一個(gè)圖片或者表格input標(biāo)簽上。你會(huì)發(fā)現(xiàn)這樣并不生效因?yàn)閭卧卦诜情]合元素上無效。我想很多開發(fā)者都認(rèn)為空元素(即沒有閉合標(biāo)簽的元素)都是這樣的。但這并不正確。

12、有些屬性值在選擇器中是不區(qū)分大小寫的
    這是一個(gè)不起眼的點(diǎn),讓他們通過下邊的HTML來看:

<div class="box"></div>
<input type="email">

    你可以通過屬性選擇器來給他們兩個(gè)添加樣式,像這樣:

div[class="box"] {
color: blue;
}
 
input[type="email"] {
border: solid 1px red;
}

    上面這樣是沒問題的,那下邊這樣呢?

div[class="BOX"] {
color: blue;
}
 
input[type="EMAIL"] {
border: solid 1px red;
}

    現(xiàn)在兩個(gè)屬性值都是大寫的。在這個(gè)示例中,因?yàn)閏lass 屬性是區(qū)分大小寫的,所以 .box 元素的樣式不生效。而另外一個(gè)email的標(biāo)簽,卻由于type 的屬性值不區(qū)分大小寫,所以它的樣式能生效。這并非什么重大發(fā)現(xiàn),只是一些你之前可能沒留意到的。

常用正則表達(dá)式20例

周周

   總結(jié)了工作中可能經(jīng)常會(huì)用到的各類正則表達(dá)式的寫法。
   方便以后進(jìn)行查找,減少工作量。

   1. 校驗(yàn)基本日期格式

var reg1 = /^\d{4}(\-|\/|\.)\d{1,2}\1\d{1,2}$/;
var reg2 = /^(^(\d{4}|\d{2})(\-|\/|\.)\d{1,2}\3\d{1,2}$)|(^\d{4}年\d{1,2}月\d{1,2}日$)$/;

   2. 校驗(yàn)密碼強(qiáng)度
   密碼的強(qiáng)度必須是包含大小寫字母和數(shù)字的組合,不能使用特殊字符,長(zhǎng)度在8-10之間。

var reg = /^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$/;

   3. 校驗(yàn)中文 

   字符串僅能是中文。

var reg = /^[\\u4e00-\\u9fa5]{0,}$/; 4. 由數(shù)字、26個(gè)英文字母或下劃線組成的字符串 var reg = /^\\w+$/; 5. 校驗(yàn)E-Mail 地址
同密碼一樣,下面是E-mail地址合規(guī)性的正則檢查語(yǔ)句。
var reg = /[\\w!#$%&'*+/=?^_`{|}~-]+(?:\\.[\\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\\w](?:[\\w-]*[\\w])?\\.)+[\\w](?:[\\w-]*[\\w])?/; 6. 校驗(yàn)身份證號(hào)碼
下面是身份證號(hào)碼的正則校驗(yàn)。15 或 18位。
15位: var reg = /^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$/; 18位: var reg = /^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}([0-9]|X)$/; 7. 校驗(yàn)日期
“yyyy-mm-dd” 格式的日期校驗(yàn),已考慮平閏年。 var reg = /^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$/; 8. 校驗(yàn)金額
金額校驗(yàn),到2位小數(shù)。 var reg = /^[0-9]+(.[0-9]{2})?$/; 9. 校驗(yàn)手機(jī)號(hào)
下面是國(guó)內(nèi) 13、15、18開頭的手機(jī)號(hào)正則表達(dá)式。(可根據(jù)目前國(guó)內(nèi)收集號(hào)擴(kuò)展前兩位開頭號(hào)碼) var reg = /^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\\d{8}$/;    10. 判斷IE的版本
   IE目前還沒被完全取代,很多頁(yè)面還是需要做版本兼容,下面是IE版本檢查的表達(dá)式。

var reg = /^.*MSIE [5-8](?:\\.[0-9]+)?(?!.*Trident\\\/[5-9]\\.0).*$/;

      11. 校驗(yàn)IP-v4地址

var reg = /\\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b/;

     12. 校驗(yàn)IP-v6地址

var reg = /(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))/;

      13. 檢查URL的前綴
   應(yīng)用開發(fā)中很多時(shí)候需要區(qū)分請(qǐng)求是HTTPS還是HTTP,通過下面的表達(dá)式可以取出一個(gè)url的前綴然后再邏輯判斷。

if (!s.match(
    /^[a-zA-Z]+:\/\//
  )) {
  s =
    'http://' +
    s;

}

      14. 提取URL鏈接
   下面的這個(gè)表達(dá)式可以篩選出一段文本中的URL。

var reg = /^(f|ht){1}(tp|tps):\/\/([\w-]+\.)+[\w-]+(\/[\w- ./?%&=]*)?/;    15. 文件路徑及擴(kuò)展名校驗(yàn)
   驗(yàn)證 windows下文件路徑和擴(kuò)展名(下面的例子中為.txt文件)
var reg = /^([a-zA-Z]\\:|\\\\)\\\\([^\\]+\\)*[^\\/:*?"<>|]+\\.txt(l)?$/;       16. 提取Color Hex Codes
   有時(shí)需要抽取網(wǎng)頁(yè)中的顏色代碼,可以使用下面的表達(dá)式。
var reg = /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/; 17. 提取網(wǎng)頁(yè)圖片
   假若你想提取網(wǎng)頁(yè)中所有圖片信息,可以利用下面的表達(dá)式。
var reg = /\\< *[img][^\\>]*[src] *= *[\\"\']{0,1}([^\\"\'\ >]*)/;    18. 提取頁(yè)面超鏈接
   提取html中的超鏈接。

var reg = /(<a\\s*(?!.*\\brel=)[^>]*)(href="https?:\/\/)((?!(?:(?:www\\.)?'.implode('|(?:www\\.)?', $follow_list).'))[^"]+)"((?!.*\\brel=)[^>]*)(?:[^>]*)>/;

   19. 查找CSS屬性
   通過下面的表達(dá)式,可以搜索到相匹配的CSS屬性。

var reg = /^\\s*[a-zA-Z\\-]+\\s*[:]{1}\\s[a-zA-Z0-9\\s.#]+[;]{1}/;

   20. 抽取注釋
   如果你需要移除HMTL中的注釋,可以使用如下的表達(dá)式。

var reg = /<!--(.*?)-->/;

基于jQuery的select2下拉框

周周

select2簡(jiǎn)介】
       select2.js是一個(gè)html select美化模擬類jquery插件,但是select2.js又遠(yuǎn)非簡(jiǎn)單的模擬美化那么簡(jiǎn)單,它還具有搜索功能,多選功能(可限制選擇數(shù)量),ajax方式加載數(shù)據(jù),可以設(shè)置placeholder……
【引入文件】
      <linkrel="stylesheet" href="./css/select2.css">
      <scriptsrc="./js/jquery-2.1.0.js"></script>
      <scriptsrc="./js/select2.full.js"></script>
select2的簡(jiǎn)單用法】


  • 設(shè)置禁用狀態(tài)disabled,如:$(".js-example-disabled").prop("disabled",false);
  • 默認(rèn)值設(shè)置:$("#select2").val("1").trigger("change");
  • 多選的默認(rèn)值可以使用:$("#select2").val(["1","2"]).trigger("change"); 這樣傳遞數(shù)組過
  • select2還有豐富的自定義事件

  JavaScript

$("#select2").on("select2:open", function (e) { log("select2:open", e); });
 
$("#select2").on("select2:close", function (e) { log("select2:close", e); });
 
$("#select2").on("select2:select", function (e) { log("select2:select", e); });
 
$("#select2").on("select2:unselect", function (e) { log("select2:unselect", e); });
 
$("#select2").on("change", function (e) { log("change"); });


select2的其他組件】

      一、多選效果
      效果圖

161511wc0em4p5ictpk0k6.gif



代碼如下
Html代碼

<div class="box1 div">

   <p>多選下拉框</p>

<select id="sel_menu1" multiple="multiple" class="form-control">

  <optgroup label="系統(tǒng)設(shè)置">

  <option value="1">用戶管理</option>

  <option value="2">角色管理</option>

  <option value="3">部門管理</option>

  <option value="4">菜單管理</option>

  </optgroup>

  <optgroup label="訂單管理">

  <option value="5">訂單查詢</option>

  <option value="6">訂單導(dǎo)入</option>

  <option value="7">訂單刪除</option>

  <option value="8">訂單撤銷</option>

  </optgroup>

  <optgroup label="基礎(chǔ)數(shù)據(jù)">

  <option value="9">基礎(chǔ)數(shù)據(jù)維護(hù)</option>

  </optgroup>

  </select>

</div>


JS代碼

$("#sel_menu1").select2({[/align]
         tags: true,
         maximumSelectionLength: 3 //最多能夠選擇的個(gè)數(shù)

      });


二、圖文結(jié)合效果
效果圖

161544vqrri760rldcbg5d.gif


代碼

Html代碼

<div class="box2 div">
     <p>圖文結(jié)合的效果</p>
     <select id="sel_menu2" class="js-example-templating js-states form-control">
          <optgroup label="系統(tǒng)設(shè)置">
  <option value="1">用戶管理</option>
   <option value="2">角色管理</option>
   <option value="1">部門管理</option>
  <option value="1">菜單管理</option>
  </optgroup>
  <optgroup label="訂單管理">
  <option value="1">訂單查詢</option>
  <option value="1">訂單導(dǎo)入</option>
   <option value="1">訂單刪除</option>
  <option value="1">訂單撤銷</option>
   </optgroup>
  <optgroup label="基礎(chǔ)數(shù)據(jù)">
  <option value="1">基礎(chǔ)數(shù)據(jù)維護(hù)</option>
  </optgroup>
      </select>
</div>

JS代碼

$("#sel_menu2").select2({
            templateResult: formatState,
            templateSelection: formatState
        });
        function formatState(state) {
            if (!state.id) {
                return state.text; 
            }
  var $state = $('<span><img src="./image/' + state.element.value.toLowerCase() + '.png" class="img-flag" /> ' + state.text + '</span>'
            );
            return $state;
        };


10種最常見的Javascript錯(cuò)誤

周周

以下是 JavaScript 錯(cuò)誤 Top 10:

  3a8ccf12-f663-38d7-bca8-6178415d9875.png

       為了便于閱讀,我們將每個(gè)錯(cuò)誤描述都縮短了。接下來,讓我們深入到每一個(gè)錯(cuò)誤,來確定什么會(huì)導(dǎo)致它,以及如何避免創(chuàng)建它。 
1. Uncaught TypeError: Cannot read property 
        如果你是一個(gè) JavaScript 開發(fā)人員,可能你看到這個(gè)錯(cuò)誤的次數(shù)比你敢承認(rèn)的要多(LOL…)。當(dāng)你讀取一個(gè)未定義的對(duì)象的屬性或調(diào)用其方法時(shí),這個(gè)錯(cuò)誤會(huì)在 Chrome 中出現(xiàn)。 您可以很容易的在 Chrome 開發(fā)者控制臺(tái)中進(jìn)行測(cè)試(嘗試)。

       發(fā)生這種情況的原因很多,但常見的一種是在渲染 UI 組件時(shí)對(duì)于狀態(tài)的初始化操作不當(dāng)。
        我們來看一個(gè)在真實(shí)應(yīng)用程序中發(fā)生的例子:我們選擇 React,但該情況也同樣適用于 Angular、Vue 或任何其他框架。

Javascript代碼  

class Quiz extends Component {
  componentWillMount() {
    axios.get('/thedata').then(res => {
      this.setState({items: res.data});
    });
  }
  render() {
    return (
      <ul>
        {this.state.items.map(item =>
          <li key={item.id}>{item.name}</li>
        )}
      </ul>
    );
  }
}
這里有兩件重要的事情要實(shí)現(xiàn):

  • 組件的狀態(tài)(例如 this.state)從 undefined 開始。
  • 當(dāng)異步獲取數(shù)據(jù)時(shí),不管它是在構(gòu)造函數(shù)componentWillMount還是componentDidMount中獲取的,組件在數(shù)據(jù)加載之前至少會(huì)呈現(xiàn)一次,當(dāng) Quiz 第一次呈現(xiàn)時(shí),this.state.items 是未定義的。 這又意味著 ItemList 將 items 定義為 undefined,并且在控制臺(tái)中出現(xiàn)錯(cuò)誤 - “Uncaught TypeError: Cannot read property ‘map’ of undefined”。

       這很容易解決。最簡(jiǎn)單的方法:在構(gòu)造函數(shù)中用合理的默認(rèn)值來初始化 state。

Javascript代碼


class Quiz extends Component {
  // Added this:
  constructor(props) {
    super(props);
    // Assign state itself, and a default value for items
    this.state = {
      items: []
    };
  }
  componentWillMount() {
    axios.get('/thedata').then(res => {
      this.setState({items: res.data});
    });
  }
  render() {
    return (
      <ul>
        {this.state.items.map(item =>
          <li key={item.id}>{item.name}</li>
        )}
      </ul>
    );
  }
}

       在你的應(yīng)用程序中的具體代碼可能是不同的,但我們希望我們已經(jīng)給你足夠的線索,以解決或避免在你的應(yīng)用程序中出現(xiàn)的這個(gè)問題。如果還沒有,請(qǐng)繼續(xù)閱讀,因?yàn)槲覀儗⒃谙旅娓采w更多相關(guān)錯(cuò)誤的示例。
        2. TypeError: ‘undefined’ is not an object
        這是在 Safari 中讀取屬性或調(diào)用未定義對(duì)象上的方法時(shí)發(fā)生的錯(cuò)誤。您可以在 Safari Developer Console 中輕松測(cè) 試。這與 1 中提到的 Chrome 的錯(cuò)誤基本相同,但 Safari 使用了不同的錯(cuò)誤消息提示語(yǔ)。

      3.TypeError: null is not an object
        這是在 Safari 中讀取屬性或調(diào)用空對(duì)象上的方法時(shí)發(fā)生的錯(cuò)誤。 您可以在 Safari Developer Console 中輕松測(cè)試。

有趣的是,在 JavaScript 中,null 和 undefined 是不一樣的,這就是為什么我們看到兩個(gè)不同的錯(cuò)誤信息。undefined 通常是一個(gè)尚未分配的變量,而 null 表示該值為空。 要驗(yàn)證它們不相等,請(qǐng)嘗試使用嚴(yán)格的相等運(yùn)算符 ===:  

       在現(xiàn)實(shí)世界的例子中,這種錯(cuò)誤可能發(fā)生的一種場(chǎng)景是:如果在加載元素之前嘗試在 JavaScript 中使用元素。 因?yàn)?DOM API 對(duì)于空白的對(duì)象引用返回值為 null。
        任何執(zhí)行和處理 DOM 元素的 JS 代碼都應(yīng)該在創(chuàng)建 DOM 元素之后執(zhí)行。 JS 代碼按照 HTML 中的規(guī)定從上到下進(jìn)行解釋。 所以,如果 DOM 元素之前有一個(gè)標(biāo)簽,腳本標(biāo)簽內(nèi)的 JS 代碼將在瀏覽器解析 HTML 頁(yè)面時(shí)執(zhí)行。 如果在加載腳本之前尚未創(chuàng)建 DOM 元素,則會(huì)出現(xiàn)此錯(cuò)誤。
        在這個(gè)例子中,我們可以通過添加一個(gè)事件監(jiān)聽器來解決這個(gè)問題,這個(gè)監(jiān)聽器會(huì)在頁(yè)面準(zhǔn)備好的時(shí)候通知我們。 一旦 addEventListener被觸發(fā),init() 方法就可以使用 DOM 元素。

Html代碼

<script>
  function init() {
    var myButton = document.getElementById("myButton");
    var myTextfield = document.getElementById("myTextfield");
    myButton.onclick = function() {
      var userName = myTextfield.value;
    }
  }
  document.addEventListener('readystatechange', function() {
    if (document.readyState === "complete") {
      init();
    }
  });
</script>
<form>
  <input type="text" id="myTextfield" placeholder="Type your name" />
  <input type="button" id="myButton" value="Go" />
</form>

4. (unknown): Script error 
       當(dāng)未捕獲的 JavaScript 錯(cuò)誤(通過window.onerror處理程序引發(fā)的錯(cuò)誤,而不是捕獲在try-catch中)被瀏覽器的跨域策略限制時(shí),會(huì)產(chǎn)生這類的腳本錯(cuò)誤。 例如,如果您將您的 JavaScript 代碼托管在 CDN 上,則任何未被捕獲的錯(cuò)誤將被報(bào)告為“腳本錯(cuò)誤” 而不是包含有用的堆棧信息。這是一種瀏覽器安全措施,旨在防止跨域傳遞數(shù)據(jù),否則將不允許進(jìn)行通信。 
        要獲得真正的錯(cuò)誤消息,請(qǐng)執(zhí)行以下操作: 
        1. 發(fā)送 ‘Access-Control-Allow-Origin’ 頭部 
        將 Access-Control-Allow-Origin 標(biāo)頭設(shè)置為 * 表示可以從任何域正確訪問資源。 如有必要,您可以將域替換為您的域:例如,Access-Control-Allow-Origin:www.example.com。 但是,處理多個(gè)域會(huì)變得棘手,如果你使用 CDN,可能由此產(chǎn)生更多的緩存問題會(huì)讓你感覺到這種努力并不值得。 在這里看到更多。 
         這里有一些關(guān)于如何在各種環(huán)境中設(shè)置這個(gè)頭文件的例子: 
         在 JavaScript 文件所在的文件夾中,使用以下內(nèi)容創(chuàng)建一個(gè) .htaccess 文件:
代碼

       Header add Access-Control-Allow-Origin "*"  

       將 add_header 指令添加到提供 JavaScript 文件的位置塊中:
代碼

       location ~ ^/assets/ {  add_header Access-Control-Allow-Origin *;  }  

        將以下內(nèi)容添加到您為 JavaScript 文件提供資源服務(wù)的后端: 

代碼 

        rspadd Access-Control-Allow-Origin:\ *  

        在 <script> 中設(shè)置 crossorigin="anonymous"

在您的 HTML 代碼中,對(duì)于您設(shè)置了Access-Control-Allow-Origin header 的每個(gè)腳本,在 script 標(biāo)簽上設(shè)置crossorigin =“anonymous”。在腳本標(biāo)記中添加 crossorigin 屬性之前,請(qǐng)確保驗(yàn)證上述 header 正確發(fā)送。 在Firefox 中,如果存在crossorigin屬性,但Access-Control-Allow-Origin頭不存在,則腳本將不會(huì)執(zhí)行。 

5. TypeError: Object doesn’t support property

       這是您在調(diào)用未定義的方法時(shí)發(fā)生在 IE 中的錯(cuò)誤。 您可以在 IE 開發(fā)者控制臺(tái)中進(jìn)行測(cè)試。

fcb1e309-0293-3836-a8e5-e6e361a28add.png

       這相當(dāng)于 Chrome 中的 “TypeError:”undefined“ is not a function” 錯(cuò)誤。 是的,對(duì)于相同的邏輯錯(cuò)誤,不同的瀏覽器可能具有不同的錯(cuò)誤消息。 
        對(duì)于使用 JavaScript 命名空間的 Web 應(yīng)用程序,這是一個(gè) IE l瀏覽器的常見的問題。 在這種情況下,99.9% 的原因是 IE 無法將當(dāng)前名稱空間內(nèi)的方法綁定到 this 關(guān)鍵字。 例如:如果你 JS 中有一個(gè)命名空間 Rollbar 以及方法 isAwesome 。 通常,如果您在 Rollbar 命名空間內(nèi),則可以使用以下語(yǔ)法調(diào)用isAwesome方法:
Javascript代碼 

this.isAwesome();  

        Chrome,F(xiàn)irefox 和 Opera 會(huì)欣然接受這個(gè)語(yǔ)法。 另一方面 IE,不會(huì)。 因此,使用 JS 命名空間時(shí)最安全的選擇是始終以實(shí)際名稱空間作為前綴。

6. TypeError: ‘undefined’ is not a function
        當(dāng)您調(diào)用未定義的函數(shù)時(shí),這是 Chrome 中產(chǎn)生的錯(cuò)誤。 您可以在 Chrome 開發(fā)人員控制臺(tái)和 Mozilla Firefox 開發(fā)人員控制臺(tái)中進(jìn)行測(cè)試。 63e43ce7-2048-3c44-9d80-3e8a27b71a56.png

       隨著 JavaScript 編碼技術(shù)和設(shè)計(jì)模式在過去幾年中變得越來越復(fù)雜,回調(diào)和關(guān)閉中的自引用范圍也相應(yīng)增加,這是這種/那種混淆的相當(dāng)常見的來源。
       考慮這個(gè)代碼片段:
Javascript代碼

function testFunction() {
  this.clearLocalStorage();
  this.timer = setTimeout(function() {
    this.clearBoard();    // what is "this"?
  }, 0);
};

執(zhí)行上面的代碼會(huì)導(dǎo)致以下錯(cuò)誤:“Uncaught TypeError:undefined is not a function”。 你得到上述錯(cuò)誤的原因是,當(dāng)你調(diào)用setTimeout()時(shí),實(shí)際上是調(diào)用window.setTimeout()。 因此,在窗口對(duì)象的上下文中定義了一個(gè)傳遞給setTimeout()的匿名函數(shù),該函數(shù)沒有clearBoard()方法。
一個(gè)傳統(tǒng)的,舊瀏覽器兼容的解決方案是簡(jiǎn)單地將您的 this 保存在一個(gè)變量,然后可以由閉包繼承。 例如:
Javascript代碼 

function testFunction () {
  this.clearLocalStorage();
  var self = this;   // save reference to 'this', while it's still this!
  this.timer = setTimeout(function(){
    self.clearBoard(); 
  }, 0);

};

或者,在較新的瀏覽器中,可以使用bind()方法傳遞適當(dāng)?shù)囊茫?
Javascript代碼

function testFunction () {
  this.clearLocalStorage();
  this.timer = setTimeout(this.reset.bind(this), 0);  // bind to 'this'
};
function testFunction(){
    this.clearBoard();    //back in the context of the right 'this'!
};

7. Uncaught RangeError: Maximum call stack 

        這是 Chrome 在一些情況下會(huì)發(fā)生的錯(cuò)誤。 一個(gè)是當(dāng)你調(diào)用一個(gè)不終止的遞歸函數(shù)。您可以在 Chrome 開發(fā)者控制臺(tái)中進(jìn)行測(cè)試。

                     5cadac78-96ee-3a2f-ad3f-493cceae8e0a.png

      此外,如果您將值傳遞給超出范圍的函數(shù),也可能會(huì)發(fā)生這種情況。 許多函數(shù)只接受其輸入值的特定范圍的數(shù)字。 例如:Number.toExponential(digits) 和 Number.toFixed(digits) 接受 0 到 20 的數(shù)字,Number.toPrecision(digits) 接受 1 到 21 的數(shù)字。
Javascript代碼

var a = new Array(4294967295);  //OK
var b = new Array(-1); //range error
var num = 2.555555;
document.writeln(num.toExponential(4));  //OK
document.writeln(num.toExponential(-2)); //range error!
num = 2.9999;
document.writeln(num.toFixed(2));   //OK
document.writeln(num.toFixed(25));  //range error!
num = 2.3456;
document.writeln(num.toPrecision(1));   //OK
document.writeln(num.toPrecision(22));  //range error!

8. TypeError: Cannot read property ‘length’

        這是 Chrome 中發(fā)生的錯(cuò)誤,因?yàn)樽x取未定義變量的長(zhǎng)度屬性。 您可以在 Chrome 開發(fā)者控制臺(tái)中進(jìn)行測(cè)試。
      您通常會(huì)在數(shù)組中找到定義的長(zhǎng)度,但是如果數(shù)組未初始化或者變量名稱在另一個(gè)上下文中隱藏,則可能會(huì)遇到此錯(cuò)誤。讓我們用下面的例子來理解這個(gè)錯(cuò)誤。
Javascript代碼

var testArray = ["Test"];
function testFunction(testArray) {
    for (var i = 0; i < testArray.length; i++) {
      console.log(testArray[i]);
    }
}
testFunction(); 當(dāng)你用參數(shù)聲明一個(gè)函數(shù)時(shí),這些參數(shù)變成了函數(shù)作用域內(nèi)的本地參數(shù)。這意味著即使你函數(shù)外有名為 testArray 的變量,在一個(gè)函數(shù)中具有相同名字的參數(shù)也會(huì)被視為本地參數(shù)。

        您有兩種方法可以解決您的問題:
        1. 刪除函數(shù)聲明語(yǔ)句中的參數(shù)(事實(shí)上你想訪問那些聲明在函數(shù)之外的變量,所以你不需要函數(shù)的參數(shù)):

var testArray = ["Test"];
/* Precondition: defined testArray outside of a function */
function testFunction(/* No params */) {
    for (var i = 0; i < testArray.length; i++) {
      console.log(testArray[i]);
    }
}
testFunction();

      2. 用聲明的數(shù)組調(diào)用該函數(shù):

var testArray = ["Test"];
function testFunction(testArray) {
   for (var i = 0; i < testArray.length; i++) {
      console.log(testArray[i]);
    }
}
testFunction(testArray); 9. Uncaught TypeError: Cannot set property 
        當(dāng)我們嘗試訪問一個(gè)未定義的變量時(shí),它總是返回 undefined,我們不能獲取或設(shè)置任何未定義的屬性。 在這種情況下,應(yīng)用程序?qū)伋?“Uncaught TypeError: Cannot set property”。 
       如果測(cè)試對(duì)象不存在,錯(cuò)誤將會(huì)拋出 “Uncaught TypeErrorUncaught TypeError: Cannot set property”。

10. ReferenceError: event is not defined 
當(dāng)您嘗試訪問未定義的變量或超出當(dāng)前范圍的變量時(shí),會(huì)引發(fā)此錯(cuò)誤。
       如果在使用事件處理系統(tǒng)時(shí)遇到此錯(cuò)誤,請(qǐng)確保使用傳入的事件對(duì)象作為參數(shù)。像 IE 這樣的舊瀏覽器提供了一個(gè)全局變量事件,但并不是所有瀏覽器都支持。像 jQuery 這樣的庫(kù)試圖規(guī)范化這種行為。盡管如此,最好使用傳入事件處理函數(shù)的函數(shù)。
function myFunction(event) {
    event = event.which || event.keyCode;
    if(event.keyCode===13){
       alert(event.keyCode);
    }
}

結(jié)論 
        我們希望你學(xué)到了新的東西,可以避免將來的錯(cuò)誤,或者本指南幫助你解決了頭痛的問題。 
        盡管如此,即使有最佳實(shí)踐,生產(chǎn)中也會(huì)出現(xiàn)意想不到的錯(cuò)誤。能夠查看影響用戶的錯(cuò)誤,并擁有快速解決問題的好工具,這一點(diǎn)非常重要。

利用 CSS 變量實(shí)現(xiàn)令人震驚的懸浮效果

周周

這個(gè)動(dòng)畫是將鼠標(biāo)移動(dòng)到訂閱按鈕上移動(dòng)光標(biāo)會(huì)顯示相應(yīng)的彩色漸變。這個(gè)想法很簡(jiǎn)單,但是它能使這個(gè)按鈕脫穎而出,人們一下子就注意到它了,增加了點(diǎn)擊的概率。

171422eli2zvv3zq2eq2mu.gif

那么如何使用CSS實(shí)現(xiàn)這個(gè)效果?

追蹤位置

我們要做的第一件事就是獲取到鼠標(biāo)的位置。

  document.querySelector('.button').onmousemove = (e) => {
  const x = e.pageX - e.target.offsetLeft
  const y = e.pageY - e.target.offsetTop

  e.target.style.setProperty('--x', `${ x }px`)
  e.target.style.setProperty('--y', `${ y }px`)
  }
   1.選擇元素,等待,直到用戶將鼠標(biāo)移過它;
   2.計(jì)算相對(duì)于元素的位置;
   3.將坐標(biāo)存在CSS的變量中。

動(dòng)畫漸變
  .button {
     position: relative;
     appearance: none;
     background: #f72359;
     padding: 1em 2em;
     border: none;
     color: white;
     font-size: 1.2em;
     cursor: pointer;
     outline: none;
     overflow: hidden;
     border-radius: 100px;
  span {
    position: relative;
  }
  &::before {
    --size: 0;  
    content: '';
    position: absolute;
    left: var(--x);
    top: var(--y);
    width: var(--size);
    height: var(--size);
    background: radial-gradient(circle closest-side, #4405f7, transparent);
    transform: translate(-50%, -50%);
    transition: width .2s ease, height .2s ease;
    }
    &:hover::before {
    --size: 400px;
      }

   }

結(jié)果
成功啦!將其加入到對(duì)于的HTML頁(yè)面,你炫酷的按鈕就可以使用啦!

談?wù)凚FC

周周

一、什么是BFC
       BFC(block formatting context)簡(jiǎn)單來說,BFC 就是一種屬性,這種屬性會(huì)影響著元素的定位以及與其兄弟元素之間的相互作用。
    中文常譯為塊級(jí)格式化上下文。是 W3C CSS 2.1 規(guī)范中的一個(gè)概念, 從樣式上看,具有 BFC 的元素與普通的容器沒有什么區(qū)別,但是從功能上,具有 BFC 的元素可以看作是隔離了的獨(dú)立容器,容器里面的元素不會(huì)在布局上影響到外面的元素,并且 BFC 具有普通容器沒有的一些特性,它決定了元素如何對(duì)其內(nèi)容進(jìn)行定位,以及與其他元素的關(guān)系和相互作用。

如何觸發(fā) BFC

      上面介紹了 BFC 的定義,那么如何觸發(fā) BFC 呢?
    滿足下面任一條件的元素,會(huì)觸發(fā)為 BFC :
    1、浮動(dòng)元素,float 除 none 以外的值
    2、絕對(duì)定位元素,position(absolute,fixed)
    3、display 為以下其中之一的值 inline-blocks,table-cells,table-captions
    4、overflow 除了 visible 以外的值(hidden,auto,scroll)

、BFC布局與普通文檔流布局區(qū)別      
    普通文檔流布局規(guī)則
    1.浮動(dòng)的元素是不會(huì)被父級(jí)計(jì)算高度
    2.非浮動(dòng)元素會(huì)覆蓋浮動(dòng)元素的位置
    3.margin會(huì)傳遞給父級(jí)
    4.兩個(gè)相鄰元素上下margin會(huì)重疊

    BFC布局規(guī)則
    1.浮動(dòng)的元素會(huì)被父級(jí)計(jì)算高度(父級(jí)觸發(fā)了BFC)
    2.非浮動(dòng)元素不會(huì)覆蓋浮動(dòng)元素位置(非浮動(dòng)元素觸發(fā)了BFC)
    3.margin不會(huì)傳遞給父級(jí)(父級(jí)觸發(fā)了BFC)

    4.兩個(gè)相鄰元素上下margin會(huì)重疊(給其中一個(gè)元素增加一個(gè)父級(jí),然后讓他的父級(jí)觸發(fā)BFC)

   下面來說一下BFC的實(shí)際使用場(chǎng)景
   場(chǎng)景1:解決子盒子都浮動(dòng)時(shí) 父盒子高度不參與計(jì)算問題
    <style>
      .far {
         border: 10px solid pink;
         width: 300px;
     }
      .child {
         border: 10px solid yellowgreen;
         width:100px;
         height: 100px;
         float: left;
    }
     .far{
         overflow: hidden;
    }
    </style>
    <body>
        <div class="far">
             <div class="child"></div>
             <div class="child"></div>
        </div>
    </body>

    根據(jù)overflow 除了 visible 以外的值(hidden,auto,scroll)就會(huì)觸發(fā)BFC的原則 計(jì)算BFC高度時(shí) ,floatbox也參與其中。


    場(chǎng)景2:box垂直方向的距離 會(huì)由margin來決定 相鄰兩個(gè)盒子之間margin會(huì)重疊 ,這就是margin上下間值合并的原因

    <style>
    p {
        color: pink;
        background: #fcc;
        width: 200px;
        height:100px;
        text-align:center;
        margin: 100px;
    }
    </style>
    <body>
       <p></p>
       <p></p>
    </body>

    要解決這個(gè)問題我們可以在p外面包裹一層容器,并觸發(fā)該容器生成一個(gè)BFC。那么兩個(gè)P便不屬于同一個(gè)BFC,就不會(huì)發(fā)生margin重疊了,解決代碼如下。
    <style>
       .box {
          overflow: hidden;
       }
       p {
          background: green;
          width: 200px;
          height: 200px;
          margin: 100px;
      }
    </style>
    <body>
       <p></p>
       <div class="box">
           <p></p>
       </div>

    </body>

    場(chǎng)景3:實(shí)現(xiàn)左側(cè)固定右側(cè)自適應(yīng)等類似布局
    <style>
        .out{
            border: 1px solid red;
            height: 200px;
        }
        .left{
            width: 200px;
            height: 150px;
            background-color: green;
            float: left;
        }
        .right{
            background-color: pink;
            height: 250px;
            overflow: hidden;
        }
      </style>
      <body>
     <div class="out">
        <div class="left"></div>
        <div class="right"></div>
      </div>

8個(gè)非常個(gè)性化的CSS3單/復(fù)選框

周周

       單選框和復(fù)選框在網(wǎng)頁(yè)表單中應(yīng)用十分廣泛,但是瀏覽器默認(rèn)自帶的單選框和復(fù)選框樣式不僅不統(tǒng)一,而且大多都比較簡(jiǎn)單丑陋。本文給大家介紹了一些基于CSS3的個(gè)性化單選框和復(fù)選框,一些選中動(dòng)畫是基于jQuery的,你可以挑選喜歡的單選框和復(fù)選框應(yīng)用到自己的網(wǎng)頁(yè)中去,非常方便。

         1、jQuery超級(jí)個(gè)性化的單線框和復(fù)選框

       今天要分享的也是一個(gè)非常個(gè)性化的單選框和復(fù)選框插件,顏色你可以自己定義。

      56a706650001cc8206100418.png

                   在線演示  源碼下載

         2、CSS3漂亮的自定義Checkbox復(fù)選框 9款迷人樣式

       今天我們來分享一款9款樣式迷人的CSS3漂亮的自定義checkbox復(fù)選框。這幾款復(fù)選框樣式很豐富,使用起來也比較方便。


56a70c3e0001aede05880266.jpg

                    在線演示  源碼下載

        3、CSS3自定義美化復(fù)選框Checkbox組合

       今天我們要來分享一組非常漂亮的CSS3自定義復(fù)選框checkbox,每一個(gè)checkbox都有其各自的特點(diǎn)。有幾款checkbox在選中的情況下還會(huì)出現(xiàn)動(dòng)畫效果,非常不錯(cuò)的CSS3自定義美化checkbox組合。

56a70cbb00019efb06100379.png

                在線演示   源碼下載

       4、jQuery實(shí)現(xiàn)美化版的單選框和復(fù)選框

       今天這款是利用jQuery實(shí)現(xiàn)的美化版單選框和復(fù)選框,樣式風(fēng)格非常簡(jiǎn)潔清爽,是一款很不錯(cuò)的jQuery按鈕插件。

56a70e01000161c706100252.png

                          在線演示  源碼下載

       5、純CSS3 3D按鈕 按鈕酷似牛奶般剔透

       CSS3按鈕一般都可以設(shè)計(jì)的非常漂亮,利用投影、漸變等CSS3屬性可以把按鈕渲染的十分動(dòng)感。今天分享的這款CSS3按鈕外觀非常特別,它看上去酷似晶瑩剔透的牛奶,而且在點(diǎn)擊按鈕時(shí)出現(xiàn)3D效果的動(dòng)畫,按鈕按下時(shí),按鈕會(huì)輕輕的彈動(dòng)一下,非常逼真。

56a70e1000013a8d05880281.jpg

                 在線演示  源碼下載

        6、HTML5/CSS3開關(guān)按鈕 立體3D按鈕

        今天介紹的這款HTML5/CSS3開關(guān)切換按鈕是利用純CSS3的,代碼非常簡(jiǎn)單,3D效果也還可以。

56a70e1b0001142f08000557.gif

                  在下演示  源碼下載

         7、CSS3自定義發(fā)光Radiobox單選框

       今天我們要來分享一款CSS3實(shí)現(xiàn)的自定義發(fā)光radiobox單選框插件,該radiobox選中時(shí)也有滑塊的動(dòng)畫。

56a70e2d0001b19b05880259.jpg

                   在線演示  源碼下載

      8、CSS3實(shí)現(xiàn)自定義Checkbox動(dòng)畫

      今天我們要再來分享一款CSS3自定義checkbox,而且這款checkbox還帶有動(dòng)畫效果,當(dāng)你選中checkbox的時(shí)候,會(huì)以動(dòng)畫的方式打上一個(gè)大大的勾。

56a70e350001219c05880215.jpg 

                   在線演示  源碼下載



         以上就是8個(gè)非常個(gè)性化的CSS3單/復(fù)選框,希望對(duì)你有所幫助。

       本文鏈接:http://www.codeceo.com/article/10-personal-css3-radiobox-checkbox.html







日歷

鏈接

個(gè)人資料

存檔