題目:假設高度已知,請寫出三欄佈局,其中左欄、右欄寬度各爲300px,中間自適應javascript
方法一:display:flex
#container{
display: flex;
height: 100vh;
}
.left{
width: 300px;
background: red;
}
.content{
flex: 1;
background: darkcyan;
}
.right{
width: 300px;
background: red;
}
<article id="container">
<div class="left"></div>
<div class="content"></div>
<div class="right"></div>
</article>
方法二:浮動
#container{
min-height: 100px;
}
.left{
float: left;
width: 300px;
background: red;
}
.content{
background: darkcyan;
}
.right{
float: right;
width: 300px;
background: red;
}
<article id="container">
<div class="left"></div>
<div class="right"></div>
<div class="content"></div>
</article>
方法三:定位
*{
margin: 0;
padding: 0;
}
.left{
position: absolute;
top: 0;
left: 0;
width: 300px;
height: 100vh;
background: red;
}
.content{
margin: 0 300px;
height: 100vh;
background: darkcyan;
}
.right{
position: absolute;
top: 0;
right: 0;
width: 300px;
height: 100vh;
background: red;
}
<article id="container">
<div class="left"></div>
<div class="right"></div>
<div class="content"></div>
</article>
方法四:表格佈局
*{
margin: 0;
padding: 0;
}
#contenter{
display: table;
width: 100%;
min-height: 100px;
}
.left,.center,.right{
display: table-cell;
}
.left{
width: 300px;
background: red;
}
.right{
width: 300px;
background: cornflowerblue;
}
<article id="contenter">
<div class="left"></div>
<div class="center">表格佈局</div>
<div class="right"></div>
</article>
方法五:網格佈局
*{
margin: 0;
padding: 0;
}
#contenter{
display: grid;
width: 100%;
grid-template-rows: 100px;
grid-template-columns: 300px auto 300px;
}
.left{
background: red;
}
.center{
background: rebeccapurple;
}
.right{
background: cornflowerblue;
}
<article id="contenter">
<div class="left"></div>
<div class="center">表格佈局</div>
<div class="right"></div>
</article>
複製代碼
flex佈局:是比較完美的php
表格佈局:兼容性好css
網格佈局:新技術,代碼量少html
絕對定位解決方案:前端
浮動java
浮動後是脫離文檔流的,若是處理很差會帶來不少問題web
優勢是兼容性比較好面試
CSS盒模型算法
題目:談談你對CSS盒模型的認識segmentfault
BFC垂直方法邊距重疊
<style> article{ background: blue; overflow: auto; } p{ margin: 5px 0 25px; background: red; } div{ overflow: auto; } </style>
<section>
<article>
<p>1</p>
<div>
<p>2</p>
</div>
<p>3</p>
</article>
</section>
BFC不與float重疊
<style> article{ background: blue; } .left{ width: 100px; height: 100px; float: left; background: red; } .right{ height: 110px; background: #ccc; overflow: hidden; } </style>
<section>
<article>
<div class="left"></div>
<div class="right"></div>
</article>
</section>
BFC子元素即便是float,也會參與高度計算
<style> section{ /*float: left;*/ overflow: auto; background: red; } .float{ float: left; } </style>
<section>
<div class="float">我是浮動元素</div>
</section>
複製代碼
DOM事件類
DOM0 element.onclick=function(){}
DOM2 element.addEventListener('click',function(){},false)
DOM3 element.addEventListener('keyup',function(){},false)
DOM3增長了一些事件類型
複製代碼
冒泡:從目標元素往上
捕獲:從上到下的過程往目標元素
複製代碼
瀏覽器在爲當前頁面與用戶作交互的過程當中,點擊鼠標左鍵,這個左鍵是如何傳到頁面上。
一個完整的事件流分三個階段:
1. 捕獲:
2. 目標階段:事件經過捕獲到達目標元素
3. 冒泡階段:從目標元素再上傳到window對象
複製代碼
1.window
2.document
3.html:獲取html節點:docoment.documentElement
4.body
……
目標元素
複製代碼
Event對象的常見應用
event.preventDefault():阻止默認事件
event.stopPropagation():阻止事件冒泡
event.stopImmediatePropagation():阻止事件執行(事件響應優先級)
event.currentTarget:當前所綁定的事件對象
event.target:當前被點擊的元素
複製代碼
Event('事件名')
<div id="ev">目標元素</div>
<script> var eve=new Event('custome'); ev.addEventListener('custome',function () { console.log('custome'); }); ev.dispatchEvent(eve); </script>
CustomEvent('事件名',obj):能夠增長一個obj參數對象
detail:提供有關事件的自定義信息的子對象。
<div id="ev">目標元素</div>
<script> var ev=document.getElementById('ev'); var eve=new CustomEvent('test',{detail:{a:1, b:2}}); ev.addEventListener('test',function (e) { console.log(e.detail.a) }); ev.dispatchEvent(eve); </script>
複製代碼
HTTP協議類
原型鏈類
//對象字面量
var o1={name:'wbq'};
console.log(o1.name);
//new Object
var o2=new Object({name:'wbq2'});
console.log(o2.name);
//構造函數方法
var o3=function (name) {
this.name=name;
}
var result=new o3('wbq3');
console.log(result.name);
//Object.create
var o4=Object.create({name:'wbq4'});
console.log(o4.name);
複製代碼
var M=function (name) {
this.name=name;
}
var new2=function (func) {
var o=Object.create(func.prototype);
var k=func.call(o);
if(typeof k==='object'){
return k
}else {
return o
}
}
複製代碼
面向對象類
/*類的聲明:構造函數方法*/
function Animal(name){
this.name=name;
}
/*ES6中的class的聲明*/
class Animal2{
constructor(){
this.name=name;
}
}
複製代碼
/*藉助構造函數實現繼承:只實現部分繼承,沒法繼承父類原型對象的方法*/
function Parent1(){
this.name='parent1';
}
function Child1() {
Parent1.call(this);//繼承
this.type='child1';
}
//call,apply改變函數運行上下文,改變this指向
console.log(new Child1());
/*藉助原型鏈實現繼承:缺點改第一個對象的屬性,第二個對象的屬性也跟着改變了*/
function Parent1(){
this.name='parent1';
this.play=[1,2,3];
}
function Child1() {
this.type='child1';
}
Child1.prototype=new Parent1();
console.log(new Child1().play);
var s1=new Child1();
var s2=new Child1();
console.log(s1.play,s2.play);//[1,2,3]f
s2.play.push(4);
console.log(s1.play,s2.play);//[1, 2, 3, 4]
/*藉助組合方式實現繼承:*/
function Parent1(){
this.name='parent1';
this.play=[1,2,3]
}
function Child1() {
Parent1.call(this);
this.type='child1';
}
Child1.prototype=new Parent1();
var s1=new Child1();
var s2=new Child1();
s2.play.push(4);
console.log(s1.play,s2.play);//[1,2,3],[1, 2, 3, 4]
/*藉助組合繼承優化方式1:*/
function Parent1(){
this.name='parent1';
this.play=[1,2,3]
}
function Child1() {
Parent1.call(this);
this.type='child1';
}
Child1.prototype=Parent1.prototype;//這樣不用兩次調用new Parent1()
var s1=new Child1();
var s2=new Child1();
s2.play.push(4);
console.log(s1.play,s2.play);//[1,2,3],[1, 2, 3, 4]
console.log(s1.instanceOf Child1,s1.instanceOf Parent1);//true,true
console.log(s1.constructor);//Parent1,缺點是構造函數指向的是一個,沒法區分實例是由父類建立仍是由子類建立的
/*藉助組合繼承優化方式2:*/
function Parent1(){
this.name='parent1';
this.play=[1,2,3]
}
function Child1() {
Parent1.call(this);
this.type='child1';
}
Child1.prototype=Object.create(Parent1.prototype);//Object.create建立對象的原理:
Child1.prototype.constructor=Child1;
var s1=new Child1();
console.log(s1 instanceof Child1,s1 instanceof Parent1);//true true
console.log(s1.constructor);//Child1
複製代碼
通訊類
同源策略:端口、域名、協議相同
同源策略限制從一個源加載的文檔或腳本如何與來自另外一個源的資源進行交互。
這是用於隔離潛在惡意文件的關鍵的安全機制
1. Cookie,LocalStorage和indexDB沒法讀取
2. DOM沒法得到
3. Ajax請求不能發送
複製代碼
1.Ajax:同源下的通訊方式
2.WebSocket:不受同源策略限制
3.CORS:支持跨域通訊也支持同源通訊
複製代碼
1.XMLHttpRequest對象的工做流程
2.兼容性處理
3.事件的觸發條件
4.事件的觸發順序
複製代碼
1.JSONP
原理是什麼:利用script能夠實現異步加載實現的
怎麼實現的:script的src連接裏要加上一個callback名稱。在全局建立一個callback函數
2.Hash:瀏覽器連接#後面的值
window.localtion.hash
window.onhashchange
利用hash,場景是當前頁面A經過iframe或frame嵌入了跨域的頁面B
//在A中的代碼
var B=document.getElementsByTagName('iframe');
B.src=B.src+'#'+'data';
//在B中的代碼以下:
window.onhashchange=function(){
var data=window.location.hash;
};
複製代碼
3.postMessage
窗口A向(http:A.com)向跨域的窗口B(http:B.com)發送信息
//在A窗口發送數據:
window.postMessage('data','http:B.com')
//在B窗口中監聽message事件:
window.addEventListener('message',function(event){
console.log(event.origin);//http:A.com
console.log(event.source);//Bwindow
console.log(event.data);//data
},false);
複製代碼
4.WebSocket
var ws=new WebSocket('wss://echo.websocket.org');
ws.onopen=function(evt){
console.log('Connection open...');
ws.send('Hello WebSocktes!');
ws.onmessage=function(evt){
console.log('Received Message'+evt.data);
ws.close();
}
ws.onclose=function(evt){
console.log('connection closed')
}
}
複製代碼
5.CORS
fetch('/some/url',{
method:'get'
}).then(function(response){
}).catch(function(err){
//出錯,等價於then的第二個參數,但這樣更好用直觀
})
http://www.ruanyifeng.com/blog/2016/04/cors.html
複製代碼
前端安全類
前端算法類
模擬二面
<meta http-equiv="x-dns-prefetch-control" content="on">
<link rel="dns-prefetch" href="//www.imooc.com">
複製代碼
<script crossorigin src="http://www.lmj.com/demo/crossoriginAttribute/error.js"></script>
res.setHeader("Access-Control-Allow-Origin","*");複製代碼