亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

手把手用原生JS代碼實現css屬性的set和get

2019-11-11 03:57:19
字體:
來源:轉載
供稿:網友

現在我們就來實現一個簡易版小插件,能夠在不借助jQuery的情況下實現CSS屬性的獲取和設置。

第一步

首先創建一個 css-tool.js 文件,一開始他是這個樣子的:

(function(window,undefined){ "use strict";  var cssTool = function(){    return new cssTool.PRototype.init();  }  cssTool.prototype = {    init: function(){      console.log('init success');      return this;    },  }  cssTool.prototype.init.prototype = cssTool.prototype;  // 暴露接口  window.cssTool = cssTool;})(window);

全局作用域可以看作是一棟公寓樓,我們創建一個立即執行的匿名函數,相當于是公寓樓中的一間公寓,我們在屋子里做的事情就都是隱秘的,也就是起到隔離作用域的作用,避免和外部變量產生沖突。把 window 作為參數拿到屋子里來,以后就不用再重復去外面找 window 來用。最前面的分號是為了保證在文件合并壓縮后產生語法錯誤。 undefined 在老版本瀏覽器中不被支持,因此考慮到兼容性添加一個形參。

我們創建了一個叫 cssTool 的私有方法,相當于我們在屋子里找了一個小房間來放 get 和 set 等方法。接下來我們在原型上新增一個 init 方法,用于初始化。之后我們仿照 jQuery 的方式,將 init 的 prototype 指向 cssTool 的 prototype ,這樣我們在用 init 作為構造函數創造實例時,可以使插件擁有兩種調用方式:

var ct = new cssTool() 構建 cssTool 實例直接調用 cssTool() ,一樣返回 cssTool 實例

get方法

通用方式

現代瀏覽器和IE9+
window.getComputedStyle(elem,null).getPropertyValue(attr)

IE678
elem.currentStyle.getAttribute(camelCase(attr))

兼容處理

駝峰命名法轉換-camelCase

對 currentStyle 來說,在IE6瀏覽器中他很專一,只喜歡以駝峰命名法命名的變量,而IE78中就有點朝三暮四,駝峰命名法和中間帶’-‘的都照單全收,為了兼容和操作的簡便,我們統一轉換為駝峰命名法。

/** * 駝峰命名法轉換,IE678使用 * font-size --> fontSize * @param {String} attr * @param {String} match  匹配到的字符串,如-c * @param {String} originText (/w)是一個捕獲,這里是捕獲到的字符,如c * @return 返回駝峰命名方式的css屬性名 */functioncamelCase(attr){  return attr.replace(//-(/w)/g, function(match,originText){    return originText.toUpperCase();  });}

透明度獲取-getFilter

IE678的透明度是通過 filter:alpha(opacity=0) 來設置的,我們利用正則表達式匹配到此時透明度的值,由于此時得到的是0-100之間的數值,所以需要換算為我們常見的0-1的形式。

/** * IE678下獲取透明度的值 * @param  elem 獲取值的 dom * @return {Number} 透明度的值,默認為1 * IE678下設置透明度 filter: alpha(opacity=0) 取值為0-100 */functiongetFilter(elem){  var _filter = elem.currentStyle.getAttribute('filter').match(/alpha/(opacity=(.*)/)/i);  var value = parseFloat(_filter[1]);  if(!isNaN(value)){    // 轉化為0-1    return value ? value/100 : 0;  }  return 1;}

float 值的獲取

上一篇博客中提到,由于 float 是 ECMAScript 的一個保留字。所以在各瀏覽器中都會有代替的寫法,比如說在現代瀏覽器中為 cssFloat ,而在 IE678 中為 styleFloat 。經測試,在現代瀏覽器中直接使用 getPropertyValue("float") 也可以獲取到 float 的值。而 IE678 則不行,所以針對 float ,需要簡單的hack。

width | height 樣式的獲取

對于一個沒有設定高寬的元素而言,在 IE678 下直接獲取得到的值是 auto 。而現代瀏覽器會直接返回它的 px 值,我們的目標就是在 IE 下也返回 px 值。

// 直接獲取外部樣式表未設置的 width 和 height 返回值為 auto// 為了獲取精確的 px 值,使用 getBoundingClientRect 方法// getBoundingClientRect 可以獲得元素四個點相對于文檔視圖左上角// 的 top、left、bottom、right值,進行簡單計算即可var condition = attr === 'width'             || attr === 'height'             && elem.currentStyle[attr] === 'auto';if(condition){  var clientRect = elem.getBoundingClientRect();  return (attr === 'width' ?          clientRect.right - clientRect.left :          clientRect.bottom - clientRect.top         ) + 'px';}

set方法

set 方法相較于 get 方法要簡便的多,因為我們有 cssText 這個跨越 IE6+ 和現代瀏覽器的神器。

通過 elem.style.cssText 可以對元素的樣式進行讀寫,實際上操作的是 html 標簽上的 style 屬性的值。因此不能直接對其賦值,不然就把整個 style 屬性的值給覆蓋掉了。我們采用累加的方式來修改屬性。

另外,在IE瀏覽器還有個小坑,如果 cssText 不為空,返回值最后一個分號會被刪掉,因此我們需要在累加的屬性前加上一個分號。

/** * 設置元素css樣式值 * @param elem 設置值的dom元素 * @param {String} attr 設置樣式名稱,如font-size * @param {String} value 設置樣式的值,如16px */set: function(elem, attr, value){  // IE78 設置透明度需特殊處理  if(attr === 'opacity'){    // 針對 IE7 的 hack    // filter 濾鏡要求 hasLFooout=true 才能執行    // IE瀏覽器且 hasLFooout=false 時執行    if(!!elem.currentStyle && !elem.currentStyle.hasLFooout){      elem.style.zoom = 1;      attr = 'filter';      value = 'alpha(opacity=' + value * 100 + ')';    }  }  // 通用方式  elem.style.cssText += ';' + (attr + ':' + value) + ';';}

補充

簡單解釋new操作符的作用

var Foo = function(){  return new Foo.prototype.init();}Foo.prototype = {  init: function(){    this.age = 18;    return this;  },  age: 20}console.log(Foo().age); // 18console.log(Foo.prototype.age); // 20

使用 new 操作符時,是把 init 當成構造函數來調用,在 init 內部會創建一個隱式對象并用 this 指向它,此時的 this.age=18 表示在這個隱式對象上增加一個 age 屬性,最后 return this 不是必需的,構造函數默認會返回 this 。此時 Foo.prototype.age 不受影響。

當不使用 new 操作符時,相當于一個?普通對象上的函數調用, this 指向了 init 所屬的對象,即 Foo.prototype , this.age=18 相當于對 Foo.prototype.age 賦值,和使用 new 操作符是有本質區別的。

小結

到這里,教程也就要告一段落了。一個 jQuery 中常見的 css() 方法背后涵蓋了非常多的知識點,跨瀏覽器的兼容性也是我們此次討論的重點,這次只是實現了一個非常簡易的 css 操作插件。學問尚淺,如果有不清楚或者有錯誤的地方,歡迎各位留言或者提issue來幫助我改進這個小插件。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美大片大片在线播放| 欧美日韩在线观看视频小说| 91国自产精品中文字幕亚洲| 精品国产91久久久久久老师| 亚洲欧美日韩一区二区三区在线| 久久99久国产精品黄毛片入口| 久久精品在线视频| 国产偷国产偷亚洲清高网站| 国产精品美女主播在线观看纯欲| 成人动漫网站在线观看| 91在线免费看网站| 日韩精品亚洲精品| 欧美一级高清免费播放| 97成人精品区在线播放| 精品久久久久久亚洲精品| 91在线无精精品一区二区| 亚洲视频一区二区| 一区二区欧美日韩视频| 日韩免费观看视频| 久久精品99久久香蕉国产色戒| 欧美成人在线免费视频| 日本欧美中文字幕| 色综合天天狠天天透天天伊人| 亚洲欧美国产高清va在线播| 九色成人免费视频| 日本三级久久久| 欧美性xxxx18| 国产大片精品免费永久看nba| 午夜精品免费视频| 欧美激情久久久久| 66m—66摸成人免费视频| 色伦专区97中文字幕| 亚洲乱码国产乱码精品精天堂| 欧美黑人狂野猛交老妇| 久久综合国产精品台湾中文娱乐网| 欧美日韩亚洲一区二区三区| 亚洲激情 国产| 亚洲国产日韩欧美在线动漫| 欧美激情a在线| 亚洲精品不卡在线| 精品久久久久久久久久久久久| 中文字幕在线观看日韩| 亚洲男女性事视频| 久久久久久12| 欧美日韩亚洲91| 最近2019好看的中文字幕免费| 国产91亚洲精品| 日韩av在线看| 中文字幕日韩精品有码视频| 亚洲丁香婷深爱综合| 国产在线精品成人一区二区三区| 91香蕉嫩草神马影院在线观看| 91国产一区在线| 欧美中文在线观看| 成人国产精品免费视频| 性色av一区二区三区在线观看| 国产精品视频自在线| 欧美怡春院一区二区三区| 久久精品国产91精品亚洲| 97在线看免费观看视频在线观看| 欧美另类在线观看| 亚洲精品一区二区在线| 97精品国产97久久久久久春色| 久久久女女女女999久久| 国产精品扒开腿做爽爽爽的视频| 日韩高清电影好看的电视剧电影| 国产视频精品久久久| 中文字幕一区电影| 国产福利视频一区| 欧美乱大交xxxxx| www.久久色.com| 91精品啪aⅴ在线观看国产| 亚洲在线观看视频| 日韩成人中文字幕在线观看| 成人免费黄色网| 中文字幕国产亚洲| 日韩电影中文字幕av| 国产欧美日韩91| 97精品视频在线播放| 亚洲图片在线综合| 国产精品视频导航| 欧美一区二区三区免费观看| 欧美激情乱人伦一区| 美女扒开尿口让男人操亚洲视频网站| 美女久久久久久久久久久| 亚洲理论电影网| 日韩欧美国产激情| 欧美国产极速在线| 欧美一区二区三区精品电影| 在线视频精品一| 国产精品极品在线| 日韩成人性视频| 成人黄色在线免费| 日韩av在线免播放器| 在线观看欧美www| 97精品在线视频| 欧美国产日韩一区二区在线观看| 亚洲国产第一页| 国产专区精品视频| 国产精品久久久久久网站| 日韩精品中文在线观看| 久久精品中文字幕一区| 国产精品成久久久久三级| 不卡毛片在线看| 色七七影院综合| 日韩亚洲欧美中文高清在线| 国产精品久久久久久久久久| 欧美一级高清免费| 成人免费看吃奶视频网站| 宅男66日本亚洲欧美视频| 成人免费视频xnxx.com| 国产精品视频久久| 97视频在线观看成人| 亚洲精品欧美一区二区三区| 亚洲第一综合天堂另类专| 久久这里有精品视频| 亚洲精品国产精品自产a区红杏吧| 成人性生交大片免费观看嘿嘿视频| 91免费在线视频| 三级精品视频久久久久| 亚洲free性xxxx护士白浆| 成人中文字幕+乱码+中文字幕| 久久久久久亚洲精品| 亚洲国产精品久久久久秋霞不卡| 欧美成aaa人片在线观看蜜臀| 91在线高清免费观看| 久久影视电视剧免费网站清宫辞电视| 亚洲欧美制服另类日韩| 亚洲va欧美va国产综合剧情| 亚洲一区二区三区在线免费观看| 国产欧美婷婷中文| 91国内在线视频| 欧美又大又硬又粗bbbbb| 亚洲国产日韩欧美在线动漫| 奇米4444一区二区三区| 国产成+人+综合+亚洲欧美丁香花| 69影院欧美专区视频| 98精品国产自产在线观看| 欧美一区二区三区免费视| 日韩中文字幕视频在线| 91影视免费在线观看| 亚洲男人的天堂网站| 中文字幕国产精品久久| 色偷偷噜噜噜亚洲男人的天堂| 欧美成人精品在线观看| 亚洲国产成人久久综合一区| 国产主播精品在线| 欧美另类69精品久久久久9999| 日韩电影免费观看在线观看| 欧美一区二区三区四区在线| 欧美亚洲免费电影| 日韩高清电影免费观看完整版| 欧美性猛交xxxx免费看| 亚洲激情视频网站| 亚洲激情在线视频| 午夜精品一区二区三区在线播放| 中国人与牲禽动交精品| 大桥未久av一区二区三区| 国产精品人成电影在线观看| 久久艹在线视频| 久久久女人电视剧免费播放下载| 日韩精品在线观看视频| 中文字幕亚洲二区| 日韩精品极品在线观看|