Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
、請談?wù)勀銓π阅軆?yōu)化的認(rèn)識?
網(wǎng)頁內(nèi)容
減少http請求次數(shù)
80%的響應(yīng)時間花在下載網(wǎng)頁內(nèi)容(images, stylesheets, javascripts,scripts, flash等)。減少請求次數(shù)是縮短響應(yīng)時間的關(guān)鍵!可以通過簡化頁面設(shè)計來減少請求次數(shù),但頁面內(nèi)容較多可以采用以下技巧。
圖片顯示效果如左圖
減少DNS查詢次數(shù)
DNS查詢也消耗響應(yīng)時間,如果我們的網(wǎng)頁內(nèi)容來自各個不同的domain (比如嵌入了開放廣告,引用了外部圖片或腳本),那么客戶端首次解析這些domain也需要消耗一定的時間。DNS查詢結(jié)果緩存在本地系統(tǒng)和瀏覽器中一段時間,所以DNS查詢一般是對首次訪問響應(yīng)速度有所影響。下面是我清空本地dns后訪問博客園主頁dns的查詢請求。
緩存Ajax
Ajax可以幫助我們異步的下載網(wǎng)頁內(nèi)容,但是有些網(wǎng)頁內(nèi)容即使是異步的,用戶還是在等待它的返回結(jié)果,例如ajax的返回是用戶聯(lián)系人的下拉列表。所以我們還是要注意盡量應(yīng)用以下規(guī)則提高ajax的響應(yīng)速度。
延遲加載
這里討論延遲加載需要我們知道我們的網(wǎng)頁最初加載需要的最小內(nèi)容集是什么。剩下的內(nèi)容就可以推到延遲加載的集合中。
Javascript是典型的可以延遲加載內(nèi)容。一個比較激進(jìn)的做法是開發(fā)網(wǎng)頁時先確保網(wǎng)頁在沒有Javascript的時候也可以基本工作,然后通過延遲加載腳本來完成一些高級的功能。
延遲加載
這里討論延遲加載需要我們知道我們的網(wǎng)頁最初加載需要的最小內(nèi)容集是什么。剩下的內(nèi)容就可以推到延遲加載的集合中。
Javascript是典型的可以延遲加載內(nèi)容。一個比較激進(jìn)的做法是開發(fā)網(wǎng)頁時先確保網(wǎng)頁在沒有Javascript的時候也可以基本工作,然后通過延遲加載腳本來完成一些高級的功能。
2、如何避免XSS?
禁止危險腳本
IE8是第一款內(nèi)置了XSS腳本攔截保護(hù)的瀏覽器。谷歌的Chrome也會緊隨其后推出類似功能。這兩款瀏覽器都會首先查看來自某個Web服務(wù)器的腳本是否是惡意的——如果是,就攔截它。在今年4月的黑帽歐洲2010大會上,研究專家David Lindsay和Eduardo Vela Nava卻演示了一種可以破除這種攔截的辦法,不過谷歌已經(jīng)修復(fù)了Chrome中的這個漏洞。微軟則在今年1月(補(bǔ)丁MS10-002)和3月(MS10-018)也已解決了大部分問題,并計劃在6月修復(fù)第3個漏洞,所以在你讀到這篇文章的時候,破除XSS腳本攔截的問題可能已經(jīng)完全解決了。
Firefox的用戶則可以利用免費的NoScrpit附加組件有選擇地攔截腳本。比如說,你可以放行一段Flash視頻,而同時攔截該網(wǎng)站上的其他腳本組件。IE和Chrome在攔截可疑腳本方面沒有這么細(xì)的粒度——它們是要么全攔截,要么全不攔截。
NoScrpit也有一個問題,那就是大多數(shù)用戶并不喜歡放行個別腳本的做法,因為這樣會帶來不便。不過攔截和放行今后可能會成為你的第二天性。你還可以對某個特定網(wǎng)站上的所有腳本進(jìn)行認(rèn)證,無論是為了一次性訪問還是今后的所有訪問,這樣的認(rèn)證如今在IE 8和chrome中也可以做了,使得防范XSS攻擊實現(xiàn)更加可能。
3、平時如何管理項目?
所謂項目,簡單地說,就是在既定的資源和要求的約束下,為實現(xiàn)某種目的而相互聯(lián)系的一次性工作任務(wù)。一般來說,項目具有如下的基本特征:
1)明確的目標(biāo)其結(jié)果只可能是一種期望的產(chǎn)品,也可能是一種所希望得到的服務(wù)。
2)獨特的性質(zhì)每一個項目都是唯一的。
3)資源成本的約束性每一項目都需要運用各種資源來實施,而資源是有限的。
4)項目實施的一次性項目不能重復(fù)。
5)項目的不確定性在項目的具體實施中,外部和內(nèi)部因素總是會發(fā)生一些變化,因此項目也會出現(xiàn)不確定性。
4、請談?wù)勴椖康牡芷冢?/p>
軟件項目開發(fā),一般都會采用增量、迭代、(或者叫進(jìn)化、演化、演進(jìn))的軟件開發(fā)模型,眾多的軟件開發(fā)模型大多是以經(jīng)典的瀑布模型為基礎(chǔ)進(jìn)行改進(jìn)、變形,改進(jìn)原則是:增加客戶在整個項目周期中的參與度,降低軟件開發(fā)過程中的風(fēng)險,增強(qiáng)軟件項目的后期可維護(hù)性。
不同的軟件開發(fā)模型,迭代周期長短也不相同,有的是一個月,有的是兩周,我們一般都是根據(jù)實際情況確定,一個周期完成,將項目成果(可運行的軟件)提交給用戶(或進(jìn)行內(nèi)部評審),通過后就進(jìn)入下一個迭代開發(fā)周期
5、工作中用過什么構(gòu)建工具?
答:用過gulp。
第一步:安裝node和npm,搭建node環(huán)境。
第二步:安裝gulp
第三步:新建Gulpfile文件,運行g(shù)ulp
安裝依賴,提醒下,如果以上命令提示權(quán)限錯誤,需要添加 sudo 再次嘗試。
Gruntfile維護(hù)起來那么困難,有幾個原因:
配置和運行分離
程序員都知道,變量的聲明和使用挨在一起,最方便理解和修改。但Gruntfile里,配置Task和調(diào)用它們的地方離得很遠(yuǎn),極大地增加了心智負(fù)擔(dān)
每個插件做的事太多
每個Task的結(jié)果必須寫到磁盤文件,另一個Task再讀,損害性能倒是小事,更麻煩的是讓整個過程變復(fù)雜了。就像一個個小作坊,來料加工又返回給客戶,這中間的溝通成本、出錯機(jī)會都大大增加。配置項過多做事多了,配置項自然也多。至少輸入和輸出的位置得配吧。每個插件的配置規(guī)則還不盡相同。用每個插件,都得去學(xué)習(xí)一番。
6、談?wù)勀銓δK化的理解?
什么是模塊化?
? 模塊化就是為了減少系統(tǒng)耦合度,提高高內(nèi)聚,減少資源循環(huán)依賴,增強(qiáng)系統(tǒng)框架設(shè)計。
? 讓開發(fā)者便于維護(hù),同時也讓邏輯相同的部分可復(fù)用
? 模塊化開發(fā):針對js、css,以功能或業(yè)務(wù)為單元組織代碼。js方面解決獨立作用域、依賴管理、
api暴露、按需加載與執(zhí)行、安全合并等問題,css方面解決依賴管理、組件內(nèi)部樣式管理等問題。
任何事物都有一個過程,那么模塊化的過程通俗點講就是:
模塊化的過程就是:
? 1、拆分
將整個系統(tǒng)按功能,格式,加載順序,繼承關(guān)系分割為一個一個單獨的部分.
注意:拆分的粒度問題,可復(fù)用問題,效率問題.如何這些問題處理的不好,就有可能出現(xiàn)不想要的后果。
將功能或特征相似的部分組合在一起,組成一個資源塊.
將每個資源塊按找需求,功能場景以及目錄約束放到固定的地方以供調(diào)用.
模塊的歷程
模塊化的發(fā)展也是從草根一步一步走過來的。從最開始到現(xiàn)在成熟方案:
1. namespace
2. sass,less
3. AMD&CMD
4. html模版
5. grunt,gulp,webpack
6. FIS,YUI,KISSY
7、平時都用什么第三方框架?
jQuery、Bootstrap、angularjs、vue、underscore、seajs、RequireJS…
8、請描述一下cookie,sessionStorage和localStorage的區(qū)別?
答:cookies兼容所有的瀏覽器,Html5提供的storage存儲方式。
? Document.cookie
? Window.localstorage
? Window.sessionstorage
cookie數(shù)據(jù)始終在同源的http請求中攜帶(即使不需要),即cookie在瀏覽器和服務(wù)器間來回傳遞。而sessionStorage和localStorage不會自動把數(shù)據(jù)發(fā)給服務(wù)器,僅在本地保存。
存儲大小限制也不同,cookie數(shù)據(jù)不能超過4k,同時因為每次http請求都會攜帶cookie,所以cookie只適合保存很小的數(shù)據(jù),如會話標(biāo)識。sessionStorage和localStorage 雖然也有存儲大小的限制,但比cookie大得多,可以達(dá)到5M或更大。
數(shù)據(jù)有效期不同,sessionStorage:僅在當(dāng)前瀏覽器窗口關(guān)閉前有效,自然也就不可能持久保持;localStorage:始終有效,窗口或瀏覽器關(guān)閉也一直保存,因此用作持久數(shù)據(jù);cookie只在設(shè)置的cookie過期時間之前一直有效,即使窗口或瀏覽器關(guān)閉。
作用域不同,sessionStorage不在不同的瀏覽器窗口中共享,即使是同一個頁面;localStorage 在所有同源窗口中都是共享的;cookie也是在所有同源窗口中都是共享的。
9、如何使用緩存?
可以基于http的頭信息控制緩存
ajax請求對早期的IE瀏覽器默認(rèn)就是緩存的,可以通過時間戳防止緩存
10、談?wù)勀銓︻A(yù)加載的理解?
Web預(yù)加載指的是在網(wǎng)頁全加載完成之前,在頁面優(yōu)先顯示一些主要內(nèi)容,以提高用戶體驗。對于一個較龐大的網(wǎng)站,如果沒有使用預(yù)加載技術(shù),用戶界面就會長時間顯示一片空白,直到資源加載完成,頁面才會顯示內(nèi)容。
例如,可以通過js預(yù)先從服務(wù)加載圖片資源(動態(tài)創(chuàng)建Image,設(shè)置src屬性),只要瀏覽器把圖片下載到本地,就會被緩存,再次請求相當(dāng)?shù)膕rc時就會優(yōu)先尋找瀏覽器緩存,提高訪問速度。
11、緩存和預(yù)加載的區(qū)別是什么?
緩存就是把請求過的數(shù)據(jù)緩存起來,下次請求的時候直接使用緩存內(nèi)容,提高響應(yīng)速度
預(yù)加載指的是提前把需要的內(nèi)容加載完成,訪問的時候可以明天提高響應(yīng)效率,比如圖片的預(yù)加載(可以提前加載一定數(shù)量的圖片,當(dāng)用戶訪問圖片的時候一般只看前幾張,由于是預(yù)加載好的,所以速度比較快)
12、圖片如何壓縮?
可以使用一些在線的圖片壓縮工具
優(yōu)先用 png 而不是 gif
壓縮 png
去掉 jpg 的 metadata
壓縮 gif 動畫
嘗試使用 png8
避免使用 AlphaImageLoader
壓縮動態(tài)生成的圖像
使 favicon 更小 可緩存
使用 CSS Sprites
13、壓縮文件有哪些方法?
使用Grunt、Sass、ant壓縮
14、如何區(qū)分靜態(tài)頁面和動態(tài)頁面?
答:要區(qū)分這兩個,最簡單的方法就是看后綴了,動態(tài)網(wǎng)頁網(wǎng)址中有兩個標(biāo)志性的符號“?”和“&”(有的可能沒有&),這個問號和&就是用來帶參數(shù)的。現(xiàn)在幾乎愛所有的網(wǎng)頁都是動態(tài)網(wǎng)頁。
15、字符串拼接和模板引擎,項目中會如何操作?模板引擎會不會利于SEO優(yōu)化?
簡單的數(shù)據(jù)渲染,拼接字符串即可,稍微復(fù)雜的業(yè)務(wù)邏輯使用前端模板引擎,過于復(fù)雜的頁面基本上使用后臺渲染的方式;模板引擎會影響SEO優(yōu)化,為了解決這個問題,需要關(guān)注SEO的頁面最好采用后臺渲染的方式。
16、前臺兼容性問題有哪些?
答:主要是常用瀏覽的(前端)API差異,渲染差異,等等
17、你如何對網(wǎng)站的文件和資源進(jìn)行優(yōu)化?期待的解決方案包括?
答:文件合并
文件最小化/文件壓縮
使用CDN托管
緩存的使用
18、內(nèi)存泄漏怎么理解?
答: IE6時代有bug,閉包會造成內(nèi)存泄漏,這個現(xiàn)在已經(jīng)無須考慮了。
其次,閉包本身不會造成內(nèi)存泄漏,但閉包過多很容易導(dǎo)致內(nèi)存泄漏。
這句話很矛盾,技術(shù)上講,閉包是不會造成內(nèi)存泄漏的,瀏覽器的bug除外。但是,閉包會造成對象引用的生命周期脫離當(dāng)前函數(shù)的上下文,因此,如果不仔細(xì)考慮閉包函數(shù)的生命周期,的確有可能出現(xiàn)意料之外的內(nèi)存泄漏,當(dāng)然,從嚴(yán)格意義上講,這是程序員自己的bug,而不是閉包的錯。
19、微格式到底是做啥用?
答:是開放的數(shù)據(jù)格式,面向的是普通用戶,任何用戶可以透過簡單的程序讀取微格式內(nèi)容。而不是像Flickr、Amazon、Google等提供特定的面向技術(shù)人員的API(一般基于XML-PRC、REST,相對復(fù)雜)。RSS具有微格式的部分優(yōu)點,但限制還是比較多的,比如有限的元數(shù)據(jù)(標(biāo)題、描述、URL等),不能更好地描述語義,不太容易與已存在的工具結(jié)合等。用微格式可以來聚合外部Blog,F(xiàn)lickr,YouTube,MapQuest,甚至MySpace里的內(nèi)容。
微格式實際就是為現(xiàn)有的(X)HTML元素添加元數(shù)據(jù)和其他屬性,增強(qiáng)語義。
20、懶加載是用滾輪判斷高度好還是用插件?
使用插件比較好,插件考慮的問題比較全面,僅僅通過滾輪高度判斷很容易導(dǎo)致一些副作用(比如一次性請求多次)
21、如何緩存整個頁面,在沒有網(wǎng)絡(luò)的時候可以來回的跳轉(zhuǎn)?
使用 HTML5,通過創(chuàng)建 cache manifest 文件,可以輕松地創(chuàng)建 web 應(yīng)用的離線版本。
如需啟用應(yīng)用程序緩存,請在文檔的 <html> 標(biāo)簽中包含 manifest 屬性。
每個指定了 manifest 的頁面在用戶對其訪問時都會被緩存。如果未指定 manifest 屬性,則頁面不會被緩存(除非在 manifest 文件中直接指定了該頁面)。
manifest 文件的建議的文件擴(kuò)展名是:".appcache"。
manifest 文件需要配置正確的 MIME-type,即 "text/cache-manifest"。必須在 web 服務(wù)器上進(jìn)行配置。
manifest 文件可分為三個部分:
CACHE MANIFEST - 在此標(biāo)題下列出的文件將在首次下載后進(jìn)行緩存
NETWORK - 在此標(biāo)題下列出的文件需要與服務(wù)器的連接,且不會被緩存
FALLBACK - 在此標(biāo)題下列出的文件規(guī)定當(dāng)頁面無法訪問時的回退頁面(比如 404 頁面)
實例 - 完整的 Manifest 文件
22、CDN是啥?
CDN的全稱:是Content DeliveryNetwork,即內(nèi)容分發(fā)網(wǎng)絡(luò),加速的意思,那么網(wǎng)站CND服務(wù)就是網(wǎng)站加速服務(wù)。
CDN加速原理:CDN加速將網(wǎng)站的內(nèi)容緩存在網(wǎng)絡(luò)邊緣(離用戶接入網(wǎng)絡(luò)最近的地方),然后在用戶訪問網(wǎng)站內(nèi)容的時候,通過調(diào)度系統(tǒng)將用戶的請求路由或者引導(dǎo)到離用戶接入網(wǎng)絡(luò)最近或者訪問效果最佳的緩存服務(wù)器上,有該緩存服務(wù)器為用戶提供內(nèi)容服務(wù);相對于直接訪問源站,這種方式縮短了用戶和內(nèi)容之間的網(wǎng)絡(luò)距離,從而達(dá)到加速的效果。
CDN的特點:
1、本地加速 提高了企業(yè)站點(尤其含有大量圖片和靜態(tài)頁面站點)的訪問速度,并大大提高以上性質(zhì)站點的穩(wěn)定性
2、鏡像服務(wù) 消除了不同運營商之間互聯(lián)的瓶頸造成的影響,實現(xiàn)了跨運營商的網(wǎng)絡(luò)加速,保證不同網(wǎng)絡(luò)中的用戶都能得到良好的訪問質(zhì)量。
3、遠(yuǎn)程加速 遠(yuǎn)程訪問用戶根據(jù)DNS負(fù)載均衡技術(shù) 智能自動選擇Cache服務(wù)器,選擇最快的Cache服務(wù)器,加快遠(yuǎn)程訪問的速度
4、帶寬優(yōu)化 自動生成服務(wù)器的遠(yuǎn)程Mirror(鏡像)cache服務(wù)器,遠(yuǎn)程用戶訪問時從cache服務(wù)器上讀取數(shù)據(jù),減少遠(yuǎn)程訪問的帶寬、分擔(dān)網(wǎng)絡(luò)流量、減輕原站點WEB服務(wù)器負(fù)載等功能。
5、集群抗攻擊 廣泛分布的CDN節(jié)點加上節(jié)點之間的智能冗于機(jī)制,可以有效地預(yù)防黑客入侵以及降低各種D.D.o.S攻擊對網(wǎng)站的影響,同時保證較好的服務(wù)質(zhì)量。
23、瀏覽器一次可以從一個域名下請求多少資源?
瀏覽器的并發(fā)請求數(shù)目限制是針對同一域名的,同一時間針對同一域名下的請求有一定數(shù)量限制,不同瀏覽器這個限制的數(shù)目不一樣,超過限制數(shù)目的請求會被阻塞;
目前的話,所有瀏覽器的并發(fā)數(shù)目一般限制在10以內(nèi)。
24、什么是垃圾回收機(jī)制(GC)?
早期的計算機(jī)語言,比如C和C++,需要開發(fā)者手動的來跟蹤內(nèi)存,這種機(jī)制的優(yōu)點是內(nèi)存分配和釋放的效率很高。但是它也有著它的缺點,程序員很容易不小心忘記釋放內(nèi)存,從而造成內(nèi)存的泄露。
新的編程語言,比如JAVA, C#, javascript, 都提供了所謂“垃圾回收的機(jī)制”,運行時自身會運行相應(yīng)的垃圾回收機(jī)制。程序員只需要申請內(nèi)存,而不需要關(guān)注內(nèi)存的釋放。垃圾回收器(GC)會在適當(dāng)?shù)臅r候?qū)⒁呀?jīng)終止生命周期的變量的內(nèi)存給釋放掉。GC的優(yōu)點就在于它大大簡化了應(yīng)用層開發(fā)的復(fù)雜度,降低了內(nèi)存泄露的風(fēng)險。
25、image和canvas在處理圖片的時候有什么區(qū)別?
image是通過對象的形式描述圖片的
canvas通過專門的API將圖片繪制在畫布上
26、簡述移動開發(fā)的注意點,如何做好不同手機(jī)的適配,你以前的項目是怎么做的?
1、單獨做移動端項目,采用百分比布局
2、采用響應(yīng)式的方式做適配
27、響應(yīng)式布局的時候,輪播圖使用兩張不同的圖片去適配大屏幕和超小屏幕,還是一張圖片進(jìn)行壓縮適配不同終端,說明原因?
最好使用兩張不同大小的圖片去適配大屏幕和超小屏幕,這樣可以針對不同設(shè)備的屏幕大小,來加載響應(yīng)的圖片,減少超小屏幕設(shè)備的網(wǎng)絡(luò)流量消耗,加快響應(yīng)速度,同時防止圖片在大屏幕下分辨率不夠?qū)е率д娴膯栴}。
28、http和tcp有什么區(qū)別?
TPC/IP協(xié)議是傳輸層協(xié)議,主要解決數(shù)據(jù)如何在網(wǎng)絡(luò)中傳輸,是一種“經(jīng)過三次握手”的可靠的傳輸方式;
HTTP協(xié)議即超文本傳送協(xié)議(Hypertext Transfer Protocol ),是應(yīng)用層協(xié)議,是Web聯(lián)網(wǎng)的基礎(chǔ),也是手機(jī)聯(lián)網(wǎng)常用的協(xié)議之一,HTTP協(xié)議是建立在TCP協(xié)議之上的一種應(yīng)用。
29、向git中添加一個文件并commit,然后push到remote server,請寫出相關(guān)命令?
$ git add README.md $git commit -m "add README.md" $ git push origin master
30、請把以下HTML文檔翻譯成MarkDown格式?
<h3>Header</h3>
<p>Hello world!<a>Google</a></p>
<ol>
<li>NumberOne</li>
<li>NumberTwo</li>
</ol>
### Header
Hello world
1. Number One
2. Number Two
35、設(shè)計模式有哪些?列舉你在前端開發(fā)工作中自己應(yīng)用到或者了解到其他框架所用到的設(shè)計模式?
單例、工廠、觀察者、適配器、代理模式
36、請描述你熟悉的語言的垃圾回收(GC)機(jī)制,他們對循環(huán)引用是如何處理的?如何查找內(nèi)存泄漏(MemoryLeak)?
JavaScript的垃圾回收機(jī)制主要是根據(jù)數(shù)據(jù)是否還存在引用,沒有引用的數(shù)據(jù)空間可能在某個時間被回收;在java中垃圾回收機(jī)制采用對象遍歷來解決循環(huán)引用;windows的任務(wù)管理器就可以查看到內(nèi)存泄露
31、你做的頁面在哪些流覽器測試過?這些瀏覽器的內(nèi)核分別是什么?
答:Ie(Ie內(nèi)核) 火狐(Gecko)谷歌(webkit) opear(Presto)
32、寫出幾種IE6 BUG的解決方法?
答:1.雙邊距BUG float引起的使用display
2.3像素問題使用float引起的使用dislpay:inline-3px
3.超鏈接hover 點擊后失效使用正確的書寫順序 link visitedhover active
4.Iez-index問題給父級添加position:relative
5.Png 透明使用js代碼改
6.Min-height最小高度!Important 解決’
7.select在ie6下遮蓋使用iframe嵌套
8.為什么沒有辦法定義1px左右的寬度容器(IE6默認(rèn)的行高造成的,使用over:hidden,zoom:0.08line-height:1px)
33、圖片優(yōu)化
項目中圖片處理相關(guān)的優(yōu)化,項目中用到的優(yōu)化方案,圖片大小達(dá)到多少的時候選擇處理?
答:1、首先了解在web開發(fā)中常見的圖片有那些格式。
JPG 通常使用的背景圖片,照片圖片,商品圖片等等。這一類型的圖片都屬于大尺寸圖片或較大尺寸圖片一般使用的是這種格式。
PNG 這種格式的又分為兩種一種PNG-8,一種 PNG-24。
PNG-8格式不支持半透明,也是IE6兼容的圖片存儲方式。
PNG-24圖片質(zhì)量要求較高的半透明或全透明背景,保存成PNG-24更合適(為了兼容IE可以試用js插件pngfix)一般是背景圖標(biāo)中使用的多。
GIF 這種格式顯而易見的是在需要gif動畫的時候使用了。
2.優(yōu)化方案
l 樣式代替圖片
例如:半透明、圓角、陰影、高光、漸變等。這些效果主流的瀏覽器都能夠完美支持,而對于那些低端瀏覽器,我們并不會完全拋棄他們,“漸進(jìn)增強(qiáng)”則是一個很好的解決方案。
l 精靈圖
CSS Sprites,將同類型的圖標(biāo)或按鈕等背景圖合到一張大圖中,減少頁面請求。
l 字體圖標(biāo)
Icon Font,將圖標(biāo)做成字體文件。優(yōu)點是圖標(biāo)支持多個尺寸,兼容所有瀏覽器,減少頁面請求等。美中不足的是只支持純色的icon。SVG,對于絕大多數(shù)圖案、圖標(biāo)等,矢量圖更小,且可縮放而無需生成多套圖?,F(xiàn)在主流瀏覽器都支持SVG了,所以可放心使用!
l Base64
將圖片轉(zhuǎn)化為base64編碼格式,資源內(nèi)嵌于CSS或HTML中,不必單獨請求。
Base64格式
data:[][;charset=][;base64],
Base64 在CSS中的使用
.demoImg{ background-image: url("data:image/jpg;base64,/9j/4QMZRXhpZgAASUkqAAgAAAA L...."); }
Base64 在HTML中的使用
<imgwidth="40"height="30" src="data:image/jpg;base64,/9j/4QMZRXhpZgAASUkqAAgAAAAL...." />
l 圖片響應(yīng)式
通常圖片加載都是可以通過lazy加載的形式來的,那么可以在加載的時候來判斷屏幕的尺寸來達(dá)到加載大圖還是小圖的目的來達(dá)到優(yōu)化。
34、你知道有哪些方法可以提高網(wǎng)站的性能?
答:我們從兩個方面來講:
1. 資源加載
CSS頂部, JS底部
CSS JS文件壓縮
盡量使用圖片使用精靈圖,字體圖標(biāo)
圖片加載可通過懶加載的方式。
總之就是減少資源體積減少資源請求次數(shù)。
2. 代碼性能
Css:
使用CSS縮寫,減少代碼量;
減少查詢層級:如.header .logo要好過.header .top .logo;
減少查詢范圍:如.header>li要好過.header li;
避免TAG標(biāo)簽與CLASS或ID并存:如a.top、button#submit;
刪除重復(fù)的CSS;
….
Html:
減少DOM節(jié)點:加速頁面渲染;
正確的閉合標(biāo)簽:如避免使用<div/>,瀏覽器會多一個將它解析成<div\></div\>的過程;
減少頁面重繪。比如給圖片加上正確的寬高值:這可以減少頁面重繪,
……
Js:
盡量少用全局變量;
使用事件代理綁定事件,如將事件綁定在body上進(jìn)行代理;
避免頻繁操作DOM節(jié)點;
減少對象查找,如a.b.c.d這種查找方式非常耗性能,盡可能把它定義在變量里;
Angular、主流框架和服務(wù)器相關(guān)問題
1、 ng-app是什么?
答:
ng-app 指令用于告訴 AngularJS 應(yīng)用當(dāng)前這個元素是根元素。
所有 AngularJS 應(yīng)用都必須要要一個根元素。
HTML 文檔中只允許有一個 ng-app 指令,如果有多個 ng-app 指令,則只有第一個會被使用。
2、說說MVC和MVVM分別是什么?
MVC全名是Model View 。是Controller模型(model)-視圖(view)-控制器(controller)的縮寫
MVVM是Model-View-ViewModel的簡寫
3、?g是什么?
在Node.js中-g表示全局安裝模塊
4、自定義指令的類型(E,A,C,M)?
元素(E)、屬性(A)、類(C)、注釋(M)
5、$scope和自定義指令里的scope有啥區(qū)別?
$scope 對象在 AngularJS 中充當(dāng)數(shù)據(jù)模型的作用,也就是一般 MVC 框架中 Model 得角色.但又不完全與通常意義上的數(shù)據(jù)模型一樣,因為 $scope 并不處理和操作數(shù)據(jù),它只是建立了視圖和 HTML 之間的橋梁,讓視圖和Controller 之間可以友好的通訊.
自定義指令里的scope表示指令的作用域,它有三個可選值:true、false、對象{}
6、Ionic中的路由?
Ionic也是基于Angular的,使用的是ui-router,
ui-router的核心理念是將子視圖集合抽象為一個狀態(tài)機(jī),導(dǎo)航意味著 狀態(tài)的切換,Ionic之所以沒有使用Angular官方的ngRoute,是回ngRoute缺少一些高級的特性,比如視圖命名,視圖嵌套。
7、filter?
過濾器
8、ng-bind?
ng-bind 指令告訴 AngularJS 使用給定的變量或表達(dá)式的值來替換 HTML 元素的內(nèi)容。
如果給定的變量或表達(dá)式修改了,指定替換的 HTML 元素也會修改。
9、說一說link?
link中可以拿到scope和controller,可以與scope進(jìn)行數(shù)據(jù)綁定,與其他指令進(jìn)行通信。
10、為什么angular不推薦使用dom操作?
Angular倡導(dǎo)以測試驅(qū)動開發(fā),在的service或者controller中出現(xiàn)了DOM操作,那么也就意味著的測試是無法通過的
使用Angular的其中一個好處是啥,那就是雙向數(shù)據(jù)綁定,這樣就能專注于處理業(yè)務(wù)邏輯,無需關(guān)系一堆堆的DOM操作。如果在Angular的代碼中還到處充斥著各種DOM操作,那為什么不直接使用jquery去開發(fā)呢
11、看過Angular的源碼嗎,它是怎么實現(xiàn)雙向數(shù)據(jù)綁定的?
angular對常用的dom事件,xhr事件等做了封裝, 在里面觸發(fā)進(jìn)入angular的digest流程。
在digest流程里面, 會從rootscope開始遍歷, 檢查所有的watcher
12、講講promise:{
promise:null;;
}?
13、ui-router 和 ng-router區(qū)別?
AngularJS的ng-route模塊為控制器和視圖提供了[Deep-Linking]URL
ui-router的核心理念是將子視圖集合抽象為一個狀態(tài)機(jī),導(dǎo)航意味著 狀態(tài)的切換。
14、什么是指令?
指令是指示計算機(jī)執(zhí)行某種操作的命令,它由一串二進(jìn)制數(shù)碼組成。一條指令通常由兩個部分組成:操作碼+地址碼。
15、service服務(wù)三種方式是什么?
angularjs 中可通過三種($provider,$factory,$service)方式自定義服務(wù)
16、gulp任務(wù)都是怎么定義,怎么執(zhí)行的?
通過 gulp.task方法定義任務(wù),在項目中新建gulpfile.js文件,書寫代碼,如:
var gulp=require(‘gulp’)
gulp.tasks(
‘script’ // 任務(wù)名
,function(){
// 在這里寫任務(wù)需要執(zhí)行的代碼
});
在命令輸入`gulp 任務(wù)`,可以執(zhí)行所在目錄gulpfile.js文件中的任務(wù)。
17、Bootstrap中最多可以分多少列?lg、md、sm、xs這幾個屏幕寬度的界限是多少?
12列
.col-xs- 超小屏幕手機(jī) (<768px)
.col-sm- 小屏幕平板 (≥768px)
.col-md- 中等屏幕桌面顯示器 (≥992px)
.col-lg- 大屏幕大桌面顯示器 (≥1200px)
18、angular中方法apply和digest區(qū)別?
當(dāng)數(shù)據(jù)出現(xiàn)沒有經(jīng)過angular但是發(fā)生改變的情況下,需要調(diào)用apply。Apply的范圍比較廣,只執(zhí)行一次,但是digest針對某一元素執(zhí)行多次。
20、ng-show/hide和ng-if的區(qū)別是什么?
Show/hide是顯示隱藏,if是是否存在某一部分
21、react虛擬DOM運行機(jī)制是什么?
在React中,render執(zhí)行的結(jié)果得到的并不是真正的DOM節(jié)點,結(jié)果僅僅是輕量級的JavaScript對象,我們稱之為virtual DOM。虛擬dom
22、react中prop和state的區(qū)別?
需要理解的是,props是一個父組件傳遞給子組件的數(shù)據(jù)流,這個數(shù)據(jù)流可以一直傳遞到子孫組件。而state代表的是一個組件內(nèi)部自身的狀態(tài)(可以是父組件、子孫組件)。
23、redux的原理?
Redux 把一個應(yīng)用程序中,所有應(yīng)用模塊之間需要共享訪問的數(shù)據(jù),都應(yīng)該放在 State 對象中。這個應(yīng)用模塊可能是指 React Components,也可能是你自己訪問 AJAX API 的代理模塊,具體是什么并沒有一定的限制。State 以 “樹形” 的方式保存應(yīng)用程序的不同部分的數(shù)據(jù)。這些數(shù)據(jù)可能來自于網(wǎng)絡(luò)調(diào)用、本地數(shù)據(jù)庫查詢、甚至包括當(dāng)前某個 UI 組件的臨時執(zhí)行狀態(tài)(只要是需要被不同模塊訪問)、
24、node常用模塊?
http fs path url Buffer process
25、了解npm,spm,nodejs嗎,請簡要描述?
NPM便于JavaScript開發(fā)者共享和重用代碼,它可以很容易地更新你的代碼;再分享。是全球最大的開源庫生態(tài)系統(tǒng)。
SPM是淘寶社區(qū)電商業(yè)務(wù)(xTao)為外部合作伙伴(外站)提供的一套跟蹤引導(dǎo)成交效果數(shù)據(jù)的解決方案。
Node.js 是一個基于 Chrome V8 引擎的 JavaScript 運行環(huán)境。Node.js 使用了一個事件驅(qū)動、非阻塞式 I/O 的模型,使其輕量又高效。它使我們能夠在本地運行javascript
26.請列舉在內(nèi)網(wǎng)的兩臺服務(wù)器中拷貝文件的方法?用Shell腳本解答數(shù)據(jù)庫?
scp -P 1234 -r test_folderuser@192.168.1.20:~
主要就是scp命令的使用
28、請描述你所熟悉的Web服務(wù)器框架(如Django)作為一個成熟的Web框架,需要提供哪些重要的功能模塊?
提供了網(wǎng)站開發(fā)的常用模塊:處理用戶請求、操作數(shù)據(jù)庫、模板渲染、配置文件管理等
29、服務(wù)器Node.js和瀏覽器js的區(qū)別是什么?Node.js把js從客戶端遷移了到服務(wù)端、主要做了哪些工作?為什么說Node.js適合做高并發(fā)的互聯(lián)網(wǎng)應(yīng)用?
Node采用一系列“非阻塞”庫來支持事件循環(huán)的方式。本質(zhì)上就是為文件系統(tǒng)、數(shù)據(jù)庫之類的資源提供接口。Node.js 使用事件驅(qū)動,非阻塞I/O 模型而得以輕量和高效,非常適合在分布式設(shè)備上運行數(shù)據(jù)密集型的實時應(yīng)用。
網(wǎng)絡(luò)相關(guān)問題
1、請解釋下列術(shù)語:UrlEncode,Utf8,JSON,UTC,MD5?
Urlencode:將字符串以url形式編碼(在編程語言中通常都有實現(xiàn)該功能的內(nèi)置函數(shù)或者API)。
Utf8:是一種針對Unicode的可變長度字符編碼,主要用于在網(wǎng)頁上顯示各國語言字符
2、請解釋GET/POST的區(qū)別,以及請求參數(shù)放到url里和放到body里面的區(qū)別?
Post與Get區(qū)別:
GET請求,請求的數(shù)據(jù)會附加在URL之后,以?分割URL和傳輸數(shù)據(jù),多個參數(shù)用&連接。URL的編碼格式采用的是ASCII編碼,而不是uniclde,即是說所有的非ASCII字符都要編碼之后再傳輸。
POST請求:POST請求會把請求的數(shù)據(jù)放置在HTTP請求包的包體中。上面的item=bandsaw就是實際的傳輸數(shù)據(jù)。
因此,GET請求的數(shù)據(jù)會暴露在地址欄中,而POST請求則不會。
傳輸數(shù)據(jù)的大小
在HTTP規(guī)范中,沒有對URL的長度和傳輸?shù)臄?shù)據(jù)大小進(jìn)行限制。但是在實際開發(fā)過程中,對于GET,特定的瀏覽器和服務(wù)器對URL的長度有限制。因此,在使用GET請求時,傳輸數(shù)據(jù)會受到URL長度的限制。
對于POST,由于不是URL傳值,理論上是不會受限制的,但是實際上各個服務(wù)器會規(guī)定對POST提交數(shù)據(jù)大小進(jìn)行限制,Apache、IIS都有各自的配置。
安全性
Get是Form的默認(rèn)方法,安全性相對比較低。
請求參數(shù)放到url里和放到body里面的區(qū)別
首先,參數(shù)的存放位置我們無法直接指定,而是不同的請求方法參數(shù)傳遞的方式不同。
常用的HTTP請求主要為GET請求和POST請求兩種,GET請求的參數(shù)會通過以跟隨在URL后邊以鍵值對的方式進(jìn)行傳遞(例:key1=a&key2=b&key3...);而POST請求的參數(shù)會通過HEADER進(jìn)行傳遞??紤]到安全性的問題,可以確定兩者都不安全,原因是HTTP請求可以被輕易抓包和截獲,其中的請求參數(shù)值自然會很容易被獲取。
3、請列舉出常用的Http Header,Cookie是怎么實現(xiàn)的?
Content-Length,請求、響應(yīng)體的數(shù)據(jù)字節(jié)大小
Accept-Encoding,請求頭,可接受的文本壓縮算法,如: gzip, deflate
Accept-Language,請求頭,支持語言,客戶端瀏覽器的設(shè)置,如:zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
User-Agent,請求頭,瀏覽器信息,
Cookie,請求頭,服務(wù)器或客戶端在上次設(shè)置的COOKIE,包括作用域名(.360buy.com),過期時間,鍵與值。
Referer,從一個連接打開一個新頁面,新頁面的請求一般會加此信息,標(biāo)名是從哪里跳過來的,所有的頁面的打開歷史鏈就可被挖掘出來,有利于分析用戶行為與CPS分成
Cookie在瀏覽器本地會有一個文件存儲數(shù)據(jù),通信的時候通過請求頭和響應(yīng)頭傳遞數(shù)據(jù)
4、請解釋下列返回碼的含義:200,302,400,403,500,502
200:請求成功
302:請求的資源臨時從不同的 URI響應(yīng)請求。(資源臨時重定向)
400:錯誤請求(請求的參數(shù)錯誤或者服務(wù)器不理解請求的語法)
402:10.4.3 402 Payment Required This code is reserved for future use.
該狀態(tài)碼是為了將來可能的需求而預(yù)留的。
500:服務(wù)器端錯誤
502:網(wǎng)關(guān)或代理無效/無響應(yīng),網(wǎng)絡(luò)錯誤
5、長連接和短連接的區(qū)別
HTTP協(xié)議目前常用的有哪幾個?KEEPALIVE從哪個版本開始出現(xiàn)的?
到現(xiàn)在http出現(xiàn)了 1.0和 1.1版本
Keep-Alive是從1.1默認(rèn)就支持了。
1、什么是Keep-Alive模式?
我們知道HTTP協(xié)議采用“請求-應(yīng)答”模式,當(dāng)使用普通模式,即非KeepAlive模式時,每個請求/應(yīng)答客戶和服務(wù)器都要新建一個連接,完成之后立即斷開連接(HTTP協(xié)議為無連接的協(xié)議);當(dāng)使用Keep-Alive模式(又稱持久連接、連接重用)時,Keep-Alive功能使客戶端到服務(wù)器端的連接持續(xù)有效,當(dāng)出現(xiàn)對服務(wù)器的后繼請求時,Keep-Alive功能避免了建立或者重新建立連接。
http 1.0中默認(rèn)是關(guān)閉的,需要在http頭加入"Connection: Keep-Alive",才能啟用Keep-Alive;http 1.1中默認(rèn)啟用Keep-Alive,如果加入"Connection: close ",才關(guān)閉。目前大部分瀏覽器都是用http1.1協(xié)議,也就是說默認(rèn)都會發(fā)起Keep-Alive的連接請求了,所以是否能完成一個完整的Keep-Alive連接就看服務(wù)器設(shè)置情況。
2、啟用Keep-Alive的優(yōu)點
從上面的分析來看,啟用Keep-Alive模式肯定更高效,性能更高。因為避免了建立/釋放連接的開銷。
6、從服務(wù)器考慮提高網(wǎng)站性能
答:業(yè)界常用的優(yōu)化WEB頁面加載速度的方法(可以分別從頁面元素展現(xiàn),請求連接,css,js,服務(wù)器等方面介紹)?
對于服務(wù)器方面前端能做的工作:
使用CDN加速,使用戶從離自己最近的服務(wù)器下載文件;
減少Cookie的大小,使用無cookie的域,客戶端請求靜態(tài)文件的時候,減少 Cookie 的反復(fù)傳輸對主域名的影響;
為文件頭指定Expires,使內(nèi)容具有緩存性;
前端優(yōu)化:DNS預(yù)解析提升頁面速度
<link rel="dns-prefetch" />
<link rel="dns-prefetch" />
服務(wù)器端能做的工作:
負(fù)載均衡,分布式存儲,提升服務(wù)器性能等等。
7、什么是Daemon進(jìn)程?
答:Daemon()程序是一直運行的服務(wù)端程序,又稱為守護(hù)進(jìn)程。通常在系統(tǒng)后臺運行,沒有控制終端,不與前臺交互,Daemon程序一般作為系統(tǒng)服務(wù)使用。Daemon是長時間運行的進(jìn)程,通常在系統(tǒng)啟動后就運行,在系統(tǒng)關(guān)閉時才結(jié)束。一般說Daemon程序在后臺運行,是因為它沒有控制終端,無法和前臺的用戶交互。Daemon程序一般都作為服務(wù)程序使用,等待客戶端程序與它通信。我們也把運行的Daemon程序稱作守護(hù)進(jìn)程。
8、優(yōu)化一個以I/O為瓶頸的程序,以下哪些方法效果比較顯著,Why?
a) 增加CPU數(shù)目
b) 提高CPU主頻
c) 增大內(nèi)存的容量
d) 采用多線程
e) 采用異步I/O和多路(Multlplex)I/O
f) 對每次I/O進(jìn)行Bath訪問(多次I/O合并一次完成)
c、e、d、f提升的效果會比較顯著
c通過將數(shù)據(jù)預(yù)讀取到內(nèi)存中(建立內(nèi)存池)的方式,提高訪問時候的效率,有效減少磁盤IO讀寫次數(shù)
9、設(shè)計一個系統(tǒng),實現(xiàn)統(tǒng)計網(wǎng)站中每個URL訪問到的次數(shù)(pv),以及訪問的獨立用戶數(shù)(uv),其中每個獨立網(wǎng)頁以URL為key,每個獨立用戶以ip為key?
10、什么是內(nèi)存對象的序列化(Serialiization)?為什么要序列化?請描述你熟悉的網(wǎng)絡(luò)傳輸序列化(Serialiization)框架或格式(Server)?
把對象轉(zhuǎn)換為字節(jié)序列的過程稱為對象的序列化
序列化主要用于網(wǎng)絡(luò)傳輸數(shù)據(jù)及將數(shù)據(jù)保存在硬盤上
常見的序列化以后的格式有:XML Jason ,但它們都是字符串
項目相關(guān)問題
1、請談下團(tuán)購倒計時如何實現(xiàn)?
團(tuán)購倒計時頁面端的效果比較好實現(xiàn),主要是樣式和時間的操作,重要的考慮時間要和服務(wù)器端同步,其實這個效果也可以基于服務(wù)器端推送技術(shù)來實現(xiàn)
2、輪播圖有哪幾種?如何實現(xiàn)?
純css可以實現(xiàn)輪播圖;js實現(xiàn)輪播圖
3、如何實現(xiàn)數(shù)組去重?
a.最簡單的可以直接利用ES5的indexOf方法。
functiondupRemove(arr) {
var tmp=[]; //一個新的臨時數(shù)組
for (vari=0; i < arr.length; i++) {
// 判斷tmp數(shù)組中是否存在arr中第i元素,如果不存在則添加到tmp數(shù)據(jù)組。
if(tmp.indexOf(arr[i])==-1) {
tmp.push(arr[i]);
}
}
returntmp;
}
b.
b.還有一種比較有意思的寫法
function dupRemove (arr) {
var tmp=[];
for (vari=0, l=arr.length; i < l; i++) {
for (varj=i + 1; j < l; j++) {
if (arr[i]===arr[j]) {
j=++i;
}
}
tmp.push(arr[i]);
}
return r;
}
4、寫一個方法獲取url中?號后面的參數(shù),并將參數(shù)對象化?
function getSearch (url) {
varreg_url=/^[^\?]+\?([\w\W]+)$/,
reg_params=/([^&=]+)=([\w\W]*?)(&|$|#)/g,
arr_url=reg_url.exec(url),
ret={};
if(arr_url && arr_url[1]) {
var str_params=arr_url[1], result;
while((result=reg_ params.exec(str_ params)) !=null) {
ret[result[1]]=result[2];
}
}
returnret;
}
程序題
1、var a=[];
a[0]=0;a[1]=1;a[4]=4;
請問a.length的值是多少?a[3]的輸出結(jié)果是什么?
5 undefined
2、var a=[5,6];
var b=a;
b[0]="hello";
alert(a[0]);
請問值是多少?
"hello"
3、typeof(null),typeof(undefined),typeof(NaN),typeof(NaN==NaN),說出上面代碼執(zhí)行結(jié)果?
object
undefined
number
boolean
4、function doSomething(){
for(var i=0; 4 > i; i++) {
var k=100;
aMrg +=’,’ + (k + i);
}
}
var k=1,aMrg=k;
doSomething();
aMrg +=k;
log(aMrg);
1,100,101,102,1031
5、請寫出下面輸出的值
Console.log(undefined || 1);//值___1__
Console.log(null || NaN);//值__NaN___
Console.log(0 && 1);//值__0___
Console.log(0 && 1 || 0);//值__0___
6、看下列代碼,<p>標(biāo)簽內(nèi)的文字是什么顏色的?紅色
<style>
.classA{color: blue};
.classB{color: red};
</style>
<body>
<p class=”classB classA”>123</p>
</body>
7、var a=[5,6];
var b=a;
b[0]=“hello”;
alert(a[0]);
值是多少?
"hello"
8、你面前有一座高塔,這座高塔有N(N > 100)個臺階,你每次只能往前邁1個或者2個臺階,請寫出程序計算總共有多少種走法?
這個案例滿足斐波那契定律 1,1,2,3,5,8,13,21, 34, 55, 89, 144
9、請閱讀下面的CSS代碼
#left {
color: white !important;
}
#container #left {
color: red;
}
#left {
color: green !important;
}
.container #left {
color: blue;
}
則在如下html中
<div class=”container” id=”container”>
<span id=”left”>left</span>
</div>
#left最終color屬性值為?綠色
10、下面這段代碼想要循環(huán)延時輸出結(jié)果0 1 2 3 4,請問輸出結(jié)果是否正確,如果不正確說明為什么,并修改循環(huán)內(nèi)的代碼使其輸出正確的結(jié)果。
for (var i=0; i < 5; ++i) {
setTimeout (function () {
console.log(i + ‘’);
},100*i);
}
不正確,先執(zhí)行FOR循環(huán)。for循環(huán)完成后,在去執(zhí)行setTimeout。但是這個時候I已經(jīng)是5了,所以輸入了5次5
11、完成函數(shù)showlmg(),要求能夠動態(tài)根據(jù)下拉列表的選項變化,更新圖片的顯示
<body>
<script type=”text/javascript”>
Function showImg (oSel) {
};
</script>
<img id=”pic” src=”img1.jpg” width=”200” height=”200”>
<br/>
<selectid=”sel” οnchange=”showImg(this)”>
<optionvalue=”img1”>城市生活</option>
<optionvalue=”img2”>都市早報</option>
<optionvalue=”img3”>青山綠水</option>
</select>
</body>
答案說明:當(dāng)select發(fā)生改變的時候調(diào)用showImg函數(shù),實參為this(select對象本身),可以通過select對象的屬性來為pic的src賦值實現(xiàn)圖片切換
12、完成foo()函數(shù)的內(nèi)容,要求能彈出對話框提示當(dāng)前選中的是第幾個單選框
<html>
<head>
<meat http-equiv=”Content-Type”content=”text/html; charset=utf-8”>
</head>
<body>
<scripttype=”text/javascript”>
functionfoo() {
};
</script>
<form name=”form1” οnsubmit=”retuen foo()”>
<inputtype=”radio” name=“radioGroup”>
<input type=”radio” name=“radioGroup”>
<inputtype=”radio” name=“radioGroup”>
<input type=”radio” name=“radioGroup”>
</form>
</body>
</html>
題粗的有問題,onsubmit只有在提交的時候才會觸發(fā)這里面沒有submit按鈕,在提交事件觸發(fā)的時候遍歷哪個input表單是選中狀態(tài)然后alert粗來
13、計算下面程序運行結(jié)果
var msg=‘hello’;
function great(name, attr) {
name=‘david’;
var greating=msg + name + ‘!’;
var msg=‘您好’;
For (var i=0 ; i < 10;i++) {
var next=msg + ‘您的id是’ + i*2 + i;
}
console.log(arguments[0]);
console.log(arguments[1]);
console.log(greating);
console.log(next);
}
geat(‘Tom’);
答案:david //參數(shù)1
hellowworld 01.html:20 undefined //參數(shù)2 未傳入為未定義
hellowworld 01.html:21 undefineddavid! //name雖然是參數(shù)但是參數(shù)重新賦值為david了msg因為變量聲明提升所以值為undefined
您好您的id是189//因為number+string=string所以for循環(huán)最后一次聲明next=****18+9
14、下面這段JS輸出什么,并簡述為什么?
function Foo() {
var i=0;
return function () {
console.log(i++);
}
}
var f1=Foo(),
f2=Foo();
f1();
f1();
f2();
console.log(i);
0 //f1=Foo() 相當(dāng)于f1賦值為函數(shù)Foo()的返回值f1=function(){
console.log(i++)
}
1 //因為f1=了一個function所以有了作用域,f2和f1不同,不在一個內(nèi)存中
0
報錯 //i為Foo內(nèi)部的變量全局不可訪問,全局中沒有i變量所以會報錯
15、請寫出下面輸出的值
a) varnum=1;
var fun=function () {
console.log(num);//值___undefined___
var num=2;
console.log(num);//值___2___
}
fun();
b) varnum=1;
function fun () {
console.log(num);//值___1____
num=2;
console.log(num);//值___2____
}
fun();
16、寫出以下程序執(zhí)行的結(jié)果
1)var a=10;
a.pro=10;
console.log(a.pro + a);
NAN number對象不可以定義私有屬性 namber+非數(shù)字和字符的值就等于NaN
2)var s=‘hello’;
s.pro=‘world’;
console.log(s.pro + s); //undefinedhello s位字符串,字符串不可以自定義屬性,所以s.pro為undefined 字符串做加運算會強(qiáng)制拼接位字符串
3)console.log(typeof fn);
function fn() {};
var fn;
//function 函數(shù)提升優(yōu)先于變量提升
4)var f=true;
If(f===true) {
var a=10;
}
function fn() {
var b=20;
c=30;
}
fn();
console.log(a);
//10
17、請看如下的代碼,寫出結(jié)果
var a=5,b=3;
function test() {
alert(b++);
var a=4;
alert(--a);
alert(this.a);
}
1)tese(),三次alert()的值依次是什么?335 435 535
2)new test(),三次alert()的值依次是什么? 33undefined 43undefined53undefined //this更改了指向原來是指向window 用了new關(guān)鍵字后指向test test木有a屬性所以為undefined
18、p最后顯示什么顏色。怎么讓p的顏色變成黑色,并簡要說明css選擇器優(yōu)先級關(guān)系
<style>
#classA{color:yellow};
p.classB(color:red);
</style>
<body>
<p id=”classA” class=”classB”>123</p>
</body>
//p#classA{color:black}
19、關(guān)于正則表達(dá)式聲明6位數(shù)字的郵編,一下代碼正確的是(C)
A.var reg=/\d6/;
B.var reg=\d{6}\;
C.var reg=/\d{6}/;
D.var reg=new RegExp (“\d{6}”);
20、關(guān)于JavaScript里xml處理,一下說明正確的(A)
A.xml是種可擴(kuò)展標(biāo)記語言,格式更規(guī)范,是作為未來html的替代 //貌似XML是被替代的
B.Xml一般用于傳輸和存儲數(shù)據(jù),是對html的補(bǔ)充,兩者的目的不同
C.在JavaScript里解析和處理xml數(shù)據(jù)時,因為瀏覽器的不同,其做法也不同
D.在IE瀏覽器里處理xml,首先需要創(chuàng)建ActiveXObject對象
21、請選擇對javascript理解有誤的(B)
A.javascript是網(wǎng)景公司開發(fā)的一種基于事件和驅(qū)動網(wǎng)頁腳本語言
B.JScript是javascript的簡稱 //微軟自己的瀏覽器才支持
C.FireFox和IE存在大量兼容性問題的主要原因在于他們對javascript的支持不同
D.AJAX技術(shù)一定要使用javascript技術(shù)
22、在Jquery中下面哪一個是用來追加到指定元素的末尾(B)
A.inserAfter()
B.Append()
C.appendTo()
D.After()
23、在javascript中定義變量var a=”35”,var b=“7”運算a % b 的結(jié)果為(C)
A.357
B.57
C.0
D.5
24、下面哪個屬于javascript的字符型C
A.False
B.你好
C.“123”
D.Null
25、下面哪個屬于javascript的布爾值(C)
A.1.2
B.”true”
C.false
D.null
26、請選擇結(jié)果為真的表達(dá)式(C)
A.null instanceof Object
B.Null===undefined;
C.null==undefined
D.NaN==NaN
27、下列運算方式不屬于邏輯運算的是(D)
A.!a
B.a&&b
C.a||b
D.a>b
28、聲明一個對象,給它加上name屬性和show方法顯示其name值,以下代碼中正確的是(D)
A.var obj=[name : “zhangsan” ,show: function(){alert(name);}];
B.Var obj={name : “zhangsan”,show: “alert(this.name)”};
C.Var obj={name : “zhangsan”,show: function () {alert(name);}};
D.Var obj={name : “zhangsan”,show: function () {alert(this.name);}}
29、以下過于Array數(shù)組對象的說法不正確的是(C)
A.對數(shù)組里數(shù)據(jù)的排序可以用sort函數(shù),如果排序效果非預(yù)期,可以給sort函數(shù)加一個排序函數(shù)的參數(shù)
B.reverse用于對數(shù)組數(shù)據(jù)的倒序排列
C.向數(shù)組的最后位置加一個新元素,可以用pop方法 //push吧
D.unshift方法用于向數(shù)組刪除一個元素
30、要將頁面的狀態(tài)顯示”已經(jīng)選中該文本”,下列JavaScript語句正確的是(A)
A.window.status=“已經(jīng)選中該文本”
B.Document.status=“已經(jīng)選中該文本”
C.Window.screen=“已經(jīng)選中該文本”
D.Document.screen=“已經(jīng)選中該文本”
31、點擊頁面的按鈕,使之打開一個新窗口,加載一個頁面,以下JavaScript代碼中可執(zhí)行的是(D)
A.<input type=”button” value=”new”οnclick=”open(‘new.html’,’_blank’)”>
B.<input type=”button” value=”new”οnclick=”window.location=’new.html’;”>
C.<input type=”button” value=”new”οnclick=”location.assign(‘new.html’);”>
D.<form target=”_blank” action=”new.html”>
<input type=”submit” value=”new”>
</form>
32、下面的JavaScript語句中,實現(xiàn)檢索當(dāng)前頁面中的表單元素中的所有文本框,并將它們?nèi)壳蹇?B)
A.for(var i=0; i <form1.elements.length; i++) {
if(form1.elements[i].type==”text”)
form1.elements[i].value=“”;
}
B.for (var i=0; i < document.forms.length;i++) {
if(forms[0].elements[i].type==“text”)
form[0].elements[i].value=“”;
}
C.if(document.form.elements.type==“text”)
form.elements[i].value=“”;
D.for(var i=0; i <document.forms.length;i++) {
for(var j=0;j <document.forms[i].elements.length;j++) {
if(document.forms[i].elements[j].type==“text”)
document.forms[i].elements[j].value=“”;
}
}
33、在表單(form1)中有一個文本框元素(fname),用于輸入電話號碼,格式如:010-82668155,要求前3位是010,緊接一個”-”,后面是8位數(shù)字。要求在提交表單時,根據(jù)上述條件驗證該文本框中輸入內(nèi)容的有效性,下列語句中(A)能正確實現(xiàn)以上功能
A.var str=form1.fname.value;
If(str.substr(0,4)!=”010-”||str.substr(4).length!=8||isNaN(parseFloat(str.substr(4))))
Alert(“無效的電話號碼!”);
B.var str=form1.fname.value;
If(str.substr(0,4)!=”010-”&&str.substr(4).length!=8&&isNaN(parseFloat(str.substr(4))))
Alert(“無效的電話號碼!”);
C.var str=form1.fname.value;
If(str.substr(0,3)!=”010-”||str.substr(3).length!=8||isNaN(parseFloat(str.substr(3))))
alert(“無效的電話號碼!”);
D.var str=form1.fname.value;
If(str.substr(0,4)!=”010-”&&str.substr(4).length!=8&&isNaN(parseFloat(str.substr(4))))
alert(“無效的電話號碼!”);
34、關(guān)于正則表達(dá)式聲明6位數(shù)字的郵編,一下代碼正確的是(C)
A.var reg=/\d6/;
B.var reg=\d{6}\;
C.var reg=/\d{6}/;
D.var reg=new RegExp (“\d{6}”);
35、下面關(guān)于cookie的說明正確的是(D)
A.Cookie設(shè)置的過期時間為3600s是指60分鐘過期
B.Cookie設(shè)置的過期時間為3600s是指只要在間隔60分鐘內(nèi)有動作時就不過期
C.Cookie保存在服務(wù)器端
D.Cookie保存在用戶本地
36、使用js代碼實現(xiàn),將下面段落中含有的鏈接替換成可直接點擊打開的鏈接
<p id=”text”>這個段落里有鏈接
比如:http://www.abc.comm/和https://www.github.com/都是鏈接。
可是他們顯示在網(wǎng)頁中是,鏈接不可點,還得復(fù)制粘貼到地址欄打開,好麻煩
</p>
37、寫一個方法獲取url?后面的參數(shù),并將參數(shù)對象化。
function parseQueryString(url){
var params={};
var arr=url.split("?");
if (arr.length <=1)
return params;
arr=arr[1].split("&");
for(var i=0, l=arr.length;i<l; i++){
var a=arr[i].split("=");
params[a[0]]=a[1];
}
return params;
}
var url="http://witmax.cn/index.php?key0=0&key1=1&key2=2";
var ps=parseQueryString(url);
console.log(ps["key1"]);
38、Node.js中,一段訪問redis的代碼如下
var redis=require(‘redis’);
var client=redis.createClient();
client.set(‘key’, ‘value’, function (err,data) {
if(err) {
console.error(err.message);
process.exit(1;)
}
cilent.get(‘key’,function(err,data) {
if(err) {
console.error(err.message);
return;
}
console.log(data);
process.exit(0);
})
});
請用Promise的異步調(diào)用方式重寫
請用ES6 yield的異步調(diào)用方式重寫
在經(jīng)歷了多個異步回調(diào)之后,如果拿到完整的堆信息(stack trace)?
39、用你認(rèn)為合適的數(shù)據(jù)庫產(chǎn)品,請設(shè)計數(shù)據(jù)結(jié)構(gòu),并完成一下方法(Server);
1.當(dāng)出現(xiàn)一次網(wǎng)頁瀏覽的時候,請實現(xiàn)函數(shù)click(url, ip)
2.請實現(xiàn)查詢函數(shù)pv(url)以及uv(url)
40、補(bǔ)充按鈕事件的函數(shù),確認(rèn)用戶是否退出當(dāng)前頁面,確認(rèn)之后關(guān)閉窗口
<html>
<head>
<script type=”text/javasccript”>
Function closeWin() {
}
</script>
</head>
<body>
<input type=”button” value=”關(guān)閉窗口” οnclick=”closeWin()” />
</body>
</html>
41、請用JavaScript實現(xiàn),控制一個文本框只能輸入正整數(shù),如輸入不符合條件則文本全部字體標(biāo)紅,要求寫出完整的文本框HTML代碼和JavaScript邏輯代碼?
<!DOCTYPEhtml>
<htmllang="en">
<head>
<metacharset="utf-8">
<title>只能輸入正整數(shù)</title>
</head>
<body>
<inputid="txt" type="text">
<script>
var txt=document.getElementById('txt');
var color=window.getComputedStyle(txt,'').color
txt.addEventListener('keyup',function() {
var reg=newRegExp("^[0-9]*$");;
console.log(reg.test(this.value));
if(reg.test(this.value)){
this.style.color=color;
}else{
this.style.color='red';
}
});
</script>
</body>
</html>
42、請對以下代碼進(jìn)行優(yōu)化
var wrap=document.getElementById(“wrap”);
for(var i=0; i < 10; i++) {
var li=document.createElement(“l(fā)i”);
var text=document.createTextNode(“hello” + i);
li.appendCChild(text);
wrap.appendChild(li);
}
43、請看下面的HTML,寫出您的CSS使左邊元素寬度為200px保持不變,右邊元素隨瀏覽器大小自適應(yīng)
<div class=”outer”>
<div class=”left”></div>
<div class=”right”></div>
</div>
非技術(shù)問題
1、請概述一下你上家公司中項目的具體情況(工作所使用的技術(shù),業(yè)務(wù)流程,周期,)?
我在上家公司做的的網(wǎng)站pc端頁面的開發(fā)與維護(hù)。
主要技術(shù):利用div+css布局,對用戶注冊頁面開發(fā),利用ajax技術(shù)與后臺進(jìn)行數(shù)據(jù)交互,使用Validation插件進(jìn)行表單驗證;使用bootstrap/zepto框架開發(fā)移動端頁面,解決移動端設(shè)備的適配問題;側(cè)邊菜單欄的開發(fā);利用css3完成輪播圖動畫
業(yè)務(wù)流程:根據(jù)需求分析,進(jìn)行詳細(xì)的總體設(shè)計,產(chǎn)生各欄目文件夾的結(jié)構(gòu)圖,根據(jù)美工的表現(xiàn)需要,設(shè)計靜態(tài)網(wǎng)頁和其它動態(tài)頁面界面框架,程序員進(jìn)行代碼開發(fā),做一些必要的測試,由項目組共同聯(lián)調(diào)測試,發(fā)現(xiàn)bug,完善一些具體的細(xì)節(jié)。
周期:3個月
2、常用調(diào)試和優(yōu)化工具?
Firebug+YSlow+其它Firefox擴(kuò)展
瀏覽器自帶工具,IE Developer Toolbar,OperaDragonfly
Fiddler
HTTP Analyzer
HttpWatch
Web Developer
Web Accessibility Toolbar
3、什么叫代碼部署?如何部署?
代碼部署就是把開發(fā)好的網(wǎng)站代碼放到應(yīng)用服務(wù)器上對外提供服務(wù)、部署方式根據(jù)編程語言的不同而不同,但是大體的流程是一致的,生產(chǎn)環(huán)境主要是通過命令加配置文件的形式進(jìn)行部署
4、新技術(shù)通過哪些渠道了解和學(xué)習(xí)?
優(yōu)秀的博客,githup,http://www.daqianduan.com
5、對于前端這個崗位,興趣的比例占多少?
70%
6、前端到底工作內(nèi)容是什么?和UI有什么區(qū)別?
Web前端:主要講UI提供的設(shè)計圖,編碼成靜態(tài)html,實現(xiàn)所有特效;并負(fù)責(zé)所有交互的對接,對js要求較高
UI:主要對移動端和網(wǎng)頁的設(shè)計
7、你當(dāng)時進(jìn)公司時是以什么身份進(jìn)的,實習(xí)生嗎?
是軟件工程師,進(jìn)公司之后直接上崗開發(fā)
8、工作中如果出現(xiàn)空檔期的時候,你們都在做些什么?
答:空檔期的話大家就都學(xué)習(xí),學(xué)一些新的技術(shù),也可以跟著js大神學(xué)習(xí)嘛,不過空檔期的情況也很少,一般就幾天。
9、平常在公司有做網(wǎng)頁制作嗎
答:如果實在忙的時候,我也幫制作師制作一些網(wǎng)頁。
10、忙的時候,會幫網(wǎng)頁制作做到什么程度,百分之多少?
答:一般忙的時候,我會先完成我自己的工作,像一些JS的特效和交互之后,再去幫網(wǎng)頁制作,大概是10%。
11、你在你做過的哪個項目調(diào)試中,遇到了哪些比較深刻的部分,說一說。
你發(fā)現(xiàn)到解決這個問題用了多久?
答:通過你描述的問題難度,和你發(fā)現(xiàn)到解決問題的時間,看你js程度。
12、身為一位web前端工程師,你肯定知道現(xiàn)在最流行的前端技術(shù)有哪些吧?請例舉3例?
瀏覽器兼容性,hack技術(shù),Node.js
13、現(xiàn)有2個空水壺,容積分別為5升和6升,如何利用這兩水壺取出3升水,假設(shè)水無限?
假設(shè)有A,B兩只壺,A壺的容積為5升,B壺的容積為6升,
第一步:將B壺裝滿水,倒入A壺中,此時A壺滿,B壺還剩一升
第二步:將A壺水到掉,將B壺水倒入,此時A壺為一升,B壺空
第三步:將B壺裝滿,倒入A壺中,此時A壺滿,B壺還剩兩升
第四步:重復(fù)第二步的操作,此時A壺剩兩升,B壺空
第五步:重復(fù)第三步的操作,此時A壺滿,B壺還剩三升
14、小明有100元去買汽水,汽水三元一瓶,正好小店有個促銷活動,就是一個空瓶可以換1元錢,假設(shè)小明足夠能喝,問他最多可以喝多少瓶汽水,還剩多少錢或空瓶?
49瓶汽水,還剩1元
---------------------
作者:約德爾蒙
來源:CSDN
原文:https://blog.csdn.net/gyq04551/article/details/55254359
版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請附上博文鏈接!
TML:
1.對WEB標(biāo)準(zhǔn)以及W3C的理解與認(rèn)識
標(biāo)簽閉合、標(biāo)簽小寫、不亂嵌套、提高搜索機(jī)器人搜索幾率、使用外 鏈css和js腳本、結(jié)構(gòu)行為表現(xiàn)的分離、文件下載與頁面速度更快、內(nèi)容能被更多的用戶所訪問、內(nèi)容能被更廣泛的設(shè)備所訪問、更少的代碼和組件,容易維 護(hù)、改版方便,不需要變動頁面內(nèi)容、提供打印版本而不需要復(fù)制內(nèi)容、提高網(wǎng)站易用性;
2.xhtml和html有什么區(qū)別
HTML是一種基本的WEB網(wǎng)頁設(shè)計語言,XHTML是一個基于XML的置標(biāo)語言
最主要的不同:
XHTML 元素必須被正確地嵌套。
XHTML 元素必須被關(guān)閉。
標(biāo)簽名必須用小寫字母。
XHTML 文檔必須擁有根元素。
3.Doctype? 嚴(yán)格模式與混雜模式-如何觸發(fā)這兩種模式,區(qū)分它們有何意義?
用于聲明文檔使用那種規(guī)范(html/Xhtml)一般為 嚴(yán)格 過度 基于框架的html文檔
加入XMl聲明可觸發(fā),解析方式更改為IE5.5 擁有IE5.5的bug
4.行內(nèi)元素有哪些?塊級元素有哪些?CSS的盒模型?
塊級元素:div p h1 h2 h3 h4 form ul
行內(nèi)元素: a b br i span input select
Css盒模型:內(nèi)容,border ,margin,padding
5.CSS引入的方式有哪些? link和@import的區(qū)別是?
內(nèi)聯(lián) 內(nèi)嵌 外鏈 導(dǎo)入
區(qū)別 :同時加載
前者無兼容性,后者CSS2.1以下瀏覽器不支持
Link 支持使用javascript改變樣式,后者不可
6.CSS選擇符有哪些?哪些屬性可以繼承?優(yōu)先級算法如何計算?內(nèi)聯(lián)和important哪個優(yōu)先級高?
標(biāo)簽選擇符 類選擇符 id選擇符
繼承不如指定 Id>class>標(biāo)簽選擇
后者優(yōu)先級高
7.前端頁面有哪三層構(gòu)成,分別是什么?作用是什么?
結(jié)構(gòu)層 Html 表示層 CSS 行為層 js
8.css的基本語句構(gòu)成是?
選擇器{屬性1:值1;屬性2:值2;……}
9.你做的頁面在哪些流覽器測試過?這些瀏覽器的內(nèi)核分別是什么?
Ie(Ie內(nèi)核) 火狐(Gecko) 谷歌(webkit) opear(Presto)
10.寫出幾種IE6 BUG的解決方法
1.雙邊距BUG float引起的 使用display
2.像素問題 使用float引起的 使用dislpay:inline -3px
3.超鏈接hover 點擊后失效 使用正確的書寫順序 link visited hover active
4.Ie z-index問題 給父級添加position:relative
5.Png 透明 使用js代碼 改
6.Min-height 最小高度 !Important 解決’
7.select 在ie6下遮蓋 使用iframe嵌套
8.為什么沒有辦法定義1px左右的寬度容器(IE6默認(rèn)的行高造成的,使用over:hidden,zoom:0.08 line-height:1px)
11.標(biāo)簽上title與alt屬性的區(qū)別是什么?
Alt 當(dāng)圖片不顯示是 用文字代表。
Title 為該屬性提供信息
12.描述css reset的作用和用途。
Reset重置瀏覽器的css默認(rèn)屬性 瀏覽器的品種不同,樣式不同,然后重置,讓他們統(tǒng)一
13.解釋css sprites,如何使用。
Css 精靈 把一堆小的圖片整合到一張大的圖片上,減輕服務(wù)器對圖片的請求數(shù)量
14.瀏覽器標(biāo)準(zhǔn)模式和怪異模式之間的區(qū)別是什么?
盒子模型 渲染模式的不同
使用 window.top.document.compatMode 可顯示為什么模式
15.你如何對網(wǎng)站的文件和資源進(jìn)行優(yōu)化?期待的解決方案包括:
文件合并
文件最小化/文件壓縮
使用CDN托管
緩存的使用
16.什么是語義化的HTML?
直觀的認(rèn)識標(biāo)簽 對于搜索引擎的抓取有好處
17.清除浮動的幾種方式,各自的優(yōu)缺點
1.使用空標(biāo)簽清除浮動 clear:both(理論上能清楚任何標(biāo)簽,,,增加無意義的標(biāo)簽)
2.使用overflow:auto(空標(biāo)簽元素清除浮動而不得不增加無意代碼的弊端,,使用zoom:1用于兼容IE)
3.是用afert偽元素清除浮動(用于非IE瀏覽器)
18、常用那幾種瀏覽器測試?有哪些內(nèi)核(Layout Engine)?
瀏覽器:IE,Chrome,F(xiàn)ireFox,Safari,Opera。
內(nèi)核:Trident,Gecko,Presto,Webkit。
19、 說下行內(nèi)元素和塊級元素的區(qū)別?行內(nèi)塊元素的兼容性使用?(IE8 以下)
行內(nèi)元素:會在水平方向排列,不能包含塊級元素,設(shè)置width無效,height無效(可以設(shè)置line-height),margin上下無效,padding上下無效。
塊級元素:各占據(jù)一行,垂直方向排列。從新行開始結(jié)束接著一個斷行。
兼容性:display:inline-block;*display:inline;*zoom:1;
20、 清除浮動有哪些方式?比較好的方式是哪一種?
(1)父級div定義height。
(2)結(jié)尾處加空div標(biāo)簽clear:both。
(3)父級div定義偽類:after和zoom。
(4)父級div定義overflow:hidden。
(5)父級div定義overflow:auto。
(6)父級div也浮動,需要定義寬度。
(7)父級div定義display:table。
(8)結(jié)尾處加br標(biāo)簽clear:both。
比較好的是第3種方式,好多網(wǎng)站都這么用。
21、box-sizing常用的屬性有哪些?分別有什么作用?
box-sizing: content-box|border-box|inherit;
content-box:寬度和高度分別應(yīng)用到元素的內(nèi)容框。在寬度和高度之外繪制元素的內(nèi)邊距和邊框(元素默認(rèn)效果)。
border-box:元素指定的任何內(nèi)邊距和邊框都將在已設(shè)定的寬度和高度內(nèi)進(jìn)行繪制。通過從已設(shè)定的寬度和高度分別減去邊框和內(nèi)邊距才能得到內(nèi)容的寬度和高度。
22、Doctype作用?標(biāo)準(zhǔn)模式與兼容模式各有什么區(qū)別?
告知瀏覽器的解析器用什么文檔標(biāo)準(zhǔn)解析這個文檔。DOCTYPE不存在或格式不正確會導(dǎo)致文檔以兼容模式呈現(xiàn)。
標(biāo)準(zhǔn)模式的排版和JS運作模式都是以該瀏覽器支持的最高標(biāo)準(zhǔn)運行。在兼容模式中,頁面以寬松的向后兼容的方式顯示,模擬老式瀏覽器的行為以防止站點無法工作。
23、HTML5 為什么只需要寫 ?
HTML5不基于 SGML,因此不需要對DTD進(jìn)行引用,但是需要doctype來規(guī)范瀏覽器的行為(讓瀏覽器按照它們應(yīng)該的方式來運行)。
而HTML4.01基于SGML,所以需要對DTD進(jìn)行引用,才能告知瀏覽器文檔所使用的文檔類型。
24、 頁面導(dǎo)入樣式時,使用link和@import有什么區(qū)別?
(1)link屬于XHTML標(biāo)簽,除了加載CSS外,還能用于定義RSS, 定義rel連接屬性等作用;而@import是CSS提供的,只能用于加載CSS;
(2)頁面被加載的時,link會同時被加載,而@import引用的CSS會等到頁面被加載完再加載;
(3)import是CSS2.1 提出的,只在IE5以上才能被識別,而link是XHTML標(biāo)簽,無兼容問題。
25、介紹一下你對瀏覽器內(nèi)核的理解?
主要分成兩部分:渲染引擎(layout engineer或Rendering Engine)和JS引擎。
渲染引擎:負(fù)責(zé)取得網(wǎng)頁的內(nèi)容(HTML、XML、圖像等等)、整理訊息(例如加入CSS等),以及計算網(wǎng)頁的顯示方式,然后會輸出至顯示器或打印機(jī)。瀏覽器的內(nèi)核的不同對于網(wǎng)頁的語法解釋會有不同,所以渲染的效果也不相同。所有網(wǎng)頁瀏覽器、電子郵件客戶端以及其它需要編輯、顯示網(wǎng)絡(luò)內(nèi)容的應(yīng)用程序都需要內(nèi)核。
JS引擎則:解析和執(zhí)行javascript來實現(xiàn)網(wǎng)頁的動態(tài)效果。
最開始渲染引擎和JS引擎并沒有區(qū)分的很明確,后來JS引擎越來越獨立,內(nèi)核就傾向于只指渲染引擎。
26、html5有哪些新特性?如何處理HTML5新標(biāo)簽的瀏覽器兼容問題?如何區(qū)分 HTML 和 HTML5?
HTML5 現(xiàn)在已經(jīng)不是 SGML 的子集,主要是關(guān)于圖像,位置,存儲,多任務(wù)等功能的增加。
(1)繪畫 canvas;
(2)用于媒介回放的 video 和 audio 元素;
(3)本地離線存儲 localStorage 長期存儲數(shù)據(jù),瀏覽器關(guān)閉后數(shù)據(jù)不丟失;
(4)sessionStorage 的數(shù)據(jù)在瀏覽器關(guān)閉后自動刪除;
(5)語意化更好的內(nèi)容元素,比如 article、footer、header、nav、section;
(6)表單控件,calendar、date、time、email、url、search;
(7)新的技術(shù)webworker, websocket, Geolocation;
IE8/IE7/IE6支持通過document.createElement方法產(chǎn)生的標(biāo)簽,
可以利用這一特性讓這些瀏覽器支持HTML5新標(biāo)簽,
瀏覽器支持新標(biāo)簽后,還需要添加標(biāo)簽?zāi)J(rèn)的樣式。
當(dāng)然也可以直接使用成熟的框架、比如html5shim,
JavaScript:
1.解釋jsonp的原理,以及為什么不是真正的ajax?
動態(tài)創(chuàng)建script標(biāo)簽,回調(diào)函數(shù)
Ajax是頁面無刷新請求數(shù)據(jù)操作
2. apply和call的用法和區(qū)別:
用法:
都能繼承另一個對象的方法和屬性,區(qū)別在于參數(shù)列表不一樣
區(qū)別:
Function.apply(obj, args) args是一個數(shù)組,作為參數(shù)傳給Function
Function.call(obj, arg1, arg2,...) arg*是參數(shù)列表
apply一個妙用: 可以將一個數(shù)組默認(rèn)的轉(zhuǎn)化為一個參數(shù)列表
舉例說明: 有一個數(shù)組arr要push進(jìn)一個新的數(shù)組中去, 如果用call的話需要把數(shù)組中的元素一個個取出來再push, 而用apply只有Array.prototype.push.apply(this, arr)
3. bind函數(shù)的兼容性
用法:
bind()函數(shù)會創(chuàng)建一個新函數(shù), 為綁定函數(shù)。當(dāng)調(diào)用這個綁定函數(shù)時,綁定函數(shù)會以創(chuàng)建它時傳入bind方法的第一個參數(shù)作為this,傳入bind方法的第二個以及以后的參數(shù)加上綁定函數(shù)運行時本身的參數(shù)按照順序作為原函數(shù)的參數(shù)來調(diào)用原函數(shù).
一個綁定函數(shù)也能使用new操作符創(chuàng)建對象:這種行為就像把原函數(shù)當(dāng)成構(gòu)造器。提供的 this 值被忽略,同時調(diào)用時的參數(shù)被提供給模擬函數(shù)。
4. 解釋下事件代理
事件委托利用了事件冒泡, 只指定一個事件處理程序, 就可以管理某一類型的所有事件.
例: html部分: 要點擊li彈出其id
html 代碼效果預(yù)覽
javascript 代碼效果預(yù)覽
//js部分
document.getElementById("list").addHandler("click", function(e){
var e=e || window.event;
var target=e.target || e.srcElement;
if(target.nodeName.toUpperCase=="LI"){
console.log("List item", e,target.id, "was clicked!");
}
});
5. 解釋下js中this是怎么工作的?
this 在 JavaScript 中主要由以下五種使用場景。
作為函數(shù)調(diào)用,this 綁定全局對象,瀏覽器環(huán)境全局對象為 window 。
內(nèi)部函數(shù)內(nèi)部函數(shù)的 this 也綁定全局對象,應(yīng)該綁定到其外層函數(shù)對應(yīng)的對象上,這是 JavaScript的缺陷,用that替換。
作為構(gòu)造函數(shù)使用,this 綁定到新創(chuàng)建的對象。
作為對象方法使用,this 綁定到該對象。
使用apply或call調(diào)用 this 將會被顯式設(shè)置為函數(shù)調(diào)用的第一個參數(shù)。
6. 繼承
參考:js怎么實現(xiàn)繼承?
7. AMD vs. CommonJS?
AMD是依賴提前加載
CMD是依賴延時加載
8. 什么是哈希表?
哈希表(Hash table,也叫散列表),是根據(jù)關(guān)鍵碼值(Key value)而直接進(jìn)行訪問的數(shù)據(jù)結(jié)構(gòu)。也就是說,它通過把關(guān)鍵碼值映射到表中一個位置來訪問記錄,以加快查找的速度。這個映射函數(shù)叫做散列函數(shù),存放記錄的數(shù)組叫做散列表。
使用哈希查找有兩個步驟:
使用哈希函數(shù)將被查找的鍵轉(zhuǎn)換為數(shù)組的索引。在理想的情況下,不同的鍵會被轉(zhuǎn)換為不同的索引值,但是在有些情況下我們需要處理多個鍵被哈希到同一個索引值的情況。
所以哈希查找的第二個步驟就是處理沖突。處理哈希碰撞沖突。有很多處理哈希碰撞沖突的方法,比如拉鏈法和線性探測法。
元素特征轉(zhuǎn)變?yōu)閿?shù)組下標(biāo)的方法就是散列法。散列法當(dāng)然不止一種,下面列出三種比較常用的:
1,除法散列法
最直觀的一種,上圖使用的就是這種散列法,公式: index=value % 16
學(xué)過匯編的都知道,求模數(shù)其實是通過一個除法運算得到的,所以叫“除法散列法”。
2,平方散列法
求index是非常頻繁的操作,而乘法的運算要比除法來得省時(對現(xiàn)在的CPU來說,估計我們感覺不出來),所以我們考慮把除法換成乘法和一個位移操作。公式: index=(value * value) >> 28 (右移,除以2^28。記法:左移變大,是乘。右移變小,是除。)
如果數(shù)值分配比較均勻的話這種方法能得到不錯的結(jié)果,但我上面畫的那個圖的各個元素的值算出來的index都是0——非常失敗。也許你還有個問題,value如果很大,value * value不會溢出嗎?答案是會的,但我們這個乘法不關(guān)心溢出,因為我們根本不是為了獲取相乘結(jié)果,而是為了獲取index。
3,斐波那契(Fibonacci)散列法
解決沖突的方法:
1. 拉鏈法
將大小為M 的數(shù)組的每一個元素指向一個條鏈表,鏈表中的每一個節(jié)點都存儲散列值為該索引的鍵值對,這就是拉鏈法.
對采用拉鏈法的哈希實現(xiàn)的查找分為兩步,首先是根據(jù)散列值找到等一應(yīng)的鏈表,然后沿著鏈表順序找到相應(yīng)的鍵。
2. 線性探測法:
使用數(shù)組中的空位解決碰撞沖突
參考:淺談算法和數(shù)據(jù)結(jié)構(gòu): 十一 哈希表 哈希表的工作原理
9. 什么是閉包? 閉包有什么作用?
閉包是指有權(quán)訪問另一個函數(shù)作用域中的變量的函數(shù). 創(chuàng)建閉包常見方式,就是在一個函數(shù)內(nèi)部創(chuàng)建另一個函數(shù).
作用:
匿名自執(zhí)行函數(shù) (function (){ ... })(); 創(chuàng)建了一個匿名的函數(shù),并立即執(zhí)行它,由于外部無法引用它內(nèi)部的變量,因此在執(zhí)行完后很快就會被釋放,關(guān)鍵是這種機(jī)制不會污染全局對象。
緩存, 可保留函數(shù)內(nèi)部的值
實現(xiàn)封裝
實現(xiàn)模板
參考: js閉包的用途
10. 偽數(shù)組:
什么是偽數(shù)組:
偽數(shù)組是能通過Array.prototype.slice 轉(zhuǎn)換為真正的數(shù)組的帶有l(wèi)ength屬性的對象
比如arguments對象,還有像調(diào)用getElementsByTagName,document.childNodes之類的,它們都返回NodeList對象都屬于偽數(shù)組
我們可以通過Array.prototype.slice.call(fakeArray)將偽數(shù)組轉(zhuǎn)變?yōu)檎嬲腁rray對象: 返回新數(shù)組而不會修改原數(shù)組
參考:偽數(shù)組
11. undefined和null的區(qū)別, 還有undeclared:
null表示沒有對象, 即此處不該有此值. 典型用法:
(1) 作為函數(shù)的參數(shù),表示該函數(shù)的參數(shù)不是對象。
(2) 作為對象原型鏈的終點。
( 3 ) null可以作為空指針. 只要意在保存對象的值還沒有真正保存對象,就應(yīng)該明確地讓該對象保存null值.
undefined表示缺少值, 即此處應(yīng)該有值, 但還未定義.
(1)變量被聲明了,但沒有賦值時,就等于undefined。
(2) 調(diào)用函數(shù)時,應(yīng)該提供的參數(shù)沒有提供,該參數(shù)等于undefined。
(3)對象沒有賦值的屬性,該屬性的值為undefined。
(4)函數(shù)沒有返回值時,默認(rèn)返回undefined。
undeclared即為被污染的命名, 訪問沒有被聲明的變量, 則會拋出異常, 終止執(zhí)行. 即undeclared是一種語法錯誤
參考: undefined與null的區(qū)別
12. 事件冒泡機(jī)制:
從目標(biāo)元素開始,往頂層元素傳播。途中如果有節(jié)點綁定了相應(yīng)的事件處理函數(shù),這些函數(shù)都會被一次觸發(fā)。如果想阻止事件起泡,可以使用e.stopPropagation()(Firefox)或者e.cancelBubble=true(IE)來組織事件的冒泡傳播。
13. 解釋下為什么接下來這段代碼不是 IIFE(立即調(diào)用的函數(shù)表達(dá)式):function foo(){ }();?
而函數(shù)定義(語句以function關(guān)鍵字開始)是不能被立即執(zhí)行的,這無疑會導(dǎo)致語法的錯誤(SyntaxError)。當(dāng)函數(shù)定義代碼段包裹在括號內(nèi),使解析器可以將之識別為函數(shù)表達(dá)式,然后調(diào)用。IIFE: (function foo(){})()
區(qū)分 (function(){})(); 和 (function(){}()); 其實兩者實現(xiàn)效果一樣。
函數(shù)字面量:首先聲明一個函數(shù)對象,然后執(zhí)行它。(function () { alert(1); })();
優(yōu)先表達(dá)式:由于Javascript執(zhí)行表達(dá)式是從圓括號里面到外面,所以可以用圓括號強(qiáng)制執(zhí)行聲明的函數(shù)。(function () { alert(2); }());
14. "attribute" 和 "property" 的區(qū)別是什么?
DOM元素的attribute和property兩者是不同的東西。attribute翻譯為“特性”,property翻譯為“屬性”。
attribute是一個特性節(jié)點,每個DOM元素都有一個對應(yīng)的attributes屬性來存放所有的attribute節(jié)點,attributes是一個類數(shù)組的容器,說得準(zhǔn)確點就是NameNodeMap,不繼承于Array.prototype,不能直接調(diào)用Array的方法。attributes的每個數(shù)字索引以名值對(name=”value”)的形式存放了一個attribute節(jié)點。
hello
property就是一個屬性,如果把DOM元素看成是一個普通的Object對象,那么property就是一個以名值對(name=”value”)的形式存放在Object中的屬性。要添加和刪除property和普通的對象類似。
很多attribute節(jié)點還有一個相對應(yīng)的property屬性,比如上面的div元素的id和class既是attribute,也有對應(yīng)的property,不管使用哪種方法都可以訪問和修改。
總之,attribute節(jié)點都是在HTML代碼中可見的,而property只是一個普通的名值對屬性。
15. 請指出 document load 和 document ready 兩個事件的區(qū)別。
document.ready和onload的區(qū)別——JavaScript文檔加載完成事件。頁面加載完成有兩種事件:
一是ready,表示文檔結(jié)構(gòu)已經(jīng)加載完成(不包含圖片等非文字媒體文件)
二是onload,指示頁面包含圖片等文件在內(nèi)的所有元素都加載完成。
jQuery中$(function(){});他的作用或者意義就是:在DOM加載完成后就可以可以對DOM進(jìn)行操作。一般情況先一個頁面響應(yīng)加載的順序是,域名解析-加載html-加載js和css-加載圖片等其他信息。
16. 什么是use strict? 其好處壞處分別是什么?
在所有的函數(shù) (或者所有最外層函數(shù)) 的開始處加入 "use strict"; 指令啟動嚴(yán)格模式。
"嚴(yán)格模式"有兩種調(diào)用方法
1)將"use strict"放在腳本文件的第一行,則整個腳本都將以"嚴(yán)格模式"運行。如果這行語句不在第一行,則無效,整個腳本以"正常模式"運行。如果不同模式的代碼文件合并成一個文件,這一點需要特別注意。
2)將整個腳本文件放在一個立即執(zhí)行的匿名函數(shù)之中。
好處
- 消除Javascript語法的一些不合理、不嚴(yán)謹(jǐn)之處,減少一些怪異行為;
- 消除代碼運行的一些不安全之處,保證代碼運行的安全;
- 提高編譯器效率,增加運行速度;
- 為未來新版本的Javascript做好鋪墊。
壞處
同樣的代碼,在"嚴(yán)格模式"中,可能會有不一樣的運行結(jié)果;一些在"正常模式"下可以運行的語句,在"嚴(yán)格模式"下將不能運行
17. 瀏覽器端的js包括哪幾個部分?
核心( ECMAScript) , 文檔對象模型(DOM), 瀏覽器對象模型(BOM)
18. DOM包括哪些對象?
DOM是針對HTML和XML文檔的一個API(應(yīng)用程序編程接口). DOM描繪了一個層次化的節(jié)點樹, 允許開發(fā)人員添加, 移除和修改頁面的某一部分.
常用的DOM方法:
getElementById(id)
getElementsByTagName()
appendChild(node)
removeChild(node)
replaceChild()
insertChild()
createElement()
createTextNode()
getAttribute()
setAttribute()
常用的DOM屬性
innerHTML 節(jié)點(元素)的文本值
parentNode 節(jié)點(元素)的父節(jié)點
childNodes
attributes 節(jié)點(元素)的屬性節(jié)點
參考: HTML DOM 方法
19. js有哪些基本類型?
Undefined, Null, Boolean, Number, String
Object是復(fù)雜數(shù)據(jù)類型, 其本質(zhì)是由一組無序的名值對組成的.
20. 基本類型與引用類型有什么區(qū)別?
基本類型如上題所示. 引用類型則有: Object, Array, Date, RegExp, Function
存儲
基本類型值在內(nèi)存中占據(jù)固定大小的空間,因此被保存在棧內(nèi)存中
引用類型的值是對象, 保存在堆內(nèi)存中. 包含引用類型的變量實際上包含的并不是對象本身, 而是一個指向改對象的指針
復(fù)制
從一個變量向另一個變量復(fù)制基本類型的值, 會創(chuàng)建這個值的一個副本
從一個變量向另一個變量復(fù)制引用類型的值, 復(fù)制的其實是指針, 因此兩個變量最終都指向同一個對象
檢測類型
確定一個值是哪種基本類型可以用typeof操作符,
而確定一個值是哪種引用類型可以使用instanceof操作符
21. 關(guān)于js的垃圾收集例程
js是一門具有自動垃圾回收機(jī)制的編程語言,開發(fā)人員不必關(guān)心內(nèi)存分配和回收問題
離開作用域的值將被自動標(biāo)記為可以回收, 因此將在垃圾收集期間被刪除
"標(biāo)記清除"是目前主流的垃圾收集算法, 這種算法的思路是給當(dāng)前不使用的值加上標(biāo)記, 然后再回收其內(nèi)存
另一種垃圾收集算法是"引用計數(shù)", 這種算法的思想是跟蹤記錄所有值被引用的次數(shù). js引擎目前都不再使用這種算法, 但在IE中訪問非原生JS對象(如DOM元素)時, 這種算法仍然可能會導(dǎo)致問題
當(dāng)代碼中存在循環(huán)引用現(xiàn)象時, "引用計數(shù)" 算法就會導(dǎo)致問題
解除變量的引用不僅有助于消除循環(huán)引用現(xiàn)象, 而且對垃圾收集也有好處. 為了確保有效地回收內(nèi)存, 應(yīng)該及時解除不再使用的全局對象, 全局對象屬性以及循環(huán)引用變量的引用
22. ES5中, 除了函數(shù),什么能夠產(chǎn)生作用域?
try-catch 和with延長作用域. 因為他們都會創(chuàng)建一個新的變量對象.
這兩個語句都會在作用域鏈的前端添加一個變量對象. 對with語句來說, 會將指定的對象添加到作用域鏈中. 對catch語句來說, 會創(chuàng)建一個新的變量對象, 其中包含的是被拋出的錯誤對象的聲明.
當(dāng)try代碼塊中發(fā)生錯誤時,執(zhí)行過程會跳轉(zhuǎn)到catch語句,然后把異常對象推入一個可變對象并置于作用域的頭部。在catch代碼塊內(nèi)部,函數(shù)的所有局部變量將會被放在第二個作用域鏈對象中。請注意,一旦catch語句執(zhí)行完畢,作用域鏈機(jī)會返回到之前的狀態(tài)。try-catch語句在代碼調(diào)試和異常處理中非常有用,因此不建議完全避免。你可以通過優(yōu)化代碼來減少catch語句對性能的影響。一個很好的模式是將錯誤委托給一個函數(shù)處理
with(object) {statement}。它的意思是把object添加到作用域鏈的頂端
23. js有幾種函數(shù)調(diào)用方式?
方法調(diào)用模型 var obj={ func : function(){};} obj.func()
函數(shù)調(diào)用模式 var func=function(){} func();
構(gòu)造器調(diào)用模式
apply/ call調(diào)用模式
24. 描述事件模型?IE的事件模型是怎樣的?事件代理是什么?事件代理中怎么定位實際事件產(chǎn)生的目標(biāo)?
捕獲->處于目標(biāo)->冒泡,IE應(yīng)該是只有冒泡沒有捕獲。
事件代理就是在父元素上綁定事件來處理,通過event對象的target來定位。
25. js動畫有哪些實現(xiàn)方法?
用定時器 setTimeout和setInterval
26. 還有什么實現(xiàn)動畫的方法?
js動畫:使用定時器 setTimeout和setInterval
CSS : transition , animation
transition 包含4種屬性:transition-delaytransition-durationtransition-propertytransition-timing-function,對應(yīng)動畫的4種屬性: 延遲、持續(xù)時間、對應(yīng)css屬性和緩動函數(shù),
transform 包含7種屬性:animation-nameanimation-durationanimation-timing-functionanimation-delayanimation-directionanimation-iteration-countanimation-fill-modeanimation-play-state,它們可以定義動畫名稱,持續(xù)時間,緩動函數(shù),動畫延遲,動畫方向,重復(fù)次數(shù),填充模式。
HTML5 動畫
canvas
svg
webgl
參考:前端動畫效果實現(xiàn)的簡單比較
27. 面向?qū)ο笥心膸讉€特點?
封裝, 繼承, 多態(tài)
28. 如何判斷屬性來自自身對象還是原型鏈?
hasOwnPrototype
29. ES6新特性
1) 箭頭操作符 inputs=>outputs: 操作符左邊是輸入的參數(shù),而右邊則是進(jìn)行的操作以及返回的值
2) 支持類, 引入了class關(guān)鍵字. ES6提供的類實際上就是JS原型模式的包裝
3) 增強(qiáng)的對象字面量.
1. 可以在對象字面量中定義原型 __proto__: xxx //設(shè)置其原型為xxx,相當(dāng)于繼承xxx
2. 定義方法可以不用function關(guān)鍵字
3. 直接調(diào)用父類方法
4) 字符串模板: ES6中允許使用反引號 ` 來創(chuàng)建字符串,此種方法創(chuàng)建的字符串里面可以包含由美元符號加花括號包裹的變量${vraible}。
5) 自動解析數(shù)組或?qū)ο笾械闹?。比如若一個函數(shù)要返回多個值,常規(guī)的做法是返回一個對象,將每個值做為這個對象的屬性返回。但在ES6中,利用解構(gòu)這一特性,可以直接返回一個數(shù)組,然后數(shù)組中的值會自動被解析到對應(yīng)接收該值的變量中。
6) 默認(rèn)參數(shù)值: 現(xiàn)在可以在定義函數(shù)的時候指定參數(shù)的默認(rèn)值了,而不用像以前那樣通過邏輯或操作符來達(dá)到目的了。
7) 不定參數(shù)是在函數(shù)中使用命名參數(shù)同時接收不定數(shù)量的未命名參數(shù)。在以前的JavaScript代碼中我們可以通過arguments變量來達(dá)到這一目的。不定參數(shù)的格式是三個句點后跟代表所有不定參數(shù)的變量名。比如下面這個例子中,…x代表了所有傳入add函數(shù)的參數(shù)。
8) 拓展參數(shù)則是另一種形式的語法糖,它允許傳遞數(shù)組或者類數(shù)組直接做為函數(shù)的參數(shù)而不用通過apply。
9) let和const關(guān)鍵字: 可以把let看成var,只是它定義的變量被限定在了特定范圍內(nèi)才能使用,而離開這個范圍則無效。const則很直觀,用來定義常量,即無法被更改值的變量。
10) for of值遍歷 每次循環(huán)它提供的不是序號而是值。
11) iterator, generator
12) 模塊
13) Map, Set, WeakMap, WeakSet
14) Proxy可以監(jiān)聽對象身上發(fā)生了什么事情,并在這些事情發(fā)生后執(zhí)行一些相應(yīng)的操作。一下子讓我們對一個對象有了很強(qiáng)的追蹤能力,同時在數(shù)據(jù)綁定方面也很有用處。
15) Symbols Symbol 通過調(diào)用symbol函數(shù)產(chǎn)生,它接收一個可選的名字參數(shù),該函數(shù)返回的symbol是唯一的。之后就可以用這個返回值做為對象的鍵了。Symbol還可以用來創(chuàng)建私有屬性,外部無法直接訪問由symbol做為鍵的屬性值。
16) Math, Number, String, Object的新API
17) Promises是處理異步操作的一種模式
參考:ES6新特性概覽
30. 如何獲取某個DOM節(jié)點
獲取節(jié)點: getElementById() getElementsByTagName()
31. 用LESS如何給某些屬性加瀏覽器前綴?
可以自定義一個函數(shù)
.border-radius(@values) {
-webkit-border-radius: @values;
-moz-border-radius: @values;
border-radius: @values;
}
div {
.border-radius(10px);
}
32.eval是做什么的?
它的功能是把對應(yīng)的字符串解析成JS代碼并運行;
應(yīng)該避免使用eval,不安全,非常耗性能(2次,一次解析成js語句,一次執(zhí)行)。
33. 圖片預(yù)加載的實現(xiàn)
使用jQuery圖片預(yù)加載插件Lazy Load
1.加載jQuery, 與jquery.lazyload.js
2.設(shè)置圖片的占位符為data-original, 給圖片一個特別的標(biāo)簽,比如class=".lazy"
3.然后延遲加載: $('img.lazy').lazyload();這個函數(shù)可以選擇一些參數(shù):
3.1.圖片預(yù)先加載距離:threshold,通過設(shè)置這個值,在圖片未出現(xiàn)在可視區(qū)域的頂部距離這個值時加載。
3.2.事件綁定加載的方式:event
3.3.圖片限定在某個容器內(nèi):container
使用js實現(xiàn)圖片加載: 就是new一個圖片對象, 綁定onload函數(shù), 賦值url
用CSS實現(xiàn)圖片的預(yù)加載
寫一個CSS樣式設(shè)置一批背景圖片,然后將其隱藏
改進(jìn): 使用js來推遲預(yù)加載時間, 防止與頁面其他內(nèi)容一起加載
用Ajax實現(xiàn)預(yù)加載
其實就是通過ajax請求請求圖片地址. 還可以用這種方式加載css,js文件等
34. 如果在同一個元素上綁定了兩個click事件, 一個在捕獲階段執(zhí)行, 一個在冒泡階段執(zhí)行. 那么當(dāng)觸發(fā)click條件時, 會執(zhí)行幾個事件? 執(zhí)行順序是什么?
我在回答這個題的時候說是兩個事件, 先執(zhí)行捕獲的后執(zhí)行冒泡的. 其實是不對的.
綁定在目標(biāo)元素上的事件是按照綁定的順序執(zhí)行的!!!!
即: 綁定在被點擊元素的事件是按照代碼順序發(fā)生,其他元素通過冒泡或者捕獲“感知”的事件,按照W3C的標(biāo)準(zhǔn),先發(fā)生捕獲事件,后發(fā)生冒泡事件。所有事件的順序是:其他元素捕獲階段事件 -> 本元素代碼順序事件 -> 其他元素冒泡階段事件 。
參考: JavaScript-父子dom同時綁定兩個點擊事件,一個用捕獲,一個用冒泡時執(zhí)行順序
35. js中怎么實現(xiàn)塊級作用域?
使用匿名函數(shù), (立即執(zhí)行函數(shù))
(function(){...})()
使用es6
塊級作用域引入了兩種新的聲明形式,可以用它們定義一個只存在于某個語句塊中的變量或常量.這兩種新的聲明關(guān)鍵字為:
let: 語法上非常類似于var, 但定義的變量只存在于當(dāng)前的語句塊中
const: 和let類似,但聲明的是一個只讀的常量
使用let代替var可以更容易的定義一個只在某個語句塊中存在的局部變量,而不用擔(dān)心它和函數(shù)體中其他部分的同名變量有沖突.在let語句內(nèi)部用var聲明的變量和在let語句外部用var聲明的變量沒什么差別,它們都擁有函數(shù)作用域,而不是塊級作用域.
36. 構(gòu)造函數(shù)里定義function和使用prototype.func的區(qū)別?
1. 直接調(diào)用function,每一個類的實例都會拷貝這個函數(shù),弊端就是浪費內(nèi)存(如上)。prototype方式定義的方式,函數(shù)不會拷貝到每一個實例中,所有的實例共享prototype中的定義,節(jié)省了內(nèi)存。
2. 但是如果prototype的屬性是對象的話,所有實例也會共享一個對象(這里問的是函數(shù)應(yīng)該不會出現(xiàn)這個情況),如果其中一個實例改變了對象的值,則所有實例的值都會被改變。同理的話,如果使用prototype調(diào)用的函數(shù),一旦改變,所有實例的方法都會改變。——不可以對實例使用prototype屬性,只能對類和函數(shù)用。
37. js實現(xiàn)對象的深克隆
因為js中數(shù)據(jù)類型分為基本數(shù)據(jù)類型(number, string, boolean, null, undefined)和引用類型值(對象, 數(shù)組, 函數(shù)). 這兩類對象在復(fù)制克隆的時候是有很大區(qū)別的. 原始類型存儲的是對象的實際數(shù)據(jù), 而對象類型存儲的是對象的引用地址(對象的實際內(nèi)容單獨存放, 為了減少數(shù)據(jù)開銷通常放在內(nèi)存中). 此外, 對象的原型也是引用對象, 它把原型的屬性和方法放在內(nèi)存中, 通過原型鏈的方式來指向這個內(nèi)存地址.
于是克隆也會分為兩類:
淺度克隆:原始類型為值傳遞, 對象類型仍為引用傳遞
深度克?。核性鼗?qū)傩跃耆珡?fù)制, 與原對象完全脫離, 也就是說所有對于新對象的修改都不會反映到原對象中
西安尚學(xué)堂 http://www.xasxt.com/
?
Java零基礎(chǔ)就業(yè)班 最新開班日期:9月24日
上課地址:陜西省西安市高新區(qū)科技二路西安軟件園天澤大廈五樓
咨詢電話:029-62258374 QQ 2145598324
?
?
招生對象:
1. 零計算機(jī)編程基礎(chǔ)學(xué)
2. 對行業(yè)不滿意人士
3. 跨專業(yè)編程愛好者
4. 在校大學(xué)生實訓(xùn)
?
Java零基礎(chǔ)班,10年 Java 以上開發(fā)經(jīng)驗技術(shù)講師、架構(gòu)師、行業(yè)大牛,親自純面授課程,手把手教你寫編程。
?
9月新班免費試聽課程已就緒,7天免費聽課,體驗Java樂趣。
最近在整理 CSS 的時候發(fā)現(xiàn)遇到了很多面試中常見的面試題,本部分主要原作者在 Github 等各大論壇收錄的 CSS 相關(guān)知識和一些相關(guān)面試題時所做的筆記,分享這份總結(jié)給大家,對大家對 CSS 的可以來一次全方位的檢漏和排查,感謝原作者 CavsZhouyou 的付出,原文鏈接放在文章最下方,如果出現(xiàn)錯誤,希望大家共同指出!
前面CSS寫法104個知識從01-52點已經(jīng)講過了,在本篇文章我就不再重復(fù)了。具體如下:
《關(guān)于前端CSS寫法104個知識點匯總(一)》
接下來開始進(jìn)入正題:
因為移動端瀏覽器默認(rèn)的viewport叫做layoutviewport。在移動端顯示時,因為layoutviewport的寬度大于移動端屏幕
的寬度,所以頁面會出現(xiàn)滾動條左右移動,fixed的元素是相對layoutviewport來固定位置的,而不是移動端屏幕來固定位置的
,所以會出現(xiàn)感覺fixed無效的情況。
如果想實現(xiàn)fixed相對于屏幕的固定效果,我們需要改變的是viewport的大小為idealviewport,可以如下設(shè)置:
<metaname="viewport"content="width=device-width,initial-scale=1.0,maximum-scale=1.0,minimum-sca
le=1.0,user-scalable=no"/>
多數(shù)顯示器默認(rèn)頻率是60Hz,即1秒刷新60次,所以理論上最小間隔為1/60*1000ms=16.7ms
移除空格、使用margin負(fù)值、使用font-size:0、letter-spacing、word-spacing
詳細(xì)資料可以參考:《去除 inline-block 元素間間距的 N 種方法》
以下代碼可解決這種卡頓的問題:-webkit-overflow-scrolling:touch;是因為這行代碼啟用了硬件加速特性,所以滑動很流
暢。
詳細(xì)資料可以參考:《解決頁面使用 overflow:scroll 在 iOS 上滑動卡頓的問題》
(1)外層div使用position:relative;高度要求自適應(yīng)的div使用position:absolute;top:100px;bottom:0;
left:0;right:0;
(2)使用flex布局,設(shè)置主軸為豎軸,第二個div的flex-grow為1。
詳細(xì)資料可以參考:《有一個高度自適應(yīng)的 div,里面有兩個 div,一個高度 100px,希望另一個填滿剩下的高度(三種方案)》
相關(guān)知識點:
(1)BMP,是無損的、既支持索引色也支持直接色的、點陣圖。這種圖片格式幾乎沒有對數(shù)據(jù)進(jìn)行壓縮,所以BMP格式的圖片通常
具有較大的文件大小。
(2)GIF是無損的、采用索引色的、點陣圖。采用LZW壓縮算法進(jìn)行編碼。文件小,是GIF格式的優(yōu)點,同時,GIF格式還具
有支持動畫以及透明的優(yōu)點。但,GIF格式僅支持8bit的索引色,所以GIF格式適用于對色彩要求不高同時需要文件體積
較小的場景。
(3)JPEG是有損的、采用直接色的、點陣圖。JPEG的圖片的優(yōu)點,是采用了直接色,得益于更豐富的色彩,JPEG非常適合用來
存儲照片,與GIF相比,JPEG不適合用來存儲企業(yè)Logo、線框類的圖。因為有損壓縮會導(dǎo)致圖片模糊,而直接色的選用,
又會導(dǎo)致圖片文件較GIF更大。
(4)PNG-8是無損的、使用索引色的、點陣圖。PNG是一種比較新的圖片格式,PNG-8是非常好的GIF格式替代者,在可能的
情況下,應(yīng)該盡可能的使用PNG-8而不是GIF,因為在相同的圖片效果下,PNG-8具有更小的文件體積。除此之外,PNG-8
還支持透明度的調(diào)節(jié),而GIF并不支持。現(xiàn)在,除非需要動畫的支持,否則我們沒有理由使用GIF而不是PNG-8。
(5)PNG-24是無損的、使用直接色的、點陣圖。PNG-24的優(yōu)點在于,它壓縮了圖片的數(shù)據(jù),使得同樣效果的圖片,PNG-24格
式的文件大小要比BMP小得多。當(dāng)然,PNG24的圖片還是要比JPEG、GIF、PNG-8大得多。
(6)SVG是無損的、矢量圖。SVG是矢量圖。這意味著SVG圖片由直線和曲線以及繪制它們的方法組成。當(dāng)你放大一個SVG圖
片的時候,你看到的還是線和曲線,而不會出現(xiàn)像素點。這意味著SVG圖片在放大時,不會失真,所以它非常適合用來繪制企
業(yè)Logo、Icon等。
(7)WebP是谷歌開發(fā)的一種新圖片格式,WebP是同時支持有損和無損壓縮的、使用直接色的、點陣圖。從名字就可以看出來它是
為Web而生的,什么叫為Web而生呢?就是說相同質(zhì)量的圖片,WebP具有更小的文件體積。現(xiàn)在網(wǎng)站上充滿了大量的圖片,
如果能夠降低每一個圖片的文件大小,那么將大大減少瀏覽器和服務(wù)器之間的數(shù)據(jù)傳輸量,進(jìn)而降低訪問延遲,提升訪問體驗。
?在無損壓縮的情況下,相同質(zhì)量的WebP圖片,文件大小要比PNG小26%;
?在有損壓縮的情況下,具有相同圖片精度的WebP圖片,文件大小要比JPEG小25%~34%;
?WebP圖片格式支持圖片透明度,一個無損壓縮的WebP圖片,如果要支持透明度只需要22%的格外文件大小。
但是目前只有Chrome瀏覽器和Opera瀏覽器支持WebP格式,兼容性不太好。
回答:
我了解到的一共有七種常見的圖片的格式。
(1)第一種是BMP格式,它是無損壓縮的,支持索引色和直接色的點陣圖。由于它基本上沒有進(jìn)行壓縮,因此它的文件體積一般比
較大。
(2)第二種是GIF格式,它是無損壓縮的使用索引色的點陣圖。由于使用了LZW壓縮方法,因此文件的體積很小。并且GIF還
支持動畫和透明度。但因為它使用的是索引色,所以它適用于一些對顏色要求不高且需要文件體積小的場景。
(3)第三種是JPEG格式,它是有損壓縮的使用直接色的點陣圖。由于使用了直接色,色彩較為豐富,一般適用于來存儲照片。但
由于使用的是直接色,可能文件的體積相對于GIF格式來說更大。
(4)第四種是PNG-8格式,它是無損壓縮的使用索引色的點陣圖。它是GIF的一種很好的替代格式,它也支持透明度的調(diào)整,并
且文件的體積相對于GIF格式更小。一般來說如果不是需要動畫的情況,我們都可以使用PNG-8格式代替GIF格式。
(5)第五種是PNG-24格式,它是無損壓縮的使用直接色的點陣圖。PNG-24的優(yōu)點是它使用了壓縮算法,所以它的體積比BMP
格式的文件要小得多,但是相對于其他的幾種格式,還是要大一些。
(6)第六種格式是svg格式,它是矢量圖,它記錄的圖片的繪制方式,因此對矢量圖進(jìn)行放大和縮小不會產(chǎn)生鋸齒和失真。它一般
適合于用來制作一些網(wǎng)站logo或者圖標(biāo)之類的圖片。
(7)第七種格式是webp格式,它是支持有損和無損兩種壓縮方式的使用直接色的點陣圖。使用webp格式的最大的優(yōu)點是,在相
同質(zhì)量的文件下,它擁有更小的文件體積。因此它非常適合于網(wǎng)絡(luò)圖片的傳輸,因為圖片體積的減少,意味著請求時間的減小,
這樣會提高用戶的體驗。這是谷歌開發(fā)的一種新的圖片格式,目前在兼容性上還不是太好。
詳細(xì)資料可以參考:《圖片格式那么多,哪種更適合你?》
(1)寬高判斷法。通過創(chuàng)建image對象,將其src屬性設(shè)置為webp格式的圖片,然后在onload事件中獲取圖片的寬高,如
果能夠獲取,則說明瀏覽器支持webp格式圖片。如果不能獲取或者觸發(fā)了onerror函數(shù),那么就說明瀏覽器不支持webp格
式的圖片。
(2)canvas判斷方法。我們可以動態(tài)的創(chuàng)建一個canvas對象,通過canvas的toDataURL將設(shè)置為webp格式,然后判斷
返回值中是否含有image/webp字段,如果包含則說明支持WebP,反之則不支持。
詳細(xì)資料可以參考:《判斷瀏覽器是否支持 WebP 圖片》《toDataURL()》
網(wǎng)站向服務(wù)器請求的時候,會自動帶上cookie這樣增加表頭信息量,使請求變慢。
如果靜態(tài)文件都放在主域名下,那靜態(tài)文件請求的時候都帶有的cookie的數(shù)據(jù)提交給server的,非常浪費流量,所以不如隔離開
,靜態(tài)資源放CDN。
因為cookie有域的限制,因此不能跨域提交請求,故使用非主要域名的時候,請求頭中就不會帶有cookie數(shù)據(jù),這樣可以降低請
求頭的大小,降低請求時間,從而達(dá)到降低整體請求延時的目的。
同時這種方式不會將cookie傳入WebServer,也減少了WebServer對cookie的處理分析環(huán)節(jié),提高了webserver的
http請求的解析速度。
詳細(xì)資料可以參考:《CDN 是什么?使用 CDN 有什么優(yōu)勢?》
頁面加載自上而下當(dāng)然是先加載樣式。寫在body標(biāo)簽后由于瀏覽器以逐行方式對HTML文檔進(jìn)行解析,當(dāng)解析到寫在尾部的樣式
表(外聯(lián)或?qū)懺趕tyle標(biāo)簽)會導(dǎo)致瀏覽器停止之前的渲染,等待加載且解析樣式表完成之后重新渲染,在windows的IE下可
能會出現(xiàn)FOUC現(xiàn)象(即樣式失效導(dǎo)致的頁面閃爍問題)
CSS預(yù)處理器定義了一種新的語言,其基本思想是,用一種專門的編程語言,為CSS增加了一些編程的特性,將CSS作為目標(biāo)生成
文件,然后開發(fā)者就只要使用這種語言進(jìn)行編碼工作。通俗的說,CSS預(yù)處理器用一種專門的編程語言,進(jìn)行Web頁面樣式設(shè)計,然
后再編譯成正常的CSS文件。
預(yù)處理器例如:LESS、Sass、Stylus,用來預(yù)編譯Sass或lesscsssprite,增強(qiáng)了css代碼的復(fù)用性,還有層級、mixin、
變量、循環(huán)、函數(shù)等,具有很方便的UI組件模塊化開發(fā)能力,極大的提高工作效率。
CSS后處理器是對CSS進(jìn)行處理,并最終生成CSS的預(yù)處理器,它屬于廣義上的CSS預(yù)處理器。我們很久以前就在用CSS后
處理器了,最典型的例子是CSS壓縮工具(如clean-css),只不過以前沒單獨拿出來說過。還有最近比較火的Autoprefixer,
以CanIUse上的瀏覽器支持?jǐn)?shù)據(jù)為基礎(chǔ),自動處理兼容性問題。
后處理器例如:PostCSS,通常被視為在完成的樣式表中根據(jù)CSS規(guī)范處理CSS,讓其更有效;目前最常做的是給CSS屬性添加瀏
覽器私有前綴,實現(xiàn)跨瀏覽器兼容性的問題。
詳細(xì)資料可以參考:《CSS 預(yù)處理器和后處理器》
將一個頁面涉及到的所有圖片都包含到一張大圖中去,然后利用CSS的background-image,background-repeat,background
-position的組合進(jìn)行背景定位。利用CSSSprites能很好地減少網(wǎng)頁的http請求,從而很好的提高頁面的性能;CSSSprites
能減少圖片的字節(jié)。
優(yōu)點:
減少HTTP請求數(shù),極大地提高頁面加載速度
增加圖片信息重復(fù)度,提高壓縮比,減少圖片大小
更換風(fēng)格方便,只需在一張或幾張圖片上修改顏色或樣式即可實現(xiàn)
缺點:
圖片合并麻煩
維護(hù)麻煩,修改一個圖片可能需要重新布局整個圖片,樣式
優(yōu)點:
在屏幕分辨率千差萬別的時代,只要將rem與屏幕分辨率關(guān)聯(lián)起來就可以實現(xiàn)頁面的整體縮放,使得在設(shè)備上的展現(xiàn)都統(tǒng)一起來了。
而且現(xiàn)在瀏覽器基本都已經(jīng)支持rem了,兼容性也非常的好。
缺點:
(1)在奇葩的dpr設(shè)備上表現(xiàn)效果不太好,比如一些華為的高端機(jī)型用rem布局會出現(xiàn)錯亂。
(2)使用iframe引用也會出現(xiàn)問題。
(3)rem在多屏幕尺寸適配上與當(dāng)前兩大平臺的設(shè)計哲學(xué)不一致。即大屏的出現(xiàn)到底是為了看得又大又清楚,還是為了看的更多的問
題。
詳細(xì)資料可以參考:《css3 的字體大小單位 rem 到底好在哪?》《VW:是時候放棄 REM 布局了》《為什么設(shè)計稿是 750px》《使用 Flexible 實現(xiàn)手淘 H5 頁面的終端適配》
詳細(xì)的資料可以參考:《幾種常見的 CSS 布局》
采用metaviewport的方式
采用border-image的方式
采用transform:scale()的方式
詳細(xì)資料可以參考:《怎么畫一條 0.5px 的邊(更新)》
transition關(guān)注的是CSSproperty的變化,property值和時間的關(guān)系是一個三次貝塞爾曲線。
animation作用于元素本身而不是樣式屬性,可以使用關(guān)鍵幀的概念,應(yīng)該說可以實現(xiàn)更自由的動畫效果。
詳細(xì)資料可以參考:《CSSanimation 與 CSStransition 有何區(qū)別?》《CSS3Transition 和 Animation 區(qū)別及比較》《CSS 動畫簡介》《CSS 動畫:animation、transition、transform、translate》
“首選最小寬度”,指的是元素最適合的最小寬度。
東亞文字(如中文)最小寬度為每個漢字的寬度。
西方文字最小寬度由特定的連續(xù)的英文字符單元決定。并不是所有的英文字符都會組成連續(xù)單元,一般會終止于空格(普通空格)、短
橫線、問號以及其他非英文字符等。
如果想讓英文字符和中文一樣,每一個字符都用最小寬度單元,可以試試使用CSS中的word-break:break-all。
對于普通文檔流中的元素,百分比高度值要想起作用,其父級必須有一個可以生效的高度值。
原因是如果包含塊的高度沒有顯式指定(即高度由內(nèi)容決定),并且該元素不是絕對定位,則計算值為auto,因為解釋成了auto,
所以無法參與計算。
使用絕對定位的元素會有計算值,即使祖先元素的height計算為auto也是如此。
(1)max-width會覆蓋width,即使width是行類樣式或者設(shè)置了!important。
(2)min-width會覆蓋max-width,此規(guī)則發(fā)生在min-width和max-width沖突的時候。
(1)內(nèi)容區(qū)域(contentarea)。內(nèi)容區(qū)域指一種圍繞文字看不見的盒子,其大小僅受字符本身特性控制,本質(zhì)上是一個字符盒子
(characterbox);但是有些元素,如圖片這樣的替換元素,其內(nèi)容顯然不是文字,不存在字符盒子之類的,因此,對于這些
元素,內(nèi)容區(qū)域可以看成元素自身。
(2)內(nèi)聯(lián)盒子(inlinebox)?!皟?nèi)聯(lián)盒子”不會讓內(nèi)容成塊顯示,而是排成一行,這里的“內(nèi)聯(lián)盒子”實際指的就是元素的“外在盒
子”,用來決定元素是內(nèi)聯(lián)還是塊級。該盒子又可以細(xì)分為“內(nèi)聯(lián)盒子”和“匿名內(nèi)聯(lián)盒子”兩類。
(3)行框盒子(linebox),每一行就是一個“行框盒子”(實線框標(biāo)注),每個“行框盒子”又是由一個一個“內(nèi)聯(lián)盒子”組成的。
(4)包含塊(containingbox),由一行一行的“行框盒子”組成。
“幽靈空白節(jié)點”是內(nèi)聯(lián)盒模型中非常重要的一個概念,具體指的是:在HTML5文檔聲明中,內(nèi)聯(lián)元素的所有解析和渲染表現(xiàn)就如同
每個行框盒子的前面有一個“空白節(jié)點”一樣。這個“空白節(jié)點”永遠(yuǎn)透明,不占據(jù)任何寬度,看不見也無法通過腳本獲取,就好像幽靈
一樣,但又確確實實地存在,表現(xiàn)如同文本節(jié)點一樣,因此,我稱之為“幽靈空白節(jié)點”。
通過修改某個屬性值呈現(xiàn)的內(nèi)容就可以被替換的元素就稱為“替換元素”。因此,<img>、<object>、<video>、<iframe>或者表
單元素<textarea>和<input>和<select>都是典型的替換元素。
替換元素除了內(nèi)容可替換這一特性以外,還有以下一些特性。
(1)內(nèi)容的外觀不受頁面上的CSS的影響。用專業(yè)的話講就是在樣式表現(xiàn)在CSS作用域之外。如何更改替換元素本身的外觀需要
類似appearance屬性,或者瀏覽器自身暴露的一些樣式接口,
(2)有自己的尺寸。在Web中,很多替換元素在沒有明確尺寸設(shè)定的情況下,其默認(rèn)的尺寸(不包括邊框)是300像素×150像
素,如<video>、<iframe>或者<canvas>等,也有少部分替換元素為0像素,如<img>圖片,而表單元素的替換元素
的尺寸則和瀏覽器有關(guān),沒有明顯的規(guī)律。
(3)在很多CSS屬性上有自己的一套表現(xiàn)規(guī)則。比較具有代表性的就是vertical-align屬性,對于替換元素和非替換元素,ve
rtical-align屬性值的解釋是不一樣的。比方說vertical-align的默認(rèn)值的baseline,很簡單的屬性值,基線之意,
被定義為字符x的下邊緣,而替換元素的基線卻被硬生生定義成了元素的下邊緣。
(4)所有的替換元素都是內(nèi)聯(lián)水平元素,也就是替換元素和替換元素、替換元素和文字都是可以在一行顯示的。但是,替換元素默認(rèn)
的display值卻是不一樣的,有的是inline,有的是inline-block。
替換元素的尺寸從內(nèi)而外分為3類:固有尺寸、HTML尺寸和CSS尺寸。
(1)固有尺寸指的是替換內(nèi)容原本的尺寸。例如,圖片、視頻作為一個獨立文件存在的時候,都是有著自己的寬度和高度的。
(2)HTML尺寸只能通過HTML原生屬性改變,這些HTML原生屬性包括<img>的width和height屬性、<input>的s
ize屬性、<textarea>的cols和rows屬性等。
(3)CSS尺寸特指可以通過CSS的width和height或者max-width/min-width和max-height/min-height設(shè)置的
尺寸,對應(yīng)盒尺寸中的contentbox。
這3層結(jié)構(gòu)的計算規(guī)則具體如下
(1)如果沒有CSS尺寸和HTML尺寸,則使用固有尺寸作為最終的寬高。
(2)如果沒有CSS尺寸,則使用HTML尺寸作為最終的寬高。
(3)如果有CSS尺寸,則最終尺寸由CSS屬性決定。
(4)如果“固有尺寸”含有固有的寬高比例,同時僅設(shè)置了寬度或僅設(shè)置了高度,則元素依然按照固有的寬高比例顯示。
(5)如果上面的條件都不符合,則最終寬度表現(xiàn)為300像素,高度為150像素。
(6)內(nèi)聯(lián)替換元素和塊級替換元素使用上面同一套尺寸計算規(guī)則。
content屬性生成的對象稱為“匿名替換元素”。
(1)我們使用content生成的文本是無法選中、無法復(fù)制的,好像設(shè)置了userselect:none聲明一般,但是普通元素的文本
卻可以被輕松選中。同時,content生成的文本無法被屏幕閱讀設(shè)備讀取,也無法被搜索引擎抓取,因此,千萬不要自以為是
地把重要的文本信息使用content屬性生成,因為這對可訪問性和SEO都很不友好。
(2)content生成的內(nèi)容不能左右:empty偽類。
(3)content動態(tài)生成值無法獲取。
margin的'auto'可不是擺設(shè),是具有強(qiáng)烈的計算意味的關(guān)鍵字,用來計算元素對應(yīng)方向應(yīng)該獲得的剩余間距大小。但是觸發(fā)mar
gin:auto計算有一個前提條件,就是width或height為auto時,元素是具有對應(yīng)方向的自動填充特性的。
(1)如果一側(cè)定值,一側(cè)auto,則auto為剩余空間大小。
(2)如果兩側(cè)均是auto,則平分剩余空間。
(1)display計算值inline的非替換元素的垂直margin是無效的。對于內(nèi)聯(lián)替換元素,垂直margin有效,并且沒有ma
rgin合并的問題。
(2)表格中的<tr>和<td>元素或者設(shè)置display計算值是table-cell或table-row的元素的margin都是無效的。
(3)絕對定位元素非定位方位的margin值“無效”。
(4)定高容器的子元素的margin-bottom或者寬度定死的子元素的margin-right的定位“失效”。
(1)border-width卻不支持百分比。
(2)border-style的默認(rèn)值是none,有一部分人可能會誤以為是solid。這也是單純設(shè)置border-width或border-col
or沒有邊框顯示的原因。
(3)border-style:double的表現(xiàn)規(guī)則:雙線寬度永遠(yuǎn)相等,中間間隔±1。
(4)border-color默認(rèn)顏色就是color色值。
(5)默認(rèn)background背景圖片是相對于paddingbox定位的。
字母x的下邊緣(線)就是我們的基線。
x-height指的就是小寫字母x的高度,術(shù)語描述就是基線和等分線(meanline)(也稱作中線,midline)之間的距離。在C
SS世界中,middle指的是基線往上1/2x-height高度。我們可以近似理解為字母x交叉點那個位置。
ex是CSS中的一個相對單位,指的是小寫字母x的高度,沒錯,就是指x-height。ex的價值就在其副業(yè)上不受字體和字號影
響的內(nèi)聯(lián)元素的垂直居中對齊效果。內(nèi)聯(lián)元素默認(rèn)是基線對齊的,而基線就是x的底部,而1ex就是一個x的高度。
(1)對于非替換元素的純內(nèi)聯(lián)元素,其可視高度完全由line-height決定。對于文本這樣的純內(nèi)聯(lián)元素,line-height就是高
度計算的基石,用專業(yè)說法就是指定了用來計算行框盒子高度的基礎(chǔ)高度。
(2)內(nèi)聯(lián)元素的高度由固定高度和不固定高度組成,這個不固定的部分就是這里的“行距”。換句話說,line-height之所以起作
用,就是通過改變“行距”來實現(xiàn)的。在CSS中,“行距”分散在當(dāng)前文字的上方和下方,也就是即使是第一行文字,其上方也是
有“行距”的,只不過這個“行距”的高度僅僅是完整“行距”高度的一半,因此,也被稱為“半行距”。
(3)行距=line-height-font-size。
(4)border以及l(fā)ine-height等傳統(tǒng)CSS屬性并沒有小數(shù)像素的概念。如果標(biāo)注的是文字上邊距,則向下取整;如果是文字下
邊距,則向上取整。
(5)對于純文本元素,line-height直接決定了最終的高度。但是,如果同時有替換元素,則line-height只能決定最小高度。
(6)對于塊級元素,line-height對其本身是沒有任何作用的,我們平時改變line-height,塊級元素的高度跟著變化實際上是
通過改變塊級元素里面內(nèi)聯(lián)級別元素占據(jù)的高度實現(xiàn)的。
(7)line-height的默認(rèn)值是normal,還支持?jǐn)?shù)值、百分比值以及長度值。為數(shù)值類型時,其最終的計算值是和當(dāng)前font-si
ze相乘后的值。為百分比值時,其最終的計算值是和當(dāng)前font-size相乘后的值。為長度值時原意不變。
(8)如果使用數(shù)值作為line-height的屬性值,那么所有的子元素繼承的都是這個值;但是,如果使用百分比值或者長度值作為
屬性值,那么所有的子元素繼承的是最終的計算值。
(9)無論內(nèi)聯(lián)元素line-height如何設(shè)置,最終父級元素的高度都是由數(shù)值大的那個line-height決定的。
(10)只要有“內(nèi)聯(lián)盒子”在,就一定會有“行框盒子”,就是每一行內(nèi)聯(lián)元素外面包裹的一層看不見的盒子。然后,重點來了,在每個
“行框盒子”前面有一個寬度為0的具有該元素的字體和行高屬性的看不見的“幽靈空白節(jié)點”。
(1)vertical-align的默認(rèn)值是baseline,即基線對齊,而基線的定義是字母x的下邊緣。因此,內(nèi)聯(lián)元素默認(rèn)都是沿著字
母x的下邊緣對齊的。對于圖片等替換元素,往往使用元素本身的下邊緣作為基線。:一個inline-block元素,如果里面
沒有內(nèi)聯(lián)元素,或者overflow不是visible,則該元素的基線就是其margin底邊緣;否則其基線就是元素里面最后一行
內(nèi)聯(lián)元素的基線。
(2)vertical-align:top就是垂直上邊緣對齊,如果是內(nèi)聯(lián)元素,則和這一行位置最高的內(nèi)聯(lián)元素的頂部對齊;如果display
計算值是table-cell的元素,我們不妨腦補(bǔ)成<td>元素,則和<tr>元素上邊緣對齊。
(3)vertical-align:middle是中間對齊,對于內(nèi)聯(lián)元素,元素的垂直中心點和行框盒子基線往上1/2x-height處對齊。對
于table-cell元素,單元格填充盒子相對于外面的表格行居中對齊。
(4)vertical-align支持?jǐn)?shù)值屬性,根據(jù)數(shù)值的不同,相對于基線往上或往下偏移,如果是負(fù)值,往下偏移,如果是正值,往上
偏移。
(5)vertical-align屬性的百分比值則是相對于line-height的計算值計算的。
(6)vertical-align起作用是有前提條件的,這個前提條件就是:只能應(yīng)用于內(nèi)聯(lián)元素以及display值為table-cell的元
素。
(7)table-cell元素設(shè)置vertical-align垂直對齊的是子元素,但是其作用的并不是子元素,而是table-cell元素自身。
(1)一個設(shè)置了overflow:hidden聲明的元素,假設(shè)同時存在border屬性和padding屬性,則當(dāng)子元素內(nèi)容超出容器寬度
高度限制的時候,剪裁的邊界是borderbox的內(nèi)邊緣,而非paddingbox的內(nèi)邊緣。
(2)HTML中有兩個標(biāo)簽是默認(rèn)可以產(chǎn)生滾動條的,一個是根元素<html>,另一個是文本域<textarea>。
(3)滾動條會占用容器的可用寬度或高度。
(4)元素設(shè)置了overflow:hidden聲明,里面內(nèi)容高度溢出的時候,滾動依然存在,僅僅滾動條不存在!
沒有設(shè)置left/top/right/bottom屬性值的絕對定位稱為“無依賴絕對定位”。
無依賴絕對定位其定位的位置和沒有設(shè)置position:absolute時候的位置相關(guān)。
(1)如果overflow不是定位元素,同時絕對定位元素和overflow容器之間也沒有定位元素,則overflow無法對absolute
元素進(jìn)行剪裁。
(2)如果overflow的屬性值不是hidden而是auto或者scroll,即使絕對定位元素高寬比overflow元素高寬還要大,也
都不會出現(xiàn)滾動條。
(3)overflow元素自身transform的時候,Chrome和Opera瀏覽器下的overflow剪裁是無效的。
所謂“可訪問性隱藏”,指的是雖然內(nèi)容肉眼看不見,但是其他輔助設(shè)備卻能夠進(jìn)行識別和訪問的隱藏。
clip剪裁被我稱為“最佳可訪問性隱藏”的另外一個原因就是,它具有更強(qiáng)的普遍適應(yīng)性,任何元素、任何場景都可以無障礙使用。
(1)相對定位元素的left/top/right/bottom的百分比值是相對于包含塊計算的,而不是自身。注意,雖然定位位移是相對自身,但是百分比值的計算值不是。
(2)top和bottom這兩個垂直方向的百分比值計算跟height的百分比值是一樣的,都是相對高度計算的。同時,如果包含塊的高度是auto,那么計算值是0,偏移無效,也就是說,如果父元素沒有設(shè)定高度或者不是“格式化高度”,那么relative類似top:20%的代碼等同于top:0。
(3)當(dāng)相對定位元素同時應(yīng)用對立方向定位值的時候,也就是top/bottom和left/right同時使用的時候,只有一個方向的定位屬性會起作用。而誰起作用則是與文檔流的順序有關(guān)的,默認(rèn)的文檔流是自上而下、從左往右,因此top/bottom同時使用的時候,bottom失效;left/right同時使用的時候,right失效。
層疊上下文,英文稱作stackingcontext,是HTML中的一個三維的概念。如果一個元素含有層疊上下文,我們可以理解為這個元
素在z軸上就“高人一等”。
層疊上下文元素有如下特性:
(1)層疊上下文的層疊水平要比普通元素高(原因后面會說明)。
(2)層疊上下文可以阻斷元素的混合模式。
(3)層疊上下文可以嵌套,內(nèi)部層疊上下文及其所有子元素均受制于外部的“層疊上下文”。
(4)每個層疊上下文和兄弟元素獨立,也就是說,當(dāng)進(jìn)行層疊變化或渲染的時候,只需要考慮后代元素。
(5)每個層疊上下文是自成體系的,當(dāng)元素發(fā)生層疊的時候,整個元素被認(rèn)為是在父層疊上下文的層疊順序中。
層疊上下文的創(chuàng)建:
(1)頁面根元素天生具有層疊上下文,稱為根層疊上下文。根層疊上下文指的是頁面根元素,可以看成是<html>元素。因此,頁面中所有的元素一定處于至少一個“層疊結(jié)界”中。
(2)對于position值為relative/absolute以及Firefox/IE瀏覽器(不包括Chrome瀏覽器)下含有position:fixed聲明的定位元素,當(dāng)其z-index值不是auto的時候,會創(chuàng)建層疊上下文。Chrome等WebKit內(nèi)核瀏覽器下,position:fixed元素天然層疊上下文元素,無須z-index為數(shù)值。根據(jù)我的測試,目前IE和Firefox仍是老套路。
(3)其他一些CSS3屬性,比如元素的opacity值不是1。
層疊水平,英文稱作stackinglevel,決定了同一個層疊上下文中元素在z軸上的顯示順序。
顯而易見,所有的元素都有層疊水平,包括層疊上下文元素,也包括普通元素。然而,對普通元素的層疊水平探討只局限在當(dāng)前層疊上
下文元素中。
層疊順序,英文稱作 stackingorder,表示元素發(fā)生層疊時有著特定的垂直顯示順序。
(1)誰大誰上:當(dāng)具有明顯的層疊水平標(biāo)識的時候,如生效的z-index屬性值,在同一個層疊上下文領(lǐng)域,層疊水平值大的那一個覆蓋小的那一個。
(2)后來居上:當(dāng)元素的層疊水平一致、層疊順序相同的時候,在DOM流中處于后面的元素會覆蓋前面的元素。
如果使用數(shù)值作為font-weight屬性值,必須是100~900的整百數(shù)。因為這里的數(shù)值僅僅是外表長得像數(shù)值,實際上是一個具有特定含義的關(guān)鍵字,并且這里的數(shù)值關(guān)鍵字和字母關(guān)鍵字之間是有對應(yīng)關(guān)系的。
(1)text-indent僅對第一行內(nèi)聯(lián)盒子內(nèi)容有效。
(2)非替換元素以外的display計算值為inline的內(nèi)聯(lián)元素設(shè)置text-indent值無效,如果計算值inline-block/inli
ne-table則會生效。
(3)<input>標(biāo)簽按鈕text-indent值無效。
(4)<button>標(biāo)簽按鈕text-indent值有效。
(5)text-indent的百分比值是相對于當(dāng)前元素的“包含塊”計算的,而不是當(dāng)前元素。
letter-spacing可以用來控制字符之間的間距,這里說的“字符”包括英文字母、漢字以及空格等。
letter-spacing具有以下一些特性。
(1)繼承性。
(2)默認(rèn)值是normal而不是0。雖然說正常情況下,normal的計算值就是0,但兩者還是有差別的,在有些場景下,letter-spacing會調(diào)整normal的計算值以實現(xiàn)更好的版面布局。
(3)支持負(fù)值,且值足夠大的時候,會讓字符形成重疊,甚至反向排列。
(4)和text-indent屬性一樣,無論值多大或多小,第一行一定會保留至少一個字符。
(5)支持小數(shù)值,即使0.1px也是支持的。
(6)暫不支持百分比值。
letter-spacing作用于所有字符,但word-spacing僅作用于空格字符。換句話說,word-spacing的作用就是增加空格的間隙
寬度。
white-space屬性聲明了如何處理元素內(nèi)的空白字符,這類空白字符包括Space(空格)鍵、Enter(回車)鍵、Tab(制表符)
鍵產(chǎn)生的空白。因此,white-space可以決定圖文內(nèi)容是否在一行顯示(回車空格是否生效),是否顯示大段連續(xù)空白(空格是否
生效)等。
其屬性值包括下面這些。
?normal:合并空白字符和換行符。
?pre:空白字符不合并,并且內(nèi)容只在有換行符的地方換行。
?nowrap:該值和normal一樣會合并空白字符,但不允許文本環(huán)繞。
?pre-wrap:空白字符不合并,并且內(nèi)容只在有換行符的地方換行,同時允許文本環(huán)繞。
?pre-line:合并空白字符,但只在有換行符的地方換行,允許文本環(huán)繞。
相關(guān)知識點:
根據(jù)測試,一個元素如果display計算值為none,在IE瀏覽器下(IE8~I(xiàn)E11,更高版本不確定)依然會發(fā)送圖片請求,F(xiàn)ire
fox瀏覽器不會,至于Chrome和Safari瀏覽器則似乎更加智能一點:如果隱藏元素同時又設(shè)置了background-image,則圖片
依然會去加載;如果是父元素的display計算值為none,則背景圖不會請求,此時瀏覽器或許放心地認(rèn)為這個背景圖暫時是不會使
用的。
如果不是background-image,而是<img>元素,則設(shè)置display:none在所有瀏覽器下依舊都會請求圖片資源。
還需要注意的是如果設(shè)置的樣式?jīng)]有對應(yīng)的元素,則background-image也不會加載。hover情況下的background-image,在觸
發(fā)時加載。
回答:
-(1)元素的背景圖片
-元素本身設(shè)置 display:none,會請求圖片 -父級元素設(shè)置 display:none,不會請求圖片 -樣式?jīng)]有元素使用,不會請求-:hover 樣式下,觸發(fā)時請求
-(2)img 標(biāo)簽圖片任何情況下都會請求圖片
詳細(xì)資料可以參考:《CSS 控制前端圖片 HTTP 請求的各種情況示例》
/*單行文本溢出*/
p {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
/*多行文本溢出*/
p {
position: relative;
line-height: 1.5em;
/*高度為需要顯示的行數(shù)*行高,比如這里我們顯示兩行,則為3*/
height: 3em;
overflow: hidden;
}
p:after {
content: "...";
position: absolute;
bottom: 0;
right: 0;
background-color: #fff;
}
詳細(xì)資料可以參考:《【CSS/JS】如何實現(xiàn)單行/多行文本溢出的省略》《CSS 多行文本溢出省略顯示》
-(1)使用 display:none;隱藏元素,渲染樹不會包含該渲染對象,因此該元素不會在頁面中占據(jù)位置,也不會響應(yīng)綁定的監(jiān)聽事件。
-(2)使用 visibility:hidden;隱藏元素。元素在頁面中仍占據(jù)空間,但是不會響應(yīng)綁定的監(jiān)聽事件。
-(3)使用 opacity:0;將元素的透明度設(shè)置為 0,以此來實現(xiàn)元素的隱藏。元素在頁面中仍然占據(jù)空間,并且能夠響應(yīng)元素綁定的監(jiān)聽事件。
-(4)通過使用絕對定位將元素移除可視區(qū)域內(nèi),以此來實現(xiàn)元素的隱藏。
-(5)通過 z-index 負(fù)值,來使其他元素遮蓋住該元素,以此來實現(xiàn)隱藏。
-(6)通過 clip/clip-path 元素裁剪的方法來實現(xiàn)元素的隱藏,這種方法下,元素仍在頁面中占據(jù)位置,但是不會響應(yīng)綁定的監(jiān)聽事件。
-(7)通過 transform:scale(0,0)來將元素縮放為 0,以此來實現(xiàn)元素的隱藏。這種方法下,元素仍在頁面中占據(jù)位置,但是不會響應(yīng)綁定的監(jiān)聽事件。
詳細(xì)資料可以參考:《CSS 隱藏元素的八種方法》
利用絕對定位實現(xiàn)body {
padding: 0;
margin: 0;
}
.header {
position: absolute;
top: 0;
width: 100%;
height: 100px;
background: red;
}
.container {
position: absolute;
top: 100px;
bottom: 100px;
width: 100%;
background: green;
}
.footer {
position: absolute;
bottom: 0;
height: 100px;
width: 100%;
background: red;
}
利用flex布局實現(xiàn)html,
body {
height: 100%;
}
body {
display: flex;
padding: 0;
margin: 0;
flex-direction: column;
}
.header {
height: 100px;
background: red;
}
.container {
flex-grow: 1;
background: green;
}
.footer {
height: 100px;
background: red;
}
詳細(xì)資料可以參考:《css 實現(xiàn)上下固定中間自適應(yīng)布局》
相關(guān)資料:
/*兩欄布局一般指的是頁面中一共兩欄,左邊固定,右邊自適應(yīng)的布局,一共有四種實現(xiàn)的方式。*/
/*以左邊寬度固定為200px為例*/
/*(1)利用浮動,將左邊元素寬度設(shè)置為200px,并且設(shè)置向左浮動。將右邊元素的margin-left設(shè)置為200px,寬度設(shè)置為auto(默認(rèn)為auto,撐滿整個父元素)。*/
.outer {
height: 100px;
}
.left {
float: left;
height: 100px;
width: 200px;
background: tomato;
}
.right {
margin-left: 200px;
width: auto;
height: 100px;
background: gold;
}
/*(2)第二種是利用flex布局,將左邊元素的放大和縮小比例設(shè)置為0,基礎(chǔ)大小設(shè)置為200px。將右邊的元素的放大比例設(shè)置為1,縮小比例設(shè)置為1,基礎(chǔ)大小設(shè)置為auto。*/
.outer {
display: flex;
height: 100px;
}
.left {
flex-shrink: 0;
flex-grow: 0;
flex-basis: 200px;
background: tomato;
}
.right {
flex: auto;
/*11auto*/
background: gold;
}
/*(3)第三種是利用絕對定位布局的方式,將父級元素設(shè)置相對定位。左邊元素設(shè)置為absolute定位,并且寬度設(shè)置為
200px。將右邊元素的margin-left的值設(shè)置為200px。*/
.outer {
position: relative;
height: 100px;
}
.left {
position: absolute;
width: 200px;
height: 100px;
background: tomato;
}
.right {
margin-left: 200px;
height: 100px;
background: gold;
}
/*(4)第四種還是利用絕對定位的方式,將父級元素設(shè)置為相對定位。左邊元素寬度設(shè)置為200px,右邊元素設(shè)置為絕對定位,左邊定位為200px,其余方向定位為0。*/
.outer {
position: relative;
height: 100px;
}
.left {
width: 200px;
height: 100px;
background: tomato;
}
.right {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 200px;
background: gold;
}
《兩欄布局 demo 展示》
回答:
兩欄布局一般指的是頁面中一共兩欄,左邊固定,右邊自適應(yīng)的布局,一共有四種實現(xiàn)的方式。
以左邊寬度固定為 200px 為例
-(1)利用浮動,將左邊元素寬度設(shè)置為 200px,并且設(shè)置向左浮動。將右邊元素的 margin-left 設(shè)置為 200px,寬度設(shè)置為 auto(默認(rèn)為 auto,撐滿整個父元素)。
-(2)第二種是利用 flex 布局,將左邊元素的放大和縮小比例設(shè)置為 0,基礎(chǔ)大小設(shè)置為 200px。將右邊的元素的放大比例設(shè)置為 1,縮小比例設(shè)置為 1,基礎(chǔ)大小設(shè)置為 auto。
-(3)第三種是利用絕對定位布局的方式,將父級元素設(shè)置相對定位。左邊元素設(shè)置為 absolute 定位,并且寬度設(shè)置為 200px。將右邊元素的 margin-left 的值設(shè)置為 200px。
-(4)第四種還是利用絕對定位的方式,將父級元素設(shè)置為相對定位。左邊元素寬度設(shè)置為 200px,右邊元素設(shè)置為絕對定位,左邊定位為 200px,其余方向定位為 0。
相關(guān)資料:
/*三欄布局一般指的是頁面中一共有三欄,左右兩欄寬度固定,中間自適應(yīng)的布局,一共有五種實現(xiàn)方式。
這里以左邊寬度固定為100px,右邊寬度固定為200px為例。*/
/*(1)利用絕對定位的方式,左右兩欄設(shè)置為絕對定位,中間設(shè)置對應(yīng)方向大小的margin的值。*/
.outer {
position: relative;
height: 100px;
}
.left {
position: absolute;
width: 100px;
height: 100px;
background: tomato;
}
.right {
position: absolute;
top: 0;
right: 0;
width: 200px;
height: 100px;
background: gold;
}
.center {
margin-left: 100px;
margin-right: 200px;
height: 100px;
background: lightgreen;
}
/*(2)利用flex布局的方式,左右兩欄的放大和縮小比例都設(shè)置為0,基礎(chǔ)大小設(shè)置為固定的大小,中間一欄設(shè)置為auto*/
.outer {
display: flex;
height: 100px;
}
.left {
flex: 00100px;
background: tomato;
}
.right {
flex: 00200px;
background: gold;
}
.center {
flex: auto;
background: lightgreen;
}
/*(3)利用浮動的方式,左右兩欄設(shè)置固定大小,并設(shè)置對應(yīng)方向的浮動。中間一欄設(shè)置左右兩個方向的margin值,注意這種方式,中間一欄必須放到最后。*/
.outer {
height: 100px;
}
.left {
float: left;
width: 100px;
height: 100px;
background: tomato;
}
.right {
float: right;
width: 200px;
height: 100px;
background: gold;
}
.center {
height: 100px;
margin-left: 100px;
margin-right: 200px;
background: lightgreen;
}
/*(4)雙飛翼布局,利用浮動和負(fù)邊距來實現(xiàn)。父級元素設(shè)置左右的pedding,三列均設(shè)置向左浮動,中間一列放在最前面,寬度設(shè)置為父級元素的寬度,因此后面兩列都被擠到了下一行,通過設(shè)置margin負(fù)值將其移動到上一行,再利用相對定位,定位到兩邊。*/
.outer {
height: 100px;
padding-left: 100px;
padding-right: 200px;
}
.left {
position: relative;
left: -100px;
float: left;
margin-left: -100%;
width: 100px;
height: 100px;
background: tomato;
}
.right {
position: relative;
left: 200px;
float: right;
margin-left: -200px;
width: 200px;
height: 100px;
background: gold;
}
.center {
float: left;
width: 100%;
height: 100px;
background: lightgreen;
}
/*(5)雙飛翼布局,雙飛翼布局相對于圣杯布局來說,左右位置的保留是通過中間列的margin值來實現(xiàn)的,而不是通過父元
素的pedding來實現(xiàn)的。本質(zhì)上來說,也是通過浮動和外邊距負(fù)值來實現(xiàn)的。*/
.outer {
height: 100px;
}
.left {
float: left;
margin-left: -100%;
width: 100px;
height: 100px;
background: tomato;
}
.right {
float: left;
margin-left: -200px;
width: 200px;
height: 100px;
background: gold;
}
.wrapper {
float: left;
width: 100%;
height: 100px;
background: lightgreen;
}
.center {
margin-left: 100px;
margin-right: 200px;
height: 100px;
}
《三欄布局 demo 展示》
回答:
三欄布局一般指的是頁面中一共有三欄,左右兩欄寬度固定,中間自適應(yīng)的布局,一共有五種實現(xiàn)方式。
這里以左邊寬度固定為100px,右邊寬度固定為200px為例。
(1)利用絕對定位的方式,左右兩欄設(shè)置為絕對定位,中間設(shè)置對應(yīng)方向大小的margin的值。
(2)利用flex布局的方式,左右兩欄的放大和縮小比例都設(shè)置為0,基礎(chǔ)大小設(shè)置為固定的大小,中間一欄設(shè)置為auto。
(3)利用浮動的方式,左右兩欄設(shè)置固定大小,并設(shè)置對應(yīng)方向的浮動。中間一欄設(shè)置左右兩個方向的margin值,注意這種方式,中間一欄必須放到最后。
(4)圣杯布局,利用浮動和負(fù)邊距來實現(xiàn)。父級元素設(shè)置左右的pedding,三列均設(shè)置向左浮動,中間一列放在最前面,寬度設(shè)置為父級元素的寬度,因此后面兩列都被擠到了下一行,通過設(shè)置margin負(fù)值將其移動到上一行,再利用相對定位,定位到兩邊。雙飛翼布局中間列的寬度不能小于兩邊任意列的寬度,而雙飛翼布局則不存在這個問題。
(5)雙飛翼布局,雙飛翼布局相對于圣杯布局來說,左右位置的保留是通過中間列的margin值來實現(xiàn)的,而不是通過父元素的pedding來實現(xiàn)的。本質(zhì)上來說,也是通過浮動和外邊距負(fù)值來實現(xiàn)的。
/*1.第一種方式是利用vw來實現(xiàn)*/
.square {
width: 10%;
height: 10vw;
background: tomato;
}
/*2.第二種方式是利用元素的margin/padding百分比是相對父元素width的性質(zhì)來實現(xiàn)*/
.square {
width: 20%;
height: 0;
padding-top: 20%;
background: orange;
}
/*3.第三種方式是利用子元素的margin-top的值來實現(xiàn)的*/
.square {
width: 30%;
overflow: hidden;
background: yellow;
}
.square::after {
content: "";
display: block;
margin-top: 100%;
}
《自適應(yīng)正方形 demo 展示》
/*三角形的實現(xiàn)原理是利用了元素邊框連接處的等分原理。*/
.triangle {
width: 0;
height: 0;
border-width: 100px;
border-style: solid;
border-color: tomatotransparenttransparenttransparent;
}
《三角形 demo 展示》
/*實現(xiàn)原理參考自適應(yīng)正方形和水平居中方式*/
.box {
position: absolute;
top: 0;
right: 0;
left: 0;
bottom: 0;
margin: auto;
width: 10%;
height: 0;
padding-top: 20%;
background: tomato;
}
筆者再次墻裂推薦收藏這篇原文,轉(zhuǎn)載于 CavsZhouyou - 前端面試復(fù)習(xí)筆記,這個倉庫是原作者校招時的前端復(fù)習(xí)筆記,主要總結(jié)一些比較重要的知識點和前端面試問題,希望對大家有所幫助。
最后如果文章和筆記能帶您一絲幫助或者啟發(fā),請不要吝嗇你的贊和收藏,你的肯定是我前進(jìn)的最大動力
已完結(jié)。
上半部分CSS寫法:《關(guān)于前端CSS寫法104個知識點匯總(一)》
轉(zhuǎn)載鏈接:https://github.com/CavsZhouyou/Front-End-Interview-Notebook/blob/master/Css/Css.md
*請認(rèn)真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。