摘要:由于的精簡,以置于之前的的代碼不能運(yùn)行了,其中選擇器就是其中一個。總結(jié)最終我選擇了最后一種,功能能夠滿足現(xiàn)有的需求。其實很強(qiáng)大,這選擇器只是其九牛一毛,后面可以再學(xué)習(xí)學(xué)習(xí)其思想。
現(xiàn)在移動端項目在重構(gòu)階段,將之前的jQuery全部替換成Zepto了。由于Zepto的精簡,以置于之前的jQuery的代碼不能運(yùn)行了,其中visible選擇器就是其中一個。既然已經(jīng)選擇了Zepto,那就給Zepto增加visible功能。
分析第一反應(yīng)就是思考通過元素的屬性來判斷,然后嘗試了使用display和visibility來進(jìn)行判斷。但是經(jīng)過小的測試,是我想的簡單了!
display是無法繼承父元素的,visibility是能夠繼承父元素,但是父元素采用的是display顯示與隱藏。
參考地址1
參考地址1
既然模塊的根元素是用display顯示與隱藏,那我先就通過類選擇器,選到元素。然后再透過遞歸判斷父元素display,直到body元素。
;(function($) { var _filter = $.fn.filter; function visible(elem) { var $elem = $(elem); if($elem.css("display") === "none") { return false; }else { if($elem.is("body")) { return true; }else { if(visible($elem.parent())) { return true; } } } } $.fn.filter = function(sel) { if (sel === ":visible") { return $([].filter.call(this, visible)); } return _filter.call(this, sel); }; })(window.Zepto);
自己的實現(xiàn)是可以的,不過自我感覺有點(diǎn)饒了,看看能不能透過其它方式來解決。
jQuery實現(xiàn)查看了jQuery3.0的內(nèi)部實現(xiàn),最終調(diào)用的是jQuery.expr.filters.visible
jQuery.expr.filters.visible = function( elem ) { return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); };
jQuery首先的判斷元素的offsetWidth和offsetHeight。因為根元素隱藏后,導(dǎo)致其子元素的寬高為0。不占用文檔流,這很好理解。
getClientRects:獲取元素占據(jù)頁面的所有矩形區(qū)域,用于獲取元素占據(jù)頁面的所有矩形區(qū)域
與之相關(guān)的是getBoundingClientRect。
getBoundingClientRect:用于獲得頁面中某個元素的左,上,右和下分別相對瀏覽器視窗的位置
而為什么要使用這個呢?在官網(wǎng)找到了答案。
Breaking change: Behavior of :hidden and :visible
An element is considered now visible if it has a layout box returned from the DOM getClientRects() method,even if that box has a height and/or width of zero. This means that elements such as
or an empty element that don"t have height are considered to be visible.
大體的意思是對于一個元素本身寬高都為0,但是占據(jù)了穩(wěn)定流,這是能認(rèn)為是visible的。比如像 換行br、空的span 標(biāo)簽。
其它實現(xiàn)在github上也找到了,對Zepto增加visible的方法。
;(function($){ var _is = $.fn.is, _filter = $.fn.filter; function visible(elem){ elem = $(elem); return !!(elem.width() || elem.height()) && elem.css("display") !== "none"; } $.fn.is = function(sel){ if(sel === ":visible"){ return visible(this); } if(sel === ":hidden"){ return !visible(this); } return _is.call(this, sel); } $.fn.filter = function(sel){ if(sel === ":visible"){ return $([].filter.call(this, visible)); } if(sel === ":hidden"){ return $([].filter.call(this, function(elem){ return !visible(elem); })); } return _filter.call(this, sel); } })(Zepto);總結(jié)
最終我選擇了最后一種,功能能夠滿足現(xiàn)有的需求。
其實Sizzle很強(qiáng)大,這visible選擇器只是其九牛一毛,后面可以再學(xué)習(xí)學(xué)習(xí)其思想。
原文地址http://xiaoqiang730730.github.io/2016/07/16/visible%E9%80%89%E6%8B%A9%E5%99%A8/
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/87797.html
摘要:代表的上下文對象是一個的上下文對象,可以調(diào)用的方法和屬性值特殊選擇器點(diǎn)擊測試通過原生處理點(diǎn)擊測試通過原生處理直接通過的方法改變顏色通過包裝成對象改變顏色 DOM對象轉(zhuǎn)化成jQuery對象 如果傳遞給$(DOM)函數(shù)的參數(shù)是一個DOM對象,jQuery方法會把這個DOM對象給包裝成一個新的jQuery對象 元素一 元素二 元素三 var ...
摘要:如果偽類的參數(shù)不可以用轉(zhuǎn)換,則參數(shù)為字符串,用正則將字符串前后的或去掉,再賦值給最后執(zhí)行回調(diào),將解釋出來的參數(shù)傳入回調(diào)函數(shù)中,將執(zhí)行結(jié)果返回。重寫的方法,改過的調(diào)用的是方法,在回調(diào)函數(shù)中處理大部分邏輯。 Selector 模塊是對 Zepto 選擇器的擴(kuò)展,使得 Zepto 選擇器也可以支持部分 CSS3 選擇器和 eq 等 Zepto 定義的選擇器。 在閱讀本篇文章之前,最好先閱讀《...
摘要:一內(nèi)聯(lián)元素與行元素的區(qū)別內(nèi)聯(lián)元素即行內(nèi)元素。絕對定位,相對于定位以外的第一個父元素進(jìn)行定位,元素脫離文檔流。 一、內(nèi)聯(lián)元素與行元素的區(qū)別 1、內(nèi)聯(lián)元素即行內(nèi)元素。2、內(nèi)聯(lián)元素,在文檔流中擠在一行;不能設(shè)置寬高(即,即使設(shè)置了也不管用,例如a標(biāo)簽)、margin和padding的top和bottom 塊元素,獨(dú)占一行;可以設(shè)置寬高、margin、padding3、可以使用displa...
摘要:一內(nèi)聯(lián)元素與行元素的區(qū)別內(nèi)聯(lián)元素即行內(nèi)元素。絕對定位,相對于定位以外的第一個父元素進(jìn)行定位,元素脫離文檔流。 一、內(nèi)聯(lián)元素與行元素的區(qū)別 1、內(nèi)聯(lián)元素即行內(nèi)元素。2、內(nèi)聯(lián)元素,在文檔流中擠在一行;不能設(shè)置寬高(即,即使設(shè)置了也不管用,例如a標(biāo)簽)、margin和padding的top和bottom 塊元素,獨(dú)占一行;可以設(shè)置寬高、margin、padding3、可以使用displa...
摘要:部分問題與解答屬性是否區(qū)分大小寫不區(qū)分。對于行內(nèi)元素,設(shè)置左右內(nèi)邊距,左右內(nèi)邊距將是可見的。而對于替換元素,則撐開了父元素。如下代碼中文本的顏色是。 Tip:這是http://davidshariff.com/quiz/給出的web前端開發(fā)測試題,的CSS部分,我根據(jù)自己的理解給出的答案,歡迎拍磚,一起刷題==>Github 倉庫地址。 Front End Web Developm...
閱讀 1776·2021-10-27 14:15
閱讀 3835·2021-10-08 10:12
閱讀 1168·2021-09-22 15:55
閱讀 3230·2021-09-22 15:17
閱讀 834·2021-09-02 15:40
閱讀 1748·2019-08-29 18:33
閱讀 1099·2019-08-29 15:22
閱讀 2355·2019-08-29 11:08