HTML5新增了哪些內容或API,使用過哪些javascript
語義
,連通性
,離線存儲
,多媒體
,2D/3D 繪圖和效果
,性能集成
,設備訪問 Device Access
,樣式設計
php
HTML5修改的目標:css
新增應用程序接口APIhtml
元素與屬性前端
<!DOCTYPE HTML>
。section
(寫文章的時候會常常用到,w3school中說:文檔中的節(section、區段)。好比章節、頁眉、頁腳或文檔中的其餘部分。), video/audio
, nav
,aside
, canvas
, footer
, header
, mark
(標記高亮)新增標籤MDN date
, email
, url
contenteditable
(元素是否可被用戶編輯), contextmenu
(上下文菜單是指在用戶交互(例如右鍵點擊)時出現的菜單), draggable
(用於標識元素是否容許使用 拖放操做API 拖動), dropzone
, hidden
, spellcheck
input和textarea的區別vue
inputhtml5
type
值textareajava
<textarea>內容</textarea>
區別:input單行文本框, textarea多行文本框react
移動設備忽略將頁面中的數字識別爲電話號碼的方法webpack
設置mate
<meta content="telephone=no" name="format-detection">
doctype的做用是什麼
激活不一樣瀏覽器渲染模式
label的標籤的做用是
屬性: for
和accesskey
for的做用:爲哪一個控件服務.
accesskey的做用:訪問這個控件的熱鍵.
做用:用戶界面中項目的標題
png八、24的區別是
根本區別:存儲方式不一樣.
png8有1位的布爾透明通道(要麼徹底透明,要麼徹底不透明)
png24有8位(256階)的布爾透明通道(半透明)
特色:
png8和gif又一些類似之處,模式都是索引顏色,只支持像素級的純透明,不支持alpha透明。
"IE6 不支持PNG透明",是指不支持PNG-24的透明,可是IE6支持PNG8的透明,就像支持gif的透明同樣。
請說下移動端常見的適配不一樣屏幕大小的方法
移動端佈局
移動端H5頁面適配問題研究
移動web適配利器-rem
html標籤語義化的好處
頁面DOM節點太多,會出現什麼問題?如何優化?
問題:
頁面卡頓,幀率降低
優化:
頁面的渲染過程
高性能DOM
一個網站,在頁面上承載最多的內容就是DOM。並且不管是經過加載JS,加載Image,也都是經過HTML標籤來實現的。
DOM性能優化:
站點的網絡消耗基本上無法控制,複雜的網絡,在一個下行的終端實際上選擇不了會接觸什麼樣的網絡環境。
DOM的初始化過程沒法控制,瀏覽器內部有DOM解析引擎,它的解析快慢改變不了。
DOM的操做以及動態操做,一個頁面的DOM結構是在製做頁面的時候定義下來的,能夠採用各類方式,好比:多層嵌套,底層嵌套,絕對定位,相對定位。
動態操做就是DOM在運行到必定階段以後發生。
JS執行過程跟瀏覽器內核相關,依靠JS引擎執行。它的執行快慢沒法改變,可以優化的是JS邏輯組織部分。
迴流Reflow:對於DOM結構的各個元素都有本身的盒子模型,這些都須要瀏覽器根據各個樣式(瀏覽器的默認,開發人員定義的)來計算,並根據計算結果將元素放到它該出現的位置
重繪Repaint:當各個盒子的位置,大小以及其它屬性,例如:顏色,字體大小等都肯定下來後,瀏覽器因而便把這些元素都按照各自的特性繪製一遍,因而頁面的內容出現了。
什麼狀況觸發迴流或者重繪?
DOM元素的添加,修改(內容),刪除(迴流+重繪),僅修改DOM的元素的字體顏色(只有重繪,所以不須要調整佈局),迴流必定會觸發重繪,可是重繪不必定觸發迴流
避免觸發迴流和重繪,提升DOM的性能:display
的值會影響佈局,從而影響整個頁面元素的位置發生變化,因此會更改DOM-Tree
,須要從新render-Tree
的結構,先將元素從document
中刪除,完成修改後再把元素放回原來的位置,若是須要建立多個DOM結構,可使用documentFragment
建立完成後一次性添加到document
左右佈局:左邊定寬、右邊自適應,很多於3種方法
absolute + padding
<div class="auto-w"> <div class="left">left</div> <div class="right">right</div> </div> <style> .auto-w { position: relative; width: 500px; height: 200px; padding-left: 100px; } .auto-w .left { position: absolute; left: 0; width: 100px; height: 100%; background: pink; } .auto-w .right { width: 100%; height: 100%; background: cyan; } </style>
flex
<div class="auto-w"> <div class="left">left</div> <div class="right">right</div> </div> <style> .auto-w { display: flex; width: 500px; height: 200px; } .auto-w .left { width: 100px; height: 100%; background: pink; } .auto-w .right { height: 100%; background: cyan; flex-grow: 1; } </style>
float
<div class="auto-w"> <div class="left">left</div> <div class="right">right</div> </div> <style> .auto-w { width: 400px; height: 100px; } .auto-w .left { float: left; width: 100px; height: 100%; background: pink; } .auto-w .right { height: 100%; background: cyan; } </style>
CSS3用過哪些新特性
@font-face
字體border-radius
圓角box-shadow
text-shadow
文本和框的陰影Word-wrap
樣式多列布局(multi-column layout)
<style> .multi_column_style { -webkit-column-count: 3; -webkit-column-rule: 1px solid #bbb; -webkit-column-gap: 2em; } </style> <div class="multi_column_style"> </div> // Column-count:表示佈局幾列。 // Column-rule:表示列與列之間的間隔條的樣式 // Column-gap:表示列於列之間的間隔
transform
轉換
2D 轉換 rotate 旋轉,圖片轉個90或180度 translate 位置移動 scale, skew, matrix 等 3D 轉換 rotate(XYZ) 根據x,y,z軸旋轉 translate(XYZ), scale(XYZ) perspective 透視, 景深,這個不少3D效果都要設置一下,否則3D仍是會」2D」的效果
transition
: 過渡,好多簡單的動畫,移個位置,變個長短.animation
: 動畫,3D能夠調用硬件渲染。@media
媒體查詢,適用於一些響應式佈局中flex
: flex佈局,cssreference word-wrap
, background-size
, background-origin
, border-image
, box-sizing
, calc
, linear-gradient
, radial-gradient
will-change
: 改善渲染性能,使用CSS3 will-change提升頁面滾動、動畫等渲染性能 BFC、IFC
盒模型佈局的CSS渲染模式
BFC:Black Formatting Context
,塊級格式上下文。 BFC表現原則:內部子元素再怎麼折騰,都不會影響外部的元素,自成一方天地.
深刻理解BFC
BFC造成(一條或多條均可以造成BFC):
IFC:Inline Formatting Context
, 直譯"內聯格式化上下文",理解成行內盒子模型. 高度由其包含行內元素中最高的實際高度計算而來(不受到豎直方向的padding/margin影響)
對柵格的理解
基礎就是float
和 width:百分比
以規則的網格陣列來規範網頁中的版面佈局以及信息分佈。
盒子模型 加了box-sizing 以後怎樣
樣式權重的排序
!important > id > class > tag[name=val] > tag
display有哪些屬性值,有什麼做用?
1像素邊框問題
緣由:因爲移動端通常都會設置視口(屏幕寬度爲設備寬度),width=device-width,initial-scale=1
,而有些屏幕是2倍屏,致使在移動端上設置1px就是看上去的2px
解決方法:
transform
將寬度縮小一半,transform:scaleY(0.5)模仿淘寶的設置,將屏幕寬度爲設計師的設計尺寸(通常爲750)。
<meta name="viewport" content="width=750, user-scalable=no">
動態設置content
(function(e){if(!e["_med"])e["_med"]={};var t=e["_med"];t.cookie=function(e,t,a){if(t!==undefined){a=a||{};if(typeof a.expires==="number"){var o=a.expires,l=a.expires=new Date;l.setTime(+l+o*864e5)}return document.cookie=[e,"=",String(t),a.expires?"; expires="+a.expires.toUTCString():"",a.path?"; path="+a.path:"",a.domain?"; domain="+a.domain:"",a.secure?"; secure":""].join("")}var r=e?undefined:{};var i=document.cookie?document.cookie.split("; "):[];for(var n=0,s=i.length;n<s;n++){var b=i[n].split("=");var d=b.shift();var p=b.join("=");if(e&&e===d){r=p;break}if(!e&&p!==undefined){r[d]=p}}return r};var a=document;var o=e.devicePixelRatio||1,l=a.documentElement.clientWidth,r=a.documentElement.clientHeight,i,n,s,b=/initial-scale=([\d\.]+?),/i,d,p;if(a.querySelector){p=a.querySelector('meta[name="viewport"]');if(p){d=b.exec(p.content+",");if(d){s=parseFloat(d[1],10)}}}if(s){l=l*s;r=r*s}if(screen){if(Math.abs(screen.width-l*o)<.2*screen.width){l=screen.width/o;r=screen.height/o;i=screen.width;n=screen.height}else{l=screen.width;r=screen.height;i=screen.width*o;n=screen.height*o}}else{i=l*o;n=r*o}var m="createTouch"in a&&"ontouchstart"in e?1:0;var c=["dw:"+l,"dh:"+r,"pw:"+i,"ph:"+n,"ist:"+m].join("&");t.cookie("_med",c,{expires:3650})})(window);
(水平)居中有哪些實現方式
margin
<div style='width: 100px; margin: 0 auto;'>margin<div>
text-align
<div style='text-align: center'>text-align</div>
position+transform
<div> <div style='position: relative; left: 50%; transform: translateX(-50%); display: inline-block;'>transform</div> </div>
flex
<div style='display: flex; justify-content: center;'> <div>flex</div> </div>
table+margin
<div> <div style='display: table; margin: 0 auto;'>table + margin</div> </div> <!--display: table 在表現上相似 block 元素,可是寬度爲內容寬。-->
移動端的常見問題
長時間按住頁面出現閃退問題
element { -webkit-touch-callout: none; }
上下拉動滾動條時卡頓,慢的問題
body { -webkit-overflow-scrolling: touch; overflow-scrolling: touch; }
旋轉時字體大小調整
/* 旋轉屏幕時,字體大小調整的問題 */ html, body, p, div { -webkit-text-size-adjust:100%; }
忽略頁面中的電話號碼
<mate name="format-detection" content="telehone=no" />
跨域解決方式
JSONP
,domain
, window.name
,ifrome
,反向代理(nginx)
什麼是閉包?閉包有什麼做用?
閉包:函數裏面套函數,外層函數沒法訪問裏面函數中的變量,裏面函數能夠訪問外層函數中的私有變量。
做用:防止全局變量
如何實現瀏覽器內多個標籤之間的通訊
localStorage
,cookie
HTML5的存儲方式有哪些?有何區別?
存儲方式:localStorage
,sessionStorage
區別:存儲時間不同,localStorage
本地永久存儲,sessionStroage頁面關閉,ctrl+f5存儲的值清空(f5刷新值存在).
內存溢出
表現:
圖片懶加載
原理:訪問一個頁面的時候,把img
或者background
相關屬性的加載默認圖(或者其它節約資源的圖片),當圖片在可可視區域內時,才設置圖片的真正路徑.
優勢:減輕服務器的壓力,用戶體驗好(加載好的頁面更快呈如今用戶面前)
function elementInViewport(el) { var rect = el.getBoundingClientRect() // For invisible element. if (rect.top + rect.bottom + rect.left + rect.right + rect.height + rect.width === 0) { return false; } return ( rect.top >= 0 // Pre load. && rect.top <= ((window.innerHeight || document.documentElement.clientHeight) + 100) && rect.left >= 0 // Hide carousel except the first image. Do not add equal sign. && rect.left < (window.innerWidth || document.documentElement.clientWidth) ) }
實現頁面加載進度條
實現插件:PACE
readyState
事件)事件委託
利用事件冒泡
和e.target
來肯定事件和元素。在jQuery中有$.delegate
方法去代理事件。
事件委託原理:
// https://github.com/zenorocha/delegate/blob/master/src/delegate.js const delegate = (element, selector, type, callback) => { element.addEventListener(type, (e) => { let target = e.path.find(ele => ele.matches(selector)) if (target) { callback.call(element, e); } }); };
實現 extend 函數
淺拷貝使用ES6的Object.assign()
深拷貝:zepto extend
直接克隆一個Nested Object
的簡便方法:
var origin = {a: 'a'} var copy = JSON.parse(JSON.stringify(origin));
爲何會有跨域的問題以及解決方式
前端解決跨域問題的8種方案, HTTP訪問控制(CORS),瀏覽器的同源策略
產生緣由:
XMLHttpRequset
和Fetch
都須要遵循同源策略解決方式:
JSONP原理、postMessage原理
can-anyone-explain-what-jsonp-is-in-layman-terms
JSONP 原理:加載一個 script,並執行一段回調 JS ,由於加載 JS 不須要遵循同源策略。
動畫:setTimeout什麼時候執行,requestAnimationFrame的優勢
setTimeout 什麼時候執行:
tasks-microtasks-queues-and-schedules
requestAnimationFrame的優勢
window.requestAnimationFrame()
方法告知瀏覽器執行動畫,並請求瀏覽器調用指定的函數在下一次重繪以前更新動畫。該方法將在重繪以前調用的回調做爲參數。
優勢:
主要在遊戲,動畫方面使用。用這個方法能夠保持較高幀頻率和效率。 好比一個60幀率的動畫,requestAnimationFrame
通常會以16ms的間隔調用一次
手寫parseInt的實現:要求簡單一些,把字符串型的數字轉化爲真正的數字便可,但不能使用JS原生的字符串轉數字的API,好比Number()
const parseInt = str => str - 0; const parseInt = str => str / 1; const parseInt = str => str * 1; const parseInt = str => +str;
複雜寫法:
const parseInt = str => { let n = 0; let i = 1; str.split('').reverse().map(s => { n += i * (s.charCodeAt(0) - 48); i *= 10; }); return n; }
編寫分頁器組件的時候,點擊「下一頁」怎樣能確保還有數據能夠加載(請求數據不會爲空)?
服務器須要返回總數,當前偏移量,根據總數和偏移量判斷是不是最後一頁。
ES6新增了哪些特性
require.js的實現原理(若是使用過webpack,進一步會問,二者打包的異同及優缺點)
相同點:都以模塊化方式組織代碼
不一樣點:
promise的實現原理,進一步會問async、await是否使用過
使用框架 ( vue / react 等)帶來好處( 相對jQuery )
Virtual Dom
帶來性能上的提高vue雙向數據綁定的實現
實現雙向數據綁定的關鍵是Observer
. 即用戶改變了數據,框架如何知曉,並及時更新視圖。
Observer
實現包括:
參考:observerObject.defineProperty
var obj = {} Object.defineProperty(obj, 'key', { enumerable: true, set(x) { console.log(`set key: ${x}`); obj.__ob__ = obj.__ob__ || {}; obj.__ob__.key = x; }, get() { return obj.__ob__.key; } }) obj.key = 'value'; /** * 輸出: * set key: value */
Proxy
var ele = { data: null }; var handler = { get: function(target, key) { if (typeof target[key] === 'object' && target[key] !== null) { return new Proxy(target[key], handler) } else { return target[key]; } }, set: function(target, key, value) { console.log('set ' + key) target[key] = value; return value; } } ele = new Proxy(ele, handler); ele.data = {a: 'a', b: {bb: 'bb'}} ele.data.a = 'aa'; ele.data.b.bb = 'bb1'; ele.data.c = 'cc'; /* * 輸出: * set data * set a * set bb * set c */
其餘的數據操做,如:數組的push等,只須要在原生上加Hook就好了
var arr = []; var __push = Array.prototype.push; Array.prototype.push = function (...items) { console.log(`push: ${items}`); return __push.apply(this, items); } arr.push('value') /** * 輸出: * push: value */
從視圖反向把數據流過來,稍微簡單些,只須要記錄對應的key值,而後在輸入框觸發change, keypress事件的時候,更新對應key的數據便可。
單頁應用,如何實現其路由功能
Hash
// https://github.com/zhoukekestar/modules/blob/master/src/views/views.js window.addEventListener('hashchange', () => { // 隱藏其餘頁面 Array.from(document.querySelectorAll('.page')).map(page => { page.style.display = 'none'; }); // 根據hash值顯示對應的頁面 document.querySelector(location.hash).style.display = 'block'; });
使用HASH實現的簡單路由 測試:在線測試
History
// https://github.com/zhoukekestar/modules/blob/master/src/loadpage/loadpage.js // push 頁面 history.pushState('', '', url); // pop 頁面 window.onpopstate = (e) => { };
使用History實現的簡單路由,在線測試
項目中使用過哪些優化方法
CDN
加速, 多地緩存前端渲染 (Data + View) / 後端渲染( SSR, SEO 等), 視具體狀況選擇,如:
前端渲染,適合大流量的場景 後端渲染,適合SEO優化,用戶體驗提高等場景
縮減域名,以減小DNS解析時間,(可採用<link rel="dns-prefetch" href="//xxx.com">
進行優化)
若是遇到域名解析的問題,可嘗試HTTPDNS方案
資源和請求緩存,可參考緩存的答案
Cache-Control/Expires 前端緩存 Last-Modified/Etag 服務器端緩存,304
靜態資源或者接口等如何作緩存優化
redis
/memcache
作數據緩存輸入一個URL,Enter以後發生了什麼
具體步驟:
瀏覽器解析URL,如:https://www.google.co.jp/?gfe_rd=cr&ei=NPJtWZTXJabEXoKjqOAP&gws_rd=ssl
包括
協議:`http`,`https`等 域名:`www.google.co.jp` 資源路徑:`/` 參數查詢:`gfe_rd=cr`,關鍵詞`cr`
DNS
瀏覽器DNS緩存 HOSTS查詢 DNS服務器查詢 ARP查詢
HTTP(s),(或SPDY,或HTTP2.0)
Header Domain Body
Gateway/Nginx,網關和負載均衡服務器
查詢本地緩存 請求上游應用服務器
瀏覽器解析HTML,並請求資源
CSS JS 圖片
更爲完整詳細:what-happens-when-zh_CN
前端的安全問題有哪些,如何解決
sql注入
思路:發現SQL注入位置(URL地址和Input輸入框),判斷服務器類型和後臺數據庫類型.
解決方法:
URL地址防注入
// 過濾URL非法SQL字符 var sUrl = location.search.toLowerCase(); var sQuery = sUrl.substring(sUrl.indexOf('=') + 1); // 獲取查詢參數key // SQL關鍵字 reg = /select|update|delete|truncate|join|union|exec|insert|drop|count|'|"|;|>|<|%/i; if (reg.test(sQuery)) { console.log('輸入非法字符'); location.href = sUrl.replace(sQuery, ''); // 從新跳轉 }
輸入文本框防注入
// 防止SQL注入 function AntiSqlValid(context) { reg = /select|update|delete|truncate|join|union|exec|insert|drop|count|'|"|;|>|<|%/i; if (reg.test(context.value)) { // 提示信息,其它操做 } return; }
shell注入
常見的Shell注入資源有system()
,StartProcess()
,java.lang.Runtime.exec()
,System.Diagnostics.Process.Start()
以及相似的應用程序接口
在請求地址上置換用戶提交的許多其餘單字。
處理特殊字符:$
,;
,|
,&&
,||
,>
,<
XSS
英語:Cross-site scripting
,一般簡稱爲:XSS
網站應用程序的安全漏洞攻擊,是代碼注入的一種.
形成的結果:可能獲得更高的權限(如執行一些操做)、私密網頁內容、會話和cookie等各類內容。
檢測方法
測試網站是否有正確處理特殊字符
><script>alert(document.cookie)</script>
='><script>alert(document.cookie)</script>
"><script>alert(document.cookie)</script>
<img src="javascript:alert('XSS')">
<iframe src="//baidu.com/t.html"></iframe>
涉及到的知識:HTTP,Cookie,Ajax等。
XSS原理:
XSS:JavaScript代碼
DDOS
Server Limit DOS: HTTP頭超長,致使域名沒法訪問。
XSS類型:
反射型
發出請求時,XSS代碼出如今URL中,做爲輸入提交到服務器端,服務器端解析後響應,XSS代碼隨響應內容一塊兒傳回給瀏覽器,最後瀏覽器解析執行XSS代碼。該過程像一次反射,稱之爲:反射型XSS
存儲型
存儲型XSS和放射型XSS的差異僅在於,提交的代碼會存儲在服務器端(數據庫,內存,文件系統等),下次請求目標頁面時不用再提交XSS代碼
響應頭:
// express框架 res.set('X-XSS-Protection', 0) // 默認是瀏覽器攔截,設置爲0以後,XSS代碼就生效
XSS預防措施:
編碼
對用戶輸入的數據進行HTML Entity編碼
過濾
移除用戶上傳的DOM屬性,如onerror,與事件相關等 移除用戶上傳的Style節點,Script節點,Iframe節點等
校訂
避免直接對HTML Entity解碼 使用DOM Parse轉換,校訂不配對的DOM標籤
csrf
中文名稱:跨站請求僞造,也被稱爲:one click attack/session riding,縮寫爲:CSRF/XSRF。
理解成:攻擊者盜用了你的身份,以你的名義發送惡意請求.
CSRF攻擊是源於WEB的隱式身份驗證機制。WEB的身份驗證機制雖然能夠保證一個請求是來自於某個用戶的瀏覽器,但卻沒法保證該請求是用戶發送的。
CSRF的前端防護:
在每次POST,GET請求時,添加X-CSRFToken請求頭。
暫時指定代理
// npm install mongoose --registry 內網ip npm install mongoose --registry http://172.18.0.199
永久指定代理
// npm config set registry 內網ip npm config set registry "http://172.18.0.199"
使用nrm動態切換代理
npm install -g nrm
測試代理最快
nrm test