本文屬於轉載,只是想保留下來複習的時候看看~javascript
原做:蘇南 - 首席填坑官css
連接:https://honeybadger8.github.io/blog/html
有些面試官會問你對盒子模型的理解,在咱們平時看到的網頁中,內部的每個標籤元素它都是有幾個部分構成的:內容(content)、外邊距(margin)、內邊距(padding)、邊框(border),四個部分組成,當你說完這些面試官是不會滿意這個答案的,由於還有一個重點(IE盒模型和標準盒模型的區別)———IE盒模型的content包括border、padding前端
link
標籤引入,也是當下用的最多的一種方式,它屬於XHTML標籤,除了能加載css外,還能定義rel、type、media等屬性;@import
引入,@import是CSS提供的,只能用於加載CSS;style
嵌入方式引入,減小頁面請求(優勢),但只會對當前頁面有效,沒法複用、會致使代碼冗餘,不利於項目維護(缺點),此方式通常只會項目主站首頁使用(騰訊、淘寶、網易、搜狐)等大型網站主頁,以前有看到過都是這種方式,但後來有些也捨棄了 java
小結:
link
頁面被加載的時,link會同時被加載,而@import
引用的CSS會等到頁面被加載完再加載,且link是XHTML
標籤,無兼容問題; link支持動態js去控制DOM節點去改變樣式,而@import不支持,node
小結:塊元素老是獨佔一行,margin對內聯元素上下不起做用; css3
localStorage
存儲持久數據,瀏覽器關閉後數據不丟失除非用戶主動刪除數據或清除瀏覽器/應用緩存;sessionStorage
數據在當前瀏覽器窗口關閉後自動刪除。cookie
設置的cookie過時時間以前一直有效,即便窗口或瀏覽器關閉部分面試官可能還會再深刻一些:1)、如何讓cookie瀏覽器關閉就失效?——不對cookie設置任何正、負或0時間的便可;
2)、sessionStorage在瀏覽器多窗口之間 (同域)數據是否互通共享? ——不會,都是獨立的,localStorage會共享;
3)、能讓localStorage也跟cookie同樣設置過時時間?答案是能夠的,在存儲數據時,也存儲一個時間戳,get數據以前,先拿當前時間跟你以前存儲的時間戳作比較 詳細可看我以前寫的另外一篇分享(小程序項目總結 )。git
語義化是指根據內容的類型,選擇合適的標籤(代碼語義化),即用正確的標籤作正確的事情; html
語義化讓頁面的內容結構化,結構更清晰,有助於瀏覽器、搜索引擎解析對內容的抓取; 語義化的HTML在沒有CSS
的狀況下也能呈現較好的內容結構與代碼結構; 搜索引擎的爬蟲也依賴於HTML標記來肯定上下文和各個關鍵字的權重,利於SEO
;github
absolute
:絕對定位,元素會相對於值不爲 static 的第一個父元素進行定位(會一直往父級節點查找),且它是脫離正常文檔流、不佔位的;fixed
:一樣是絕對定位,但元素會相對於瀏覽器窗口進行定位,而不是父節點的position (IE9如下不支持);relative
:相對定位,元素相對於自身正常位置進行定位,屬於正常文檔流;static: position的默認值,也就是沒有定位,當元素設置該屬性後( top、bottom、left、right、z-index )等屬性將失效; inherit
:貌似沒用過,查了一下文檔「規定從父元素繼承 position 屬性的值」;<div class="div-demo"></div> <style> .div-demo{ width:100px; height:100px; background-color:#06c; margin: auto; position:absolute; top: 0; left: 0; bottom: 0; right: 0; } </style>
<style> .div-demo{ width:100px; height:100px; background-color:#06c; margin: auto; position:absolute; top: 50%; left: 50%; transform: translate(-50%,-50%); -webkit-transform: translate(-50%,-50%); } </style>
<body class="container"> <div class="div-demo"></div> <style> html,body{ height:100%; } .container{ display: box; display: -webkit-box; display: flex; display: -webkit-flex; -webkit-box-pack: center; -webkit-justify-content: center; justify-content: center; -webkit-box-align: center; -webkit-align-items: center; align-items: center; } .div-demo{ width:100px; height:100px; background-color:#06c; } </style> </body>
<body class="container"> <div class="div-angles"></div> <div class="div-angles right"></div> <div class="div-angles bottom"></div> <div class="div-angles left"></div> <style> html,body{ height:100%; } .container{ display: box; display: -webkit-box; display: flex; display: -webkit-flex; -webkit-box-pack: center; -webkit-justify-content: center; justify-content: center; -webkit-box-align: center; -webkit-align-items: center; align-items: center; } .div-angles{ width: 0; height: 0; border-style: solid; border-width:30px; width:0px; height:0px; border-color: transparent transparent #06c transparent; } .right{ border-color: transparent transparent transparent #06c ; } .bottom{ border-color: #06c transparent transparent ; } .left{ border-color: transparent #06c transparent transparent; } </style> </body>
::before
,以後則使用::after; 在代碼順序上,::after
生成的內容也比::before生成的內容靠後。input:-webkit-autofill, textarea:-webkit-autofill, select:-webkit-autofill { background-color: #fff;//設置成元素本來的顏色 background-image: none; color: rgb(0, 0, 0); } //方法2:由(licongwen )補充 input:-webkit-autofill { -webkit-box-shadow: 0px 0 3px 100px #ccc inset; //背景色 }
又去找chrome複習了一下,說是 「display:table;display: table-cell;」 能夠作到,沒用過。web
linear-gradient
,缺點就是:樣式多,遇到圓角這個方案就杯劇了; box-shadow:網上看到說使用box-shadow模擬邊框,box-shadow: inset 0px -1px 1px -1px #06c;沒用過,不過多評論,建議本身百度;僞類縮放:如今用的比較多的方式之一 :after 1px而後transform: scale(0.5);基本能知足全部場景,對於圓角的處理也很方便;
//三、css3的background-image @mixin border($top:1, $right:1, $bottom:1, $left:1, $color:#ebebf0) { background-image:linear-gradient(180deg, $color, $color 50%, transparent 50%), linear-gradient(90deg, $color, $color 50%, transparent 50%), linear-gradient(0deg, $color, $color 50%, transparent 50%), linear-gradient(90deg, $color, $color 50%, transparent 50%); background-size: 100% $top + px, $right + px 100%, 100% $bottom + px, $left + px 100%; background-repeat: no-repeat; background-position: top, right top, bottom, left top ; } @mixin borderTop($top:1, $color:#ebebf0) { @include border($top, 0, 0, 0, $color); } @mixin borderRight($right:1, $color:#ebebf0) { @include border(0, $right, 0, 0, $color); } @mixin borderBottom($bottom:1, $color:#ebebf0) { @include border(0, 0, $bottom, 0, $color); } @mixin borderLeft($left:1, $color:#ebebf0) { @include border(0, 0, 0, $left, $color); } @mixin borderColor($color:#ebebf0) { @include border(1, 1, 1, 1, $color); } //五、css3的transform:scale @mixin borderRadius($width:1,$style:solid,$color:#ebebf0,$radius:2px) { position:relative; &:after{ left:0px; top:0px; right:-100%; bottom:-100%; border-radius:$radius; border-style: $style; border-color: $color; border-width: $width+ px; position:absolute; display:block; transform:scale(0.5); -webkit-transform:scale(0.5); transform-origin:0 0; -webkit-transform-origin:0 0; content:''; } }
重繪/迴流請看JS部分第七題
;function b(){ var a=1; }; function b(){ var a=1; return ()=>{ a++; return a; } }; let c = b(); c(); //2 c(); //3 c(); //4
二、js有哪些基本數據類型:
ECMAScript 標準定義有7種數據類型:
Boolean
Null
Undefined
Number
String
Symbol
:(ECMAScript 6 新定義 ,Symbol 生成一個全局惟1、表示獨一無二的值) Object
:(Array、Function、Object)//方法1: var separator=(num)=>{ if(!num){ return '0.00'; }; let str = parseFloat(num).toFixed(2); return str && str .toString() .replace(/(\d)(?=(\d{3})+\.)/g, function($0, $1) { return $1 + ","; }); } separator(386485473.88) //"386,485,473.88" //方法2: (386485473.88).toLocaleString('en-US') // "386,485,473.88" 由 (sRect)補充
for
循環 數組下標的typeof類型:number
, for in 循環數組下標的typeof類型:string
;var southSu = ['蘇南','深圳','18','男']; for(var i=0;i<southSu.length;i++){ console.log(typeof i); //number console.log(southSu[i]);// 蘇南 , 深圳 , 18 , 男 } var arr = ['蘇南','深圳','18','男','帥氣',"@IT·平頭哥聯盟-首席填坑官"]; for(var k in arr){ console.log(typeof k);//string console.log(arr[k]);// 蘇南 , 深圳 , 18 , 男 , 帥氣,@IT·平頭哥聯盟-首席填坑官 }
for
循環 沒法用於循環對象,獲取不到obj.length; for in 循環遍歷對象的屬性時,原型鏈上的全部屬性都將被訪問,解決方案:使用hasOwnProperty
方法過濾或Object.keys會返回自身可枚舉屬性組成的數組
Object.prototype.test = '原型鏈上的屬性 var southSu = {name:'蘇南',address:'深圳',age:18,sex:'男',height:176}; for(var i=0;i<southSu.length;i++){ console.log(typeof i); //空 console.log(southSu[i]);//空 } for(var k in southSu){ console.log(typeof k);//string console.log(southSu[k]);// 蘇南 , 深圳 , 18 , 男 , 176 }
<body class="container"> <table id="table"> <tr><td>咱們是@IT·平頭哥聯盟</td><td>,我是首席填坑官</td><td>蘇南</td><td>前端開發</td><td>優秀</td></tr> <tr><td>咱們是@IT·平頭哥聯盟</td><td>,我是首席填坑官</td><td>蘇南</td><td>前端開發</td><td>優秀</td></tr> <tr><td>咱們是@IT·平頭哥聯盟</td><td>,我是首席填坑官</td><td>蘇南</td><td>前端開發</td><td>優秀</td></tr> ………… </table> <script> let table =document.querySelector("#table"); table.addEventListener("click",(e)=>{ let {nodeName} = e.target; if(nodeName.toUpperCase() === "TD"){ console.log(e.target);//<td>N</td> } },false); </script> </body>
<script> let str = "12qwe345671dsfa233dsf9876ds243dsaljhkjfzxcxzvdsf let array = str.split(""); //方案一: array = [...new Set(array)].join(""); array = ((a)=>[...new Set(a)])(array).join(""); console.log(array);//12qwe34567dsfa98ljhkzxcv //方案二: function unique (arr) { const seen = new Map() return (arr.filter((a) => !seen.has(a) && seen.set(a, 1))).join(""); } console.log(unique(array)) // 12qwe34567dsfa98ljhkzxcv //方案三: function unique (arr) { let arrs=[]; var news_arr = arr.sort();//排序能減小一次循環 for(var i=0;i<news_arr.length;i++){ if(news_arr[i] == news_arr[i+1] && news_arr[i]!= news_arr[i-1] ){ arrs.push(arr[i]); }; }; return arrs.join(""); } console.log(unique(array)) // 12qwe34567dsfa98ljhkzxcv //方案四: function unique (arr) { let obj={}; for(var i=0;i<arr.length;i++){ let key = arr[i]; if(!obj[key] ){ obj[key]=1; }else{ obj[key]+=1; } }; return obj; } console.log(unique(array)) // object 對應每一個key以及它重複的次數 </script>
promise
嗎?請寫出下列代碼的執行結果,並寫出你的理解思路:setTimeout(()=>{ console.log(1); }, 0); new Promise((resolve)=>{ console.log(2); for(var i = 1; i < 200; i++){ i = 198 && resolve(); } console.log(3); }).then(()=>{ console.log(4); }); console.log(5); // 結果:二、三、五、四、1;
宏任務
:js異步執行過程當中遇到宏任務,就先執行宏任務,將宏任務加入執行的隊列(event queue),而後再去執行微任務; 微任務
:js異步執行過程當中遇到微任務,也會將任務加入執行的隊列(event queue),可是注意這兩個queue身份是不同的,不是你先進來,就你先出去的(就像宮裏的皇上選妃侍寢同樣,不是你先進宮(或先來排隊)就先寵幸的 ),真執行的時候是先微任務裏拿對應回調函數,而後才輪到宏任務的隊列回調執行的; 說細步驟以下:
setTimeout 是異步,不會當即執行,加入執行隊列;
new Promise 會當即執行 輸出 二、3,而在二、3之間執行了resolve 也就是微任務;
再到console.log(5)了,輸出5;
而後異步裏的微任務先出,那就獲得4;
最後執行宏任務 setTimeout 輸出 1;
function SouthSu(){ this.name = "蘇南"; this.age = 18; this.address = "深圳"; this.address = "首席填坑官"; }; let South = new SouthSu(); console.log(South,South.__proto__ === SouthSu.prototype) //true 執行過程: 建立一個空的對象 let p1 = new Object(); 設置原型鏈 p1.__proto__ = SouthSu.prototype; 讓 構造函數 的this 指向 p1 這個空對象 let funCall = SouthSu.call(p1); 處理 構造函數 的返回值:判斷SouthSu的返回值類型,若是是值類型則返回obj,若是是引用類型,就返回這個引用類型的對象;
window.requestAnimationFrame()
方法告訴瀏覽器您但願執行動畫並請求瀏覽器在下一次重繪以前調用指定的函數來更新動畫。該方法使用一個回調函數做爲參數,這個回調函數會在瀏覽器重繪以前調用,回調的次數一般是每秒60次,是大多數瀏覽器一般匹配 W3C 所建議的刷新頻率。在大多數瀏覽器裏,當運行在後臺標籤頁或者隱藏的<iframe>
裏時,requestAnimationFrame() 會暫停調用以提高性能和電池壽命。
小結:以往項目開發中大數人可能都是第一時間選擇JS定時器setInterval
或者setTimeout
來控制的動畫每隔一段時間刷新元素的狀態,來達到本身所想要的動畫效果,可是這種方式並不能準確地控制動畫幀率,由於這是開發者主動要求瀏覽器去繪製,它這可能會由於動畫控制的時間、繪製的頻率、瀏覽器的特性等而致使丟幀的問題; requestAnimationFrame
是瀏覽器何時要開始繪製了瀏覽器它本身知道,經過requestAnimationFrame
告訴咱們,這樣就不會出現重複繪製丟失的問題。
//一個持續旋轉的正方形, <div class="angle-div"></div> <script> let timer = null; let Deg = 0; let distance = 360; var _requestAnimationFrame_ = window.requestAnimationFrame || window.webkitRequestAnimationFrame; let angleDiv = document.querySelector(".angle-div"); cancelAnimationFrame(timer); let fn = ()=>{ if(Deg < distance){ Deg++; }else{ Deg=0; }; angleDiv.style.transform = `rotateZ(${Deg}deg) translateZ(0)`; angleDiv.style.WebkitTransform = `rotateZ(${Deg}deg) translateZ(0)`; timer = _requestAnimationFrame_(fn); } timer = _requestAnimationFrame_(fn); </script>
1)、Expires
Expires
的值爲服務端返回的到期時間,響應時告訴瀏覽器能夠直接從瀏覽器緩存中讀取無需再次請求。2)、Cache-Control
Cache-Control
可設置的字段有:private
:客戶端能夠緩存public
:客戶端和代理服務器均可以緩存max-age=xxx
:緩存內容在xxx秒後失效no-cache
:須要用另外一種緩存策略來驗證緩存(ETag
,Last-Modified
)no-store
:不進行緩存Last-Modified
:瀏覽器請求得到文件後,服務器返回該文件的最後修改時間Last-Modified
,下一次請求會帶上If-Modified-Since
標識,若是If-Modified-Since
等於服務器的文件修改時間,則表示文件沒有修改,返回304狀態碼,瀏覽器從瀏覽器緩存中讀取文件。若是If-Modified-Since
小於服務端的文件修改時間,則瀏覽器會從新發送請求獲取文件,返回狀態碼200。ETag
:服務器文件的一個惟一標識,例如對文件內容取md5值做爲ETag
的字段返回給瀏覽器。當文件變化時ETag
的值也會發生變化。下次請求會帶上If-None-Match
即瀏覽器保留的ETag
值,若是發送了變化,則文件被修改,須要從新請求,返回200狀態碼。反之瀏覽器就從緩存中讀取文件,返回304狀態碼。總結:——幾者之間的關係
Cache-Control
設置爲max-age=xx
而且同事設置Expires
時,Cache-Control
的優先級更高ETag
和Last-Modified
同時存在時,服務器先會檢查ETag
,而後再檢查Last-Modified
,最終決定返回304仍是200ZodiacSyndicate
)補充
const shuffle = arr => { let end = arr.length - 1 while(end) { // 當end爲0時不須要交換 const index = Math.floor(Math.random() * (end + 1)) [arr[index], arr[end]] = [arr[end], arr[index]] end -= 1 } return arr }
const mousePosition = Component => class extends React.Component { state = { x: 0, y: 0, } handleMouseMove = e => { this.setState({ x: e.clientX, y: e.clientY }) } render() { const { x, y } = this.state return ( <> <div onMouseMove={this.handleMouseMove}> <Component {...this.props} /> </div> <span>x: {x}</span> <span>y: {y}</span> </> ) } }