亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

章節
問答
課簽
筆記
評論
占位
占位

樣式操作接口

jQuery操作樣式的接口 jQuery.fn.css 與 jQuery.css

我們知道實例是調用靜態的方法,css的接口參數傳遞是可以很多個組合情況的,這也符合了 jQuery “少寫多做”的原則了。

css: function(name, value ) {
        return value !== undefined ?
            jQuery.style(elem, name, value) :
            jQuery.css(elem, name);
 }

最終方法與設置樣式的方法是實例方法,所以我們看傳遞的參數就知道了,只能是單一的 elem、 name、 value 實參。

jQuery.style( elem, name, value ) :
jQuery.css( elem, name );

所以如果我們傳遞是對象或者別的方式就需要一個過濾的環節,css 參數的處理也跟之前的 attr 屬性的處理保持一致,采用了jQuery.access 方法統一調配,這個具體之前就分析了,無非就是遞歸參數,但是有個可學的設計思路,分離不同的邏輯判斷通過回調傳遞進去。

jQuery.css()取值

用戶傳遞寫 css 屬性名是可以很隨意的,backgroundColor,backgourd-color,所以框架內部自然要過這個統一的處理。

檢測是否是駝峰寫法,如果不是就得轉化下:

origName = jQuery.camelCase( name );

其次還有一些特殊的屬性名的讀取問題,比如float就是關鍵字,就需要轉成cssFloat,還有瀏覽器前綴的命名處理。

name = jQuery.cssProps[origName] || (jQuery.cssProps[origName] = vendorPropName(elem.style, origName));

我們知道元素在 display:none 的情況下是無法獲取一些跟布局定位有關的值的,還有不同的元素尺寸width、height、margin獲取問題等等,但是這么多情況如何去處理?

jQuery在這里就引入了“css鉤子”

hooks = jQuery.cssHooks[name] || jQuery.cssHooks[origName];

每一個特定方法都帶有各自的處理模式,舉個例子如果要獲取 ele.css("width")。

那么 cssHooks.width 中就是這樣一個結構:

cssHooks = {
    width:{
        get:function(){},
        set:function(){}
    }
}

我們看到 cssHooks 幾乎都是針對盒子模型的屬性處理了,我們考慮下如果用戶獲取一個元素的 width 會有什么情況?

1. 元素在隱藏 display:none 先獲取不到尺寸
2. 元素的寬度,jQuery就有width、innerWidth、outerWidth等各種不同取值方式
3. 元素可以被設置css3的盒子模型

所以針對這一種特定的屬性我們需要單獨拿一個鉤子做處理,那么在取值的時候,我們自然在 cssHooks.width.get 中要判斷一下:當元素是否是可見狀態,如果不是則要先處理下,在之后判斷盒子模型的處理。接下來我們看到如果沒有對應的鉤子方法,我們模型采用了 curCSS 取值:

if (hooks && "get" in hooks) {
    val = hooks.get(elem, true, extra);
}
if (val === undefined) {
    val = curCSS(elem, name, styles);
}

其內部就采用了 defaultView.getComputedStyle(elem, null);最終就是通過 getComputedStyle的getPropertyValue 方法了。

所以總結 jquery.css 的接口其實也很簡單。

1.轉化樣式命名
2.處理特殊的屬性比如float
3.分離出一個鉤子,用于處理跟尺寸有關的屬性
4.其余元素采用getComputedStyle獲取對應的值

 

任務

?不會了怎么辦
||

提問題

寫筆記

公開筆記
提交
||

請驗證,完成請求

由于請求次數過多,請先驗證,完成再次請求

加群二維碼

打開微信掃碼自動綁定

您還未綁定服務號

綁定后可得到

  • · 粉絲專屬優惠福利
  • · 大咖直播交流干貨
  • · 課程更新,問題答復提醒
  • · 賬號支付安全提醒

收藏課程后,能更快找到我哦~

使用 Ctrl+D 可將課程添加到書簽

邀請您關注公眾號
關注后,及時獲悉本課程動態

舉報

0/150
提交
取消
全部 精華 我要發布
全部 我要發布
最熱 最新
只看我的

手記推薦

更多

本次提問將花費2個積分

你的積分不足,無法發表

為什么扣積分?

本次提問將花費2個積分

繼續發表請點擊 "確定"

為什么扣積分?