api平常總結:前端經常使用js函數和CSS經常使用技巧

個人移動端media 

html{font-size:10px} @media screen and (min-width:321px) and (max-width:375px){html{font-size:11px}} @media screen and (min-width:376px) and (max-width:414px){html{font-size:12px}} @media screen and (min-width:415px) and (max-width:639px){html{font-size:15px}} @media screen and (min-width:640px) and (max-width:719px){html{font-size:20px}} @media screen and (min-width:720px) and (max-width:749px){html{font-size:22.5px}} @media screen and (min-width:750px) and (max-width:799px){html{font-size:23.5px}} @media screen and (min-width:800px){html{font-size:25px}}

forEach()與map()方法 

一個數組組成最大的數:

 

對localStorage的封裝,使用更簡單

//在get時,若是是JSON格式,那麼將其轉換爲JSON,而不是字符串。如下是基礎代碼: var Store = {     get: function(key) {         var value = localStorage.getItem(key);         if (value) {             try {                 var value_json = JSON.parse(value);                 if (typeof value_json === 'object') {                     return value_json;                 } else if (typeof value_json === 'number') {                     return value_json;                 }             } catch(e) {                 return value;             }         } else {             return false;         }     },     set: function(key, value) {         localStorage.setItem(key, value);     },     remove: function(key) {         localStorage.removeItem(key);     },     clear: function() {         localStorage.clear();     } };
在此基礎之上,能夠擴展不少方法,好比批量保存或刪除一些數據:
// 批量保存,data是一個字典 Store.setList = function(data) {     for (var i in data) {         localStorage.setItem(i, data[i]);     } }; // 批量刪除,list是一個數組 Store.removeList = function(list) {     for (var i = 0, len = list.length; i < len; i++) {         localStorage.removeItem(list[i]);     } };

js判斷滾動條是否到底部:

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" /> <title></title> <script src=""></script> <style type="text/css"> * { padding: 0px; margin: 0px; } #main { width: 100%; height: 2000px; background: pink; } </style> <script type="text/javascript"> $(window).scroll(function() {   var scrollTop = $(this).scrollTop();   var docHeight = $(document).height();   var windowHeight = $(this).height(); var scrollHeight=document.body.scrollHeight; console.log("scrollTop:"+scrollTop); console.log("scrollbottom:"+(docHeight-scrollTop-windowHeight)); if(scrollTop + windowHeight == docHeight) {     alert("已經到最底部了!");   } }); </script> </head> <body> <div id="main"></div> </body> </html>

js操做cookie

JS設置cookie:
 
假設在A頁面中要保存變量username的值("jack")到cookie中,key值爲name,則相應的JS代碼爲:  document.cookie="name="+username;   JS讀取cookie:   假設cookie中存儲的內容爲:name=jack;password=123   則在B頁面中獲取變量username的值的JS代碼以下: var username=document.cookie.split(";")[0].split("=")[1];   //JS操做cookies方法!  //寫cookies  function setCookie(name,value)  {      var Days = 30;      var exp = new Date();      exp.setTime(exp.getTime() + Days*24*60*60*1000);      document.cookie = name + "="+ escape (value) + ";expires=" + exp.toGMTString();  }  //讀取cookies  function getCookie(name)  {      var arr,reg=new RegExp("(^| )"+name+"=([^;]*)(;|$)");       if(arr=document.cookie.match(reg))           return unescape(arr[2]);      else          return null;  }  //刪除cookies  function delCookie(name)  {      var exp = new Date();      exp.setTime(exp.getTime() - 1);      var cval=getCookie(name);      if(cval!=null)          document.cookie= name + "="+cval+";expires="+exp.toGMTString();  }  //使用示例  setCookie("name","hayden");  alert(getCookie("name"));  //若是須要設定自定義過時時間  //那麼把上面的setCookie 函數換成下面兩個函數就ok;  //程序代碼  function setCookie(name,value,time) {      var strsec = getsec(time);      var exp = new Date();      exp.setTime(exp.getTime() + strsec*1);      document.cookie = name + "="+ escape (value) + ";expires=" + exp.toGMTString();  }  function getsec(str) {     alert(str);     var str1=str.substring(1,str.length)*1;     var str2=str.substring(0,1);     if (str2=="s")    {          return str1*1000;     }    else if (str2=="h")    {         return str1*60*60*1000;     }    else if (str2=="d")    {         return str1*24*60*60*1000;     }  }  //這是有設定過時時間的使用示例:  //s20是表明20秒  //h是指小時,如12小時則是:h12  //d是天數,30天則:d30  setCookie("name","hayden","s20"); /***************************************/ function getCookie(name){         if(name){             var arr,reg=new RegExp("(^| )"+name+"=([^;]*)(;|$)");             if(arr=document.cookie.match(reg))                 return (decodeURIComponent(arr[2]));             else                 return null;         }         return null;     }; function setCookie(name,value,Days){         if(!Days)Days=3000;         var exp = new Date();         exp.setTime(exp.getTime() + Days*24*60*60*1000000);         document.cookie = name + "="+ encodeURIComponent(value) + ";domain=weshare.com.cn;expires=" + exp.toGMTString() + ";path=/";     }; 

獲取URL參數:

 function GetURLlist(name) {                 var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");                 var r = window.location.search.substr(1).match(reg);                 if(r != null) return unescape(r[2]);                 return null;             };

IOS和安卓判斷:

var u = navigator.userAgent, app = navigator.appVersion; var isAndroid = u.indexOf('Android') > -1 || u.indexOf('Linux') > -1; //android終端或者uc瀏覽器 var isiOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios終端 if(isAndroid){ $(".down0").css('display','none') }else if(isiOS){ $(".down").css('display','none') } else{ return false; }

判斷微信:

function isWeiXin(){                 var ua = window.navigator.userAgent.toLowerCase();                 if(ua.match(/MicroMessenger/i) == 'micromessenger'){                     return true;                 }else{                     return false;                 }             }
var u = navigator.userAgent; var isAndroid = u.indexOf('Android') > -1 || u.indexOf('Linux') > -1|| u.indexOf('MI') > -1|| <br>u.indexOf('XiaoMi') > -1; //android終端或者uc,小米等奇葩瀏覽器  if(!isAndroid) {}  if(isAndroid) {}

 

判斷頁面滾動方向:

<script type="text/javascript"> $(function() { function scroll(fn) { var beforeScrollTop = document.body.scrollTop, fn = fn || function() {}; window.addEventListener("scroll", function() { var afterScrollTop = document.body.scrollTop, delta = afterScrollTop - beforeScrollTop; if(delta === 0) return false; fn(delta > 0 ? "down" : "up"); beforeScrollTop = afterScrollTop; }, false); } scroll(function(direction) { if(direction == "down") { console.log("向下滾"); } else { console.log("向上滾"); } }); }); </script>
<script type="text/javascript">         var windowHeight = $(window).height();         $("body").css("height", windowHeight);         var startX, startY, moveEndX, moveEndY, X, Y;         $("body").on("touchstart", function(e) {             e.preventDefault();             startX = e.originalEvent.changedTouches[0].pageX, startY = e.originalEvent.changedTouches[0].pageY;         });         $("body").on("touchmove", function(e) {             e.preventDefault();             moveEndX = e.originalEvent.changedTouches[0].pageX, moveEndY = e.originalEvent.changedTouches[0].pageY, X = moveEndX - startX, Y = moveEndY - startY;             if (Math.abs(X) > Math.abs(Y) && X > 0) {                 alert("left to right");             } else if (Math.abs(X) > Math.abs(Y) && X < 0) {                 alert("right to left");             } else if (Math.abs(Y) > Math.abs(X) && Y > 0) {                 alert("top to bottom");             } else if (Math.abs(Y) > Math.abs(X) && Y < 0) {                 alert("bottom to top");             } else {                 alert("just touch");             }         });     </script>

排序

<script type="text/javascript"> var a = [1, 18, 23, 9, 16, 10, 29, 17]; var t = 0; for(var i = 0; i < a.length; i++) { for(var j = i + 1; j < a.length; j++) { if(a[i] > a[j]) { t = a[i]; a[i] = a[j]; a[j] = t; } } } console.log(a); //[1, 9, 10, 16, 17, 18, 23, 29] </script>

倒計時:

<!Doctype html> <html> <head> <meta charset="utf-8"> <title>下班倒計時</title> <style> * { margin: 0; padding: 0; } body { font-size: 16px; text-align: center; font-family: arial; } .time { margin-top: 10px; border: 1px solid red; height: 30px; padding: 2px; line-height: 30px; } </style> </head> <body> <div class="time"> <span id="t_d">00天</span> <span id="t_h">00時</span> <span id="t_m">00分</span> <span id="t_s">00秒</span> </div> <script> setInterval(function() { var EndTime = new Date('2016/06/13 00:00:00'); var NowTime = new Date(); var t = EndTime.getTime() - NowTime.getTime(); var d = 0; var h = 0; var m = 0; var s = 0; if (t >= 0) { d = Math.floor(t / 1000 / 60 / 60 / 24); h = Math.floor(t / 1000 / 60 / 60 % 24); m = Math.floor(t / 1000 / 60 % 60); s = Math.floor(t / 1000 % 60); } document.getElementById("t_d").innerHTML = d + "天"; document.getElementById("t_h").innerHTML = h + "時"; document.getElementById("t_m").innerHTML = m + "分"; document.getElementById("t_s").innerHTML = s + "秒"; }, 10); </script> </body> </html>

類型判斷:

function _typeOf(obj) { return Object.prototype.toString.call(obj).toLowerCase().slice(8, -1); // } 判斷undefined:  <span style="font-size: small;"> var tmp = undefined;  if (typeof(tmp) == "undefined"){  alert("undefined");  } </span>  判斷null:  <span style="font-size: small;"> var tmp = null;  if (!tmp && typeof(tmp)!="undefined" && tmp!=0){  alert("null");  }  </span>  判斷NaN:  var tmp = 0/0;  if(isNaN(tmp)){  alert("NaN");  } 判斷undefined和null:  <span style="font-size: small;"> var tmp = undefined;  if (tmp== undefined)  {  alert("null or undefined");  } </span>  <span style="font-size: small;"> var tmp = undefined;  if (tmp== null)  {  alert("null or undefined");  } </span>  判斷undefined、null與NaN:  <span style="font-size: small;"> var tmp = null;  if (!tmp)  {  alert("null or undefined or NaN");  } </span> 

 

Ajax

jquery ajax函數javascript

我本身封裝了一個ajax的函數,代碼以下:php

var Ajax = function(url, type success, error) { $.ajax({ url: url, type: type, dataType: 'json', timeout: 10000, success: function(d) { var data = d.data; success && success(data); }, error: function(e) { error && error(e); } }); }; // 使用方法: Ajax('/data.json', 'get', function(data) { console.log(data); });

jsonp方式css

有時候咱們爲了跨域,要使用jsonp的方法,我也封裝了一個函數:html

function jsonp(config) { var options = config || {}; // 須要配置url, success, time, fail四個屬性 var callbackName = ('jsonp_' + Math.random()).replace(".", ""); var oHead = document.getElementsByTagName('head')[0]; var oScript = document.createElement('script'); oHead.appendChild(oScript); window[callbackName] = function(json) { //建立jsonp回調函數 oHead.removeChild(oScript); clearTimeout(oScript.timer); window[callbackName] = null; options.success && options.success(json); //先刪除script標籤,實際上執行的是success函數 }; oScript.src = options.url + '?' + callbackName; //發送請求 if (options.time) { //設置超時處理 oScript.timer = setTimeout(function () { window[callbackName] = null; oHead.removeChild(oScript); options.fail && options.fail({ message: "超時" }); }, options.time); } }; // 使用方法: jsonp({ url: '/b.com/b.json', success: function(d){ //數據處理 }, time: 5000, fail: function(){ //錯誤處理 } });

JS生成隨機字符串的最佳實踐

var random_str = function() {     var len = 32;     var chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890';     var max = chars.length;     var str = '';     for (var i = 0; i < len; i++) {     str += chars.charAt(Math.floor(Math.random() * max));     }     return str; }; //這樣生成一個32位的隨機字符串,相同的機率低到不可能。

經常使用正則表達式

JavaScript過濾Emoji的最佳實踐java

name = name.replace(/\uD83C[\uDF00-\uDFFF]|\uD83D[\uDC00-\uDE4F]/g, "");

手機號驗證:node

var validate = function(num) { var reg = /^1[3-9]\d{9}$/; return reg.test(num); };

身份證號驗證:jquery

var reg = /^[1-9]{1}[0-9]{14}$|^[1-9]{1}[0-9]{16}([0-9]|[xX])$/;

ip驗證:android

var reg = /^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])(\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])){3}$/

經常使用js函數

返回頂部:ios

$(window).scroll(function() { var a = $(window).scrollTop(); if(a > 100) { $('.go-top').fadeIn(); }else { $('.go-top').fadeOut(); } }); $(".go-top").click(function(){ $("html,body").animate({scrollTop:"0px"},'600'); });

阻止冒泡:css3

function stopBubble(e){ e = e || window.event; if(e.stopPropagation){ e.stopPropagation(); //W3C阻止冒泡方法 }else { e.cancelBubble = true; //IE阻止冒泡方法 } }

所有替換replaceAll:

var replaceAll = function(bigStr, str1, str2) { //把bigStr中的全部str1替換爲str2 var reg = new RegExp(str1, 'gm'); return bigStr.replace(reg, str2); }

獲取瀏覽器url中的參數值:

var getURLParam = function(name) { return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)', "ig").exec(location.search) || [, ""])[1].replace(/\+/g, '%20')) || null; };

深度拷貝對象:

function cloneObj(obj) { var o = obj.constructor == Object ? new obj.constructor() : new obj.constructor(obj.valueOf()); for(var key in obj){ if(o[key] != obj[key] ){ if(typeof(obj[key]) == 'object' ){ o[key] = mods.cloneObj(obj[key]); }else{ o[key] = obj[key]; } } } return o; }

數組去重:

var unique = function(arr) { var result = [], json = {}; for (var i = 0, len = arr.length; i < len; i++){ if (!json[arr[i]]) { json[arr[i]] = 1; result.push(arr[i]); //返回沒被刪除的元素 } } return result; };

判斷數組元素是否重複:

var isRepeat = function(arr) { //arr是否有重複元素 var hash = {}; for (var i in arr) { if (hash[arr[i]]) return true; hash[arr[i]] = true; } return false; };

生成隨機數:

function randombetween(min, max){ return min + (Math.random() * (max-min +1)); }

操做cookie:

own.setCookie = function(cname, cvalue, exdays){ var d = new Date(); d.setTime(d.getTime() + (exdays*24*60*60*1000)); var expires = 'expires='+d.toUTCString(); document.cookie = cname + '=' + cvalue + '; ' + expires; }; own.getCookie = function(cname) { var name = cname + '='; var ca = document.cookie.split(';'); for(var i=0; i< ca.length; i++) { var c = ca[i]; while (c.charAt(0) == ' ') c = c.substring(1); if (c.indexOf(name) != -1) return c.substring(name.length, c.length); } return ''; };

數據類型: underfined、null、0、false、NaN、空字符串。他們的邏輯非結果均爲true。

閉包格式: 好處:避免命名衝突(全局變量污染)。

(function(a, b) { console.log(a+b); //30 })(10, 20);

截取和清空數組:

var arr = [12, 222, 44, 88]; arr.length = 2; //截取,arr = [12, 222]; arr.length = 0; //清空,arr will be equal to [].

獲取數組的最大最小值:

var numbers = [5, 45822, 120, -215]; var maxInNumbers = Math.max.apply(Math, numbers); //45822 var minInNumbers = Math.min.apply(Math, numbers); //-215

浮點數計算問題:

0.1 + 0.2 == 0.3   //false

爲何呢?由於0.1+0.2等於0.30000000000000004。JavaScript的數字都遵循IEEE 754標準構建,在內部都是64位浮點小數表示。能夠經過使用toFixed()來解決這個問題。

數組排序sort函數:

var arr = [1, 5, 6, 3]; //數字數組 arr.sort(function(a, b) { return a - b; //從小到大排 return b - a; //從大到小排 return Math.random() - 0.5; //數組洗牌 });
var arr = [{ //對象數組 num: 1, text: 'num1' }, { num: 5, text: 'num2' }, { num: 6, text: 'num3' }, { num: 3, text: 'num4' }]; arr.sort(function(a, b) { return a.num - b.num; //從小到大排 return b.num - a.num; //從大到小排 });

對象和字符串的轉換:

var obj = {a: 'aaa', b: 'bbb'}; var objStr = JSON.stringify(obj); // "{"a":"aaa","b":"bbb"}" var newObj = JSON.parse(objStr); // {a: "aaa", b: "bbb"}

對象拷貝與賦值

var obj = { name: 'xiaoming', age: 23 }; var newObj = obj; newObj.name = 'xiaohua'; console.log(obj.name); // 'xiaohua' console.log(newObj.name); // 'xiaohua'

上方咱們將obj對象賦值給了newObj對象,從而改變newObj的name屬性,可是obj對象的name屬性也被篡改,這是由於實際上newObj對象得到的只是一個內存地址,而不是真正 的拷貝,因此obj對象被篡改。

var obj2 = { name: 'xiaoming', age: 23 }; var newObj2 = Object.assign({}, obj2, {color: 'blue'}); newObj2.name = 'xiaohua'; console.log(obj2.name); // 'xiaoming' console.log(newObj2.name); // 'xiaohua' console.log(newObj2.color); // 'blue'

上方利用Object.assign()方法進行對象的深拷貝能夠避免源對象被篡改的可能。由於Object.assign() 方法能夠把任意多個的源對象自身的可枚舉屬性拷貝給目標對象,而後返回目標對象。

var obj3 = { name: 'xiaoming', age: 23 }; var newObj3 = Object.create(obj3); newObj3.name = 'xiaohua'; console.log(obj3.name); // 'xiaoming' console.log(newObj3.name); // 'xiaohua'

咱們也可使用Object.create()方法進行對象的拷貝,Object.create()方法能夠建立一個具備指定原型對象和屬性的新對象。

 

 

git筆記

git使用以前的配置:

1.git config --global user.email xxx@163.com 2.git config --global user.name xxx 3.ssh-keygen -t rsa -C xxx@163.com(郵箱地址) // 生成ssh 4.找到.ssh文件夾打開,使用cat id_rsa.pub //打開公鑰ssh串 5.登錄github,settings - SSH keys - add ssh keys (把上面的內容所有添加進去便可)

說明:而後這個郵箱(xxxxx@gmail.com)對應的帳號在github上就有權限對倉庫進行操做了。能夠盡情的進行下面的git命令了。

git經常使用命令:

一、git config user.name  /  user.email     //查看當前git的用戶名稱、郵箱
二、git clone https://github.com/jarson7426/javascript.git  project  //clone倉庫到本地。
三、修改本地代碼,提交到分支:  git add file   /   git commit -m 「新增文件」 四、把本地庫推送到遠程庫: git push origin master 五、查看提交日誌:git log -5 六、返回某一個版本:git reset --hard 123 七、分支:git branch / git checkout name / git checkout -b dev 八、合併name分支到當前分支:git merge name / git pull origin 九、刪除本地分支:git branch -D name 十、刪除遠程分支: git push origin :daily/x.x.x 十一、git checkout -b mydev origin/daily/1.0.0 //把遠程daily分支映射到本地mydev分支進行開發 十二、合併遠程分支到當前分支 git pull origin daily/1.1.1 1三、發佈到線上: git tag publish/0.1.5 git push origin publish/0.1.5:publish/0.1.5 1四、線上代碼覆蓋到本地: git checkout --theirs build/scripts/ddos git checkout --theirs src/app/ddos

 

判斷是否有中文:

var reg = /.*[\u4e00-\u9fa5]+.*$/; reg.test('123792739測試') //true

判斷是對象仍是數組:

function isArray = function(o) { return toString.apply(o) === '[object Array]'; } function isObject = function(o) { return toString.apply(o) === '[object Object]'; }

CSS修改滾動條樣式:

::-webkit-scrollbar { width: 10px; background-color: #ccc; } ::-webkit-scrollbar-track { background-color: #ccc; border-radius: 10px; } ::-webkit-scrollbar-thumb { background-color: rgb(255, 255, 255); background-image: -webkit-gradient(linear, 40% 0%, 75% 84%, from(rgb(77, 156, 65)), color-stop(0.6, rgb(84, 222, 93)), to(rgb(25, 145, 29))); border-radius: 10px; }

單行多行省略號:

       <style type="text/css">               .inaline {                   overflow: hidden;                   white-space: nowrap;                   text-overflow: ellipsis;                   /*clip  修剪文本。*/               }                              .intwoline {                   display: -webkit-box !important;                   overflow: hidden;                   text-overflow: ellipsis;                   word-break: break-all;                   -webkit-box-orient: vertical;                   -webkit-line-clamp: 3;               }           </style>  

遮罩:

<!doctype html> <html lang="en"> <head> <meta charset="UTF-8" /> <title>RGBA 遮罩</title> <style type="text/css"> * { padding: 0px; margin: 0px; } html, body { width: 100%; min-height: 100%; background: white; } div.mask { display: none; position: fixed; top: 0px; left: 0px; width: 100%; height: 100%; background: rgba(0, 0, 0, 0.7); } div.masks-body { width: 300px; height: 300px; position: absolute; top: 0px; left: 0px; bottom: 0px; right: 0px; background: green; margin: auto; } p { position: absolute; width: 30px; height: 30px; background: red; right: 0px; top: -30px; } </style> <script type="text/javascript"> window.onload = function() { document.querySelector("#main").onclick = function() { document.querySelector(".mask").style.display = "block"; } document.querySelector("p#close").onclick=function(){ document.querySelector(".mask").style.display = "none"; } } </script> </head> <body> <button id="main">點我</button> <div class="mask"> <div class="masks-body"> <p id="close"></p> </div> </div> </body> </html>

常見頁面flex佈局:

<!doctype html> <html lang="en"> <head> <meta charset="UTF-8" /> <title></title> <style type="text/css"> * { padding: 0px; margin: 0px; } html, body { width: 100%; min-height: 100%; min-width: 1200px; overflow-x: hidden; } h1 { color: red; text-align: center; } #main0 { height: 400px; background: black; display: flex; flex-flow: row wrap; justify-content: flex-start; align-items: flex-start; } #main0 div:nth-child(2n) { flex: 1; height: 200px; font-size: 100px; line-height: 200px; text-align: center; background: red; } #main0 div:nth-child(2n+1) { flex: 1; height: 200px; line-height: 200px; font-size: 100px; text-align: center; background: blue; } #main1 { height: 400px; background: pink; display: flex; flex-flow: row nowrap; justify-content: flex-start; align-items: flex-start; } #main1 div:nth-child(2n) { flex: 1; height: 200px; font-size: 100px; line-height: 200px; text-align: center; background: red; } #main1 div:nth-child(2n+1) { width: 300px; height: 200px; font-size: 100px; line-height: 200px; text-align: center; background: blue; } #main2 { height: 400px; background: yellow; display: flex; flex-flow: row nowrap; justify-content: flex-start; align-items: flex-start; } #main2 div:nth-child(2n) { flex: 1; height: 200px; font-size: 100px; line-height: 200px; text-align: center; background: red; } #main2 div:nth-child(2n+1) { width: 300px; height: 200px; font-size: 100px; line-height: 200px; text-align: center; background: blue; } #main3 { height: 400px; background: fuchsia; display: flex; flex-flow: row nowrap; justify-content: flex-start; align-items: flex-start; } #main3 div.div1 { flex: 1; height: 200px; font-size: 100px; line-height: 200px; text-align: center; background: blue; } #main3 div.div2 { flex: 2; height: 200px; font-size: 100px; line-height: 200px; text-align: center; background: red; } #main3 div.div3 { flex: 3; height: 200px; font-size: 100px; line-height: 200px; text-align: center; background: orange; } </style> </head> <body> <h1>等分佈局</h1> <div id="main0"> <div>1</div> <div>2</div> <div>3</div> <div>4</div> <div>5</div> </div> <h1>左邊固定右邊自適應佈局</h1> <div id="main1"> <div>1</div> <div>2</div> </div> <h1>左右固定中間自適應佈局</h1> <div id="main2"> <div>1</div> <div>2</div> <div>3</div> </div> <h1>寬度等差佈局</h1> <div id="main3"> <div class="div1">1</div> <div class="div2">2</div> <div class="div3">3</div> </div> </body> </html>

flex: 1的使用:

 

 

<!doctype html> <html lang="en"> <head> <meta charset="UTF-8" /> <title>Document</title> <style type="text/css"> * { padding: 0px; margin: 0px; } #main { display: flex; align-items: center; } h1 { background: red; flex: 1; text-align: center; } </style> </head> <body> <div id="main"> <p>哈哈哈</p> <h1>啊啊啊</h1> <div>嗚嗚嗚</div> </div> </body> </html>

單行超出省略字

 .div{   overflow: hidden;   text-overflow: ellipsis;   white-space: nowrap;  }

placeholder顏色

input::-webkit-input-placeholder{   color: #666; }

禁止文本選擇

.div{   -moz-user-select:none;   -webkit-user-select:none;   -ms-user-select:none;   -khtml-user-select:none;   user-select:none; }

iOS慣性滾動

.div{   -webkit-overflow-scrolling:touch !important; }

表單100%寬,可是有padding

input{   -webkit-box-sizing: border-box;   -moz-box-sizing: border-box;   box-sizing: border-box; }

字體細長

.div{   -webkit-font-smoothing: antialiased;   -moz-osx-font-smoothing: grayscale; }

橫向滾動

.div{   white-space: nowrap;   overflow-x: auto;   overflow-y: hidden; }

IOS開關:

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <style type="text/css"> div#main { width: 208px; height: 108px; border-radius: 60px; background: pink; overflow: hidden; transition: all 300ms linear 0s; } div#main.bk { background: red; } div.ios { width: 100px; height: 100px; border-radius: 50px; background: blue; margin-left: 4px; margin-top: 4px; transition: all 300ms linear 0s; } div.ios.sb { margin-left: 104px; } </style> <script type="text/javascript"> window.onload = function() { document.getElementById("main").onclick = function() { if(document.querySelector("div.ios").classList.contains("sb")) { document.querySelector("div.ios").classList.remove("sb"); this.classList.remove("bk"); return false; } document.querySelector("div.ios").classList.add("sb"); this.classList.add("bk"); } } </script> </head> <body> <div id="main"> <div class="ios"></div> </div> </body> </html>

一個高度自適應的DIV

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>一個高度自適應的DIV</title> <style type="text/css"> * { padding: 0px; margin: 0px; } div { width: 100%; position: absolute; /*relative 不能夠*/ top: 100px; bottom: 100px; left: 0px; right: 0px; background: red; } </style> </head> <body> <div></div> </body> </html>

淺拷貝與深拷貝

-------------
    淺拷貝
  -------------
  var obj = { name: 'name' } var a = obj; a.name = 'new name'; console.log(a.name); // 'new name' console.log(obj.name); // 'new name' 這裏就是一個淺拷貝的例子。a只是經過賦值符號獲得了obj的引用。 --------------- 深拷貝 --------------- function object(parent, child) { var i, tostring = Object.prototype.toString, aStr = "[object Array]"; child = child || {}; for(i in parent) { if(parent.hasOwnProperty(i)) { //這時候還要判斷它的值是否是對象 if(typeof parent[i] === 'object') { child[i] = tostring.call(parent[i]) === aStr ? [] : {}; object(parent[i], child[i]); } else { child[i] = parent[i]; } } } return child; } var obj = { tags: ['js','css'], s1: { name: 'dai', age: 21 }, flag: true } var some = object(obj); some.tags = [1,2]; console.log(some.tags); //[1, 2] console.log(obj.tags); //['js', 'css'] 

placeholder是H5的一個新屬性,可是在IE9如下是不支持的,爲此咱們會封裝一個函數進行能力檢測。

$(function() {     // 若是不支持placeholder,用jQuery來完成     if(!isSupportPlaceholder()) {         // 遍歷全部input對象, 除了密碼框         $('input').not("input[type='password']").each(             function() {                 var self = $(this);                 var val = self.attr("placeholder");                 input(self, val);             }         );         /**          *  對password框的特殊處理          * 1.建立一個text框           * 2.獲取焦點和失去焦點的時候切換          */         $('input[type="password"]').each(             function() {                 var pwdField    = $(this);                 var pwdVal      = pwdField.attr('placeholder');                 var pwdId       = pwdField.attr('id');                 // 重命名該input的id爲原id後跟1                 pwdField.after('<input id="' + pwdId +'1" type="text" value='+pwdVal+' autocomplete="off" />');                 var pwdPlaceholder = $('#' + pwdId + '1');                 pwdPlaceholder.show();                 pwdField.hide();                 pwdPlaceholder.focus(function(){                     pwdPlaceholder.hide();                     pwdField.show();                     pwdField.focus();                 });                 pwdField.blur(function(){                     if(pwdField.val() == '') {                         pwdPlaceholder.show();                         pwdField.hide();                     }                 });             }         );     } }); // 判斷瀏覽器是否支持placeholder屬性 function isSupportPlaceholder() {     var input = document.createElement('input');     return 'placeholder' in input; } // jQuery替換placeholder的處理 function input(obj, val) {     var $input = obj;     var val = val;     $input.attr({value:val});     $input.focus(function() {         if ($input.val() == val) {             $(this).attr({value:""});         }     }).blur(function() {         if ($input.val() == "") {             $(this).attr({value:val});         }     }); }

蘋果瀏覽器和uc瀏覽器在移動端的坑(平常積累,隨時更新)

 

1 .  移動端uc瀏覽器不兼容css3 calc()

2 .  ie8下a標籤沒有內容給寬高也不能觸發點擊跳轉

3 . safari輸入框加上readOnly="ture"屬性仍然能夠觸發獲取焦點,可再加上onfocus="this.blur()「解決

 

日期格式化:

// 對Date的擴展,將 Date 轉化爲指定格式的String // 月(M)、日(d)、小時(h)、分(m)、秒(s)、季度(q) 能夠用 1-2 個佔位符,  // 年(y)能夠用 1-4 個佔位符,毫秒(S)只能用 1 個佔位符(是 1-3 位的數字)  // 例子:  // (new Date()).Format("yyyy-MM-dd hh:mm:ss.S") ==> 2006-07-02 08:09:04.423  // (new Date()).Format("yyyy-M-d h:m:s.S")      ==> 2006-7-2 8:9:4.18 Date.prototype.Format = function (fmt) { //author: meizz     var o = {         "M+": this.getMonth() + 1, //月份         "d+": this.getDate(), //日         "h+": this.getHours(), //小時         "m+": this.getMinutes(), //分         "s+": this.getSeconds(), //秒         "q+": Math.floor((this.getMonth() + 3) / 3), //季度         "S": this.getMilliseconds() //毫秒     };     if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));     for (var k in o)     if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));     return fmt; } 調用:  var time1 = new Date().Format("yyyy-MM-dd"); var time2 = new Date().Format("yyyy-MM-dd HH:mm:ss");  

 

js中不存在自帶的sleep方法,要想休眠要本身定義個方法:

function sleep(numberMillis) { var now = new Date(); var exitTime = now.getTime() + numberMillis; while (true) { now = new Date(); if (now.getTime() > exitTime) return; } }

將 Date 轉化爲指定格式的String

// 對Date的擴展,將 Date 轉化爲指定格式的String // 月(M)、日(d)、小時(h)、分(m)、秒(s)、季度(q) 能夠用 1-2 個佔位符, // 年(y)能夠用 1-4 個佔位符,毫秒(S)只能用 1 個佔位符(是 1-3 位的數字) // 例子: // (new Date()).Format("yyyy-MM-dd hh:mm:ss.S") ==> 2006-07-02 08:09:04.423 // (new Date()).Format("yyyy-M-d h:m:s.S") ==> 2006-7-2 8:9:4.18 Date.prototype.Format = function (fmt) { //author: zouqj var o = { "M+": this.getMonth() + 1, //月份 "d+": this.getDate(), //日 "h+": this.getHours(), //小時 "m+": this.getMinutes(), //分 "s+": this.getSeconds(), //秒 "q+": Math.floor((this.getMonth() + 3) / 3), //季度 "S": this.getMilliseconds() //毫秒 }; if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length)); for (var k in o) if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length))); return fmt; }

獲取當前時間,格式:yyyy-MM-dd hh:mm:ss

//獲取當前時間,格式:yyyy-MM-dd hh:mm:ss function getNowFormatDate() { var date = new Date(); var seperator1 = "-"; var seperator2 = ":"; var month = date.getMonth() + 1; var strDate = date.getDate(); if (month >= 1 && month <= 9) { month = "0" + month; } if (strDate >= 0 && strDate <= 9) { strDate = "0" + strDate; } var currentdate = date.getFullYear() + seperator1 + month + seperator1 + strDate + " " + date.getHours() + seperator2 + date.getMinutes() + seperator2 + date.getSeconds(); return currentdate; }

生成一個由隨機數組成的僞Guid(32位Guid字符串)

//方式一 function newPseudoGuid () { var guid = ""; for (var i = 1; i <= 32; i++) { var n = Math.floor(Math.random() * 16.0).toString(16); guid += n; if ((i == 8) || (i == 12) || (i == 16) || (i == 20)) guid += "-"; } return guid; } //方式二 function S4() { return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1); } //生成guid function guid() { return (S4() + S4() + "-" + S4() + "-" + S4() + "-" + S4() + "-" + S4() + S4() + S4()); }

判斷js是否加載完畢:

在正常的加載過程當中,js文件的加載是同步的,也就是說在js加載的過程當中,瀏覽器會阻塞接下來的內容的解析。這時候,動態加載便顯得尤其重要了,因爲它是異步加載,所以,它能夠在後臺自動下載,並不會妨礙其它內容的正常解析,由此,即可以提升頁面首次加載的速度。

在IE或一些基於IE內核的瀏覽器中(如Maxthon),它是經過script節點的readystatechange方法來判斷的,而其它的一些瀏覽器中,每每是經過load事件來決定的。

function dynamicLoad()   {      var _doc=document.getElementsByTagName('head')[0];      var script=document.createElement('script');   script.setAttribute('type','text/javascript');   script.setAttribute('src','jquery-1.4.4.js');   _doc.appendChild(script);   script.onload=script.onreadystatechange=function(){       if(!this.readyState||this.readyState=='loaded'||this.readyState=='complete'){       alert('done');   }   script.onload=script.onreadystatechange=null;   }   }  
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title></title> <script type="text/javascript"> function dynamicLoad() { var _doc = document.getElementsByTagName('head')[0]; var script = document.createElement('script'); script.setAttribute('type', 'text/javascript'); script.setAttribute('src', 'js/a.js'); _doc.appendChild(script); script.onload = script.onreadystatechange = function() { if(!this.readyState || this.readyState == 'loaded' || this.readyState == 'complete') { alert('下載完成!'); } script.onload = script.onreadystatechange = null; } } dynamicLoad(); </script> </head> <body> </body> </html>

遞歸排列組合:

<!DOCTYPE html> <html> <head> <title>demo</title> <script type="text/javascript"> var str = [1, 2, 3, 4, 5]; var count = 0; function arrange(s) { for(var i = 0, length = str.length; i < length; i++) { if(s.length == length - 1) { if(s.indexOf(str[i]) < 0) { count++; document.writeln("組合" + count + ":" + s + str[i] + '<br />'); } continue; } if(s.indexOf(str[i]) < 0) { arrange(s + str[i]); } } } arrange(""); </script> </head> <body> </body> </html>

 

js獲取頁面url

設置或獲取對象指定的文件名或路徑。
window.location.pathname 例:http://localhost:8086/topic/index?topicId=361 alert(window.location.pathname); 則輸出:/topic/index 設置或獲取整個 URL 爲字符串。 window.location.href 例:http://localhost:8086/topic/index?topicId=361 alert(window.location.href); 則輸出:http://localhost:8086/topic/index?topicId=361 設置或獲取與 URL 關聯的端口號碼。 window.location.port 例:http://localhost:8086/topic/index?topicId=361 alert(window.location.port); 則輸出:8086 設置或獲取 URL 的協議部分。 window.location.protocol 例:http://localhost:8086/topic/index?topicId=361 alert(window.location.protocol); 則輸出:http: 設置或獲取 href 屬性中在井號「#」後面的分段。 window.location.hash 設置或獲取 location 或 URL 的 hostname 和 port 號碼。 window.location.host 例:http://localhost:8086/topic/index?topicId=361 alert(window.location.host); 則輸出:http:localhost:8086 設置或獲取 href 屬性中跟在問號後面的部分。 window.location.search 例:http://localhost:8086/topic/index?topicId=361 alert(window.location.search); 則輸出:?topicId=361 window.location 屬性                  描述 hash                設置或獲取 href 屬性中在井號「#」後面的分段。 host                 設置或獲取 location 或 URL 的 hostname 和 port 號碼。 hostname      設置或獲取 location 或 URL 的主機名稱部分。 href                  設置或獲取整個 URL 爲字符串。 pathname      設置或獲取對象指定的文件名或路徑。 port                  設置或獲取與 URL 關聯的端口號碼。 protocol          設置或獲取 URL 的協議部分。 search            設置或獲取 href 屬性中跟在問號後面的部分。

css不經常使用選擇器

 

 

 

ele:nth-of-type爲何要叫:nth-of-type?由於它是以"type"來區分的。

                        也就是說:ele:nth-of-type(n)是指父元素下第n個ele元素,

                                          而ele:nth-child(n)是指父元素下第n個元素且這個元素爲ele,若不是,則選擇失敗。

 

h4~p   h4後面的p標籤  h4+p   h4相鄰的p標籤 p[id]   包含id屬性的p標籤 p[class~="b"]  class類名爲b且b前面有空格的p標籤 p[class|="b"]  class類名爲b且b後面有橫槓的p標籤 a[href^="http"] a標籤下的href以http開頭 a[href$="rar"] a標籤下的href以rar結尾 a[href*="o"] a標籤下的href有o p::first-line  選擇p標籤下第一行 a:before(a::before),a:after(a::after) 僞元素 p::selection  選擇被選中的文字 p::first-letter 選擇p標籤下第一個字 div:not(#container) 選擇除id爲container以外的全部div標籤   p:first-child  找到P,而後找P的父級 再找父級下第一個元素是P(匹配的是某父元素的第一個子元素,能夠說是結構上的第一個子元素。) p:first-of-type 找到P,而後找P的父級 再找父級下第一個元素是P(匹配的是該類型的第一個,這裏再也不限制是第一個子元素了,只要是該類型元素的第一個就好了,固然這些元素的範圍都是屬於同一級的,也就是同輩的。) p:last-child  找到P 而後找P的父級 再找父級下最後一個元素是P p:last-of-type 找到P 而後找P的父級 再找父級下最後一個元素是P li:nth-child(2)  找到li 而後找li的父級 再找父級下第二個元素是li li:nth-of-type(2) li:nth-last-child(2)  找到li 而後找li的父級 再找父級下倒數第二元素個是li li:nth-last-of-type(2)  li:nth-child(even)  找到li的全部偶數位(2N) li:nth-last-child(even) li:nth-last-child(odd) 找到li的全部奇數位(2N-1 或 2n+1) li:nth-last-child(odd) li:only-child 找到li是父級的惟一子元素(選擇器選擇的是父元素中只有一個子元素,並且只有惟一的一個子元素) li:only-of-type 表示一個元素他有不少個子元素,而其中只有一種類型的子元素是惟一的,使用「:only-of-type」選擇器就能夠選中這個元素中的惟一一個類型子元素。

對 Select 的各類操做(JQuery)

<select id="relationship" name="relationship" required="true"> <option value="1">父母</option> <option value="2">夫妻</option> <option value="3">子女</option> <option value="4">朋友</option> <option value="5">其餘</option> </select>
$(document).ready(function() {     //獲取下拉框選中項的index屬性值     var selectIndex = $("#relationship").get(0).selectedIndex;     alert(selectIndex);          //綁定下拉框change事件,當下來框改變時調用 SelectChange()方法     $("#relationship").change(function() {         //todo     });          //獲取下拉框選中項的value屬性值     var selectValue = $("#relationship").val();     alert(selectValue);          //獲取下拉框選中項的text屬性值     var selectText = $("#relationship").find("option:selected").text();     alert(selectText);          //設置下拉框index屬性爲5的選項 選中     $("#relationship").get(0).selectedIndex = 5;          //設置下拉框value屬性爲4的選項 選中     $("#relationship").val(4);          //設置下拉框text屬性爲5的選項 選中     $("#relationship option[text=5]").attr("selected", "selected");     $("#yyt option:contains('5')").attr("selected", true);          ////獲取下拉框最大的index屬性值     var selectMaxIndex = $("#relationship option:last").attr("index");     alert(selectMaxIndex);          //在下拉框最前添加一個選項     $("#relationship").prepend("<option value='0'>領導</option>");          //在下拉框最後添加一個選項     $("#relationship").append("<option value='6'>同事</option>");          //移除下拉框最後一個選項     $("#relationship option:last").remove();          //移除下拉框 index屬性爲1的選項     $("#relationship option[index=1]").remove();          //移除下拉框 value屬性爲4的選項     $("#relationship option[value=4]").remove();          //移除下拉框 text屬性爲5的選項     $("#relationship option[text=5]").remove();      });

 

JavaScript利用閉包實現模塊化

var foo = (function CoolModule() {     var something = "cool";     var another = [1, 2, 3];     function doSomething() {         alert( something );     }     function doAnother() {         alert( another.join( " ! " ) );     }     return {         doSomething: doSomething,         doAnother: doAnother     }; })(); foo.doSomething(); // cool foo.doAnother(); // 1 ! 2 ! 3

javascript中如何把一個數組的內容所有賦值給另一個數組:

1、 錯誤實現
var array1 = new Array("1","2","3"); var array2;  array2 = array1;  array1.length = 0;  alert(array2); //返回爲空 這種作法是錯的,由於javascript分原始類型與引用類型(與java、c#相似)。Array是引用類 型。array2獲得的是引用,因此對array1的修改會影響到array2。 2、 使用slice() 可以使用slice()進行復制,由於slice()返回也是數組。 var array1 = new Array("1","2","3"); var array2;  array2 = array1.slice(0);  array1.length = 0;  alert(array2); //返回一、二、3   3、 使用concat() 注意concat()返回的並非調用函數的Array,而是一個新的Array,因此能夠利用這一點進行復制。 var array1 = new Array("1","2","3"); var array2;  array2 = array1.concat();  array1.length = 0;  alert(array2); //返回一、二、3 
var b = [].concat(a);

事件委派: 

//利用事件委派能夠寫出更加優雅的       (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(x);                     e.preventDefault();                 }             };         })();    

把字符串的首字母大寫返回一個新的字符串

1.1簡單寫法,把一個單詞的首字母大寫 String.prototype.firstUpperCase = function(){ return this[0].toUpperCase()+this.slice(1); } 1.2字符串中全部單詞首字母大寫,非首字母小寫 String.prototype.firstUpperCase = function(){ return this.replace( /\b(\w)(\w*)/g, function($0, $1, $2) {// \b表明定界符 // 第一個形參$0表明全部子字符串(全部單詞) // 第二個形參$1表明第一個括號內匹配到的字符串(首字母) // 第三個形參$2表明第二個括號內匹配到的字符串(除首字母外的字母) return $1.toUpperCase() + $2.toLowerCase()}); } 另外一種寫法 String.prototype.firstUpperCase = function(){ return this.toLowerCase().replace(/( |^)[a-z]/g, function(U){return U.toUpperCase()}); }

 

隨機數:

由js生成一切隨機數的基礎都是Math.random(),這個方法比較特別,生成的隨機數落在的區間是[0,1); 全閉區間[n,m] 這種的最多見,你們都知道的那一長串公式:Math.floor(Math.random()*(m-n+1))+n; 就是生成這個全閉區間的方法。說到這個公式不少人都知道,但真正想明白的人估計不多。先生成一個[0,m-n+1)這樣左閉右開的區間,而後用Math.floor()取到[0,m-n]之間內的任意整數(看明白這一步很關鍵),以後加上區間左端點變成[n,m]內的任意整數,達到目的。 說到這個地方,有一點必須提一下,隨便搜一下js生成隨機數,有不少文章都會用Math.ceil()或Math.round()這兩個方法,好比生成全閉的[n,m]區間內的任意整數,Math.ceil(Math.random()*(m-n))+n;或者Math.round(Math.random()*(m-n))+n;我感受隨機數,最重要的就是隨機兩個字,每一個值取到的機率必定要相等,這一點對於一些特定的場合很是重要,好比抽獎(年會都有抽獎的吧)。Math.ceil()的毛病是n<<m≈x,x爲除端點以外的數,區間足夠大的話n幾乎取不到,m和x的機率幾乎相等,由於m這個點取不到因此機率相對來講小了一點。Math.round()的毛病是n≈m=x/2,緣由和前面的差很少,不明白的能夠本身畫個座標軸,很明瞭。 全開區間(x,y) 其實只要記住上面的全閉區間,其它全部區間的開閉,均可以由其推到,過程以下: (x,y) ==[x+1,y-1];也就是說n=x+1; m=y-1;將其代入上面的公式就能夠獲得:Math.floor(Math.random()*(y-x-1))+x+1; 左閉右開[x,y) 同理,[x,y) == [x,y-1];代入獲得:Math.floor(Math.random()*(y-x))+x; 左開右閉(x,y] (x,y]==[x+1,y];代入獲得:Math.floor(Math.random()*(y-x))+x+1;

 

js 小數取整,js 小數向上取整,js小數向下取整

/** 
 * 數字,數字(包括正整數、0、浮點數),也能夠判斷是否金額 
 * @param z_check_value 要檢查的值 
 * @return 符合返回true,否false   * @author lqy   * @since 2017-01-07  */   function isFloat(z_check_value){       var z_reg = /^((([0-9])|([1-9][0-9]+))(\.([0-9]+))?)$/;//.是特殊字符,須要轉義       return z_reg.test($.trim(z_check_value));   };      /**   * js小數向下取整:浮點數轉換成整數,小數點後去掉   * @param floatNumber   */   function floatToInteger(floatNumber){       if(!isFloat(floatNumber)){           error("請輸入正確的數字");           return;       }       return parseInt(floatNumber);   };      /**   * js 小數向上取整:浮點數轉換成整數,若是有小數(1.00不算有小數),整數加1   * @param floatNumber   */   function floatToIntegerUp(floatNumber){       var integerNumber = floatToInteger(floatNumber);       if(floatNumber > integerNumber){           integerNumber += 1;       }       return integerNumber;   };    

 

 

CSS多行文本溢出省略顯示

文本溢出咱們常常用到的應該就是text-overflow:ellipsis了,相信你們也很熟悉,可是對於多行文本的溢出處理確接觸的不是不少,最近在公司羣裏面有同事問到,而且本身也遇到過這個問題,因此專門研究過這個問題。

首先咱們回顧一下之前實現單行縮略是能夠經過下面的代碼實現的(部分瀏覽器須要設置寬度):

overflow: hidden; text-overflow: ellipsis; white-space: nowrap; 

WebKit內核瀏覽器解決辦法

首先,WebKit內核的瀏覽器實現起來比較簡單,能夠經過添加一個-webkit-line-clamp的私有屬性來實現,-webkit-line-clamp是用來限制在一個塊元素顯示的文本的行數。 爲了實現這個效果,它須要組合其餘的WebKit屬性:

  • display: -webkit-box 將對象做爲彈性伸縮盒子模型顯示;
  • -webkit-box-orient 設置或檢索伸縮盒對象的子元素的排列方式;
  • text-overflow: ellipsis 用省略號「…」隱藏超出範圍的文本。

具體代碼參考以下:

overflow : hidden; text-overflow: ellipsis; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; 

這個方法合適WebKit瀏覽器或移動端(絕大部分是WebKit內核的)瀏覽器,效果能夠查看:

其餘瀏覽器的解決方案

目前沒有什麼CSS的屬性能夠直接控制多行文本的省略顯示,比較靠譜的辦法應該就是利用相對定位在最後面加上一個省略號了,代碼能夠參考下面:

p { position:relative; line-height:1.5em; /* 高度爲須要顯示的行數*行高,好比這裏咱們顯示兩行,則爲3 */ height:3em; overflow:hidden; } p:after { content:"..."; position:absolute; bottom:0; right:0; padding: 0 5px; background-color: #fff; } 

效果以下:

不過這樣會有一點問題:

  1. 須要知道顯示的行數並設置行高才行;
  2. IE6/7不支持aftercontent,須要添加一個標籤來代替;
  3. 省略號的背景顏色跟文本背景顏色同樣,而且可能會遮住部分文字,建議可使用漸變的png背景圖片代替。

 

 

 

一行居中多行居左:

 

<!DOCTYPE html>
<html> <head> <meta charset="UTF-8"> <title></title> <style type="text/css"> .ps { width: 600px; border: 1px solid red; text-align: center; } .ps span { display: inline-block; text-align: left; } .tab-cell { display: table; margin: 0 auto; text-align: left; } </style> </head> <body> <p class="ps"><span>文字文文字文字文字文字</span></p> <p class="ps"><span>文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字<文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字</span></p> <p class="tab-cell">文字文文字文字文字文字</p> <p class="tab-cell">文字文文字文字文字文字文字文文字文字文字文字文字文文字文字文字文字</p> </body> </html>

 

判斷返回js數據類型

function judgeType(arg){//判斷返回js數據類型    return Object.prototype.toString.call(arg).slice(8,-1); }

clone

 function deepCloneNick(obj){//深克隆     var result;     //肯定result的類型     if(judgeType(obj)==="Object"){         result={};     }else if(judgeType(obj)==="Array"){         result=[];     }else{         return obj;     }     for(var key in obj){         var copy=obj[key];         if(judgeType(copy)==="Object"||"Array"){             //result[key]=deepCloneNick(copy);//遞歸調用 避免函數名改變 改爲下面一句             result[key]=arguments.callee(copy);         }else{             result[key]=obj[key];         }     }     return result; } var obj={a:[1,2],b:3},arr=[{a:'a'},2];     var obj1=deepCloneNick(obj),arr1=deepCloneNick(arr);     console.log(obj);     console.log(obj1);     console.log(arr);     console.log(arr1);

 

 

 

 

let person = { getGreeting() { return "Hello"; } }; // 原型爲 person let friend = { getGreeting() { return super.getGreeting() + ", hi!"; } }; Object.setPrototypeOf(friend, person); console.log(friend.getGreeting()); // "Hello, hi!"

 

 

 

學習z-index,整理轉述

 

 

 

 

前言:這是筆者第一次寫博客,主要是學習以後本身的理解。若是有錯誤或者疑問的地方,請你們指正,我會持續更新!

z-index屬性描述元素的堆疊順序(層級),意思是A元素能夠覆蓋B元素,可是B元素並無消失(display:none)
z-index屬性能夠爲負值,默認爲auto(能夠理解爲0),值最大的處於最上層.

一些元素設置z-index無效,可能的緣由:

z-index屬性必須和position屬性(absolute/relative/fixed)配合使用,不然無效.
z-index屬性應該繼承父元素的z-idnex值,意思就是祖先元素優先,若是兩個父元素層級已決高下,那麼他們兩個的子元素之間再設層級就不會起做用了.

額,先就這麼多了,本來想畫個圖來解釋的,發現不會畫圖,仍是要繼續學習。

 

 

 

 

 

 

網頁上添加一個input file HTML控件:

1

  默認是這樣的,全部文件類型都會顯示出來,若是想限制它只顯示咱們設定的文件類型呢,好比「word「,」excel「,」pdf「文件 

  解決辦法是能夠給它添加一個accept屬性,好比:

      <input type="file" id="userImage" name="userImage" accept="image/x-png,image/gif,image/jpeg,image/bmp"/>    

 

 

 

WebSocket :

WebSocket API是下一代客戶端-服務器的異步通訊方法。該通訊取代了單個的TCP套接字,使用ws或wss協議,可用於任意的客戶端和服務器程序。WebSocket目前由W3C進行標準化。WebSocket已經受到Firefox 四、Chrome 四、Opera 10.70以及Safari 5等瀏覽器的支持。

WebSocket API最偉大之處在於服務器和客戶端能夠在給定的時間範圍內的任意時刻,相互推送信息。WebSocket並不限於以Ajax(或XHR)方式通訊,由於Ajax技術須要客戶端發起請求,而WebSocket服務器和客戶端能夠彼此相互推送信息;XHR受到域的限制,而WebSocket容許跨域通訊。

Ajax技術很聰明的一點是沒有設計要使用的方式。WebSocket爲指定目標建立,用於雙向推送消息。

2、WebSocket API的用法

只專一於客戶端的API,由於每一個服務器端語言有本身的API。下面的代碼片斷是打開一個鏈接,爲鏈接建立事件監聽器,斷開鏈接,消息時間,發送消息返回到服務器,關閉鏈接。

 

// 建立一個Socket實例

var socket = new WebSocket('ws://localhost:8080'); 

// 打開Socket 

socket.onopen = function(event) { 

  // 發送一個初始化消息

  socket.send('I am the client and I\'m listening!'); 

  // 監聽消息

  socket.onmessage = function(event) { 

    console.log('Client received a message',event); 

  }; 

  // 監聽Socket的關閉

  socket.onclose = function(event) { 

    console.log('Client notified socket has closed',event); 

  }; 

  // 關閉Socket.... 

  //socket.close() 

};

 

 

讓咱們來看看上面的初始化片斷。參數爲URL,ws表示WebSocket協議。onopen、onclose和onmessage方法把事件鏈接到Socket實例上。每一個方法都提供了一個事件,以表示Socket的狀態。

onmessage事件提供了一個data屬性,它能夠包含消息的Body部分。消息的Body部分必須是一個字符串,能夠進行序列化/反序列化操做,以便傳遞更多的數據。

WebSocket的語法很是簡單,使用WebSockets是難以置信的容易……除非客戶端不支持WebSocket。

Websocket

1.websocket是什麼?

WebSocket是爲解決客戶端與服務端實時通訊而產生的技術。其本質是先經過HTTP/HTTPS協議進行握手後建立一個用於交換數據的TCP鏈接,

此後服務端與客戶端經過此TCP鏈接進行實時通訊。

2.websocket的優勢

之前咱們實現推送技術,用的都是輪詢,在特色的時間間隔有瀏覽器自動發出請求,將服務器的消息主動的拉回來,在這種狀況下,咱們須要不斷的向服務器 發送請求,然而HTTP request 的header是很是長的,裏面包含的數據可能只是一個很小的值,這樣會佔用不少的帶寬和服務器資源。會佔用大量的帶寬和服務器資源。

WebSocket API最偉大之處在於服務器和客戶端能夠在給定的時間範圍內的任意時刻,相互推送信息。在創建鏈接以後,服務器能夠主動傳送數據給客戶端。

此外,服務器與客戶端之間交換的標頭信息很小。

WebSocket並不限於以Ajax(或XHR)方式通訊,由於Ajax技術須要客戶端發起請求,而WebSocket服務器和客戶端能夠彼此相互推送信息;

關於ajax,comet,websocket的詳細介紹,和websocket報文的介紹,你們能夠參看http://www.shaoqun.com/a/54588.aspx  網頁設計]Ajax、Comet與Websocket,

3.如何使用websocket

客戶端

在支持WebSocket的瀏覽器中,在建立socket以後。能夠經過onopen,onmessage,onclose即onerror四個事件實現對socket進行響應

一個簡單是示例

var ws = new WebSocket(「ws://localhost:8080」); ws.onopen = function() {   console.log(「open」);   ws.send(「hello」); }; ws.onmessage = function(evt) {   console.log(evt.data) }; ws.onclose = function(evt) {   console.log(「WebSocketClosed!」); }; ws.onerror = function(evt) {   console.log(「WebSocketError!」); };

1.var ws = new WebSocket(「ws://localhost:8080」);      申請一個WebSocket對象,參數是須要鏈接的服務器端的地址,同http協議使用http://開頭同樣,WebSocket協議的URL使用ws://開頭,另外安全的WebSocket協議使用wss://開頭。ws.send(「hello」);用於叫消息發送到服務端2.ws.onopen = function() { console.log(「open」)};當websocket建立成功時,即會觸發onopen事件3.ws.onmessage = function(evt) { console.log(evt.data) };當客戶端收到服務端發來的消息時,會觸發onmessage事件,參數evt.data中包含server傳輸過來的數據4.ws.onclose = function(evt) { console.log(「WebSocketClosed!」); };當客戶端收到服務端發送的關閉鏈接的請求時,觸發onclose事件5.ws.onerror = function(evt) { console.log(「WebSocketError!」); };若是出現鏈接,處理,接收,發送數據失敗的時候就會觸發onerror事件咱們能夠看出全部的操做都是採用事件的方式觸發的,這樣就不會阻塞UI,使得UI有更快的響應時間,獲得更好的用戶體驗。服務端:如今有不少的服務器軟件支持websocket,好比node.js,jetty,tomcat等

相關文章
相關標籤/搜索