PIXNET Logo登入

互聯網 - 大數據

跳到主文

本部落格為互聯網熱門頭條訊息管理中心

部落格全站分類:生活綜合

  • 相簿
  • 部落格
  • 留言
  • 名片
  • 3月 09 週四 201720:21
  • 用css3實現各種圖標效果(2)


文章出處
寫在前面
寫的一模一樣的css樣式,結果卻導致原來出來不一樣的效果圖。
用chrome的開發者工具查看,比較起來還是一模一樣的css樣式,可為什么會出現不一樣的placeholder效果呢?一個白色粗體,一個灰色正常字體。
找了老半天找不到原因
后來才發現是我同事寫的框架css里面代碼的一句話影響到了
::-webkit-input-placeholder {
color
: #a4afc6;
}

可是為什么在chrome控制臺看不到這句代碼呢?請教了一番同事,原來是這樣的。
 1、點擊控制臺“設置”按鈕
2、按如下所示設置,選中“Show user agent shadow DOM”
3、你就會在elements控制面板里面能看到如下所示
回歸正題,繼續我的css各種圖標。。。。
當然在開始之前,還是加上如下這段公共樣式吧!
[class^="u-icon"]
{
display
: inline-block;
color
: #fff;
vertical-align
: middle;
}

 
各種刪除按鈕(不用圖標只能css來實現)
html代碼如下:
 <span class="u-icon-radioDelete"></span>
<span class="u-icon-deleteToggle Orange">
<span class="u-icon-trash"></span>刪除
</span>
<span class="u-icon-deleteToggle Blue">
<span class="u-icon-grayTrash"></span>刪除
</span>
<span class="u-icon-del"></span>
<span class="u-icon-del on"></span>
<span class='u-icon-sel more'>搜索更多</span>
<span class='u-icon-sel on'>搜索更多</span>
<span class='u-icon-delete'><i></i></span>

 
頁面顯示效果如下:
css樣式代碼:
.u-icon-sel
{
position
: relative;
-webkit-box-sizing
: border-box;
width
: 32%;
height
: 32px;
line-height
: 30px;
margin-bottom
: 4px;
border
: 1px solid #a4afc6;
border-radius
: 3px;
color
: #a4afc6;
text-align
: center;
text-overflow
: ellipsis;
overflow
: hidden;
white-space
: nowrap;
}
.u-icon-sel.on
{
overflow
: hidden;
border-color
: #ff5d1d;
color
: #000;
}
.u-icon-sel.on:before
{
position
: absolute;
right
: 0;
bottom
: 0;
width
: 18px;
height
: 18px;
background
: url(http://webresource.c-ctrip.com/ResCorpMobile/R1/img/common-graphic37.png?20150423) no-repeat -23px -152px/150px 240px;
content
: '';
}
.u-icon-sel.more
{
color
: #6daeee;
}
.u-icon-deleteToggle
{
width
: 75px;
height
: 45px;
line-height
: 45px;
text-align
: center;
}
.u-icon-deleteToggle.Blue
{
background-color
: #3e74b9;
}
.u-icon-deleteToggle.Orange
{
background-color
: #ff5d1d;
}
/*白色垃圾桶、灰色垃圾桶圖標*/
.u-icon-trash,.u-icon-grayTrash
{
background
: url(http://webresource.c-ctrip.com/ResCorpMobile/R1/img/common-graphic37.png?20150423) no-repeat 0 0/150px 240px;
}
.u-icon-trash
{
background-position
: 0 -84px;
width
: 16px;
height
: 18px;
}
.u-icon-grayTrash
{
display
: inline-block;
width
: 12px;
height
: 18px;
margin-right
: 8px;
vertical-align
: -2px;
background-position
: -3px -178px;
}
/*不用任何圖標實現刪除icon效果*/
.u-icon-delete
{
position
: absolute;
bottom
: 5px;
right
: 0;
width
: 40px;
height
: 40px;
}
/*給before偽類設置一個默認背景色 設置content*/
.u-icon-delete:before
{
position
: absolute;
top
: 10px;
left
: 10px;
width
: 20px;
height
: 20px;
border-radius
: 20px;
background-color
: #8e8e93;
content
: '';
}
/*給after偽類 -webkit-transform: rotate(-45deg);旋轉 background-color: #e1e2e4;設置X的一邊的顏色*/
.u-icon-delete:after
{
position
: absolute;
top
: 19px;
left
: 14px;
width
: 12px;
height
: 2px;
-webkit-transform
: rotate(-45deg);
background-color
: #e1e2e4;
content
: '';
}
/* -webkit-transform: rotate(45deg); 運用的特別巧秒*/
.u-icon-delete i
{
position
: absolute;
top
: 19px;
left
: 14px;
width
: 12px;
height
: 2px;
background-color
: #e1e2e4;
-webkit-transform
: rotate(45deg);
}
/*橙色背景中間一白色橫杠的刪除icon */
.u-icon-del
{
position
: relative;
width
: 24px;
height
: 24px;
border
: 1px solid #ff5d1d;
-webkit-border-radius
: 24px;
border-radius
: 24px;
-webkit-transition
: 300ms ease-in-out;
transition
: 300ms ease-in-out;
background-color
: #ff5d1d;
}
.u-icon-del.on,.on .u-icon-del
{
-webkit-transform
: rotateZ(90deg);
}
/*這里的background-color: #fff;和 content: "\20";實現白色橫杠*/
.u-icon-del::after
{
position
: absolute;
top
: 10px;
left
: 4px;
width
: 16px;
height
: 4px;
background-color
: #fff;
content
: "\20";
}
.u-icon-radioDelete
{
position
: relative;
width
: 24px;
height
: 24px;
border
: 1px solid #8AADD8;
-webkit-border-radius
: 24px;
border-radius
: 24px;
-webkit-transition
: 300ms ease-in-out;
transition
: 300ms ease-in-out;
}
.u-icon-radioDelete::after
{
position
: absolute;
top
: 11px;
left
: 4px;
width
: 16px;
height
: 2px;
background-color
: #8AADD8;
color
: #8AADD8;
content
: "\20";
}
.u-icon-radioDelete.on,.on .u-icon-radioDelete
{
-webkit-transform
: rotateZ(90deg);
-ms-transform
: rotateZ(90deg);
}

 
加加減減圖標
html代碼如下:
 <i class='u-icon-plus on'></i>
<i class='u-icon-minus on'></i>
<i class='u-icon-plus '></i>
<i class='u-icon-minus '></i>
<span class="u-icon-addS"></span>
<span class="u-icon-addB"></span>

 
頁面顯示效果如下:
css樣式代碼:
/*加減標簽*/
/*加標簽icon*/
.u-icon-addS, .u-icon-addB
{
width
: 60px;
height
: 40px;
}
/*加的大icon*/
.u-icon-addB
{ position: relative;
top
: 0;
right
: 0;
}
/*加的小icon*/
.u-icon-addS
{
position
: relative;
color
: #3B8FF8;
}
.u-icon-addS::before,.u-icon-addS::after, .u-icon-addB::before,.u-icon-addB::after
{
position
: absolute;
top
: 20px;
left
: 25px;
width
: 12px;
content
: "";
}
.u-icon-addB::before, .u-icon-addB::after
{
border-top
: 1px solid #fff;
}
.u-icon-addS::before,.u-icon-addS::after
{
border-top
: 2px solid #3B8FF8;
}
.u-icon-addB::after,.u-icon-addS::after
{
-webkit-transform
: rotateZ(90deg);
transform
: rotateZ(90deg);
}
/*加、減按鈕*/
.u-icon-plus, .u-icon-minus
{
position
: relative;
width
: 30px;
height
: 3px;
background-color
: #a9b3c9;
box-shadow
: 0 1px 1px #959bab inset;
border-radius
: 3px;
}
.u-icon-plus.on, .u-icon-minus.on,.on.u-icon-plus::before,
.on .u-icon-plus,.on .u-icon-minus ,.on .u-icon-plus ::before
{
background-color
: #6daeee;
box-shadow
: 0 1px 1px #6a9aca inset;
}
.u-icon-plus::before
{
position
: absolute;
left
: 13px;
width
: 3px;
height
: 30px;
border-radius
: 3px;
box-shadow
: 1px 0 1px #959bab inset;
background-color
: #a9b3c9;
-webkit-transform
: translate(0,-13.5px);
transform
: translate(0,-13.5px);
text-align
: center;
content
: "";
}

 
問號圖標
html代碼如下:
<span class="u-icon-qa"></span>

 
頁面顯示效果如下:
css樣式代碼:
.u-icon-qa {
width
: 60px;
height
:44px;
text-align
: center;
color
: #FFFFFF;
font-size
: 18px;
}
.u-icon-qa:before
{
position
: absolute;
top
:10px;
right
: 15px;
width
: 24px;
height
: 24px;
background
: #67a5e2;
-webkit-border-radius
: 24px;
border-radius
: 24px;
content
: '';
}
.u-icon-qa:after
{
position
: absolute;
top
:10px;
right
: 22px;
content
: '?';
}

 
一行被選中狀態圖標
html代碼如下:
<span class="u-icon-checkTitle"></span>

 
頁面顯示效果如下:
css樣式代碼:
.u-icon-checkTitle
{
position
: absolute;
top
: 9px;
right
: 13px;
width
: 16px;
height
: 16px;
border-radius
: 100%;
background
: #fff;
content
: '';
}
.u-icon-checkTitle::after
{
position
: absolute;
top
: 2px;
right
: 5px;
width
: 4px;
height
: 8px;
border-width
: 0 2px 2px 0;
border-color
: #ffa124;
border-style
: solid;
-webkit-transform
: rotate(45deg);
content
: '';
}

未完待續(如果大家有更好的方法來實現,不用圖片,可以麻煩與我交流一下,謝謝!)
如果您覺得本篇博文對您有所收獲,覺得小女子還算用心,請點擊右下角的 [推薦],謝謝!
(繼續閱讀...)
文章標籤

AutoPoster 發表在 痞客邦 留言(0) 人氣(2)

  • 個人分類:生活學習
▲top
  • 3月 09 週四 201720:21
  • css編寫規范


文章出處
一、注釋規范 
1、文件頂部注釋(推薦使用) 


Css代碼 



  1. /*  

  2. * @description: 中文說明  

  3. * @author: name  

  4. * @update: name (2013-04-13 18:32)  

  5. */  



2、模塊注釋 
模塊注釋必須單獨寫在一行 


Css代碼 



  1. /* module: module1 by 張三 */  

  2. …  

  3. /* module: module2 by 張三 */  



3、單行注釋與多行注釋 
單行注釋可以寫在單獨一行,也可以寫在行尾,注釋中的每一行長度不超過40個漢字,或者80個英文字符。 


Css代碼 



  1. /* this is a short comment */  



多行注釋必須寫在單獨行內 


Css代碼 



  1. /*  

  2. * this is comment line 1.  

  3. * this is comment line 2.  

  4. */  



4、特殊注釋 
用于標注修改、待辦等信息 


Css代碼 



  1. /* TODO: xxxx by name 2013-04-13 18:32 */  

  2. /* BUGFIX: xxxx by name 2012-04-13 18:32 */  



5、區塊注釋 
對一個代碼區塊注釋(可選),將樣式語句分區塊并在新行中對其注釋。 


Css代碼 



    1. /* Header */  

    2. /* Footer */  

    3. /* Gallery */  



二、編碼規范
 
1. tab鍵用(必須)四個空格代替
2. 每個樣式屬性后(必須)加 ";"
方便壓縮工具"斷句"。
3. Class命名中(禁止)出現大寫字母,(必須)采用” - “對class中的字母分隔,如:
 /* 正確的寫法 */
.hotel-title {
font-weight: bold;
}
/* 不推薦的寫法 */
.hotelTitle {
font-weight: bold;
}

  • 用"-"隔開比使用駝峰是更加清晰。

  • 產品線-產品-模塊-子模塊,命名的時候也可以使用這種方式(@Artwl)

  •  
    4. 空格的使用,以下規則(必須)執行:
     .hotel-content {
    font-weight: bold;
    }

  • 選擇器與 { 之前(必須)要有空格

  • 屬性名的 : 后(必須)要有空格

  • 屬性名的 : 前(禁止)加空格

  • 一個原因是美觀,其次IE 6存在一個bug, 戳bug
     
    5.多選擇器規則之間(必須)換行
    當樣式針對多個選擇器時每個選擇器占一行
     /* 推薦的寫法 */
    a.btn,
    input.btn,
    input[type="button"] {
    ......
    }

     
    6. (禁止)將樣式寫為單行, 如
    .hotel-content {margin: 10px; background-color: #efefef;}

    單行顯示不好注釋,不好備注,這應該是壓縮工具的活兒~
     
    7. (禁止)向 0 后添加單位, 如:
    .obj {
    left: 0px;
    }

    只是為了統一。記住,綠色字表強調,不表強制!
     
     
    8. (禁止)使用css原生import
    使用css原生import有很多弊端,比如會增加請求數等....

    9. 不要輕易改動全站級CSS和通用CSS庫。改動后,要經過全面測試。8. 避免使用filter


    10. 避免在CSS中使用expression


    11. 避免過小的背景圖片平鋪,小圖片(必須)sprite 合并


    12. 層級(z-index)必須清晰明確,頁面彈窗、氣泡為最高級(最高級為999),不同彈窗氣泡之間可在三位數之間調整;普通區塊為10-90內10的倍數;區塊展開、彈出為當前父層級上個位增加,禁止層級間盲目攀比。


    13. 背景圖片請盡可能使用sprite技術, 減小http請求, 考慮到多人協作開發, sprite按照模塊、業務、頁面來劃分均可。


     
     
    14. (推薦)屬性的書寫順序, 舉個例子:
    .hotel-content {
    /* 定位 */
    display: block;
    position: absolute;
    left: 0;
    top: 0;
    /* 盒模型 */
    width: 50px;
    height: 50px;
    margin: 10px;
    border: 1px solid black;
    / *其他* /
    color: #efefef;
    }

  • 定位相關, 常見的有:display position left top float 等

  • 盒模型相關, 常見的有:width height margin padding border 等

  • 其他屬性

  •     按照這樣的順序書寫可見提升瀏覽器渲染dom的性能
     
    15. (推薦)當編寫針對特定html結構的樣式時,使用元素名 + 類名
    /* 所有的nav都是針對ul編寫的 */
    ul.nav {
    ......
    }

    ".a div"和".a div.b",為什么后者好?如果需求有所變化,在".a"下有多加了一個div,試問,開始的樣式是不是會影響后來的div啊~
     
    16. (推薦)IE Hack List
     /* 針對ie的hack */
    selector {
    property: value; /* 所有瀏覽器 */
    property: value\9; /* 所有IE瀏覽器 */
    property: value\0; /* IE8 */
    +property: value; /* IE7 */
    _property: value; /* IE6 */
    *property: value; /* IE6-7 */
    }

    當使用hack的時候想想能不能用更好的樣式代替
     
    17. (不推薦)ie使用filter,( 禁止)使用expression
    這里主要是效率問題,應該當格外注意,咱們要少用燒CPU的東西~ 
    18. (禁止)使用行內(inline)樣式
    <p style="font-size: 12px; color: #FFFFFF">靖鳴君</p>

    像這樣的行內樣式,最好用一個class代替。又如要隱藏某個元素,可以給他加一個class
    .hide {
    display: none;
    }

    盡量做到樣式和結構分離~
     
    19. (推薦)reset.css樣式
    推薦網站:http://www.cssreset.com/
     
    20.(禁止)使用"*"來選擇元素
    /*別這樣寫*/
    * {
    margin: 0;
    padding: 0;
    }

    這樣寫是沒有必要的,一些元素在瀏覽器中默認有margin或padding值,但是只是部分元素,沒有必要將所有元素的margin、padding值都置為0。
    21. 鏈接的樣式,(務必)按照這個順序來書寫
    a:link -> a:visited -> a:hover -> a:active

    (繼續閱讀...)
    文章標籤

    AutoPoster 發表在 痞客邦 留言(0) 人氣(0)

    • 個人分類:生活學習
    ▲top
    • 3月 09 週四 201720:21
    • 從js的repeat方法談js字符串與數組的擴展方法


    文章出處
    js將字符串重復N次的repeat方法的8個版本
    /*
    *@desc: 將一個字符串重復自身N次
    */
    //版本1:利用空數組的join方法
    function repeat(target, n) {
    return (new Array(n + 1)).join(target);
    }
    //版本2:之所以要創建一個帶length屬性的對象 是因為要調用數據的原型方法,需要指定call的第一個參數為類數組對象
    //
    類數組對象的必要條件是其length屬性的值為非負數
    function repeat(target, n) {
    return Array.prototype.join.call({
    length: n
    + 1
    }, target);
    }
    //版本3:利用閉包將類數組對象與數組原型的join方法緩存起來
    var repeat = (function () {
    var join = Array.prototype.join, obj = {};
    return function (target, n) {
    obj.length
    = n + 1;
    return join.call(obj, target);
    }
    })();
    //版本4:使用二分法
    function repeat(target, n) {
    var s = target, total = [];
    while (n > 0) {
    if (n % 2 == 1) {
    total[total.length]
    = s;//如果是奇數
    }
    if (n == 1) {
    break;
    }
    s
    += s;
    n
    = n >> 1;//相當于將n除以2取其商,或者說是開2次方
    }
    return total.join('');
    }
    //版本5:版本4的改良版本
    function repeat(target, n) {
    var s = target, total = "";
    while (n > 0) {
    if (n % 2 == 1) {
    total
    += s;
    }
    if (n == 1) {
    break;
    }
    s
    += s;
    n
    = n >> 1;//相當于將n除以2取其商,或者說是開2次方
    }
    return total;
    }
    //版本6:版本4的變樣版本 免去創建數組與使用join方法 但在循環中創建字符串比要求的還長 所以...
    function repeat(target, n) {
    var s = target, c = s.length * n;
    do {
    s
    += s;
    }
    while (n = n >> 1);
    s
    = s.substring(0, c);
    return s;
    }
    //版本7:版本5的優化版本
    function repeat(target, n) {
    if (n == 1) {
    return target;
    }
    var s = repeat(target, Math.floor(n / 2));
    s
    += s;
    if (n % 2) {
    s
    += target;
    }
    return s;
    }
    //版本8:反例
    function repeat(target, n) {
    return (n <= 0) ? "" : target.concat(repeat(target, --n));
    }

    大家可以猜猜哪個運行速度最快。事實上應該是版本5.
    事實上業余時間一直都在關注一些js性能方面的東西,跟.net一樣,每種語言的代碼都有些性能方面的小常識。
    (有空可以看看  我總結的js方面你可能不是特別清楚的小知識   我總結的js性能優化的小知識     )
    回到正題
    下面來說說。。。
    trim方法的各種不同版本(13種不同方法實現)
    /*
    *@desc:去掉首尾空格
    */
    //版本1:
    function trim(str) {
    return str.replace(/^\s\s*/, '').replace('/\s\s*$/', '');
    }
    //版本2:比版本1稍微慢些
    function trim(str) {
    return str.replace(/^\s+/, '').replace('/\s+$/', '');//比版本1慢的原因在于它最先假設至少存在一個空白符
    }
    //版本3:運用等巧妙的
    function trim(str) {
    return str.substring(Math.max(str.search(/\S/), 0), str.search(/\S\s*$/) + 1);
    }
    //版本4:jQuery類庫就是使用這種方法 但是它相對之前三個都要慢些
    function trim(str) {
    return str.replace(/^\s+|\s+$/g, '');
    }
    //版本5:
    function trim(str) {
    str
    = str.match(/\S+(?:\s+\S+)*/);//使用非捕獲性分組(?:expr)
    return str ? str[0] : '';
    }
    //版本6:效率挺差
    function trim(str) {
    return str.replace(/^\s*(\S*(\s+\S+)*)\s*$/, '$1');
    }
    //版本7:比版本6來說使用了非捕獲性分組
    function trim(str) {
    return str.replace(/^\s*(\S*(?:\s+\S+)*)\s*$/, '$1');
    }
    //版本8:效果秒殺
    function trim(str) {
    return str.replace(/^\s*((?:[\S\s]*\S)?)\s*$/, '$1');
    }
    //版本9:使用懶惰匹配
    function trim(str) {
    return str.replace(/^\s*([\S\s]*?)\s*$/, '$1');
    }
    //版本10:速度最快
    function trim(str) {
    var whitespace = '\n\r\t\f\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u3000';
    for (var i = 0; i < str.length; i++) {
    if (whitespace.indexOf(str.charCodeAt(i)) === -1) {
    str
    = str.substring(i);
    break;
    }
    }
    for (i = str.length - 1; i >= 0; i--) {
    if (whitespace.indexOf(str.charCodeAt(i)) === -1) {
    str
    = str.substring(0, i + 1);
    break;
    }
    }
    return whitespace.indexOf(str.charAt(0)) === -1 ? str : '';
    }
    //版本11:
    function trim(str) {
    str
    = str.replace('^\s+', '');
    for (var i = str.length - 1 ; i >= 0; i--) {
    if (/\S/.test(str.charAt(i))) {
    str
    = str.substring(0, i + 1);
    break;
    }
    }
    return str;
    }
    //版本12:
    function trim(str) {
    var str = str.replace(/^\s\s*/, ''),
    ws
    = /\s/,
    i
    = str.length;
    while (ws.test(str.charAt(--i))) {
    return str.slice(0, i + 1);
    }
    }
    //版本13:僅次于版本10
    function trim(str) {
    var m = str.length;
    for (var i = -1; str.charCodeAt(++i) <= 32;)
    for (var j = 0; j > i && str.charCodeAt(j) <= 32; j--) {
    return str.slice(i, j + 1);
    }
    }

    與trim相反,下面說說為字符串的某一端填充字符串,其實最常見的場景就是日期中的月份前補零
    pad:這字符串的某一端填充字符串
    /*
    *@desc:給字符串的某一端填充字符串
    */
    //版本1:創建數組來放置填充物,然后再在右邊起截取
    function pad(target, n) {
    var zero = new Array(n).join('0'),
    str
    = zero + target,
    result
    = str.substr(-n);
    return result;
    }
    //版本2:
    function pad(target, n) {
    return Array((n + 1) - target.toString().split('').length).join('0') + target;
    }
    //版本3:二進制法
    function pad(target, n) {
    return (Math.pow(10, n) + "" + target).slice(-n);
    }
    //版本4:Math.pow
    function pad(target, n) {
    return ((1 << n).toString(2) + target).slice(-n);
    }
    //版本5:toFixed
    function pad(target, n) {
    return (0..toFixed(n) + target).slice(-n);
    }
    //版本6:創建一個超大數,在常規情況下截不完
    function pad(target, n) {
    return (1e20 + '' + target).slice(-n);
    }
    //版本7:質樸長存法
    function pad(target, n) {
    var len = target.toString().length;
    while (len < n) {
    target
    = '0' + target;
    len
    ++;
    }
    return target;
    }
    //版本8:支持更多參數
    function pad(target, n, filling, right, radix) {
    var num = target.toString(radix || 10);
    filling
    = filling || '0';
    while (num.length < n) {
    if (!right) {
    num
    = filling + num;
    }
    else {
    num
    += filling;
    }
    }
    return num;
    }

     
    取得字符串所有字節的長度
    大家都知道,一個中文字符占兩個字節,而一個英文字符只占一個字符,所以在前端就會免不了做字符長度的校驗。
    /*
    *@desc:取得字符串所有字節的長度
    */
    //版本1:傳統常規作法
    function byteLen(target) {
    var byteLength = target.length, i = 0;
    for (; i< target.length; i++) {
    if (target.charCodeAt(i)>255) {
    byteLength
    ++;
    }
    }
    return byteLength;
    }
    //版本8:使用正則
    //
    param:fix 默認為2 可傳入轉換長度
    function byteLen(target,fix) {
    fix
    = fix ? fix : 2;
    var str = new Array(fix + 1).join('-');
    return target.replace(/[^ -]/g, str).length;
    }

     
    再來說說我們最常使用的js字符串方法吧
    常用的js字符串方法
     
    /*
    *@desc: 判斷一個字符串是否包含另一個字符串
    */
    function contains(target, str, separator) {
    return separator ?
    (separator
    + target + separator).indexOf(separator + str + separator) > -1 :
    target.indexOf(str)
    > -1;
    }
    /*
    *@desc: 判斷目標字符串是否位于原字符串的開始之處
    *@param:ignorecase 是否忽略大小寫
    */
    function startsWith(target, str, ignorecase) {
    var start_str = target.substr(0, str.length);
    return ignorecase ?
    start_str.toLowerCase()
    === str.toLowerCase() :
    start_str
    === str;
    }
    /*
    *@desc: 判斷目標字符串是否位于原字符串的末尾之處
    */
    function endsWith(target, str, ignorecase) {
    var end_str = target.substr(0, str.length);
    return ignorecase ?
    end_str.toLowerCase()
    === str.toLowerCase() :
    end_str
    === str;
    }
    /*
    *@desc: 對字符串進行截斷處理,當超過限定長度,默認添加三個點號或者...
    */
    function truncate(target, length, truncation) {
    length
    = length || 30;
    truncation
    = truncation === void (0) ? '...' : truncation;
    return target.length > length ?
    target.slice(
    0, length - truncation.length) + truncation : String(target);
    }
    /*
    *@desc: 轉換為下劃線風格
    */
    function underscored(target) {
    return target.replace(/([a-z\d])([A-Z])/g, '$1_$2').replace(/\-/g, '_').toLowerCase();
    }
    /*
    *@desc: 轉換為連字符風格
    */
    function dasherize(target) {
    return underscored(target).replace(/_/g, '-');
    }
    /*
    *@desc: 首字母大寫
    */
    function capitalize(target) {
    return target.charAt(0).toUpperCase() + target.substring(1).toLowerCase();
    }
    /*
    *@desc: 移除字符串中的html標簽
    */
    function stripTags(target) {
    return String(target || '').replace(/<[^>]+>/g, '');
    }
    /*
    *@desc: 移除字符串中所有的script標簽
    */
    function stripScripts(target) {
    return String(target || '').replace(/<script[^>]*>([\S\s]*?)<\/script>/img, '');
    }
    /*
    *@desc: 將字符串經過html轉義得到適合在頁面上顯示的內容
    */
    function escapeHTML(target) {
    return target.repeat(/&/g, '&amp;')
    .repeat(
    /</g, '&lt;')
    .repeat(
    />/g, '&gt;')
    .repeat(
    /"/g, '&quot;')
    .repeat(
    /'/g, '&#39;');
    }
    /*
    *@desc: 將字符串中的html實體字符還原為對應字符
    */
    function unescapeHTML(target) {//
    return target.repeat(/&lt;/g, '<')
    .repeat(
    /&gt;/g, '>')
    .repeat(
    /&quot;/g, '"')
    .repeat(
    /&amp;/g, '&')
    .repeat(
    /&#([\d]+);/g, function ($0, $1) {
    return String.fromCharCode(parseInt($1, 10));
    });
    }
    /*
    *@desc: 將字符串安全格式化為正則表達式的源碼
    */
    function escapeRegExp(target) {
    return target.replace(/([-.*+?^${}()|[\]\/\\])/g, '\\$1');
    }
    /*
    *@desc: 為目標字符串添加軟換行
    */
    function wbr(target) {
    return String(target).replace(/(?:<[^>]+>)|(?:&#?[0-9a-z]{2,6};)|(.{1})/gi, '$&<wbr>').replace('/><wbr>/g', '>');
    }
    /*
    *@desc: 格式化
    */
    function format(str, object) {
    var array = Array.prototype.slice.call(arguments, 1);
    return str.replace(/\\?\#{([^{}]+)\}/gm, function (match, name) {
    if (match.charAt(0)=='\\') {
    return match.slice(1);
    }
    var index = Number(name);
    if (index>=0) {
    return array[index];
    }
    if (object&&object[name]!=void 0) {
    return object[name];
    }
    return '';
    });
    }

    順便說說上述format方法的使用吧
     var a = format('Result is #{0},#{1}', 22, 33);
    console.log(a);
    var b = format("#{name}is a #{sex}", {
    name:
    "Jhon",
    sex:
    'man'
    });
    console.log(b);

    運行結果如下圖:
    js數組方法的擴展
    大家都知道js數組沒有像字符串一樣的indexOf、lastIndexOf等方法,那我們先來造造輪子吧。先來擴展一下吧!
    /*
    *@desc:定位操作,返回數組中第一個等于給定參數的元素的索引值
    */
    Array.prototype.indexOf
    = function (item, index) {
    var n = this.length, i = ~~index;
    if (i < 0) {
    i
    += n;
    }
    for (; i < n; i++) {
    if (this[i] === item) {
    return i;
    }
    }
    return -1;
    }
    /*
    *@desc:與lastIndex功能類似 不過是從后遍歷
    */
    Array.prototype.lastIndexOf
    = function (item,index) {
    var n = this.length,
    i
    = index == null ? n - 1 : index;
    if (i<0) {
    i
    = Math.max(0, n + i);
    }
    for (; i > length; i--) {
    if (this[i]===item) {
    return i;
    }
    }
    return -1;
    }
    /*
    *@desc:因為forEach、map、filter、some、every這幾個方法結構相似 所以... 先造個輪子
    */
    function iterator(vars,body,ret) {
    var fun = 'for(var ' + vars + 'i=0,n=this.length;i<n;i++){' +
    body.replace(
    '_', '((i in this ) && fn.call(scope ,this[i],i,this))') + '}' + ret;;
    return Function("fn,scope", fun);
    }
    /*
    *@desc:將數組中的元素依次傳入一個函數中運行
    */
    Array.prototype.forEach
    = iterator('', '_', '');
    /*
    *@desc:將數組中的元素依次傳入一個函數中運行 將返回值為ture的那個元素放入新數組中返回
    */
    Array.prototype.filter
    = iterator('r=[],j=0,', 'if(_)r[j++]=this[i]', 'return r');
    /*
    *@desc:收集、將數組中的元素依次傳入一個函數中運行 然后把它們的返回值組成一個新數組返回
    */
    Array.prototype.map
    = iterator('r=[],', 'r[i]=_', 'return r');
    /*
    *@desc:只有數組中的元素有一個元素滿足條件則返回true
    */
    Array.prototype.some
    = iterator('', 'if(_) return true', 'return false');
    /*
    *@desc:只有數組中的元素都滿足條件才返回true
    */
    Array.prototype.every
    = iterator('', 'if(!_) return false', 'return true');
    /*
    *@desc:歸化操作,將數組中的元素歸化為一個簡單的數值
    */
    Array.prototype.reduce
    = function (fn,lastResult,scope) {
    if (this.length == 0) {
    return lastResult;
    }
    var i = lastResult != undefined ? 0 : 1;
    var result = lastResult != undefined ? lastResult : this[0];
    for (var i = this.length; i < n; i++) {
    result
    = fn.call(scope, result, this[i], i, this);
    }
    return result;
    }
    /*
    *@desc:功能類似于reduce 但是從后遍歷
    */
    Array.prototype.reduceRight
    = function (fn,lastResult,scope) {
    var array = this.concat().reverse();
    return array.reduce(fn, lastResult, scope);
    }

    常用的js數組方法
    /*
    *@desc:判定數組是否包含指定目標
    */
    function contains(target, item) {
    return target.indexOf(item) > -1;
    }
    /*
    *@desc:移除數組中指定位置的元素,返回布爾表示成功與否
    */
    function removeAt(target, index) {
    return !!target.splice(index, 1).length;
    }
    /*
    *@desc:移除數組中第一個匹配傳參的那個元素
    */
    function remove(target, item) {
    var index = target.indexOf(item);
    if (~index) {
    return removeAt(target, index);
    }
    return false;
    }
    /*
    *@desc:對數組進行洗牌
    */
    function shuffle(target) {
    var j, x, i = target.length;
    for (; i > 0; j = parseInt(Math.random() * i), x = target[--i], target[i] = target[j], target[j] = x) {
    }
    return target;
    }
    /*
    *@desc:從數組中隨機抽選一個元素出來
    */
    function random(target) {
    return target[Math.floor(Math.random() * target.length)];
    }
    /*
    *@desc:對數組進行平坦化處理,返回一個一維新數組
    */
    function flatten(target) {
    var result = [];
    target.forEach(
    function (item) {
    if (Array.isArray(item)) {
    result
    = result.concat(flatten(item));
    }
    else {
    result.push(item);
    }
    });
    return result;
    }
    /*
    *@desc:對數組進行去重操作,返回一個沒有重復元素的新數組
    */
    function unique(target) {
    var result = [];
    loop:
    for (var i = 0, n = target.length; i < n; i++) {
    for (var x = i + 1; x < n; x++) {
    if (target[x] === target[i]) {
    continue loop;
    }
    }
    result.push(target[i]);
    }
    return result;
    }
    /*
    *@desc:過濾數組中的null和undefined 但不影響原數組
    */
    function compact(target) {
    return target.filter(function (el) {
    return el != null;
    });
    }
    /*
    *@desc:取得對象數組的每個元素的指定屬性 組成數組返回
    */
    function pluck(target, item) {
    var result = [], prop;
    target.forEach(
    function (item) {
    prop
    = item[name];
    if (prop != null) {
    result.push(prop);
    }
    });
    return result;
    }
    /*
    *@desc:根據指定條件(如回調或對象的某個屬性)進行分組,構成對象返回
    */
    function groupBy(target, val) {
    var result = {};
    var iterator = $.isFunction(val) ? val : function (obj) {
    return obj[val];
    };
    target.forEach(
    function (value, index) {
    var key = iterator(value, index);
    (result[key]
    || (result[key] = [])).push(value);
    });
    return result;
    }
    /*
    *@desc:根據指定條件進行排序
    */
    function sortBy(target, fn, scope) {
    var array = target.map(function (item, index) {
    return {
    el: item,
    re: fn.call(scope, item, index)
    };
    }).sort(
    function (left, right) {
    var a = left.re, b = right.re;
    return a < b ? -1 : a > b ? 1 : 0;
    });
    return pluck(array, 'el');
    }
    /*
    *@desc:對兩個數組取并集
    */
    function union(target, array) {
    return unique(target.concat(array));
    }
    /*
    *@desc:對兩個數組取交集
    */
    function intersect(target, array) {
    return target.filter(function (n) {
    return ~array.indexOf(n);
    });
    }
    /*
    *@desc:對兩個數組取差集
    */
    function diff(target, array) {
    var result = target.slice();
    for (var i = 0; i < result.length; i++) {
    for (var j = 0; j < result.length; j++) {
    if (result[i] === array[j]) {
    result.splice(i,
    1);
    i
    --;
    break;
    }
    }
    }
    return result;
    }
    /*
    *@desc:返回數組中的最小值(用于數字數組)
    */
    function min(target) {
    return Math.min.apply(0, target);
    }
    /*
    *@desc:返回數組中的最大值(用于數字數組)
    */
    function max(target) {
    return Math.max.apply(0, target);
    }

    其實還有很多。。。
    本文中的方法是根據《JavaScript框架設計》中第三章--數組的擴展與修復進行整理的。
    如果您覺得本篇博文對您有所收獲,覺得小女子還算用心,請點擊右下角的 [推薦],謝謝!
    (繼續閱讀...)
    文章標籤

    AutoPoster 發表在 痞客邦 留言(0) 人氣(6)

    • 個人分類:生活學習
    ▲top
    • 3月 09 週四 201720:21
    • 利用css3選擇器及css3邊框做出的特效(1)


    文章出處
    利用border-radius及box-shadow制作圓角表格
    界面效果圖如下:
    css樣式如下所示:

    * {
    margin
    : 0;
    padding
    : 0;
    }
    body
    {
    padding
    : 40px 100px;
    }
    .demo
    {
    width
    : 600px;
    margin
    : 40px auto;
    font-family
    : 'trebuchet MS', 'Lucida sans', Arial;
    font-size
    : 14px;
    color
    : #444;
    }
    /*表格的默認設置*/
    table
    {
    *border-collapse
    : collapse; /* IE7 and lower */
    border-spacing
    : 0;
    width
    : 100%;
    }
    /*========制作圓角表格========*/
    .bordered
    {
    border
    : solid #ccc 1px; /*給表格添加邊框*/
    border-radius
    : 6px; /*設置表格圓角*/
    box-shadow
    : 0 1px 1px #ccc; /*表格陰影設置*/
    }
    .bordered tr
    {
    -o-transition
    : all 0.1s ease-in-out;
    -webkit-transition
    : all 0.1s ease-in-out;
    -moz-transition
    : all 0.1s ease-in-out;
    -ms-transition
    : all 0.1s ease-in-out;
    transition
    : all 0.1s ease-in-out;
    }
    .bordered .highlight,
    .bordered tr:hover
    {
    background
    : #fbf8e9; /*表格行的懸浮狀態效果*/
    }
    .bordered td,
    .bordered th
    {
    border-left
    : 1px solid #ccc;
    border-top
    : 1px solid #ccc;
    padding
    : 10px;
    text-align
    : left;
    }
    .bordered th
    {
    /*表格表頭添加漸變背景色*/
    background-color
    : #dce9f9;
    background-image
    : -webkit-gradient(linear, left top, left bottom, from(#ebf3fc), to(#dce9f9));
    background-image
    : -webkit-linear-gradient(top, #ebf3fc, #dce9f9);
    background-image
    : -moz-linear-gradient(top, #ebf3fc, #dce9f9);
    background-image
    : -ms-linear-gradient(top, #ebf3fc, #dce9f9);
    background-image
    : -o-linear-gradient(top, #ebf3fc, #dce9f9);
    background-image
    : linear-gradient(top, #ebf3fc, #dce9f9);
    filter
    : progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr=#ebf3fc, endColorstr=#dce9f9);
    -ms-filter
    : "progid:DXImageTransform.Microsoft.gradient (GradientType=0, startColorstr=#ebf3fc, endColorstr=#dce9f9)";
    box-shadow
    : 0 1px 0 rgba(255,255,255,.8) inset; /*表格表頭設置內陰影*/
    border-top
    : none;
    text-shadow
    : 0 1px 0 rgba(255,255,255,.5); /*表格表頭設置文字陰影*/
    }
    /*使用:first-child去除表格每行的第一個單元格的左邊框*/
    .bordered td:first-child,
    .bordered th:first-child
    {
    border-left
    : none;
    }
    /*使用:first-child設置表格表頭第一個單元格僅左上角為圓角*/
    .bordered th:first-child
    {
    border-radius
    : 6px 0 0 0;
    }
    /*使用:last-child設置表格表頭最后一個單元格僅右上角為圓角*/
    .bordered th:last-child
    {
    border-radius
    : 0 6px 0 0;
    }
    /*使用:first-child和:last-child設置表格最后一行的第一個單元格左下角為圓角*/
    .bordered tr:last-child td:first-child
    {
    border-radius
    : 0 0 0 6px;
    }
    /*使用:last-child設置表格最后一行的最后一個單元格右上角為圓角*/
    .bordered tr:last-child td:last-child
    {
    border-radius
    : 0 0 6px 0;
    }
    /*=======制作Zebra表格(斑馬線表格)效果==========*/
    .zebra td,
    .zebra th
    {
    padding
    : 10px;
    border-bottom
    : 1px solid #f2f2f2;
    }
    /*使用:nth-child(even)給表格的奇數行添加背景和陰影效果*/
    .zebra .alternate,
    .zebra tbody tr:nth-child(even)
    {
    background
    : #f5f5f5;
    box-shadow
    : 0 1px 0 rgba(255,255,255,.8) inset;
    }
    .zebra th
    {
    text-align
    : left;
    text-shadow
    : 0 1px 0 rgba(255,255,255,.5);
    border-bottom
    : 1px solid #ccc;
    background-color
    : #eee;
    background-image
    : -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#eee));
    background-image
    : -webkit-linear-gradient(top, #f5f5f5, #eee);
    background-image
    : -moz-linear-gradient(top, #f5f5f5, #eee);
    background-image
    : -ms-linear-gradient(top, #f5f5f5, #eee);
    background-image
    : -o-linear-gradient(top, #f5f5f5, #eee);
    background-image
    : linear-gradient(top, #f5f5f5, #eee);
    filter
    : progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr=#f5f5f5, endColorstr=#eeeeee);
    -ms-filter
    : "progid:DXImageTransform.Microsoft.gradient (GradientType=0, startColorstr=#f5f5f5, endColorstr=#eeeeee)";
    }
    /*使用 :first-child設置表格表頭第一個單元格左上角為圓角*/
    .zebra th:first-child
    {
    border-radius
    : 6px 0 0 0;
    }
    /*使用 :last-child設置表格表頭最后一個單元格右上角為圓角*/
    .zebra th:last-child
    {
    border-radius
    : 0 6px 0 0;
    }
    .zebra tfoot td
    {
    border-bottom
    : 0;
    border-top
    : 1px solid #fff;
    background-color
    : #f1f1f1;
    }
    /*使用 :first-child設置表格腳部第一個單元格左下角為圓角*/
    .zebra tfoot td:first-child
    {
    border-radius
    : 0 0 0 6px;
    }
    /*使用 :last-child設置表格腳部最后一個單元格右下角為圓角*/
    .zebra tfoot td:last-child
    {
    border-radius
    : 0 0 6px 0;
    }


    View Code
    頁面HTML代碼如下所示:

    <div class="demo">
    <table class="bordered">
    <thead>
    <tr>
    <th>#</th>
    <th>IMDB Top 10 Movies</th>
    <th>Year</th>
    </tr>
    </thead>
    <tbody>
    <tr>
    <td>1</td>
    <td>The Shawshank Redemption</td>
    <td>1994</td>
    </tr>
    <tr>
    <td>2</td>
    <td>The Godfather</td>
    <td>1972</td>
    </tr>
    <tr>
    <td>3</td>
    <td>The Godfather: Part II</td>
    <td>1974</td>
    </tr>
    <tr>
    <td>4</td>
    <td>The Good, the Bad and the Ugly</td>
    <td>1966</td>
    </tr>
    </tbody>
    </table>
    <p style="height: 50px"></p>
    <table class="zebra">
    <thead>
    <tr>
    <th>#</th>
    <th>IMDB Top 10 Movies</th>
    <th>Year</th>
    </tr>
    </thead>
    <tbody>
    <tr>
    <td>1</td>
    <td>The Shawshank Redemption</td>
    <td>1994</td>
    </tr>
    <tr>
    <td>2</td>
    <td>The Godfather</td>
    <td>1972</td>
    </tr>
    <tr>
    <td>3</td>
    <td>The Godfather: Part II</td>
    <td>1974</td>
    </tr>
    <tr>
    <td>4</td>
    <td>The Good, the Bad and the Ugly</td>
    <td>1966</td>
    </tr>
    </tbody>
    <tfoot>
    <tr>
    <td>&nbsp;</td>
    <td></td>
    <td></td>
    </tr>
    </tfoot>
    </table>
    </div>


    View Code
     
    利用border-radius制作各種圖形效果
    界面效果圖如下:
    css樣式如下所示:

    /*制作半圓效果*/
    .semicircle
    {
    background-color
    : orange;
    margin
    : 30px;
    }
    .top
    {
    width
    : 100px;
    height
    : 50px;
    border-radius
    : 50px 50px 0 0;
    }
    .right
    {
    height
    : 100px;
    width
    : 50px;
    border-radius
    : 0 50px 50px 0;
    }
    .bottom
    {
    width
    : 100px;
    height
    : 50px;
    border-radius
    : 0 0 50px 50px;
    }
    .left
    {
    width
    : 50px;
    height
    : 100px;
    border-radius
    : 50px 0 0 50px;
    }
    /*制作扇形效果*/
    .quarterCircle
    {
    background-color
    : orange;
    margin
    : 30px;
    }
    .top
    {
    width
    : 100px;
    height
    : 100px;
    border-radius
    : 100px 0 0 0;
    }
    .right
    {
    width
    : 100px;
    height
    : 100px;
    border-radius
    : 0 100px 0 0;
    }
    .bottom
    {
    width
    : 100px;
    height
    : 100px;
    border-radius
    : 0 0 100px 0;
    }
    .left
    {
    width
    : 100px;
    height
    : 100px;
    border-radius
    : 0 0 0 100px;
    }
    /*制作橢圓*/
    .oval
    {
    background-color
    : orange;
    margin
    : 30px;
    }
    .hov
    {
    width
    : 100px;
    height
    : 50px;
    border-radius
    : 100px / 50px;
    }
    .ver
    {
    width
    : 50px;
    height
    : 100px;
    border-radius
    : 50px / 100px;
    }


    View Code
     
    頁面HTML代碼如下所示:

     <!--制作扇形效果-->
    <div class="semicircle top"></div>
    <div class="semicircle right"></div>
    <div class="semicircle bottom"></div>
    <div class="semicircle left"></div>
    <!--制作扇形效果-->
    <div class="quarterCircle top"></div>
    <div class="quarterCircle right"></div>
    <div class="quarterCircle bottom"></div>
    <div class="quarterCircle left"></div>
    <!--制作橢圓效果-->
    <div class="oval hov"></div>
    <div class="oval ver"></div>


    View Code
     看了上面的效果圖和代碼之后,大家肯定知道如果制作圓形效果那自然就是border-radius: 50%;
    再看一個效果圖:
    其實實現代碼很簡單:
     .border-radius {
    width
    : 350px;
    height
    : 100px;
    border
    : 10px solid orange;
    border-radius
    : 10px 20px 30px 40px / 40px 30px 20px 10px;
    }

    原理很簡單就是用了border-radius
    我還是原來的那句話,同樣是手機為什么是蘋果很貴但卻依舊那么受人的喜歡,把平凡簡單的事情做到好才是最重要的。
    利用動態偽類美化按鈕
    界面效果圖如下:
    css樣式如下所示:

     .download-info {
    text-align
    : center;
    }
    /*默認狀態下的按鈕效果*/
    .btn
    {
    background-color
    : #0074cc;
    *background-color
    : #0055cc;
    background-image
    : -ms-linear-gradient(top, #0088cc, #0055cc);
    background-image
    : -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0055cc));
    background-image
    : -webkit-linear-gradient(top, #0088cc, #0055cc);
    background-image
    : -o-linear-gradient(top, #0088cc, #0055cc);
    background-image
    : -moz-linear-gradient(top, #0088cc, #0055cc);
    background-image
    : linear-gradient(top, #0088cc, #0055cc);
    background-repeat
    : repeat-x;
    display
    : inline-block;
    *display
    : inline;
    border
    : 1px solid #cccccc;
    *border
    : 0;
    border-color
    : #ccc;
    border-color
    : rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
    border-radius
    : 6px;
    color
    : #ffffff;
    cursor
    : pointer;
    font-size
    : 20px;
    font-weight
    : normal;
    filter
    : progid:dximagetransform.microsoft.gradient(startColorstr='#0088cc', endColorstr='#0055cc', GradientType=0);
    filter
    : progid:dximagetransform.microsoft.gradient(enabled=false);
    line-height
    : normal;
    padding
    : 14px 24px;
    text-align
    : center;
    text-shadow
    : 0 -1px 0 rgba(0, 0, 0, 0.25);
    text-decoration
    : none;
    vertical-align
    : middle;
    *zoom
    : 1;
    }
    /*懸浮狀態下按鈕效果*/
    .btn:hover
    {
    background-position
    : 0 -15px;
    background-color
    : #0055cc;
    *background-color
    : #004ab3;
    color
    : #ffffff;
    text-decoration
    : none;
    text-shadow
    : 0 -1px 0 rgba(0, 0, 0, 0.25);
    -webkit-transition
    : background-position 0.1s linear;
    -moz-transition
    : background-position 0.1s linear;
    -ms-transition
    : background-position 0.1s linear;
    -o-transition
    : background-position 0.1s linear;
    transition
    : background-position 0.1s linear;
    }
    /*點擊時按鈕效果*/
    .btn:active
    {
    background-color
    : #0055cc;
    *background-color
    : #004ab3;
    background-color
    : #004099 \9;
    background-image
    : none;
    outline
    : 0;
    box-shadow
    : inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
    color
    : rgba(255, 255, 255, 0.75);
    }
    /*獲得焦點按鈕效果*/
    .btn:focus
    {
    outline
    : thin dotted #333;
    outline
    : 5px auto -webkit-focus-ring-color;
    outline-offset
    : -2px;
    }


    View Code
     
    頁面HTML代碼如下所示:
     <div class="download-info">
    <a href="#" class="btn">View project on GitHub</a>
    </div>

     
    利用動態偽類:target制作垂直手風琴
    界面效果圖如下:
    css樣式如下所示:

     .accordionMenu {
    background
    : #fff;
    color
    : #424242;
    font
    : 12px Arial, Verdana, sans-serif;
    margin
    : 0 auto;
    padding
    : 10px;
    width
    : 500px;
    }
    .accordionMenu h2
    {
    margin
    : 5px 0;
    padding
    : 0;
    position
    : relative;
    }
    .accordionMenu h2:before
    {/*向下箭頭*/
    border
    : 5px solid #fff;
    border-color
    : #fff transparent transparent;
    content
    : "";
    height
    : 0;
    position
    : absolute;
    right
    : 10px;
    top
    : 15px;
    width
    : 0;
    }
    .accordionMenu h2 a
    {
    background
    : #8f8f8f;
    background
    : -moz-linear-gradient( top, #cecece, #8f8f8f);
    background
    : -webkit-gradient(linear, left top, left bottom, from(#cecece), to(#8f8f8f));
    background
    : -webkit-linear-gradient( top, #cecece, #8f8f8f);
    background
    : -o-linear-gradient( top, #cecece, #8f8f8f);
    background
    : linear-gradient( top, #cecece, #8f8f8f);
    border-radius
    : 5px;
    color
    : #424242;
    display
    : block;
    font-size
    : 13px;
    font-weight
    : normal;
    margin
    : 0;
    padding
    : 10px 10px;
    text-shadow
    : 2px 2px 2px #aeaeae;
    text-decoration
    : none;
    }
    .accordionMenu :target h2 a,
    .accordionMenu h2 a:focus,
    .accordionMenu h2 a:hover,
    .accordionMenu h2 a:active
    {/*選中、聚焦、激活狀態下的樣式*/
    background
    : #2288dd;
    background
    : -moz-linear-gradient( top, #6bb2ff, #2288dd);
    background
    : -webkit-gradient(linear, left top, left bottom, from(#6bb2ff), to(#2288dd));
    background
    : -webkit-linear-gradient( top, #6bb2ff, #2288dd);
    background
    : -o-linear-gradient( top, #6bb2ff, #2288dd);
    background
    : linear-gradient( top, #6bb2ff, #2288dd);
    color
    : #FFF;
    }
    .accordionMenu p
    {/*所有未選中的段落 都默認overflow:hidden*/
    margin
    : 0;
    height
    : 0;
    overflow
    : hidden;
    padding
    : 0 10px;
    -moz-transition
    : height 0.5s ease-in;
    -webkit-transition
    : height 0.5s ease-in;
    -o-transition
    : height 0.5s ease-in;
    transition
    : height 0.5s ease-in;
    }
    .accordionMenu :target p
    {/*如果是選中 則將選中的段落顯示*/
    height
    : 100px;
    overflow
    : auto;
    }
    .accordionMenu :target h2:before
    {
    border-color
    : transparent transparent transparent #fff;/*向下箭頭效果*/
    }


    View Code
     頁面HTML代碼如下所示:

    <div class="accordionMenu">
    <div class="menuSection" id="brand">
    <h2><a href="#brand">Brand</a></h2>
    <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
    </div>
    <div class="menuSection" id="promotion">
    <h2><a href="#promotion">Promotion</a></h2>
    <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
    </div>
    <div class="menuSection" id="event">
    <h2><a href="#event">Event</a></h2>
    <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
    </div>
    </div>


    View Code
     
    利用border-image制作tabs效果
    界面效果圖如下:
    css樣式如下所示:

     .tabs-box {
    border-bottom
    : 3px solid #9eaab6;
    margin
    : 0;
    padding
    : 0;
    overflow
    : hidden;
    zoom
    : 1;
    }
    .tabs-box li
    {
    float
    : left;
    display
    : inline;
    margin
    : 0 12px 0 0;
    list-style
    : none outside none;
    border
    : 1px solid #9EAAB6;
    padding
    : 5px;
    border-image
    : url("border-image-tab.gif") 0 5 0 5;
    -moz-border-image
    : url("border-image-tab.gif") 0 5 0 5;
    -webkit-border-image
    : url("border-image-tab.gif") 0 5 0 5;
    -o-border-image
    : url("border-image-tab.gif") 0 5 0 5;
    -ms-border-image
    : url("border-image-tab.gif") 0 5 0 5;
    border-width
    : 0 5px;
    text-align
    : center;
    text-shadow
    : 0 -1px 0 rgba(0,0,0,0.8);
    color
    : rgba(0, 125, 200, 0.3);
    }


    View Code
    樣式中的image下載地址為:border-image-tab.gif
    頁面HTML代碼如下所示:

     <ul class="tabs-box">
    <li>Home</li>
    <li>CSS3</li>
    <li>Html5</li>
    <li>JavaScript</li>
    <li>jQuery</li>
    </ul>


    View Code
     
    利用box-shadow制作立體導航search框
    界面效果圖如下:
    css樣式如下所示:

     #formWrapper {
    width
    : 450px;
    padding
    : 8px;
    margin
    : 20px;
    overflow
    : hidden;
    border-width
    : 1px;
    border-style
    : solid;
    border-color
    : #dedede #bababa #aaa #bababa;
    box-shadow
    : 0 3px 3px rgba(255,255,255,.1), 0 3px 0 #bbb, 0 4px 0 #aaa, 0 5px 5px #444;
    border-radius
    : 10px;
    background-color
    : #f6f6f6;
    background-image
    : -webkit-gradient(linear, left top, left bottom, from(#f6f6f6), to(#eae8e8));
    background-image
    : -webkit-linear-gradient(top, #f6f6f6, #eae8e8);
    background-image
    : -moz-linear-gradient(top, #f6f6f6, #eae8e8);
    background-image
    : -ms-linear-gradient(top, #f6f6f6, #eae8e8);
    background-image
    : -o-linear-gradient(top, #f6f6f6, #eae8e8);
    background-image
    : linear-gradient(top, #f6f6f6, #eae8e8);
    }
    #formWrapper .search
    {
    width
    : 330px;
    height
    : 20px;
    padding
    : 10px 5px;
    float
    : left;
    font
    : bold 16px 'lucida sans', 'trebuchet MS', 'Tahoma';
    border
    : 1px solid #ccc;
    box-shadow
    : 0 1px 1px #ddd inset, 0 1px 0 #fff;
    border-radius
    : 3px;
    }
    #formWrapper .search:focus
    {
    outline
    : 0;
    border-color
    : #aaa;
    box-shadow
    : 0 1px 1px #bbb inset;
    }
    #formWrapper .search::-webkit-input-placeholder,
    #formWrapper .search:-moz-placeholder,
    #formWrapper .search:-ms-input-placeholder
    {
    color
    : #999;
    font-weight
    : normal;
    }
    #formWrapper .btn
    {
    float
    : right;
    border
    : 1px solid #00748f;
    height
    : 42px;
    width
    : 100px;
    padding
    : 0;
    cursor
    : pointer;
    font
    : bold 15px Arial, Helvetica;
    color
    : #fafafa;
    text-transform
    : uppercase;
    background-color
    : #0483a0;
    background-image
    : -webkit-gradient(linear, left top, left bottom, from(#31b2c3), to(#0483a0));
    background-image
    : -webkit-linear-gradient(top, #31b2c3, #0483a0);
    background-image
    : -moz-linear-gradient(top, #31b2c3, #0483a0);
    background-image
    : -ms-linear-gradient(top, #31b2c3, #0483a0);
    background-image
    : -o-linear-gradient(top, #31b2c3, #0483a0);
    background-image
    : linear-gradient(top, #31b2c3, #0483a0);
    border-radius
    : 3px;
    text-shadow
    : 0 1px 0 rgba(0, 0,0, .3);
    box-shadow
    : 0 1px 0 rgba(255, 255, 255, 0.3) inset, 0 1px 0 #fff;
    }
    #formWrapper .btn:hover,
    #formWrapper .btn:focus
    {
    background-color
    : #31b2c3;
    background-image
    : -webkit-gradient(linear, left top, left bottom, from(#0483a0), to(#31b2c3));
    background-image
    : -webkit-linear-gradient(top, #0483a0, #31b2c3);
    background-image
    : -moz-linear-gradient(top, #0483a0, #31b2c3);
    background-image
    : -ms-linear-gradient(top, #0483a0, #31b2c3);
    background-image
    : -o-linear-gradient(top, #0483a0, #31b2c3);
    background-image
    : linear-gradient(top, #0483a0, #31b2c3);
    }
    #formWrapper .btn:active
    {
    outline
    : 0;
    box-shadow
    : 0 1px 4px rgba(0, 0, 0, 0.5) inset;
    }
    #formWrapper::-moz-focus-inner
    {
    border
    : 0;
    }


    View Code
     頁面HTML代碼如下所示:

     <form id="formWrapper">
    <div class="formFiled clearfix">
    <input type="text" required="" placeholder="Search for CSS3, HTML5, jQuery ..." class="search">
    <input type="submit" class="btn submit" value="go">
    </div>
    </form>


    View Code
     
    利用background url多背景制作圖片花邊框
    界面效果圖如下:
    (其中這五張背景圖片分別為上左、上右、下左、下右、中間背景圖)
    css樣式如下所示:

     .demo {
    width
    : 240px;
    border
    : 20px solid rgba(104, 104, 142,0.5);
    border-radius
    : 10px;
    padding
    : 80px 60px;
    color
    : #f36;
    font-size
    : 25px;
    line-height
    : 1.5;
    text-align
    : center;
    }
    .multipleBg
    {
    background
    : url("bg-tl.png") no-repeat left top,url("bg-tr.png") no-repeat right top,url("bg-bl.png") no-repeat left bottom,url("bg-br.png") no-repeat right bottom,url("bg-repeat.png") repeat left top;
    /*改變背景圖片的position起始點,四朵花都是border邊緣處起,而平鋪背景是在paddin內邊緣起*/
    -webkit-background-origin
    : border-box, border-box,border-box,border-box,padding-box;
    -moz-background-origin
    : border-box, border-box,border-box,border-box,padding-box;
    -o-background-origin
    : border-box, border-box,border-box,border-box,padding-box;
    background-origin
    : border-box, border-box,border-box,border-box,padding-box;
    /*控制背景圖片的顯示區域,所有背景圖片超邊border外邊緣都將被剪切掉*/
    -moz-background-clip
    : border-box;
    -webkit-background-clip
    : border-box;
    -o-background-clip
    : border-box;
    background-clip
    : border-box;
    }


    View Code
    頁面HTML代碼如下所示:

    <div class="demo multipleBg">我使用了五張背景圖片。制作這樣的效果</div>


    View Code
     
    利用text-shadow制作3D立體文本效果
    界面效果圖如下:
    css樣式如下所示:

     body {
    background-color
    : #665757;
    }
    .text-wrap
    {
    width
    : 600px;
    margin
    : 10px auto;
    padding
    : 10px 0;
    border
    : 5px solid #ccc;
    position
    : relative;
    box-shadow
    : 0 0 4px rgba(0, 0, 0, 0.80);
    clear
    : both;
    font-family
    : 'Airal', serif;
    font-size
    : 50px;
    text-align
    : center;
    color
    : #f7edf7;
    }
    .box1
    {
    text-shadow
    : 0px 0px 0 rgb(188,178,188),1px 0px 0 rgb(173,163,173),2px 0px 0 rgb(157,147,157),3px 0px 0 rgb(142,132,142),4px 0px 0 rgb(126,116,126),5px 0px 0 rgb(111,101,111),6px 0px 0 rgb(95,85,95), 7px 0px 0 rgb(79,69,79),8px 0px 7px rgba(0,0,0,0.35),8px 0px 1px rgba(0,0,0,0.5),0px 0px 7px rgba(0,0,0,.2);
    }
    .box2
    {
    text-shadow
    : 0px 0px 0 rgb(188,178,188),1px -1px 0 rgb(173,163,173),2px -2px 0 rgb(157,147,157),3px -3px 0 rgb(142,132,142),4px -4px 0 rgb(126,116,126),5px -5px 0 rgb(111,101,111),6px -6px 0 rgb(95,85,95), 7px -7px 0 rgb(79,69,79),8px -8px 7px rgba(0,0,0,0.35),8px -8px 1px rgba(0,0,0,0.5),0px 0px 7px rgba(0,0,0,.2);
    }
    .box3
    {
    text-shadow
    : 0px 0px 0 rgb(188,178,188),0px -1px 0 rgb(173,163,173),0px -2px 0 rgb(157,147,157),0px -3px 0 rgb(142,132,142),0px -4px 0 rgb(126,116,126),0px -5px 0 rgb(111,101,111),0px -6px 0 rgb(95,85,95), 0px -7px 0 rgb(79,69,79),0px -8px 7px rgba(0,0,0,0.35),0px -8px 1px rgba(0,0,0,0.5),0px 0px 7px rgba(0,0,0,.2);
    }
    .box5
    {
    text-shadow
    : 0px 0px 0 rgb(188,178,188),-1px 0px 0 rgb(173,163,173),-2px 0px 0 rgb(157,147,157),-3px 0px 0 rgb(142,132,142),-4px 0px 0 rgb(126,116,126),-5px 0px 0 rgb(111,101,111),-6px 0px 0 rgb(95,85,95), -7px 0px 0 rgb(79,69,79),-8px 0px 7px rgba(0,0,0,0.35),-8px 0px 1px rgba(0,0,0,0.5),0px 0px 7px rgba(0,0,0,.2);
    }
    .box7
    {
    text-shadow
    : 0px 0px 0 rgb(188,178,188),0px 1px 0 rgb(173,163,173),0px 2px 0 rgb(157,147,157),0px 3px 0 rgb(142,132,142),0px 4px 0 rgb(126,116,126),0px 5px 0 rgb(111,101,111),0px 6px 0 rgb(95,85,95), 0px 7px 0 rgb(79,69,79),0px 8px 7px rgba(0,0,0,0.35),0px 8px 1px rgba(0,0,0,0.5),0px 0px 7px rgba(0,0,0,.2);
    }
    .box8
    {
    text-shadow
    : 0px 0px 0 rgb(188,178,188),1px 1px 0 rgb(173,163,173),2px 2px 0 rgb(157,147,157),3px 3px 0 rgb(142,132,142),4px 4px 0 rgb(126,116,126),5px 5px 0 rgb(111,101,111),6px 6px 0 rgb(95,85,95), 7px 7px 0 rgb(79,69,79),8px 8px 7px rgba(0,0,0,0.35),8px 8px 1px rgba(0,0,0,0.5),0px 0px 7px rgba(0,0,0,.2);
    }


    View Code
    頁面HTML代碼如下所示:

     <div class="text-wrap box1">W3cplus (0 deg)</div>
    <div class="text-wrap box2">W3cplus (45 deg)</div>
    <div class="text-wrap box3">W3cplus (90 deg)</div>
    <div class="text-wrap box5">W3cplus (180 deg)</div>
    <div class="text-wrap box7">W3cplus (270 deg)</div>
    <div class="text-wrap box8">W3cplus (315 deg)</div>


    View Code
    暫時先寫到這里吧。事實上這些效果都是看《圖解CSS3》,根據書中理論利用css相關屬性制作的效果圖。(在此強烈推薦一下這本書,確實是理論與實踐結合的好書)
     未完待續
    (繼續閱讀...)
    文章標籤

    AutoPoster 發表在 痞客邦 留言(0) 人氣(2)

    • 個人分類:生活學習
    ▲top
    • 3月 09 週四 201720:21
    • JS性能方面--內存管理及ECMAScript5 Object的新屬性方法

    文章出處
    Delete一個Object的屬性會讓此對象變慢(多耗費15倍的內存)
    var o = { x: 'y' };
    delete o.x; //此時o會成一個慢對象
    o.x; //

    var o = { x: 'y' };
    o
    = null; //應該這樣

     
    閉包
    在閉包中引入閉包外部的變量時,當閉包結束時此對象無法被垃圾回收(GC)。
    var a = function() {
    var largeStr = new Array(1000000).join('x');
    return function() {
    return largeStr;
    }
    }();

     
    DOM泄露
    當原有的COM被移除時,子結點引用沒有被移除則無法回收。
    var select = document.querySelector;
    var treeRef = select('#tree');
    //在COM樹中leafRef是treeFre的一個子結點
    var leafRef = select('#leaf');
    var body = select('body');
    body.removeChild(treeRef);
    //#tree不能被回收入,因為treeRef還在
    //
    解決方法:
    treeRef = null;
    //tree還不能被回收,因為葉子結果leafRef還在
    leafRef = null;
    //現在#tree可以被釋放了。

     
    Timers計(定)時器泄露
    for (var i = 0; i < 90000; i++) {
    var buggyObject = {
    callAgain:
    function() {
    var ref = this;
    var val = setTimeout(function() {
    ref.callAgain();
    },
    90000);
    }
    }
    buggyObject.callAgain();
    //雖然你想回收但是timer還在
    buggyObject = null;
    }

     
    調試內存
    Chrome自帶的內存調試工具可以很方便地查看內存使用情況和內存泄露:
    在 Timeline -> Memory 點擊record即可:
     
    Object.create(prototype[,descriptors])
    這個方法用于創建一個對象,并把其prototype屬性賦值為第一個參數,同時可以設置多個descriptors,關于decriptor下一個方法就會介紹這里先不說。只需要這樣就可以創建一個原型鏈干凈對象了
    var o = Object.create({
    "say": function () {
    alert(
    this.name);
    },
    "name":"Byron"
    });

    image
    Object.defineProperty(O,Prop,descriptor) / Object.defineProperties(O,descriptors)
    想明白這兩個函數必須明白descriptor是什么,在之前的JavaScript中對象字段是對象屬性,是一個鍵值對,而在ECMAScript5中引入property,property有幾個特征
    1. value:值,默認是undefined
    2. writable:是否是只讀property,默認是false,有點像C#中的const
    3. enumerable:是否可以被枚舉(for in),默認false
    4. configurable:是否可以被刪除,默認false
    同樣可以像C#、Java一樣些get/set,不過這兩個不能和value、writable同時使用
    5.get:返回property的值得方法,默認是undefined
    6.set:為property設置值的方法,默認是undefined
     Object.defineProperty(o, 'age', {
    value:
    24,
    writable:
    true,
    enumerable:
    true,
    configurable:
    true
    });
    Object.defineProperty(o,
    'sex', {
    value:
    'male',
    writable:
    false,
    enumerable:
    false,
    configurable:
    false
    });
    console.log(o.age);
    //24
    o.age = 25;
    for (var obj in o) {
    console.log(obj
    + ' : ' + o[obj]);
    /*
    age : 25 //沒有把sex : male 遍歷出來
    say : function () {
    alert(this.name);
    }
    name : Byron
    */
    }
    delete o.age;
    console.log(o.age);
    //undefined

    console.log(o.sex);
    //male
    //o.sex = 'female'; //Cannot assign to read only property 'sex' of #<Object>
    delete o.age;
    console.log(o.sex);
    //male ,并沒有被刪除

    也可以使用defineProperties方法同時定義多個property,
     Object.defineProperties(o, {
    'age': {
    value:
    24,
    writable:
    true,
    enumerable:
    true,
    configurable:
    true
    },
    'sex': {
    value:
    'male',
    writable:
    false,
    enumerable:
    false,
    configurable:
    false
    }
    });

     
    Object.getOwnPropertyDescriptor(O,property)
     
    這個方法用于獲取defineProperty方法設置的property 特性
     
    var props = Object.getOwnPropertyDescriptor(o, 'age');
    console.log(props);
    //Object {value: 24, writable: true, enumerable: true, configurable: true}

     
    Object.getOwnPropertyNames
    獲取所有的屬性名,不包括prototy中的屬性,返回一個數組
    console.log(Object.getOwnPropertyNames(o)); //["age", "sex"]

    (繼續閱讀...)
    文章標籤

    AutoPoster 發表在 痞客邦 留言(0) 人氣(28)

    • 個人分類:生活學習
    ▲top
    • 3月 09 週四 201720:21
    • chrome使用技巧(看了定不讓你失望)

    文章出處
    寫在前面
    之前有看過劉哇勇寫的Chrome 控制臺不完全指南,讓我覺得瞬間對chrome的了解實在太淺了。對此特意了解了一番(也就是在他的博文上進行了一些總結和了解一些其它chrome使用方面的訣竅),寫了兩篇博文
    你可能不知道console強大
    我所了解的chrome
    最近又學到了一些chrome的使用技巧,在此分享一下,我只是覺得工欲善其事,必先利其器。chrome在我心里就是神。
    我只是很用心的寫一下這篇文章,希望這些使用技巧對大家有用。
    快速切換文件
    我一般如果查找每個文件,一般都是打開控制臺,在source控制面板里面一個一個去找,看下面的圖你就應該知道,這么多文件,你都不知道在哪個目錄下面,然后就只能一個一個點開看
    后來才發現原來按Ctrl+P(cmd+p on mac),就能快速搜尋和打開你項目的文件。
    在源代碼中搜索
    大家都知道如果在要在Elements查看源碼,只要定位到Elements面板,然后按ctrl+f就可以了
    可是如果你希望在源代碼中搜索要怎么辦呢?在頁面已經加載的文件中搜尋一個特定的字符串,快捷鍵是Ctrl + Shift + F (Cmd + Opt + F),這種搜尋方式還支持正則表達式哦
    在源代碼中快速跳轉到指定的行
    大家都知道在VS里,一個cs文件可能特別多行,然后我們就是使用ctrl+g快捷鍵來跳轉到特定的行,事實上在chrome控制臺也是一樣的,在Sources標簽中打開一個文件之后,按Ctrl + G,(or Cmd + L for Mac),然后輸入行號,chrome控制臺就會跳轉到你輸入的行號所在的行。
    使用多個插入符進行選擇
    當編輯一個文件的時候,你可以按住Ctrl在你要編輯的地方點擊鼠標,可以設置多個插入符,這樣可以一次在多個地方編輯
    設備模式
    最近做用H5做攜程商旅APP,用的最多的就是chrome瀏覽器的設備模式。試想一下,如果我們每在Visual studio工具上開發完一個功能又得跑到手機上調試,那得多煩,開發效率多低呀。想想就知道為什么那么多人喜歡用chrome瀏覽器。
    設備傳感仿真
    設備模式的另一個很酷的功能是模擬移動設備的傳感器,例如觸摸屏幕和加速計。你甚至可以惡搞你的地理位置。這個功能位于元素標簽的底部,點擊“show drawer”按鈕,就可看見Emulation --> Sensors.
     
     
    格式化凌亂的js源碼
    有時候看到壓縮好的一團糟的js,都不知道從何著手去看。chrome控制臺有內建的美化代碼功能,可以返回一段最小化且格式易讀的代碼。Pretty Print的按鈕在Sources標簽的左下角。
     
    顏色選擇器
    當在樣式編輯中選擇了一個顏色屬性時,你可以點擊顏色預覽,就會彈出一個顏色選擇器。當選擇器開啟時,如果你停留在頁面,鼠標指針會變成一個放大鏡,讓你去選擇像素精度的顏色。
    改變顏色格式
    相信前端開發人員都知道,顏色有很多種表示方式,比如rgb,hsl,十六進制表示方法等。看了下面的這個圖,我相信你肯定會佩服chrome的功能強大,連細節都做得那么好。
    在顏色預覽功能使用快捷鍵Shift + Click,可以在rgba、hsl和hexadecimal來回切換顏色的格式
     
    強制改變元素狀態(方便查看不同狀態下元素的樣式)
    chrome控制臺有一個可以模擬CSS狀態的功能,例如元素的hover和focus,可以很容易的改變元素樣式。在CSS編輯器中可以利用這個功能查看不同狀態下元素的樣式,我相信這個功能對于模仿別人界面的前端愛好者來說是非常實用的。
    利用chrome來查看和編輯本地文件
    事實上我們可以用chrome來查看本地文件,只要把相關目錄拖到chrome瀏覽器中即可。
    選擇下一個匹配項
    當在Sources標簽下編輯文件時,按下Ctrl + D (Cmd + D) ,當前選中的單詞的下一個匹配也會被選中,有利于你同時對它們進行編輯。

    可視化的DOM陰影
    eb瀏覽器在構建如文本框、按鈕和輸入框一類元素時,其它基本元素的視圖是隱藏的。不過,你可以在Settings -> General 中切換成Show user agent shadow DOM,這樣就會在元素標簽頁中顯示被隱藏的代碼。甚至還能單獨設計他們的樣式,這給你了很大的控制權。
    這點特性在我的另一篇博文中有提到,當時遇到問題時找了半天才發現原因,如果早點能知道chrome的這個特性,我相信必定會節省不少時間。
    用css3實現各種圖標效果(2)
    (繼續閱讀...)
    文章標籤

    AutoPoster 發表在 痞客邦 留言(0) 人氣(0)

    • 個人分類:生活學習
    ▲top
    • 3月 09 週四 201720:21
    • VS快捷鍵大全(總結了一些記憶的口訣)


    文章出處
    相信.Net開發人員都想能夠熟記各種VS快捷鍵以提高平時開發的效率,但苦于記憶能力太差而快捷鍵又特別多,特別煩,所以作罷!
    下面我將簡單介紹一下我記憶VS快捷鍵的一些方法,希望對大家有所幫助。
    1、窗口快捷鍵 
    (大家有沒有發現但凡跟窗口掛上鉤的快捷鍵當中都有一個W,那是因為W代表Windows也就是窗口的意思)
    Ctrl+W,W: 瀏覽器窗口 (瀏覽櫥窗用有道的翻譯是window shopping   所以打開瀏覽器窗口的快捷鍵自然就是Ctrl+W,W  大家想想為什么這里的w代表瀏覽櫥窗的含義呢,那是因為你打開瀏覽器窗口默認會讓大家去看各種微軟新聞及產品以便引導大家購買微軟產品  這是后話 哈哈)
    Ctrl+W,S: 解決方案管理器 (解決方案是Solution)
    Ctrl+W,C: 類視圖 (類自然是Class)
    Ctrl+W,E: 錯誤列表 (錯誤是Error)
    Ctrl+W,O: 輸出視圖 (輸出Output )用過輸出窗口的猿們自然知道它的厲害啦 我覺得是一個挺強悍的窗口
    Ctrl+W,P: 屬性窗口 (屬性 Property)
    Ctrl+W,T: 任務列表 (任務Task)
    Ctrl+W,X: 工具箱  (事實上工具應該是Tool  但t已被任務列表占用了  那總歸得找一個字母用吧  哈哈  自然就想到了X  大家看看X的體型就知道了它可是四通八達呀  微軟用它自然就想表達我們的VS工具箱可是各色各樣的工具都有的哦   這是我瞎謅的)
    Ctrl+W,B: 書簽窗口 (書簽 Bookmark   )書簽其實是挺好用的  用熟悉的猿們肯定對它愛不釋手
    Ctrl+W,U: 文檔大綱
    Ctrl+D,B: 斷點窗口 (斷點 breakpoint)
    Ctrl+D,I: 即時窗口 (即時immediately )
    2、項目功能快捷鍵 
    (先總結一下哦 ctrl是強制功能鍵  shift有給項目增加功能作用)
    CTRL + F6 /CTRL + TAB下一個文檔窗口即活動窗體切換 (相信使用過windows操作系統的伙伴們都知道alt+tab表示在任務之間切換  那如果在當中任務不同的活動標簽中切換就是ctrl+tab了   嘿嘿)
    CTRL + SHIFT + F6 /CTRL + SHIFT + TAB上一個文檔窗口 (在windows系統操作中  相信大家都知道shift有相反的功能  哈哈  在這里體現了)
    F7: 查看代碼 
    Shift+F7: 查看窗體設計器 (coding的大家相信用過最多的就是在視圖界面的代碼界面切換  那就用它了  如果是想再切換回視圖界面  哈哈 記得加相反鍵 shift)
     
    Ctrl+Shift+N: 新建項目 (N是New新建的意思  那如果需要強制在項目中新建項目的話  自然就是組合鍵Ctrl+Shift+N)
    Ctrl+Shift+O: 打開項目 (O代表Open打開的意思)
    CTRL + SHIFT + C顯示類視圖窗口(C代表Class類的意思)
    CTRL + F4關閉文檔窗口 (相信用過qq的大家都有使用alt+f4來關閉當前聊天窗口    想想用ctrl+tab在活動標簽窗口切換就知道為什么關閉當前標簽窗口是ctrl+f4)
    CTRL + SHIFT + E顯示資源視圖 (E代表Explorer資源管理器的意思)
    CTRL + SHIFT + B生成解決方案 (B代表Build生成的意思  其實用F6也可以實現)
    Shift+F6表示生成當前項目 (上面已經說過使用f6可以生成整個解決方案  那如果是當前項目的生成那自然就是加上功能鍵shift了 )
    F4 顯示屬性窗口
    SHIFT + F4顯示項目屬性窗口
    Ctrl+Shift+S: 全部保存 (S代表Save保存的意思  這里表示全部保存是因為如果只是單個保存Ctrl+S跟整個項目沒有任何瓜葛  而全部保存的概念應該是說在整個項目中  所以組合鍵中自然會有shift了哦)
    Ctrl+Shift+A: 新建項(A是Add的意思)
    Shift+Alt+C: 新建類 (大家可以會想為什么新建類是shift+alt+c  c自然是class啦  我相信平時的coding工作當中添加類是最多的而alt鍵是我們使用的最多的鍵空格鍵旁邊的小功能鍵 shift是跟項目有關的功能鍵  這樣一記不就哈哈  進入腦海啦)

    3、書簽相關快捷鍵(我本人比較喜歡看書的時候寫些東西或者做些標記  所以提前寫這部門啦)

    (B代表Bookmark  )
    Ctrl+B,T  切換書簽開關 (切換是trigger 哦)
    Ctrl+B,N  移動到下一書簽 (下一個是Next)
    Ctrl+B,P: 移動到上一書簽 (上一個是Previous)
    Ctrl+B,C: 清除全部標簽(C是Clear)
    4、查找相關快捷鍵
    Ctrl+F: 查找 (Find)
    Ctrl+Shift+F: 在文件中查找 (上面已經提過了shift是表示在項目中  所以如果需要在項目中的文件中查找的話  那自然就少不了Shift)
    F3: 查找下一個 (相信使用過windows系統的人都知道f3是查找的快捷鍵)
    Shift+F3: 查找上一個 (shift在此有反向的功能哦)
    Ctrl+H: 替換 
    Ctrl+Shift+H: 在文件中替換
    5、代碼快捷鍵
    Ctrl+E,D(ctrl+k,d) ----格式化全部代碼 (每個使用過vs的人  如果不會用這個快捷鍵那可是虧大了哦)
    Ctrl+E,F ----格式化選中的代碼(如果你已經記住Ctrl+E+D是格式化全部代碼的話  那你想想規律不就知道了嗎 F不就在D的右邊表示它是特定某一范圍)
     
    Ctrl+K,C: 注釋選定內容 
    Ctrl+K,U: 取消選定注釋內容 (平常注釋和反注釋  大家相信都用的比較平凡  kernel核心內容 c表示Comment selected text   U表示Uncomment selected text)
    Ctrl+J /Ctrl+K,L: 智能提示  列出成員 (kernel核心內容 list列表  如果我們想查看一個對象具有的成員具體信息的時候試下這個快捷鍵吧)
    Ctrl+K,P: 參數信息 (kernel核心內容 Parameters參數  如果我們想查看一個方法的具體參數的時候這個組合鍵可是挺有用的哦)
    Ctrl+K,I: 快速信息
     
    Ctrl+K,X: 插入代碼段 
    Ctrl+K,S: 插入外側代碼(平時個人習慣會時不時的用#region  用了region之后代碼看起來就特別整潔  所以自然而然的就用習慣了這個)
     
     
    CTRL + M, CTRL + M 折疊或展開當前方法
    CTRL + M, CTRL + O 折疊所有方法
    CTRL + M, CTRL + L展開所有方法
    Ctrl+M,P: 停止大綱顯示 (用了region將代碼折疊起來之后試試用這組組合鍵吧  體驗一下折疊和展開的快感吧  看著舒服的代碼我相信你記住這對快捷鍵肯定是值得的)
     
    ctrl+shift+f10:自動添加using命名空間
    插入自動屬性:輸入prop后按兩下tab
    6、調試快捷鍵
    F5: 啟動調試
    Ctrl+F5: 開始執行(不調試)
    Shift+F5: 停止調試
    Ctrl+Shift+F5: 重啟調試
    F9: 切換斷點
    Ctrl+F9: 啟用/停止斷點
    Ctrl+Shift+F9: 刪除全部斷點
    F10: 逐過程
    Ctrl+F10: 運行到光標處
    F11: 逐語句
     
    7、編輯快捷鍵
    Shift+Alt+Enter: 切換全屏編輯(如果想一心一意的只寫代碼  讓整個vs鋪滿全屏  感覺還不錯哦)
    F12: 轉到所調用過程或變量的定義 
    Alt+F12: 查找符號(列出所有查找結果) 
    shift+f12:查找所有引用(講光標放在單詞上, 然后按Shift + F12)
     
    Ctrl+U: 全部變為小寫  (個人最喜歡這組快捷鍵了  因為平常寫sql語句的時候都是在sqlserver里面寫的 然后再粘貼到vs里來  了解了一些sql語句性能優化的皮毛知識就免不了想把粘貼過來的sql語句全部轉換成大寫以提高丁點兒性能   )
    Ctrl+Shift+U: 全部變為大寫  (U表示Upper )
     
    Ctrl+Shift+V: 剪貼板循環 (平時我們都只習慣用ctrl+c 和ctrl+v  大家可能還不知道事實上微軟都已經幫我們把多次剪切的結果都保存了下來  記下這組快捷鍵吧  可以粘貼上幾次剪切的結果  一用便知道它的強大厲害之處)
    Ctrl+Shift+L: 刪除當前行 (這個很有用哦  因為大家常常會要刪除多余的空行  哈哈  這組快捷鍵會讓你省力不少)
    Ctrl+E,S: 查看空白(ctrl+r,w   和它一樣可以查看空白或者說顯示或隱藏tab標記)
     
     
    Ctrl+E,W: 自動換行 (這組快捷鍵真的是太方便了,平常一行代碼太長 然后老是要拉滾動條  用了組快捷鍵就能將手從鼠標解放出來啦)
    Ctrl+G: 轉到指定行 (通過情況下 我們想在跳轉到具體某一行 用它太方便了)
    Shift+Alt+箭頭鍵: 選擇矩形文本
    Alt+鼠標左按鈕: 選擇矩形文本
    CTRL + DELETE刪除至詞尾
    CTRL + BACKSPACE刪除至詞頭
    SHIFT + TAB取消制表符
     
    Ctrl+左右箭頭鍵: 一次可以移動一個單詞
    Ctrl+單擊: 選中當前點擊的整個單詞
    SHIFT + END選擇至行尾
    SHIFT + HOME選擇至行開始處
    CTRL + SHIFT + END選擇至文檔末尾
    CTRL + SHIFT + HOME選擇至文檔末尾開始
    CTRL + SHIFT + PAGE UP選擇至本頁前面
    CTRL + SHIFT + PAGE DOWN選擇至本頁后面
    CTRL + PAGE DOWN光標定位到窗口上方
    CTRL + PAGE UP光標定位到窗口下方
    CTRL + END文檔定位到最后
    CTRL + HOME文檔定位到最前
     
    按兩下tab快速插入代碼段(寫for, foreach循環,或者try, 還有綁定事件方法) 
    ctrl+減號:回退到光標上一次的位置(這個真心挺有用的)
     (希望這篇文章能夠幫助大家記住一些常用的快捷鍵)
    特別聲明,文章中的圖片是借鑒小坦克的圖片,本人才疏學淺做不來這樣好的圖片,所以......
    希望快捷鍵的使用可以幫助大家提高工作效率! 哈哈
    (繼續閱讀...)
    文章標籤

    AutoPoster 發表在 痞客邦 留言(0) 人氣(3)

    • 個人分類:生活學習
    ▲top
    • 3月 09 週四 201720:21
    • HTML5系列五(Canvas詳述)


    文章出處
    寫在前面
    閑來無事的時候會來一場一個人說走就走的旅行或者宅家里系統性的看些技術方面的書,最近在看《html5與css3權威指南》,這本書挺適合初學前端的人,雖然對于我來說只是溫習相關的知識,但好歹來說開卷有益,只要是一本好書,即使知識很淺也值得一看。
    (我會在相關代碼注釋中揭示canvas對象相關方法各參數的含義)
    寫的不好的地方還望大家見諒
    canvas概述
    canvas標簽非常的簡潔,常用的就width和height兩個屬性
    大多數 canvas 繪圖 API 都沒有定義在 <canvas> 元素本身上,而是定義在通過畫布的 getContext() 方法獲得的一個“繪圖環境”對象上
     var tCanvas = document.getElementById("canvasOne");
    var ct = tCanvas.getContext("2d");
    //因此可以通過該方法來檢測瀏覽器是否支持canvas:
    function canvasSupport() {
    //檢測是否支持canvas
    return !!document.createElement("canvas").getContext;
    }

    繪制矩形
    界面html如下所示:
    <!DOCTYPE html>
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title></title>
    </head>
    <body onload="draw('canvas');">
    <canvas id="canvas" width="400" height="300"></canvas>
    <script src="script.js"></script>
    </body>
    </html>

    JavaScript如下所示:
     function draw(id) {
    var canvas = document.getElementById(id);
    if (canvas == null) {
    return false;
    }
    var context = canvas.getContext('2d');//取得上下文對象
    context.fillStyle = '#EEEEFF';//填充樣式
    context.fillRect(0, 0, 400, 300);//填充矩形
    context.fillStyle = 'red';
    context.strokeStyle
    = 'blue';//圖形邊框的樣式
    context.lineWidth = 1;//設置圖形邊框的寬度
    context.fillRect(50, 50, 100, 100);//填充矩形
    context.strokeRect(50, 50, 100, 100);//繪制矩形邊框
    }

    效果圖如下所示:
    使用路徑繪制圓形
    JavaScript如下所示:
     function draw(id) {
    var canvas = document.getElementById(id);
    if (canvas == null) {
    return false;
    }
    var context = canvas.getContext('2d');
    context.fillStyle
    = '#EEEEFF';
    context.fillRect(
    0, 0, 400, 300);
    for (var i = 0; i < 10; i++) {
    context.beginPath();
    //開始創建路徑
    //創建圓形路徑
    context.arc(i * 25,//繪制圓形的起點橫坐標
    i * 25,//繪制圓形的起點縱坐標
    i * 10,//圓形半徑
    0,//開始角度
    Math.PI * 2,//結束角度
    true/*是否按順時針方向進行繪制*/);
    context.closePath();
    //關閉路徑
    context.fillStyle = 'rgba(255,0,0,0.25)';//設置繪制樣式
    context.fill();//進行圖形繪制

    }
    }

     
    效果圖如下所示:
    未關閉路徑繪制圓形
    JavaScript如下所示:
     function draw(id) {
    var canvas = document.getElementById(id);
    if (canvas == null) {
    return false;
    }
    var context = canvas.getContext('2d');
    context.fillStyle
    = '#EEEEFF';
    context.fillRect(
    0, 0, 400, 300);
    for (var i = 0; i < 10; i++) {
    context.arc(i
    * 25, i * 25, i * 10, 0, Math.PI * 2, true);
    context.fillStyle
    = 'rgba(255,0,0,0.25)';
    context.fill();
    }
    }

     
    效果圖如下所示:
    使用moveTo和LineTo方法繪制復雜線條
    JavaScript如下所示:
     function draw(id) {
    var canvas = document.getElementById(id);
    if (canvas == null) {
    return false;
    }
    var context = canvas.getContext('2d');
    context.fillStyle
    = '#EEEEFF';
    context.fillRect(
    0, 0, 400, 300);
    var dx = 150,
    dy
    = 150,
    s
    = 100,
    x
    = Math.sin(0),
    y
    = Math.cos(0),
    dig
    = Math.PI / 15 * 11;
    context.beginPath();
    //需要使用moveTo將光標移動到所指定的直線起點
    context.fillStyle = 'rgb(100,255,100)';
    context.strokeStyle
    = 'rbg(0,0,100)';
    for (var i = 0; i < 30; i++) {
    x
    = Math.sin(i * dig);
    y
    = Math.cos(i * dig);
    context.lineTo(dx
    + x * s, dy + y * s);//繪制一條直線 (在直線起點和直線終點繪制)
    }
    context.closePath();
    context.fill();
    context.stroke();
    }

     
    效果圖如下所示:
    使用bezierCurveTo繪制貝濟埃曲線
    JavaScript如下所示:
     function draw(id) {
    var canvas = document.getElementById(id);
    if (canvas == null) {
    return false;
    }
    var context = canvas.getContext('2d');
    context.fillStyle
    = '#EEEEFF';
    var dx = 150,
    dy
    = 150,
    s
    = 100,
    x
    = Math.sin(0),
    y
    = Math.cos(0),
    dig
    = Math.PI / 15 * 11;
    context.beginPath();
    context.globalCompositeOperation
    = 'red';
    context.fillStyle
    = 'rgb(100,255,100)';
    context.moveTo(dx, dy);
    //將光標移動到指定坐標點
    for (var i = 0; i < 30; i++) {
    x
    = Math.sin(i * dig);
    y
    = Math.cos(i * dig);
    //繪制貝濟埃曲線 將當前坐標點到指定坐標點中間的貝濟埃曲線追加到路徑中
    context.bezierCurveTo(dx + x * s,//第一個控制點的橫坐標
    dy + y * s - 100,//第一個控制點的縱坐標
    dx + x * s + 100,//第二個控制點的橫坐標
    dy + y * s,//第二個控制點的縱坐標
    dx + x * s,//貝濟埃曲線的終點橫坐標
    dy + y * s);//貝濟埃曲線的終點縱坐標
    }
    context.closePath();
    context.fill();
    context.stroke();
    }

     
    效果圖如下所示:
    繪制線性漸變
    JavaScript如下所示:
     function draw(id) {
    var canvas = document.getElementById(id);
    if (canvas == null) {
    return false;
    }
    var context = canvas.getContext('2d');
    //創建線性漸變
    var g1 = context.createLinearGradient(0,//漸變起始地點的橫坐標
    0,//漸變起始地點的縱坐標
    0,////漸變結束地點的橫坐標
    300);//漸變結束地點的縱坐標
    //追加漸變的顏色
    g1.addColorStop(0,//設定顏色離開漸變起始點的偏移量 該參數的值是一個范圍在0到1之間的浮點數 漸變起始點的偏移量為0 漸變結束點的偏移量為1
    'rgb(255,255,0)');//顏色值
    //因為是漸變 所以至少使用兩次addColorStop
    g1.addColorStop(1, 'rgb(0,255,255)');
    context.fillStyle
    = g1;
    context.fillRect(
    0, 0, 400, 300);
    var g2 = context.createLinearGradient(0, 0, 300, 0);
    g2.addColorStop(
    0, 'rgba(0,0,255,0.5)');
    g2.addColorStop(
    1, 'rgba(255,0,0,0.5)');
    for (var i = 0; i < 10; i++) {
    context.beginPath();
    context.fillStyle
    = g2;//設置為漸變LinearGradient對象
    context.arc(i * 25, i * 25, i * 10, 0, Math.PI * 2, true);
    context.closePath();
    context.fill();
    }
    }

     
    效果圖如下所示:
    繪制徑向漸變
    JavaScript如下所示:
     function draw(id) {
    var canvas = document.getElementById(id);
    if (canvas == null) {
    return false;
    }
    var context = canvas.getContext('2d');
    //繪制徑向漸變
    var g1 = context.createRadialGradient(400,//漸變開始圓的圓心橫坐標
    0,//漸變開始圓的圓心縱坐標
    0,//漸變開始圓的半徑
    400,//漸變結束圓的圓心橫坐標
    0,//漸變結束圓的圓心縱坐標
    400);//漸變結束圓的半徑
    g1.addColorStop(0.1, 'rgb(255,255,0)');
    g1.addColorStop(
    0.3, 'rgb(255,0,255)');
    g1.addColorStop(
    1, 'rgb(0,255,255)');
    context.fillStyle
    = g1;
    context.fillRect(
    0, 0, 400, 300);
    var g2 = context.createRadialGradient(250, 250, 0, 250, 250, 250, 300);
    g2.addColorStop(
    0.1, 'rgba(255,0,0,0.5)');
    g2.addColorStop(
    0.7, 'rgba(255,255,0,0.5)');
    g2.addColorStop(
    1, 'rgba(0,0,255,0.5)');
    for (var i = 0; i < 10; i++) {
    context.beginPath();
    context.fillStyle
    = g2;
    context.arc(i
    * 25, i * 25, i * 10, 0, Math.PI * 2, true);
    context.closePath();
    context.fill();
    }
    }

     
    效果圖如下所示:
    利用坐標變換來繪制類似撲克牌的變形圖形
    JavaScript如下所示:
     function draw(id) {
    var canvas = document.getElementById(id);
    if (canvas == null) {
    return false;
    }
    var context = canvas.getContext('2d');
    context.fillStyle
    = '#eef';
    context.fillRect(
    0, 0, 400, 300);
    //移動坐標軸原點
    context.translate(200,//將坐標軸原點向左移動多少個單位
    50); //將坐標軸原點向下移動多少個單位

    context.fillStyle
    = 'rgba(255,0,0,0.25)';
    for (var i = 0; i < 50; i++) {
    context.translate(
    25, 25);
    //將圖形放大
    context.scale(0.95,//水平方向的放大倍數
    0.95);//垂直方向的放大倍數
    context.rotate(Math.PI / 10);//將圖形進行旋轉
    context.fillRect(0, 0, 100, 50);
    }
    }

     
    效果圖如下所示:
    利用坐標變換與路徑結合使用來繪制星形圖形
    JavaScript如下所示:
     function draw(id) {
    var canvas = document.getElementById(id);
    if (canvas == null) {
    return false;
    }
    var context = canvas.getContext('2d');
    context.fillStyle
    = '#eef';
    context.fillRect(
    0, 0, 400, 300);
    context.translate(
    200, 50);
    for (var i = 0; i < 50; i++) {
    context.translate(
    25, 25);
    context.scale(
    0.95, 0.95);
    context.rotate(Math.PI
    / 10);
    create5Star(context);
    context.fill();
    }
    }
    function create5Star(context) {
    var dx = 100,
    dy
    = 0,
    s
    = 50;
    context.beginPath();
    context.fillStyle
    = 'rgba(255,0,0,0.5)';
    var x = Math.sin(0),
    y
    = Math.cos(0),
    dig
    = Math.PI / 5 * 4;
    for (var i = 0; i < 5; i++) {
    x
    = Math.sin(i * dig);
    y
    = Math.cos(i * dig);
    context.lineTo(dx
    + x * s, dy + y * s);
    }
    context.closePath();
    }

     
    效果圖如下所示:
    利用矩陣變換來繪制彩虹
    JavaScript如下所示:
     function draw(id) {
    var canvas = document.getElementById(id);
    if (canvas == null) {
    return false;
    }
    var context = canvas.getContext('2d');
    //定義顏色
    var colors = ['red', 'orange', 'yellow', 'green', 'blue', 'navy', 'purple'];
    context.lineWidth
    = 10;//定義線寬
    context.transform(1, 0, 0, 1, 100, 0);//矩陣轉換
    for (var i = 0; i < colors.length; i++) {//循環繪制圓弧
    context.transform(1, 0, 0, 1, 0, 10);//定義每次向下移動10個像素的變換矩陣
    context.strokeStyle = colors[i];//設定顏色
    context.beginPath();
    context.arc(
    50, 100, 100, 0, Math.PI, true);//繪制圓弧
    context.stroke();
    }
    }

     
    效果圖如下所示:
    使用setTransform方法繪制變形圖形
    JavaScript如下所示:
     function draw(id) {
    var canvas = document.getElementById(id);
    if (canvas == null) {
    return false;
    }
    var context = canvas.getContext('2d');
    //繪制紅色長方形
    context.strokeStyle = 'red';
    context.strokeRect(
    30, 10, 60, 20);
    //繪制順時針旋轉45度的藍色長方形
    var rad = 45 * Math.PI / 180;
    context.setTransform(Math.cos(rad), Math.sin(rad),
    -Math.sin(rad), Math.cos(rad), 0, 0);//定義順時針旋轉45的變換矩陣
    context.strokeStyle = 'blue';
    context.strokeRect(
    30, 10, 60, 20);//繪制圖形
    //繪制放大2.5倍后的綠色長方形
    context.setTransform(2.5, 0, 0, 2.5, 0, 0);//定義放大2.5倍的變換矩陣
    context.strokeStyle = 'green';
    context.strokeRect(
    30, 10, 60, 20);//繪制圖形
    //將坐標原點向左移動40像素,向下移動80像素后繪制灰色長方形
    context.setTransform(1, 0, 0, 1, 40, 80);//定義將坐標原點向右移動40像素,向下移動80像素的矩陣
    context.strokeStyle = 'gray';
    context.strokeRect(
    30, 10, 60, 20);//繪制圖形
    }

     
    效果圖如下所示:
    圖形結合的不同選項講解
    JavaScript如下所示:
     function draw(id) {
    var canvas = document.getElementById(id);
    if (canvas == null) {
    return false;
    }
    var context = canvas.getContext('2d');
    var oprtns = [
    'source-atop',//只繪制新圖形中與原有圖形重疊的部分與未被重疊覆蓋的原有圖形,新圖形的其它部分變成透明
    'source-in',//只顯示新圖形中與原有圖形相重疊的部分,新圖形與原有圖形的其它部分均變成透明
    'source-out',//只顯示原圖形與新圖形不重疊的部分,新圖形與原有圖形的其它部分均變成透明
    'source-over',//新圖形覆蓋在原有圖形之上
    'destination-atop',//只繪制原有圖形中被新圖形重疊覆蓋的部分與新圖形的其它部分,原有圖形中的其它部分變成透明 ,不繪制新圖形中與原有圖形相重疊的部分
    'destination-in',//只顯示原有圖形中與新圖形相重疊的部分,新圖形與原有圖形的其它部分均變成透明
    'destination-out',//只顯示原有圖形中與新圖形不重疊的部分,新圖形與原有圖形的其它部分均變成透明
    'destination-over',//在原有圖形之下繪制圖形
    'lighter',//原有圖形與新圖形均繪制,重疊部分做加色處理
    'copy',//只繪制新圖形,原有圖形中未與新圖形重疊的部分變成透明
    'xor'];//只繪制新圖形中與原有圖形不重疊的部分,重疊部分變成透明
    i = 7;//在原有圖形之下繪制圖形 (這里大家可以自己去試下其它選項 方便自己深入理解)
    context.fillStyle = 'blue';
    context.fillRect(
    10, 10, 60, 60);
    context.globalCompositeOperation
    = oprtns[i];
    context.beginPath();
    context.fillStyle
    = 'red';
    context.arc(
    60, 60, 30, 0, Math.PI * 2, false);
    context.fill();
    }

     
    效果圖如下所示:
    給圖形繪制陰影
    JavaScript如下所示:
     function draw(id) {
    var canvas = document.getElementById(id);
    if (canvas == null) {
    return false;
    }
    var context = canvas.getContext('2d');
    context.fillStyle
    = '#eef';
    context.fillRect(
    0, 0, 400, 300);
    context.shadowOffsetX
    = 10;//陰影的橫向位移量
    context.shadowOffsetY = 10;//陰影的縱向位移量
    context.shadowColor = 'rgba(100,100,100,0.5)';//陰影的顏色
    context.shadowBlur = 7.5;//陰影的模糊范圍
    context.translate(0, 50);
    for (var i = 0; i < 3; i++) {
    context.translate(
    50, 50);
    create5Star(context);
    context.fill();
    }
    }
    function create5Star(context) {
    var dx = 100,
    dy
    = 0,
    s
    = 50,
    x
    = Math.sin(0),
    y
    = Math.cos(0),
    dig
    = Math.PI / 5 * 4;
    context.beginPath();
    context.fillStyle
    = 'rgba(255,0,0,0.5)';
    for (var i = 0; i < 5; i++) {
    x
    = Math.sin(i * dig);
    y
    = Math.cos(i * dig);
    context.lineTo(dx
    + x * s, dy + y * s);
    }
    context.closePath();
    }

     
    效果圖如下所示:
    繪制圖像
    JavaScript如下所示:
     function draw(id) {
    var canvas = document.getElementById(id);
    if (canvas == null) {
    return false;
    }
    var context = canvas.getContext('2d');
    context.fillStyle
    = '#eef';
    context.fillRect(
    0, 0, 400, 300);
    var image = new Image();
    image.src
    = 'img/ctrip.gif';
    image.onload
    = function () {
    for (var i = 0; i < 7; i++) {
    context.drawImage(image,
    //img元素
    0 + i * 50,//繪制時的圖像的寬度
    0 + i * 25,//繪制時的圖像的高度
    100,//繪制該圖像在畫布中的x坐標
    100);//繪制該圖像在畫布中的y坐標
    }
    }
    }

     
    效果圖如下所示:
    繪制圖像時放大局部圖像
    JavaScript如下所示:
     function draw(id) {
    var canvas = document.getElementById(id);
    if (canvas == null) {
    return false;
    }
    var context = canvas.getContext('2d');
    context.fillStyle
    = '#eef';
    context.fillRect(
    0, 0, 400, 300);
    var image = new Image();
    image.src
    = 'img/ctrip.gif';//設置圖像路徑
    image.onload = function () {//繪制圖像的函數
    var i = 0;
    //繪制原始圖像
    context.drawImage(image,//img元素
    0,//繪制時的圖像的寬度
    0,//繪制時的圖像的高度
    100,//繪制該圖像在畫布中的x坐標
    100);//繪制該圖像在畫布中的y坐標
    //繪制將局部區域進行放大后的圖像
    context.drawImage(image,//img元素
    0,//源圖像被復制區域在畫布中的起始畫布中的起始橫坐標
    0,//源圖像被復制區域在畫布中的起始畫布中的起始縱坐標
    50,//被復制區域的寬度
    80,//被復制區域的高度
    110,//復制后的目標圖像在畫布中的起始橫坐標
    0,//復制后的目標圖像在畫布中的起始縱坐標
    100,//復制后的目標圖像的寬度
    100);//復制后的目標圖像的高度
    }
    }

     
    效果圖如下所示:
    圖像平鋪
    JavaScript如下所示:
     function draw(id) {
    var canvas = document.getElementById(id);
    if (canvas == null) {
    return false;
    }
    var context = canvas.getContext('2d');
    var image = new Image();
    image.src
    = 'img/ctrip.gif';//設置圖像路徑
    image.onload = function () {
    var scale = 5,
    n1
    = image.width / scale,
    n2
    = image.height / scale,
    n3
    = canvas.width / n1,
    n4
    = canvas.height / n2;
    for (var i = 0; i < n3; i++) {
    for (var j = 0; j < n4; j++) {
    context.drawImage(image, i
    * n1, j * n2, n1, n2);
    }
    }
    }
    }

     
    效果圖如下所示:
    利用createPattern方法平鋪圖像
    JavaScript如下所示:
     function draw(id) {
    var canvas = document.getElementById(id);
    if (canvas == null) {
    return false;
    }
    var context = canvas.getContext('2d');
    var image = new Image();
    image.src
    = 'img/ctrip.gif';//設置圖像路徑
    image.onload = function () {
    //no-repeat 不平鋪
    //repeat-x 橫方向平鋪
    //repeat-y 縱方向平鋪
    //repeat 全方向平鋪
    var ptrn = context.createPattern(image, 'repeat');//創建填充樣式,全方向平鋪
    context.fillStyle = ptrn;//指定填充樣式
    context.fillRect(0, 0, 400, 300);//填充畫布
    }
    }

     
    效果圖如下所示:
    圖像裁剪
    JavaScript如下所示:
     function draw(id) {
    var canvas = document.getElementById(id);
    if (canvas == null) {
    return false;
    }
    var context = canvas.getContext('2d');
    var gr = context.createLinearGradient(0, 400, 300, 0);
    gr.addColorStop(
    0, 'rgb(255,255,0)');
    gr.addColorStop(
    1, 'rgb(0,255,255)');
    context.fillStyle
    = gr;
    context.fillRect(
    0, 0, 400, 300);
    var image = new Image();
    image.src
    = 'img/ctripLogo.png';//設置圖像路徑
    image.onload = function () {
    var n = 0,
    dx
    = 100,
    dy
    = 0,
    s
    = 150,
    x
    = Math.sin(0),
    y
    = Math.cos(0),
    dig
    = Math.PI / 5 * 4;
    context.beginPath();
    context.translate(
    100, 150);
    for (var i = 0; i < 5; i++) {
    x
    = Math.sin(i * dig);
    y
    = Math.cos(i * dig);
    context.lineTo(dx
    + x * s, dy + y * s);//創建一個五角星的路徑
    }
    context.clip();
    //設置裁剪圖像
    context.drawImage(image, -50, -150, 300, 300);
    }
    }

     
    效果圖如下所示:
    將圖像進行反顯操作
    JavaScript如下所示:
     function draw(id) {
    var canvas = document.getElementById(id);
    if (canvas == null) {
    return false;
    }
    var context = canvas.getContext('2d');
    var image = new Image();
    image.src
    = 'img/ctrip.gif';//設置圖像路徑
    image.onload = function () {
    context.drawImage(image,
    0, 0);
    //獲得圖像中的像素
    var imageData = context.getImageData(0,//起點橫坐標
    0,//起點縱坐標
    image.width,//獲取區域的寬度
    image.height);//獲取區域的高度
    for (var i = 0,n=imageData.data.length; i < n; i+=4) {
    imageData.data[i
    + 0] = 255 - imageData.data[i + 0];//red
    imageData.data[i + 1] = 255 - imageData.data[i + 2];//red
    imageData.data[i + 2] = 255 - imageData.data[i + 1];//red
    }
    //將像素的數據重新放置到圖像中
    context.putImageData(imageData,//像素數組
    0,//重繪圖像的起點橫坐標
    0);//重繪圖像的起點縱坐標
    }
    }

     
    效果圖如下所示:
    繪制文字
    JavaScript如下所示:
     function draw(id) {
    var canvas = document.getElementById(id);
    if (canvas == null) {
    return false;
    }
    var context = canvas.getContext('2d');
    context.fillStyle
    = '#00f';
    context.font
    = 'italic 30px sans-serif';//設置文字字體
    context.textBaseline = 'top';//設置文字垂直對齊方式
    context.fillText('示例文字', 0, 0);
    context.font
    = 'bold 30px sans-serif';
    context.strokeText(
    '示例文字', 0, 50);
    }

     
    效果圖如下所示:
    測量文字寬度
    JavaScript如下所示:
     function draw(id) {
    var canvas = document.getElementById(id);
    if (canvas == null) {
    return false;
    }
    var context = canvas.getContext('2d');
    context.font
    = 'italic 20px sans-serif';
    var txt = '字符串的寬度為';//定義繪制文字
    var tml = context.measureText(txt);//獲得文字寬度
    context.fillText(txt, 10, 30);//繪制文字
    context.fillText(tml.width, tml.width + 10, 30);
    context.font
    = 'bold 30px sans-serif';//改變字體
    var tm2 = context.measureText(txt);//重新獲得文字寬度
    context.fillText(txt, 10, 70);//重新繪制文字
    context.fillText(tm2.width, tm2.width + 10, 70);
    }

    效果圖如下所示:
    (繼續閱讀...)
    文章標籤

    AutoPoster 發表在 痞客邦 留言(0) 人氣(10)

    • 個人分類:生活學習
    ▲top
    • 3月 09 週四 201720:21
    • 美化博客園界面(讓您的博客更加賞心悅目)希望對您有用


    文章出處
    寫在前面
    上次無意間寫了一篇博文,誰知還是有挺多人關注的。評論當中都是問我界面看起來挺別致的,是怎樣設計的?
     
    我不好一個一個的告知,特此,寫了這篇博文,希望大家的博客界面都看起來更加悅目。
    博客界面設計原理
    其實要讓自己的博客更加好看(好看與否每個人的眼光不一樣),無非就是覆蓋原先的css,然后自己寫一些css讓界面符合自己的審美觀。
    我當前的博客園首頁是怎樣設計的
    每個人的博客都有自己的管理后臺,大家可以跟我一步一步設置下去
    1、進入管理后臺
    2、進入管理后臺的“設置”界面
    3、選擇博客皮膚
    4、鏈接相關的css樣式:在頁首html文本框中輸入<link href="http://files.cnblogs.com/files/liyunhua/cnblogs.css" rel="stylesheet" />
    5、點擊保存按鈕即可。(大家不信可以自己試試,然后看下自己博客園界面是否...)
    分享是怎樣實現的
    有園友問我,右側分享是怎樣實現的
    百度輸入“百度分享代碼”,就知道怎么做了,
    注冊之后把那段代碼輸入到“博客側邊欄公告”,
    具體代碼如下所示:
    <script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"slide":{"type":"slide","bdImg":"6","bdPos":"right","bdTop":"100"},"image":{"viewList":["qzone","tsina","tqq","renren","weixin"],"viewText":"分享到:","viewSize":"16"}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>

     
    我的側邊欄時間控件是怎樣實現
    也有園友問我,我的側邊欄時間框看起來挺雅致,在此我也順便分享一下吧,要實現如下圖所示效果,其實也非常簡單
    也如上一樣,進入設置界面,
    在“博客側邊欄公告(支持HTML代碼)”文本框中輸入:
     <div id="myTime">
    <object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" width="160" height="70" id="honehoneclock" align="middle">
    <param name="allowScriptAccess" value="always">
    <param name="movie" value="http://chabudai.sakura.ne.jp/blogparts/honehoneclock/honehone_clock_wh.swf">
    <param name="quality" value="high">
    <param name="bgcolor" value="#ffffff">
    <param name="wmode" value="transparent">
    <embed wmode="transparent" src="http://chabudai.sakura.ne.jp/blogparts/honehoneclock/honehone_clock_wh.swf" quality="high" bgcolor="#ffffff" width="160" height="70" name="honehoneclock" align="middle" allowscriptaccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer">
    </object>
    </div>

     
    博客園界面目錄設置
    目錄設置我也是看了園友的一篇文章《讓博客園博客自動生成章節目錄索引》,做了一個很簡單的功能。之所以要弄一個目錄,就在于你可能寫的博文特別長,那么,在文章最開始就把相關目錄顯示起來,讓園友能方便查看你的文章,當瀏覽到文章的某一章節末尾,也可以方便回頂部。
    實現的原理很簡單,也就是用js獲得你界面上所有的標題(h1到h6,這個在于你自己選用,我就是選擇的h4),也是在設置界面,
    在“頁腳HTML代碼”文本框中輸入:
    <script language="javascript" type="text/javascript">
    //生成目錄索引列表
    function GenerateContentList()
    {
    var jquery_h3_list = $('#cnblogs_post_body h4');//如果你的章節標題不是h4,只需要將這里的h4換掉即可
    if(jquery_h3_list.length>0)
    {
    var content = '<a name="_labelTop"></a>';
    content
    += '<div id="navCategory">';
    content
    += '<p style="font-size:18px"><b>閱讀目錄</b></p>';
    content
    += '<ul>';
    for(var i =0;i<jquery_h3_list.length;i++)
    {
    var go_to_top = '<div style="text-align: right"><a href="#_labelTop">回到頂部</a><a name="_label' + i + '"></a></div>';
    $(jquery_h3_list[i]).before(go_to_top);
    var li_content = '<li><a href="#_label' + i + '">' + $(jquery_h3_list[i]).text() + '</a></li>';
    content
    += li_content;
    }
    content
    += '</ul>';
    content
    += '</div>';
    if($('#cnblogs_post_body').length != 0 )
    {
    $($(
    '#cnblogs_post_body')[0]).prepend(content);
    }
    }
    }
    GenerateContentList();
    </script>

    有了上面這段js代碼,你的界面效果圖就會如下所示:
     
    回頂部、收藏、添加評論、首頁側邊欄是如何實現?
    其實實現也特別簡單,大家可以一試。(所以有些事情真的在于細節,一丁點兒改變就能讓自己的博客頓生雅致)
    同樣是在設置界面,
    在“頁腳Html代碼”文本框輸入:
    <div class="scrollBtn" id="scrollBtn">
    <ul class="clearfix">
    <li class="sB-home">
    <a href="http://www.cnblogs.com/liyunhua" class="ff-t" title="首頁"></a>
    </li>
    <li class="sB-comment">
    <a href="#blog-comments-placeholder" onclick="$('#tbCommentBody').focus();" class="ff-t" title="添加評論"></a>
    </li>
    <li class="sB-share"><a onclick="if(cb_entryId !=undefined){AddToWz(cb_entryId)}" href="javascript:void(0);" title="收藏"></a></li>
    <li class="sB-goTop" id="goTop" style="display: list-item;">
    <a href="#top" title="回頂部"></a>
    </li>
    </ul>
    </div>

     界面效果圖如下所示:
    另外分享一個適合男孩的博客園界面
    我想我的博客園界面可能并非大家都喜歡,所以在此特意分享另外一個博客園界面版本,希望對大家有用。
    我相信如下的這個版本還算端莊(博客園友地址為http://www.cnblogs.com/wangqiguo/),
    其實實現起來也很簡單,只需要在設置界面里面選擇“博客園皮膚”為“ThinkInside”
    然后在“頁首Html代碼”輸入
    <link href="http://files.cnblogs.com/files/liyunhua/cnblogBlack.css" rel="stylesheet" />

    點擊“保存”就可以了。
    還有一個更加雅致的版本分享
    其實我本來還有一個更加好看的皮膚要分享,但因為其兼容性不好并且太耗性能,所以就不分享了
    在此說一句費話,其實我之前是做.net開發的,后來發現前端越來越好玩了,就只要改變一下css樣式就可以。。。
    希望有前端高手能指點我一二,每個人都會有瓶頸的時候,強中自有強中手,希望我這個小菜能夠得到高手指點
    (繼續閱讀...)
    文章標籤

    AutoPoster 發表在 痞客邦 留言(0) 人氣(6)

    • 個人分類:生活學習
    ▲top
    • 3月 09 週四 201720:20
    • 我所了解的javaScript細節


    文章出處
    變量轉換
    var myVar = "3.14159",
    str = ""+ myVar,// to string
    int = ~~myVar, // to integer
    float = 1*myVar, // to float
    bool = !!myVar, /* to boolean - any string with length
    and any number except 0 are true */
    array = [myVar]; // to array

    但是轉換日期(new Date(myVar))和正則表達式(new RegExp(myVar))必須使用構造函數,創建正則表達式的時候要使用/pattern/flags這樣的簡化形式。  
    取整同時轉換成數值型
     //字符型變量參與運算時,JS會自動將其轉換為數值型(如果無法轉化,變為NaN)
    '10.567890' | 0
    //結果: 10
    //JS里面的所有數值型都是雙精度浮點數,因此,JS在進行位運算時,會首先將這些數字運算數轉換為整數,然后再執行運算
    //| 是二進制或, x|0 永遠等于x;^為異或,同0異1,所以 x^0 還是永遠等于x;至于~是按位取反,搞了兩次以后值當然是一樣的
    '10.567890' ^ 0
    //結果: 10
    - 2.23456789 | 0
    //結果: -2
    ~~-2.23456789
    //結果: -2

    日期轉數值
     //JS本身時間的內部表示形式就是Unix時間戳,以毫秒為單位記錄著當前距離1970年1月1日0點的時間單位
    var d = +new Date(); //1295698416792

    類數組對象轉數組
    var arr =[].slice.call(arguments)

      下面的實例用的更絕
    function test() {
    var res = ['item1', 'item2']
    res
    = res.concat(Array.prototype.slice.call(arguments)) //方法1
    Array.prototype.push.apply(res, arguments) //方法2
    }

    進制之間的轉換
    (int).toString(16); // converts int to hex, eg 12 => "C"
    (int).toString(8); // converts int to octal, eg. 12 => "14"
    parseInt(string,16) // converts hex to int, eg. "FF" => 255
    parseInt(string,8) // converts octal to int, eg. "20" => 16

      
    將一個數組插入另一個數組指定的位置
    var a = [1,2,3,7,8,9];
    var b = [4,5,6];
    var insertIndex = 3;
    a.splice.apply(a, Array.prototype.concat(insertIndex,
    0, b));

    刪除數組元素
    var a = [1,2,3,4,5];
    a.splice(
    3,1); //a = [1,2,3,5]

    大家也許會想為什么要用splice而不用delete,因為用delete將會在數組里留下一個空洞,而且后面的下標也并沒有遞減。
    判斷是否為IE
    var ie = /*@cc_on !@*/false;

      這樣一句簡單的話就可以判斷是否為ie,太。。。
    其實還有更多妙的方法,請看下面
    // 貌似是最短的,利用IE不支持標準的ECMAscript中數組末逗號忽略的機制
    var ie = !-[1,];
    // 利用了IE的條件注釋
    var ie = /*@cc_on!@*/false;
    // 還是條件注釋
    var ie//@cc_on=1;
    //
    IE不支持垂直制表符
    var ie = '\v'=='v';
    // 原理同上
    var ie = !+"\v1";

    學到這個瞬間覺得自己弱爆了。
    盡量利用原生方法
    要找一組數字中的最大數,我們可能會寫一個循環,例如:
    var numbers = [3,342,23,22,124];
    var max = 0;
    for(var i=0;i<numbers.length;i++){
    if(numbers[i] > max){
    max = numbers[i];
    }
    }
    alert(max);

    其實利用原生的方法,可以更簡單實現
    var numbers = [3,342,23,22,124];
    numbers.sort(function(a,b){return b - a});
    alert(numbers[0]);

    當然最簡潔的方法便是:
    Math.max(12,123,3,2,433,4); // returns 433

     當前也可以這樣
     Math.max.apply(Math, [12, 123, 3, 2, 433, 4]) //取最大值
    Math.min.apply(Math, [12, 123, 3, 2, 433, 4]) //取最小值

      
    生成隨機數
     Math.random().toString(16).substring(2);// toString() 函數的參數為基底,范圍為2~36。
    Math.random().toString(36).substring(2);

      
    不用第三方變量交換兩個變量的值
    a=[b, b=a][0];

    引用評論中的一種方法:
     
    a^=b, b^=a, a^=b;

     
     
     
    事件委派
    舉個簡單的例子:html代碼如下
    <h2>Great Web resources</h2>
    <ul id="resources">
    <li><a href="http://opera.com/wsc">Opera Web Standards Curriculum</a></li>
    <li><a href="http://sitepoint.com">Sitepoint</a></li>
    <li><a href="http://alistapart.com">A List Apart</a></li>
    <li><a href="http://yuiblog.com">YUI Blog</a></li>
    <li><a href="http://blameitonthevoices.com">Blame it on the voices</a></li>
    <li><a href="http://oddlyspecific.com">Oddly specific</a></li>
    </ul>

    js代碼如下:
    // Classic event handling example
    (function(){
    var resources = document.getElementById('resources');
    var links = resources.getElementsByTagName('a');
    var all = links.length;
    for(var i=0;i<all;i++){
    // Attach a listener to each link
    links[i].addEventListener('click',handler,false);
    };
    function handler(e){
    var x = e.target; // Get the link that was clicked
    alert(x);
    e.preventDefault();
    };
    })();

    利用事件委派可以寫出更加優雅的:
    (function(){
    var resources = document.getElementById('resources');
    resources.addEventListener(
    'click',handler,false);
    function handler(e){
    var x = e.target; // get the link tha
    if(x.nodeName.toLowerCase() === 'a'){
    alert(
    'Event delegation:' + x);
    e.preventDefault();
    }
    };
    })();

    檢測ie版本
    var _IE = (function(){
    var v = 3, div = document.createElement('div'), all = div.getElementsByTagName('i');
    while (
    div.innerHTML
    = '<!--[if gt IE ' + (++v) + ']><i></i><![endif]-->',
    all[
    0]
    );
    return v > 4 ? v : false ;
    }());

    javaScript版本檢測
    你知道你的瀏覽器支持哪一個版本的Javascript嗎?
    var JS_ver = [];
    (Number.prototype.toFixed)
    ?JS_ver.push("1.5"):false;
    ([].indexOf
    && [].forEach)?JS_ver.push("1.6"):false;
    ((
    function(){try {[a,b] = [0,1];return true;}catch(ex) {return false;}})())?JS_ver.push("1.7"):false;
    ([].reduce
    && [].reduceRight && JSON)?JS_ver.push("1.8"):false;
    (
    "".trimLeft)?JS_ver.push("1.8.1"):false;
    JS_ver.supports
    = function()
    {
      
    if (arguments[0])
        
    return (!!~this.join().indexOf(arguments[0] +",") +",");
      
    else
        return (this[this.length-1]);
    }
    alert(
    "Latest Javascript version supported: "+ JS_ver.supports());
    alert(
    "Support for version 1.7 : "+ JS_ver.supports("1.7"));

    判斷屬性是否存在
    // BAD: This will cause an error in code when foo is undefined
    if (foo) {
      doSomething();
    }
    // GOOD: This doesn't cause any errors. However, even when
    //
    foo is set to NULL or false, the condition validates as true
    if (typeof foo != "undefined") {
      doSomething();
    }
    // BETTER: This doesn't cause any errors and in addition
    //
    values NULL or false won't validate as true
    if (window.foo) {
      doSomething();
    }

    有的情況下,我們有更深的結構和需要更合適的檢查的時候
    // UGLY: we have to proof existence of every
    //
    object before we can be sure property actually exists
    if (window.oFoo && oFoo.oBar && oFoo.oBar.baz) {
      doSomething();
    }

     其實最好的檢測一個屬性是否存在的方法為:
    if("opera" in window){
    console.log(
    "OPERA");
    }
    else{
    console.log(
    "NOT OPERA");
    }

    檢測對象是否為數組
    var obj=[];
    Object.prototype.toString.call(obj)=="[object Array]";

    給函數傳遞對象
    function doSomething() {
      
    // Leaves the function if nothing is passed
      if (!arguments[0]) {
      
    return false;
      }
      
    var oArgs = arguments[0]
      arg0
    = oArgs.arg0 || "",
      arg1
    = oArgs.arg1 || "",
      arg2
    = oArgs.arg2 || 0,
      arg3
    = oArgs.arg3 || [],
      arg4
    = oArgs.arg4 || false;
    }
    doSomething({
      arg1 :
    "foo",
      arg2 :
    5,
      arg4 :
    false
    });

    為replace方法傳遞一個函數
    var sFlop = "Flop: [Ah] [Ks] [7c]";
    var aValues = {"A":"Ace","K":"King",7:"Seven"};
    var aSuits = {"h":"Hearts","s":"Spades",
    "d":"Diamonds","c":"Clubs"};
    sFlop
    = sFlop.replace(/\[\w+\]/gi, function(match) {
      match
    = match.replace(match[2], aSuits[match[2]]);
      match
    = match.replace(match[1], aValues[match[1]] +" of ");
      
    return match;
    });
    // string sFlop now contains:
    //
    "Flop: [Ace of Hearts] [King of Spades] [Seven of Clubs]"

    循環中使用標簽
    有時候循環當中嵌套循環,你可能想要退出某一層循環,之前總是用一個標志變量來判斷,現在才知道有更好的方法
    outerloop:
    for (var iI=0;iI<5;iI++) {
      
    if (somethingIsTrue()) {
      
    // Breaks the outer loop iteration
      break outerloop;
      }
      innerloop:
      
    for (var iA=0;iA<5;iA++) {
        
    if (somethingElseIsTrue()) {
        
    // Breaks the inner loop iteration
        break innerloop;
      }
      }
    }

    對數組進行去重
    /*
    *@desc:對數組進行去重操作,返回一個沒有重復元素的新數組
    */
    function unique(target) {
    var result = [];
    loop: for (var i = 0, n = target.length; i < n; i++) {
    for (var x = i + 1; x < n; x++) {
    if (target[x] === target[i]) {
    continue loop;
    }
    }
    result.push(target[i]);
    }
    return result;
    }

    或者如下:
    Array.prototype.distinct = function () { 
    var newArr = [],obj = {};
    for(var i=0, len = this.length; i < len; i++){
    if(!obj[typeof(this[i]) + this[i]]){
    newArr.push(this[i]);
    obj[typeof(this[i]) + this[i]] = 'new';
    }
    }
    return newArr;
    }

    其實最優的方法是這樣的
    Array.prototype.distinct = function () { 
    var sameObj = function(a, b){
    var tag = true;
    if(!a || !b) return false;
    for(var x in a){
    if(!b[x]) return false;
    if(typeof(a[x]) === 'object'){
    tag
    = sameObj(a[x],b[x]);
    }
    else {
    if(a[x]!==b[x])
    return false;
    }
    }
    return tag;
    }
    var newArr = [], obj = {};
    for(var i = 0, len = this.length; i < len; i++){
    if(!sameObj(obj[typeof(this[i]) + this[i]], this[i])){
    newArr.push(
    this[i]);
    obj[
    typeof(this[i]) + this[i]] = this[i];
    }
    }
    return newArr;
    }

     使用范例(借用評論):
     
    var arr=[{name:"tom",age:12},{name:"lily",age:22},{name:"lilei",age:12}];
    var newArr=arr.distinct(function(ele){
    return ele.age;
    });

     
     
     
      
    查找字符串中出現最多的字符及個數
    var i, len, maxobj='', maxnum=0, obj={};
    var arr = "sdjksfssscfssdd";
    for(i = 0, len = arr.length; i < len; i++){
    obj[arr[i]]
    ? obj[arr[i]]++ : obj[arr[i]] = 1;
    if(maxnum < obj[arr[i]]){
    maxnum
    = obj[arr[i]];
    maxobj
    = arr[i];
    }
    }
    alert(maxobj
    + "在數組中出現了" + maxnum + "次");

    其實還有很多,這些只是我閑來無事總結的一些罷了。
    (繼續閱讀...)
    文章標籤

    AutoPoster 發表在 痞客邦 留言(0) 人氣(0)

    • 個人分類:生活學習
    ▲top
    «1...252627230»

    pop-under

    參觀人氣

    • 本日人氣:
    • 累積人氣:

    線上人數

    Marquee

    最新文章

    • 文章列表
    • jvm系列(四):jvm調優-命令大全(jps jstat jmap jhat jstack jinfo)
    • spring boot(一):入門篇
    • jvm系列(一):java類的加載機制
    • jvm系列(三):java GC算法 垃圾收集器
    • spring boot 實戰:我們的第一款開源軟件
    • jvm系列(六):jvm調優-從eclipse開始
    • 混合應用技術選型
    • jvm系列(二):JVM內存結構
    • spring boot(五):spring data jpa的使用

    熱門文章

    • (1,764)jQuery之前端國際化jQuery.i18n.properties
    • (1,001)Oracle Hint
    • (630)技術筆記:Indy控件發送郵件
    • (516)linux下安裝sqlite3
    • (501)學習筆記: Delphi之線程類TThread
    • (242)VC單選按鈕控件(Radio Button)用法(轉)
    • (104)單條件和多條件查詢
    • (51)淺談config文件的使用
    • (22)基于 Asp.Net的 Comet 技術解析
    • (15)Java中的抽象類

    文章分類

    • 生活學習 (2,296)
    • 未分類文章 (1)

    最新留言

    • [20/04/24] 我是女生想約炮 有男生願意給我溫暖的嗎?我賴是woyou58 於文章「(1)從底層設計,探討插件式GIS框架的...」留言:
      我叫黎兒女生最近內心掙扎著要不要約炮我的line:woy...

    文章搜尋

    文章精選

    誰來我家

    Live Traffic Feed