css添加一條屬性能夠繪制一個(gè)矩形框
發(fā)布時(shí)間:2014-02-11 16:10:45 作者:佚名
我要評(píng)論

添加一條屬性,它能夠繪制一個(gè)矩形框,可以指定矩形邊的顏色,邊的寬度,邊的樣式等等,具體的實(shí)現(xiàn)步驟如下,感興趣的朋友不要錯(cuò)過
添加一條屬性,它能夠繪制一個(gè)矩形框。它可以指定矩形邊的顏色,邊的寬度,邊的樣式,以及矩形區(qū)域。如:
picl:blue solid 2px rect(100px 300px 300px 100px);
picl為屬性名稱,blue為邊的顏色,solid為邊 的樣式,2px為邊的寬度,rect(100px 300px 200px 50px)為矩形區(qū)域。
步驟:
(1).通過在 css/CSSPropertyNames.in文件中增加一個(gè)屬性名的關(guān)鍵字;
(2).使用perl命令(#perl makeprop.pl),生成對(duì)應(yīng)的.cpp和.h文件,這兩個(gè)文件包含了屬性名和屬性ID,以及屬性名的查找規(guī)則;
(3).將(2)中生成 的兩個(gè)文件拷貝到generated/ 目錄下;
(4).在CSSStyleSelector.cpp, CSSParser.cpp兩個(gè)文件中提供了屬性ID對(duì)應(yīng)的接口:(中間一些具體處理不詳細(xì)闡述,這里只說明總體步驟)
a.在 CSSParser.cpp中的“bool CSSParser::parseValue(int propId, bool important)”函數(shù)中增加“case CSSPropertyPicl: ”以及對(duì)應(yīng)的處理代碼,它是網(wǎng)頁上css樣式中我們自定義屬性“picl”的解析的入口;
說明:以此函數(shù)為起點(diǎn),將picl中各種值進(jìn)行解析,判 斷值是否合法。如果合法,將其進(jìn)行保存,保存后會(huì)更新css樣式。我們所關(guān)心的是如何取出picl屬性的各個(gè)值,以及怎樣進(jìn)行保存,我們不必去修改與樣式 更新有關(guān)的代碼,當(dāng)解析完后,瀏覽器會(huì)更新css樣式,丟棄無效的樣式,只保留合法(有效)的樣式。由于picl屬性是復(fù)合屬性,添加本條屬性只需調(diào)用這 個(gè)文件中的“bool CSSParser::parseShorthand(int propId, const int *properties, int numProperties, bool important)”函數(shù),它就會(huì)完成它里面對(duì)應(yīng)的各種單一屬性的解析。
b.如果屬性是單一 屬性,必須在CSSStyleSelector.cpp中的“void CSSStyleSelector::applyProperty(int id, CSSValue *value)”函數(shù)中添加對(duì)應(yīng)的case語句,它是css樣式執(zhí)行的入口。由于我們添加的屬性是一條復(fù)合屬性,它在執(zhí)行時(shí)會(huì)通過它里面的單一屬性進(jìn)行執(zhí) 行。因此,在CSSStyleSelector.cpp中的“void CSSStyleSelector::applyProperty(int id, CSSValue *value)”函數(shù)中不必添加本條屬性對(duì)應(yīng)的case語句。
說明:我借助了border屬性的方法來保存“邊的顏 色,邊的寬度,邊的樣式”,我們主要需要做的是對(duì)矩形值的處理,以及設(shè)置一個(gè)執(zhí)行我們的“picl”屬性的標(biāo)志。我添加了一個(gè)單一屬性:hic,它主要保 存矩形的四個(gè)值。在CSSStyleSelector.cpp中,“邊的顏色,邊的寬度,邊的樣式”這三個(gè)值由類似border屬性處理方式進(jìn)行了傳遞, 矩形的值通過“ case CSSPropertyHic: ”來傳遞,當(dāng)“picl”屬性的標(biāo)志被激活時(shí),則取出picl屬性的各個(gè)值,做如下處理:
paintInfo.context->setStrokeColor(); 設(shè)置邊的顏色;
paintInfo.context->setStrokeThickness(); 設(shè)置邊的寬度;
paintInfo.context->setStrokeStyle(); 設(shè)置邊邊的樣式;
paintInfo.context->drawLine() 畫矩形的一條邊,需要畫四次。
修改的文件:
(1).webkit/WebCore/css/CSSPropertyNames.in 中,在文件末尾增加如下兩行:
hic;
picl;
(2).webkit/WebCore/css/CSSParser.cpp 中,CSSParser::parseValue()函數(shù)中增加“case CSSPropertyPicl: ”以及對(duì)應(yīng)的處理代碼。如下:
case CSSPropertyPicl: {
const int properties4 = { CSSPropertyBorderWidth, CSSPropertyBorderStyle,
CSSPropertyBorderColor, CSSPropertyHic};
return parseShorthand(propId, properties, 4, important);
}
(3).webkit/WebCore /css/CSSStyleSelector.cpp中,CSSStyleSelector::applyProperty()函數(shù)中添加對(duì)應(yīng)的 “case CSSPropertyHic: ”,這里取出矩形的四條邊的值,并傳送到下面。
(4).webkit/WebCore /rendering/RenderObject.h中添加hasHic(),getHicRect()兩個(gè)函數(shù)的定義。
(5).webkit/WebCore /rendering/style/RenderStyle.h中添加如下幾個(gè)函數(shù):
Length hicLeft() const { return visual->hic.left(); }
Length hicRight() const { return visual->hic.right(); }
Length hicTop() const { return visual->hic.top(); }
Length hicBottom() const { return visual->hic.bottom(); }
LengthBox hic() const { return visual->hic; }
bool hasHic() const { return visual->hasHic; }
void setHasHic(bool b =true) { SET_VAR(visual, hasHic, b) }
void setHic(Length top, Length right, Length bottom, Length left);
(6).webkit/WebCore /rendering/style/RenderStyle.cpp中添加setHic()函數(shù)的實(shí)現(xiàn);
(7).webkit/WebCore /rendering/style/StyleVisualData.h中添加:
LengthBox hic;
bool hasHic : 1; //hasHic
(8).webkit/WebCore/rendering/RendBox.h中添加:
virtual IntRect getHicRect(int tx, int ty);
(9).webkit/WebCore/rendering /RendBox.cpp中,RenderBox::paintBoxDecorations()函數(shù)中添加畫矩形的實(shí)現(xiàn),以及getHicRect() 函數(shù)的實(shí)現(xiàn)
picl:blue solid 2px rect(100px 300px 300px 100px);
picl為屬性名稱,blue為邊的顏色,solid為邊 的樣式,2px為邊的寬度,rect(100px 300px 200px 50px)為矩形區(qū)域。
步驟:
(1).通過在 css/CSSPropertyNames.in文件中增加一個(gè)屬性名的關(guān)鍵字;
(2).使用perl命令(#perl makeprop.pl),生成對(duì)應(yīng)的.cpp和.h文件,這兩個(gè)文件包含了屬性名和屬性ID,以及屬性名的查找規(guī)則;
(3).將(2)中生成 的兩個(gè)文件拷貝到generated/ 目錄下;
(4).在CSSStyleSelector.cpp, CSSParser.cpp兩個(gè)文件中提供了屬性ID對(duì)應(yīng)的接口:(中間一些具體處理不詳細(xì)闡述,這里只說明總體步驟)
a.在 CSSParser.cpp中的“bool CSSParser::parseValue(int propId, bool important)”函數(shù)中增加“case CSSPropertyPicl: ”以及對(duì)應(yīng)的處理代碼,它是網(wǎng)頁上css樣式中我們自定義屬性“picl”的解析的入口;
說明:以此函數(shù)為起點(diǎn),將picl中各種值進(jìn)行解析,判 斷值是否合法。如果合法,將其進(jìn)行保存,保存后會(huì)更新css樣式。我們所關(guān)心的是如何取出picl屬性的各個(gè)值,以及怎樣進(jìn)行保存,我們不必去修改與樣式 更新有關(guān)的代碼,當(dāng)解析完后,瀏覽器會(huì)更新css樣式,丟棄無效的樣式,只保留合法(有效)的樣式。由于picl屬性是復(fù)合屬性,添加本條屬性只需調(diào)用這 個(gè)文件中的“bool CSSParser::parseShorthand(int propId, const int *properties, int numProperties, bool important)”函數(shù),它就會(huì)完成它里面對(duì)應(yīng)的各種單一屬性的解析。
b.如果屬性是單一 屬性,必須在CSSStyleSelector.cpp中的“void CSSStyleSelector::applyProperty(int id, CSSValue *value)”函數(shù)中添加對(duì)應(yīng)的case語句,它是css樣式執(zhí)行的入口。由于我們添加的屬性是一條復(fù)合屬性,它在執(zhí)行時(shí)會(huì)通過它里面的單一屬性進(jìn)行執(zhí) 行。因此,在CSSStyleSelector.cpp中的“void CSSStyleSelector::applyProperty(int id, CSSValue *value)”函數(shù)中不必添加本條屬性對(duì)應(yīng)的case語句。
說明:我借助了border屬性的方法來保存“邊的顏 色,邊的寬度,邊的樣式”,我們主要需要做的是對(duì)矩形值的處理,以及設(shè)置一個(gè)執(zhí)行我們的“picl”屬性的標(biāo)志。我添加了一個(gè)單一屬性:hic,它主要保 存矩形的四個(gè)值。在CSSStyleSelector.cpp中,“邊的顏色,邊的寬度,邊的樣式”這三個(gè)值由類似border屬性處理方式進(jìn)行了傳遞, 矩形的值通過“ case CSSPropertyHic: ”來傳遞,當(dāng)“picl”屬性的標(biāo)志被激活時(shí),則取出picl屬性的各個(gè)值,做如下處理:
paintInfo.context->setStrokeColor(); 設(shè)置邊的顏色;
paintInfo.context->setStrokeThickness(); 設(shè)置邊的寬度;
paintInfo.context->setStrokeStyle(); 設(shè)置邊邊的樣式;
paintInfo.context->drawLine() 畫矩形的一條邊,需要畫四次。
修改的文件:
(1).webkit/WebCore/css/CSSPropertyNames.in 中,在文件末尾增加如下兩行:
hic;
picl;
(2).webkit/WebCore/css/CSSParser.cpp 中,CSSParser::parseValue()函數(shù)中增加“case CSSPropertyPicl: ”以及對(duì)應(yīng)的處理代碼。如下:
case CSSPropertyPicl: {
const int properties4 = { CSSPropertyBorderWidth, CSSPropertyBorderStyle,
CSSPropertyBorderColor, CSSPropertyHic};
return parseShorthand(propId, properties, 4, important);
}
(3).webkit/WebCore /css/CSSStyleSelector.cpp中,CSSStyleSelector::applyProperty()函數(shù)中添加對(duì)應(yīng)的 “case CSSPropertyHic: ”,這里取出矩形的四條邊的值,并傳送到下面。
(4).webkit/WebCore /rendering/RenderObject.h中添加hasHic(),getHicRect()兩個(gè)函數(shù)的定義。
(5).webkit/WebCore /rendering/style/RenderStyle.h中添加如下幾個(gè)函數(shù):
Length hicLeft() const { return visual->hic.left(); }
Length hicRight() const { return visual->hic.right(); }
Length hicTop() const { return visual->hic.top(); }
Length hicBottom() const { return visual->hic.bottom(); }
LengthBox hic() const { return visual->hic; }
bool hasHic() const { return visual->hasHic; }
void setHasHic(bool b =true) { SET_VAR(visual, hasHic, b) }
void setHic(Length top, Length right, Length bottom, Length left);
(6).webkit/WebCore /rendering/style/RenderStyle.cpp中添加setHic()函數(shù)的實(shí)現(xiàn);
(7).webkit/WebCore /rendering/style/StyleVisualData.h中添加:
LengthBox hic;
bool hasHic : 1; //hasHic
(8).webkit/WebCore/rendering/RendBox.h中添加:
virtual IntRect getHicRect(int tx, int ty);
(9).webkit/WebCore/rendering /RendBox.cpp中,RenderBox::paintBoxDecorations()函數(shù)中添加畫矩形的實(shí)現(xiàn),以及getHicRect() 函數(shù)的實(shí)現(xiàn)
相關(guān)文章
- CSS Grid 是一種二維布局系統(tǒng),可以同時(shí)控制行和列,相比 Flex(一維布局),更適合用在整體頁面布局或復(fù)雜模塊結(jié)構(gòu)中,這篇文章主要介紹了前端CSS Grid 布局詳解,需要的朋2025-04-16
CSS Padding 和 Margin 區(qū)別全解析
CSS 中的 padding 和 margin 是兩個(gè)非?;A(chǔ)且重要的屬性,它們用于控制元素周圍的空白區(qū)域,本文將詳細(xì)介紹 padding 和 margin 的概念、區(qū)別以及如何在實(shí)際項(xiàng)目中使用它們2025-04-07- will-change 是一個(gè) CSS 屬性,用于告訴瀏覽器某個(gè)元素在未來可能會(huì)發(fā)生哪些變化,本文給大家介紹CSS will-change 屬性詳解,感興趣的朋友一起看看吧2025-04-07
- 本文給大家分享在 CSS 中,去除a標(biāo)簽(超鏈接)的下劃線的幾種方法,本文給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2025-04-07
- 在前端開發(fā)中,CSS(層疊樣式表)不僅是用來控制網(wǎng)頁的外觀和布局,更是實(shí)現(xiàn)復(fù)雜交互和動(dòng)態(tài)效果的關(guān)鍵技術(shù)之一,隨著前端技術(shù)的不斷發(fā)展,CSS的用法也日益豐富和高級(jí),本文將2025-04-07
css中的 vertical-align與line-height作用詳解
文章詳細(xì)介紹了CSS中的`vertical-align`和`line-height`屬性,包括它們的作用、適用元素、屬性值、常見使用場(chǎng)景、常見問題及解決方案,感興趣的朋友跟隨小編一起看看吧2025-03-26淺析CSS 中z - index屬性的作用及在什么情況下會(huì)失效
z-index屬性用于控制元素的堆疊順序,值越大,元素越顯示在上層,它需要元素具有定位屬性(如relative、absolute、fixed或sticky),本文給大家介紹CSS 中z - index屬性的作用2025-03-21- 文章詳細(xì)介紹了CSS中的打印媒體查詢@mediaprint包括基本語法、常見使用場(chǎng)景和代碼示例,如隱藏非必要元素、調(diào)整字體和顏色、處理鏈接的URL顯示、分頁控制、調(diào)整邊距和背景等2025-03-18
CSS模擬 html 的 title 屬性(鼠標(biāo)懸浮顯示提示文字效果)
本文介紹了如何使用CSS模擬HTML的title屬性,通過鼠標(biāo)懸浮顯示提示文字效果,通過設(shè)置`.tipBox`和`.tipBox.tipContent`的樣式,實(shí)現(xiàn)了提示內(nèi)容的隱藏和顯示,感興趣的朋友一起2025-03-10前端 CSS 動(dòng)態(tài)設(shè)置樣式::class、:style 等技巧(推薦)
本文介紹了Vue.js中動(dòng)態(tài)綁定類名和內(nèi)聯(lián)樣式的兩種方法:對(duì)象語法和數(shù)組語法,通過對(duì)象語法,可以根據(jù)條件動(dòng)態(tài)切換類名或樣式;通過數(shù)組語法,可以同時(shí)綁定多個(gè)類名或樣式,此外2025-02-26