前段時間去阿里面試的一次經歷,分享給你們吧!javascript
腦子混了記得很少了,記得多少就記錄多少吧。。。。css
animation:mymove 5s infinite;
@keyframes mymove {
from {top:0px;}
to {top:200px;}
}
複製代碼
主要考:animation
用法html
值 | 描述 |
---|---|
animation-name |
規定須要綁定到選擇器的 keyframe 名稱。 |
animation-duration |
規定完成動畫所花費的時間,以秒或毫秒計。 |
animation-timing-function |
規定動畫的速度曲線。 |
animation-delay |
規定在動畫開始以前的延遲。 |
animation-iteration-count |
規定動畫應該播放的次數。 |
animation-direction |
規定是否應該輪流反向播放動畫。 |
最開始的思路是用定時器實現,最後沒有想的太完整,面試官給出的答案是用requestAnimationFrame
。java
var e = document.getElementById('e')
var flag = true;
var left = 0;
setInterval(() => {
left == 0 ? flag = true : left == 100 ? flag = false : ''
flag ? e.style.left = ` ${left++}px` : e.style.left = ` ${left--}px`
}, 1000 / 60)
複製代碼
requestAnimationFrame
因爲以前沒有用過這個 API
因此是現學的。//兼容性處理
window.requestAnimFrame = (function(){
return window.requestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.mozRequestAnimationFrame ||
function(callback){
window.setTimeout(callback, 1000 / 60);
};
})();
var e = document.getElementById("e");
var flag = true;
var left = 0;
function render() {
left == 0 ? flag = true : left == 100 ? flag = false : '';
flag ? e.style.left = ` ${left++}px` :
e.style.left = ` ${left--}px`;
}
(function animloop() {
render();
requestAnimFrame(animloop);
})();
複製代碼
不足之處請指正(畢竟是現學的)順便查了一下優點:node
tab
不可見暫停等等) 注:requestAnimFrame
和 定時器同樣也頭一個相似的清除方法 cancelAnimationFrame
。第一種:webpack
<style> body{ display: flex; } .left{ background-color: rebeccapurple; height: 200px; flex: 1; } .right{ background-color: red; height: 200px; width: 100px; } </style>
<body>
<div class="left"></div>
<div class="right"></div>
</body>
複製代碼
第二種web
<style> div { height: 200px; } .left { float: right; width: 200px; background-color: rebeccapurple; } .right { margin-right: 200px; background-color: red; } </style>
<body>
<div class="left"></div>
<div class="right"></div>
</body>
複製代碼
暫時想到了兩種。面試
第一種gulp
#container{
position:relative;
}
#center{
width:100px;
height:100px;
position:absolute;
top:50%;
left:50%;
transform: translate(-50%,-50%);
}
複製代碼
第二種數組
#container{
position:relative;
}
#center{
width:100px;
height:100px;
position:absolute;
top:50%;
left:50%;
margin:-50px 0 0 -50px;
}
複製代碼
第三種
#container{
position:relative;
}
#center{
position:absolute;
margin:auto;
top:0;
bottom:0;
left:0;
right:0;
}
複製代碼
第四種 flex
#container{
display:flex;
justify-content:center;
align-items: center;
}
複製代碼
static
是默認值relative
相對定位 相對於自身原有位置進行偏移,仍處於標準文檔流中absolute
絕對定位 相對於最近的已定位的祖先元素, 有已定位(指position
不是static
的元素)祖先元素, 以最近的祖先元素爲參考標準。若是無已定位祖先元素, 以body
元素爲偏移參照基準, 徹底脫離了標準文檔流。fixed
固定定位的元素會相對於視窗來定位,這意味着即使頁面滾動,它仍是會停留在相同的位置。一個固定定位元素不會保留它本來在頁面應有的空隙。由於項目考慮兼容 IE9
因此直接說用的很少
使用媒體查詢作的響應式佈局,根據不一樣屏幕寬度加載不一樣css
.
let
爲 ES6
新添加申明變量的命令,它相似於 var
,可是有如下不一樣:
var
聲明的變量,其做用域爲該語句所在的函數內,且存在變量提高現象let
聲明的變量,其做用域爲該語句所在的代碼塊內,不存在變量提高let
不容許重複聲明.當咱們執行代碼時,咱們能夠簡單的理解爲新變量分配一起內存,命名爲a
,並賦值爲2
,但在運行的時候編譯器與引擎還會進行兩項額外的操做:判斷變量是否已經聲明:
var a
,則編譯器會詢問做用域是否已經存在叫 a
的變量了,若是不存在,則招呼做用域聲明一個新的變量a
,若已經存在,則忽略var
繼續向下編譯,這時a = 2
被編譯成可執行的代碼供引擎使用。a=2
時一樣會詢問在當前的做用域下是否有變量a
,若存在,則將a
賦值爲2
(因爲第一步編譯器忽略了重複聲明的var
,且做用域中已經有a
,因此重複聲明會發生值得覆蓋而並不會報錯)。若不存在,則順着做用域鏈向上查找,若最終找到了變量a
則將其賦值2
,若沒有找到,則招呼做用域聲明一個變量a
並賦值爲2
。 參考連接function sleep (time) {
return new Promise((resolve) => setTimeout(resolve, time));
}
複製代碼
差很少應該是這樣,記不太清了
obj = {
name: 'a',
getName : function () {
console.log(this.name);
}
}
var fn = obj.getName
obj.getName()
var fn2 = obj.getName()
fn()
fn2()
複製代碼
CommonJS
模塊的重要特性是加載時執行,即腳本代碼在 require
的時候,就會所有執行。一旦出現某個模塊被」循環加載」,就只輸出已經執行的部分,還未執行的部分不會輸出。ES6
模塊是動態引用,若是使用 import
從一個模塊加載變量,那些變量不會被緩存,而是成爲一個指向被加載模塊的引用,須要開發者本身保證,真正取值的時候可以取到值。import/export
最終都是編譯爲 require/exports
來執行的。CommonJS
規範規定,每一個模塊內部,module
變量表明當前模塊。這個變量是一個對象,它的 exports
屬性(即 module.exports
)是對外的接口。加載某個模塊,實際上是加載該模塊的 module.exports
屬性。export
命令規定的是對外的接口,必須與模塊內部的變量創建一一對應關係。[...new Set([1,2,3,1,'a',1,'a'])]
複製代碼
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
</ul>
複製代碼
這個題沒答出來😨😨
var ulNode = document.getElementById("ul");
ulNode.addEventListener('click', function (e) {
if (e.target && e.target.nodeName.toUpperCase() == "LI") {
alert(e.target.innerHTML);
}
}, false);
複製代碼
obj={
a:1,
b:2
}
obj2={
a:1,
b:2
}
obj3={
a:1,
b:'2'
}
複製代碼
最開始的思路是遍從來判斷,可是最後好像沒有說清楚,查了下,好像能夠轉換爲字符串來判斷。
JSON.stringify(obj)==JSON.stringify(obj2);//true
JSON.stringify(obj)==JSON.stringify(obj3);//false
複製代碼
HTTP
請求數DNS
查詢CDN
DOM
元素數量DOM
操做JavaScript
和 CSS
JavaScript
、 CSS
、字體、圖片等CSS Sprite
iconfont
iframe
使用src
爲空使用命名空間。
我說Vue項目中使用了,而後就沒問了。
不知道怎麼怎麼回答,不都是使用模塊來寫的麼,而後就說是使用模塊。
router.go(1)
router.push('/')
複製代碼
router
是 hash
改變 location.href
是頁面跳轉,刷新頁面
經過 Object.defineProperty
實現的
<body>
<div id="app">
<input type="text" id="txt">
<p id="show-txt"></p>
</div>
<script> var obj = {} Object.defineProperty(obj, 'txt', { get: function () { return obj }, set: function (newValue) { document.getElementById('txt').value = newValue document.getElementById('show-txt').innerHTML = newValue } }) document.addEventListener('keyup', function (e) { obj.txt = e.target.value }) </script>
</body>
複製代碼
ES6
提供了新的數據結構 Set
它相似於數組,可是成員的值都是惟一的,沒有重複的值。ES6
提供了 Map
數據結構。它相似於對象,也是鍵值對的集合,可是「鍵」的範圍不限於字符串,各類類型的值(包括對象)均可以看成鍵。也就是說,Object
結構提供了「字符串—值」的對應,Map
結構提供了「值—值」的對應,是一種更完善的 Hash
結構實現。WeakMap
結構與 Map
結構基本相似,惟一的區別是它只接受對象做爲鍵名( null
除外),不接受其餘類型的值做爲鍵名,並且鍵名所指向的對象,不計入垃圾回收機制。WeakMap
最大的好處是能夠避免內存泄漏。一個僅被 WeakMap
做爲 key
而引用的對象,會被垃圾回收器回收掉。WeakMap
擁有和 Map
相似的 set(key, value)
、get(key)、has(key)
、delete(key)
clear()
DOM
節點display: none
隱藏一個 DOM
節點-觸發重排和重繪visibility: hidden
隱藏一個 DOM
節點-只觸發重繪,由於沒有幾何變化DOM
節點添加動畫瀏覽器緩存分爲強緩存和協商緩存。當客戶端請求某個資源時,獲取緩存的流程以下:
http header
判斷它是否命中強緩存,若是命中,則直接從本地獲取緩存資源,不會發請求到服務器;request header
驗證這個資源是否命中協商緩存,稱爲http
再驗證,若是命中,服務器將請求返回,但不返回資源,而是告訴客戶端直接從緩存中獲取,客戶端收到返回後就會從緩存中獲取資源;ctrl+f5
強制刷新網頁時,直接從服務器加載,跳過強緩存和協商緩存;f5
刷新網頁時,跳過強緩存,可是會檢查協商緩存;http1.0
時的規範,值爲一個絕對時間的 GMT
格式的時間字符串,表明緩存資源的過時時間)http1.1
的規範,強緩存利用其 max-age
值來判斷緩存資源的最大生命週期,它的值單位爲秒)WeakMap
的 clear()
方法已經廢棄了,感謝 @Feibuli 指正
判斷對象相等 obj3
寫錯了,已改正 謝謝 @silent同志
有的答案可能不太準確,但願你們輕噴
掘金技術證文活動連接: https://juejin.im/post/5aaf2a95f265da239b413aa1