第七周第一天筆記

1 CSS盒子模型

  • 定義:CSS盒子模型:由四部分構(gòu)成:手動(dòng)設(shè)置的寬高+padding+border+margin

2 JS中的盒子模型

  • 目的:通過(guò)元素身上提供的屬性和方法,來(lái)獲取元素身上的樣式慷妙;
  • 分類(lèi):client系列自脯、offset系列嫌套、scroll系列
  • 注意:獲取的值都沒(méi)有單位蛆挫,只是數(shù)值琉朽;

2.1 client系列--可視區(qū)域

  • 包括:clientWidth clientHeight clientLeft clientTop
    1. clientWidth:手動(dòng)設(shè)置的寬度+左右padding
    2. clientHeight:手動(dòng)設(shè)置的高度+上下padding
    3. clientLeft:左邊框的寬度淤袜;
    4. clientTop:上邊框的寬度痒谴;
  • 瀏覽器頁(yè)面可視區(qū)域的寬高
    • 寬度:document.documentElement.clientWidth || document.body.clientWidth;
    • 高度:document.documentElement.clientHeight || document.body.clientHeight;

2.2 offset系列--偏移量

  • 包括:offsetWidth offsetHeight offsetLeft offsetTop offsetParent
    1. offsetWidth: 手動(dòng)設(shè)置的寬度+左右padding+左右border;
    2. offsetHeight: 手動(dòng)設(shè)置的高度+上下padding+上下border;
    3. offsetLeft: 元素的左外邊框距離它父級(jí)的左內(nèi)邊框之間的距離;
    4. offsetTop: 元素的上外邊框距離它父級(jí)的上內(nèi)邊框之間的距離铡羡;
    5. offsetParent: 定位上的父級(jí)积蔚;查找到離它最近的添加定位元素的元素

2.3 scroll系列--卷簾

  • 包括:scrollWidth scrollHeight scrollLeft scrollTop
    1. scrollWidth:
      • 內(nèi)容沒(méi)有溢出的情況下,等于自己設(shè)定的寬度+左右padding,跟clientWidth相等蓖墅;
      • 內(nèi)容溢出的情況下库倘,約等于自己設(shè)定的寬度+左padding,約等于是因?yàn)椴煌瑸g覽器獲得的值不同论矾;
    2. scrollHeight:
      • 內(nèi)容沒(méi)有溢出的情況下教翩,等于自己設(shè)定的高度+上下padding,跟clientHeight相等;
      • 內(nèi)容溢出的情況下贪壳,約等于自己設(shè)定的高度+上padding饱亿,約等于是因?yàn)椴煌瑸g覽器獲得的值不同;
    3. scrollLeft:指當(dāng)前頁(yè)面被瀏覽器卷去的寬度闰靴,有滾動(dòng)條時(shí)彪笼,滾動(dòng)卷去的寬度;
    4. scrollTop:指當(dāng)前頁(yè)面被瀏覽器卷去的高度蚂且,有滾動(dòng)條時(shí)配猫,滾動(dòng)卷去的高度;

2.4 JS盒子模型遇到的問(wèn)題

  • JS盒子模型中求出來(lái)值都是四舍五入后的整數(shù)杏死,無(wú)法拿到小數(shù)——不解決泵肄;
  • JS盒子模型中拿到的值都是復(fù)合值捆交,無(wú)法拿到元素身上單獨(dú)的寬或高屬性;——解決:封裝getCss
  • 關(guān)于盒子模型的偏移量腐巢,只能求出當(dāng)前容器的外邊框到定位父級(jí)內(nèi)邊框之間的距離品追,無(wú)法求出當(dāng)前定位元素到body的距離;——解決:封裝offset
  • 求可視區(qū)的寬高或被瀏覽器卷去的高度和寬度冯丙,代碼太長(zhǎng)肉瓦,太麻煩;——封裝win胃惜;

3 JS中常見(jiàn)的封裝思想

  • 封裝的基本思想
    1. 屬性判斷:點(diǎn); 得到的結(jié)果是泞莉,有值或undefined,配合if判斷蛹疯,返回的是布爾值戒财;
        1. obj.xxx 如:if(window.getComputedStyle)->boolean;
        1. typeof obj.xxx=="function" 如:if(typeof window.getComputedStyle==="function");
    2. 屬性判斷:in; 得到的結(jié)果是布爾值,配合if判斷捺弦;
      • 代碼:"屬性名" in 對(duì)象;如:if("getComputedStyle" in window)饮寞,返回布爾值
    3. 存在報(bào)錯(cuò):用try...catch(e)...方法
    4. 正則判斷:獲取瀏覽器詳細(xì)信息str,判斷里面是否存在字符MSIE 6/7/8.0,利用正則查找返回相應(yīng)的值列吼;
      • 獲取瀏覽器的信息:var str=window.navigator.userAgent;
      • 判斷條件:MSIE 6/7/8.0;
      • 利用正則表達(dá)式來(lái)匹配多個(gè)滿(mǎn)足情況的字符串幽崩,正則表達(dá)式為:reg=/MSIE (6|7|8)\.0/gi;
          1. reg.test(str);返回布爾值
          1. str.search(reg)===-1;如果搜索到,則返回下標(biāo)值寞钥,如果未搜索到慌申,則返回-1;與indexOf方法相同理郑,只不過(guò)indexOf方法只能查找一種字符蹄溉,而正則可以查找多個(gè);
    5. 總結(jié):就是利用兩種方法來(lái)滿(mǎn)足不同瀏覽器存在的問(wèn)題您炉;
      • 利用if...else..方法來(lái)解決兩種不同情況下的選擇問(wèn)題柒爵,而條件就是布爾值;
        • 1)屬性判斷:實(shí)質(zhì)是判斷屬性是否存在赚爵;分為兩種棉胀,目的是獲取布爾值;適用于不同瀏覽器對(duì)同一屬性支持情況不同冀膝;
          • 第一種唁奢,利用屬性判斷,來(lái)獲取布爾值窝剖,其中點(diǎn)得到的結(jié)果是:有值或者undefined麻掸,添加if會(huì)被強(qiáng)制轉(zhuǎn)換為布爾值;
          • 第二種赐纱,利用in來(lái)判斷论笔,得到的結(jié)果就是布爾值采郎;
        • 2)正則表達(dá)式判斷:實(shí)質(zhì)是判斷瀏覽器種類(lèi)千所;分為兩種方法狂魔,目的是獲取布爾值;適用于不同瀏覽器對(duì)一個(gè)屬性支持淫痰,但是屬性在不同瀏覽器中的表現(xiàn)形式不同最楷,所以需要判斷瀏覽器種類(lèi);
          • 獲取瀏覽器種類(lèi)的代碼:var str=window.navigator.userAgent待错,window可以省略籽孙;
          • indexOf方法,查找字符火俄,來(lái)判斷不同的瀏覽器犯建;缺點(diǎn)是:只能查找一個(gè)特定字符,不能查找一類(lèi)字符瓜客;
          • test()方法适瓦,利用正則表達(dá)式來(lái)查找一類(lèi)字符,返回值為布爾值谱仪;
          • search()方法玻熙,同樣利用正則表達(dá)式來(lái)搜索一類(lèi)字符,找到則返回下標(biāo)值疯攒,找不到則返回-1嗦随,所以判斷條件為str.search(reg)===-1,返回值也是布爾值敬尺;
      • 利用try...catch(e)..方法來(lái)解決枚尼,報(bào)錯(cuò)的問(wèn)題,只要報(bào)錯(cuò)就可以用此方法砂吞;當(dāng)不報(bào)錯(cuò)的情況下署恍,執(zhí)行try語(yǔ)句,報(bào)錯(cuò)的情況下呜舒,執(zhí)行catch語(yǔ)句锭汛;
  • 實(shí)例:獲取元素身上的屬性的兩種方法解析
    • getComputedStyle()方法,是window的屬性袭蝗,屬性值為函數(shù)唤殴;
      • 代碼:getComputedStyle(oDiv,null).width,其中第一個(gè)參數(shù)為元素,第二個(gè)參數(shù)可以是任何值到腥,沒(méi)有含義朵逝,一般設(shè)置為null,width為元素身上的屬性乡范;
      • 兼容性:標(biāo)準(zhǔn)瀏覽器(包括IE9/10/11)支持配名;IE5/6/7/8瀏覽器不支持啤咽,會(huì)報(bào)錯(cuò);
    • currentStyle屬性渠脉,是元素身上的屬性宇整;
      • 代碼:oDiv.currentStyle.width,其中oDiv為元素芋膘,width為元素身上的屬性鳞青;
      • 兼容性:IE瀏覽器(包括IE9/10/11)都支持;標(biāo)準(zhǔn)瀏覽器(Chrome)不支持为朋,會(huì)報(bào)錯(cuò)臂拓;
    • 總結(jié):出現(xiàn)報(bào)錯(cuò)可以用try...catch(e)...方法,以上方法配合使用习寸;
      • 代碼:
       <script>
           //封裝兼容的方法獲取oDiv元素身上的width屬性
           //第一種方法:
           try{
               console.log(getComputedStyle(oDiv,null).width);
           }catch(e){
               console.log(oDiv.currentStyle.width);
           }
           //第二種方法:
           try{
               console.log(oDiv.currentStyle.width);
           }catch(e){
               console.log(getComputedStyle(oDiv,false).width);
           }
       </script>
      

4 getCss封裝

  • 需求:獲取元素身上的屬性值
  • 知識(shí)點(diǎn):
    • 不同瀏覽器獲取屬性值的方法不同胶惰,封裝兼容的方法,使用if...else...或try...catch...方法霞溪;
    • 獲取的屬性值分為幾類(lèi)孵滞,1)數(shù)字加單位,如200px威鹿,屬性名為width剃斧;2)單詞,如solid忽你,屬性名為borderStyle幼东;3)二進(jìn)制顏色值,如#fff科雳,屬性名為backgroundColor;等
    • 獲取的屬性值不能是復(fù)合值根蟹,如background,padding糟秘,border等简逮;
    • 針對(duì)一些兼容性不同的屬性,如透明度尿赚,在標(biāo)準(zhǔn)瀏覽器中設(shè)置為opacity:0.1散庶,在IE6-8瀏覽器下設(shè)置為:filter:alpha(opacity=10),所以在不同瀏覽器下獲取屬性名時(shí)會(huì)不同凌净;
  • 思路:
    1. 基本封裝:標(biāo)準(zhǔn)瀏覽器下使用getComputedStyle()方法悲龟,IE6-8瀏覽器下使用currentStyle方法;
    2. 升級(jí)1:獲取數(shù)字加單位中的數(shù)字冰寻,需要去掉單位:有效數(shù)字的判斷+單位须教;其中單位可以是px,em,rem,pt等;
    3. 升級(jí)2:透明度兼容問(wèn)題斩芭,所以獲取屬性時(shí)會(huì)存在差異轻腺,需要針對(duì)不同的瀏覽器下進(jìn)行分別獲取乐疆,在標(biāo)準(zhǔn)瀏覽器下,直接獲取opacity屬性值贬养,在IE6-8瀏覽器下挤土,實(shí)際求filter的值,如果filter的值輸入正確煤蚌,返回對(duì)應(yīng)的數(shù)值耕挨,數(shù)值一定要除上100,如果透明度書(shū)寫(xiě)錯(cuò)誤尉桩,則透明度無(wú)法設(shè)置成功,返回默認(rèn)1贪庙;
     <script>
         var oDiv=document.getElementsByTagName("div")[0];
         function getCss(ele,attr){
             var value=null;
             //利用try...catch...方法來(lái)兼容不同瀏覽器
             /*try{
                 value=getComputedStyle(ele,null)[attr];
             }catch(e){
                 value=ele.currentStyle[attr];
             }*/
             if(window.getComputedStyle){
                 //在標(biāo)準(zhǔn)瀏覽器(包括IE9,10)下蜘犁,window.getComputedStyle屬性值為一個(gè)函數(shù),強(qiáng)制轉(zhuǎn)換為布爾值為true
                 value=getComputedStyle(ele,null)[attr];
             }else{
                 //在IE6,7,8瀏覽器下止邮,不支持getComputedStyle屬性这橙,會(huì)返回undefined,轉(zhuǎn)換為布爾值為false导披;
                 //添加對(duì)透明的判斷
                 if(attr=="opacity"){
                     //還要判斷透明度代碼是否書(shū)寫(xiě)正確屈扎,書(shū)寫(xiě)錯(cuò)誤設(shè)置不成功,返回1撩匕;
                     var reg1=/^alpha\(opacity=(\d+)\)$/;//此時(shí)絕對(duì)不能加全局g鹰晨,否則test和exec會(huì)對(duì)lastIndex值進(jìn)行重復(fù)影響;
                     value=ele.currentStyle.filter;
                     return reg1.test(value) ? reg1.exec(value)[1]/100 : 1;
                     //如果reg1添加全局g止毕,會(huì)出現(xiàn)問(wèn)題模蜡,可以通過(guò)RegExp.$1來(lái)獲取小分組的內(nèi)容
                     //代碼:return reg1.test(value)? RegExp.$1/100 : 1;
                 }
                 value=ele.currentStyle[attr];
             }
             //升級(jí)1 將獲取的屬性值為200px格式的值,去掉單位扁凛,只輸出數(shù)字忍疾,其他類(lèi)型的不變
             //判斷條件為:有效數(shù)字,如+-200.343px;
             var reg=/^(([+-]?(\d|([1-9]\d+)))(\.\d+)?)(px|em|rem|pt)$/;
             return reg.test(value) ? parseFloat(value) : value;
             //升級(jí)2 針對(duì)不同瀏覽器兼容不同谨朝,如透明度的設(shè)置卤妒,在不同瀏覽器下設(shè)置的代碼不同,想要獲取其中的數(shù)值
             //思路:在標(biāo)準(zhǔn)瀏覽器下獲取屬性名opacity字币,在IE6-8瀏覽器下则披,獲取屬性名filter,在利用正則獲取其中的數(shù)值,需要除上100纬朝;
         }
         console.log(getCss(oDiv,"height"));//屬性名要加雙引號(hào)收叶;
         console.log(getCss(oDiv,"borderStyle"));//結(jié)果為solid;
         console.log(getCss(oDiv,"opacity"));//結(jié)果為0.5;
     </script>
    
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市共苛,隨后出現(xiàn)的幾起案子判没,更是在濱河造成了極大的恐慌蜓萄,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件澄峰,死亡現(xiàn)場(chǎng)離奇詭異嫉沽,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)俏竞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)绸硕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人魂毁,你說(shuō)我怎么就攤上這事玻佩。” “怎么了席楚?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵咬崔,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我烦秩,道長(zhǎng)垮斯,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任只祠,我火速辦了婚禮兜蠕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘抛寝。我一直安慰自己熊杨,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布墩剖。 她就那樣靜靜地躺著猴凹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪岭皂。 梳的紋絲不亂的頭發(fā)上郊霎,一...
    開(kāi)封第一講書(shū)人閱讀 51,562評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音爷绘,去河邊找鬼书劝。 笑死,一個(gè)胖子當(dāng)著我的面吹牛土至,可吹牛的內(nèi)容都是我干的购对。 我是一名探鬼主播,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼陶因,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼骡苞!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤解幽,失蹤者是張志新(化名)和其女友劉穎贴见,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體躲株,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡片部,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了霜定。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片档悠。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖望浩,靈堂內(nèi)的尸體忽然破棺而出辖所,到底是詐尸還是另有隱情,我是刑警寧澤曾雕,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布奴烙,位于F島的核電站,受9級(jí)特大地震影響剖张,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜揩环,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一搔弄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧丰滑,春花似錦顾犹、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至郁妈,卻和暖如春浑玛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背噩咪。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工顾彰, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人胃碾。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓涨享,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親仆百。 傳聞我的和親對(duì)象是個(gè)殘疾皇子厕隧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容