global命令結合了Ex命令與Vim的模式匹配這兩方面能力。憑借該命令,可以在某個指定模式的所有匹配行上運行Ex命令。就處理重復工作的效率而言,global 命令是除點范式以及宏之外,最為強大的Vim工具之一。
:global 命令允許在某個指定模式的所有匹配行上運行Ex命令。首先研究一下它的語法。
:global命令通常采用以下形式(參見 :h :g
)。
:[range] global[!] /{pattern}/ [cmd]
首先,在缺省情況下,:global命令的作用范圍是整個文件(%),這一點與其他大多數Ex命令(包括:delete、:substitute 以及 :normal)有所不同,這些命令的缺省范圍僅為當前行(.)。
其次,{pattern} 域與查找歷史相互關聯。這意味著如果將該域留空的話,Vim會自動使用當前的查找模式。
另外,[cmd]可以是除 :global命令之外的任何Ex命令。在實際應用中,如表5-1中所列的那些Ex命令,無一不在處理文本過程中起到了極大的作用。順便提一下,如果不指定任何 [cmd],Vim將缺省使用 :print。
還有,可以用 :global! 或者 :vglobal(v表示invert)反轉:global命令的行為。這兩條命令將指示Vim在沒有匹配到指定模式的行上執行 [cmd]。在下一節中,將會分別看到 :global 與 :vglobal的應用實例。
最后需要指出的是 :global命令在指定 [range] 內的文本行上執行時通常分為兩輪。第一輪,Vim在所有[pattern]的匹配行上做上標記。第二輪,再在所有已標記的文本行上執行 [cmd]。另外,由于 [cmd] 的范圍可單獨設定,因此可在多行文本段內進行操作,將在技巧101中講解這項強大的技術。
將 :global 命令與 :delete命令一起組合使用,可以快速裁剪文件內容。對于那些匹配 {pattern} 的文本行,既可以選擇保留,也可以將其丟棄。
以下內容取自Vimcasts.org歸檔網頁中有關前幾部主題的鏈接。
global/episodes.html
<ol> <li> <a href="/episodes/show-invisibles/"> Show invisibles </a> </li> <li> <a href="/episodes/tabs-and-spaces/"> Tabs and Spaces </a> </li> <li> <a href="/episodes/whitespace-preferences-and-filetypes/"> Whitespace preferences and filetypes </a> </li></ol>
顯而易見,所有列表項均由兩部分數據構成:主題的標題及其URL。接下來,將利用 :global命令分別取出這兩組數據。
如果只想保留 <a> 標簽內的標題,而把其他行刪掉,該怎么做呢?在本例中,由于每組鏈接的內容各占一行,而其他文本行只包含或開或閉這兩種類型的標簽,因此,如果設計一個可以匹配HTML標簽的模式,再用它調用 :global命令,就可以刪掉所有該模式的匹配行了。
以下命令可以做到這一點。
? /\v\<\/?\w+>? :g//d
如果在Vimcasts.org的歸檔文件中運行這兩條命令,文件的內容將會變為:
Show invisiblesTabs and SpacesWhitespace preferences and filetypes
與 :substitute命令類似,也可以將:global命令的查找域留空。這樣一來,Vim將會重用最后一次的查找模式(參見技巧91)。這意味著在構造正則表達式的過程中,可以先進行粗粒度匹配,然后再對其進行精細調整,正如技巧85展示的那樣。
本例的正則表達式采用的是 very magic模式(在技巧74中有所涉及)。首先,它會匹配左尖括號(\<);然后,匹配可選的正斜杠(\/?);接下來,再匹配一個或多個單詞型字符(\w+);最后匹配表示單詞結尾的分隔符(>)。盡管這個正則表達式并不能匹配所有的標簽,但對于這個特定的例子來說,已經夠用了。
Grep一詞的來歷
請仔細琢磨一下 :global命令的簡寫形式:
? :g/re/p
re表示regular expression,而 p是 :print的縮寫,它作為缺省的 [cmd]使用。如果我們把符號 / 忽略掉,便會發現單詞“grep”已然呼之欲出了。
這一次,我們將進行相反的操作。正如我們前面提到的,:vglobal或簡寫的 :v命令恰好與 :g命令的操作相反。也就是說,它用于在指定模式的非匹配行上執行Ex命令。
在本例中,包含URL的文本行很容易識別,它們都含有 href屬性。因此,運行以下命令,可以得到這些文本行。
? :v/href/d
以上命令可以解讀為“刪除所有不包含 href的文本行”。最終的結果如下。
<a href="/episodes/show-invisibles/"><a href="/episodes/tabs-and-spaces/"><a href="/episodes/whitespace-preferences-and-filetypes/">
僅僅憑借一條命令,整篇文檔就被精煉為我們感興趣的文本段了。
通過把 :global和 :yank 這兩條命令結合在一起,可以把所有匹配 {pattern}的文本行收集到某個寄存器中。
下列代碼包含了幾行以“TODO”開頭的注釋行。
global/markdown.js
Markdown.dialects.Gruber={ lists: function() { // TODO: Cache this regexp for certain depths. function regex_for_depth(depth) { /* implementation */ } }, "`": function inlineCode( text ) { var m=text.match( /(`+)(([\s\S]*?))/ ); if ( m && m[2] ) return [ m[1].length + m[2].length ]; else { // TODO: No matching end code found - warn! return [ 1, "`" ]; } }}
假設想把所有TODO項收集到一起。只需輸入以下命令,這些信息就會變得一覽無余。
? :g/TODO《 // TODO: Cache this regexp for certain depths. // TODO: No matching end code found - warn!
請牢記,:print是 :global命令的缺省 [cmd],它只是簡單地回顯所有匹配單詞“TODO”的文本行。這并沒什么用處,因為一旦執行了其他命令,這些信息將會消失。
這里介紹另外一種做法。先將所有包含單詞“TODO”的文本行復制到某個寄存器,再把寄存器的內容粘貼到其他文件中,以備不時之需。
這一次,將用到寄存器a。首先運行 qaq,將其清空。對這個命令進行分解。qa會讓vim開始錄制宏,并把它存到寄存器a中,最后的 q則負責終止錄制。由于在錄制宏的過程中,我們沒有敲擊任何按鍵,因此寄存器最終被清空了。可以用下面的命令印證一下。
? :reg a《--- Registers --- "a
現在,可以把包含TODO注釋的行復制到此寄存器中了。
? :g/TODO/yank A? :reg a《"a // TODO: Cache this regexp for certain depths. // TODO: No matching end code found - warn!
此處有一個竅門,即要用大寫字母A引用寄存器。這意味著Vim將把內容附加到指定的寄存器,用小寫字母 a的話,則會覆蓋原有寄存器的內容。因此,這條global命令可以被解讀為“將所有匹配模式 /TODO/ 的文本行依次附加到寄存器 a。”
這一次,當再次運行 :reg a時,會發現寄存器 a已經存有兩組源自文檔的TODO項了。(為了方便閱讀,已將這些內容調整為兩行,但在Vim中,換行符實際會顯示為 ^J。)此后,只需在任意分割窗口中打開一個新緩沖區,再運行 "ap命令,就可以將寄存器 a的內容粘貼進去了。
本例只收集了兩個TODO項,即使手動操作也可以很快地完成。但是,以上介紹的技術具有很好的擴展性。如果某篇文檔包含十幾個TODO項,采用該技巧將使我們事半功倍。
甚至可以將 :global命令與 :bufdo或 :argdo一起搭配使用,從一組文件中收集所有的TODO項。這個任務就留給你作為練習吧,可以參考技巧36中類似的工作流程。
還有另外一種方案:
? :g/TODO/t$
這里用到的 :t命令已經在技巧29中介紹。該命令是將所有TODO項復制到當前文件的末尾,而不是把它們附加到寄存器。一旦運行完該命令,就可以在文件的末尾看到這些TODO項了。由于此法不會影響寄存器的內容,因此相對簡單直接,但它在與 :argdo以及:bufdo命令一起使用時不太干凈利落。
當Ex命令與 :global一起組合使用時,也可以為[cmd]單獨指定范圍。Vim允許以 :g/{pattern} 為參考點,動態地設定范圍。接下來,看看如何利用這一點,將CSS文件中每一條規則的所有屬性均按照字母順序排列。
用以下 CSS 文件作為演示。
global/unsorted.css
Line 1 html { - margin: 0; - padding: 0; - border: 0; 5 font-size: 100%; - font: inherit; - vertical-align: baseline; - } - body { 10 line-height: 1.5; - color: black; - background: white; - }
假設想把每一組規則內的屬性都按照字母順序排序。借助Vim的內置命令 :sort(參見:h :sort ),就可以實現這一功能。
先用 :sort命令在該文件的子集上練練手(參見表15-1)。
首先,使用文本對象 vi{,可以輕易地選中一段由 {} 所圍的文本塊。然后,運行 :'<,'>sort,便可以將這些文本行按照字母順序重新排列了。如果每次僅對一條規則進行排序,此法完全可以勝任,但假設我們遇到的是一個包含數百條規則的樣式表呢?如果能把這一過程自動化豈不更好么?
表15-1 對文件的子集進行排序
按鍵操作緩沖區內容{start}html {
margin: 0;
padding: 0;
border: 0;
font-size: 100%;
font: inherit;
vertical-align: baseline;
}vi{html {
margin: 0;
padding: 0;
border: 0;
font-size: 100%;
font: inherit;
vertical-align: baseline;
}:’<,’>sorthtml {
border: 0;
font-size: 100%;
font: inherit;
margin: 0;
padding: 0;
vertical-align: baseline;
}
其實,可以用一條 :global 命令對文件中所有規則的屬性進行排序。假設在本例的樣式表中運行以下命令。
? :g/{/ .+1,/}/-1 sort
最終會得到以下結果。
html { border: 0; font-size: 100%; font: inherit; margin: 0; padding: 0; vertical-align: baseline;}body { background: white; color: black; line-height: 1.5;}
這條排序命令會在每條規則的{} 塊內執行。盡管本例中的樣式表僅僅包含十幾行文本,但對于內容更多的CSS文件,此法也同樣適用。
這條命令很復雜,但掌握其機理后,將會由衷地贊嘆 :global命令的強大。:global命令的標準格式如下。
:g/{pattern}/[cmd]
請牢記,Ex命令通常都會接受“范圍”作為其參數(正如技巧28討論的那樣)。對于:global命令內部的 [cmd],該規則依然有效。因此,可以將命令的模板擴展成以下形式。
:g/{pattern}/[range][cmd]
實際上,可以用 :g/{pattern} 匹配作為參考點,動態設置 [cmd]的 [range]。. 符號通常表示光標所在行,但在 :global命令的上下文中,它則表示 {pattern} 的匹配行。
可以把原有的命令拆分成兩條單獨的Ex命令進行講解,先分析命令的后半部分。以下是一條有效的Ex命令。
? :.+1,/}/-1 sort
如果去掉范圍中的偏移,該范圍可簡化為 .,/}/,其含義是“從當前行開始,一直到匹配模式 /}/ 的那一行為止”。偏移值 +1 與 —1 僅僅用于縮小操作范圍,讓我們把目光集中在 {} 之間的內容上面。對于排序前的原始CSS文件,如果把光標置于第1行或第9行,以上這條Ex命令將會對相應 {} 之內的規則按照字母順序重新排序。
也就是說,只需將光標置于每個{} 塊的起始位置,再運行 :.,/}/ sort 命令,即可將其中的規則按照字母順序重新排序了。明白了么?現在,試著用 :global命令中的 {pattern} 執行一次查找。
? /{/
以上命令會將光標置于某個 {} 塊的起始位置,即我們的目標所在。現在,再重新將 :global 與 Ex命令 [cmd]組合在一起。
? :g/{/ .+1,/}/—1 sort
其中,模式 { 會匹配每個 {} 塊的起始行。而對于每個匹配行,:sort會在匹配行到 {} 塊的結尾這個[range] 范圍內執行。最終,每一條規則的CSS屬性都會按照字母順序排列整齊。
:global命令的廣義形式如下。
:g/{start}/ .,{finish} [cmd]
可以將其解讀為“對從 {start} 開始,到 {finish} 結束的所有文本行,執行指定的 [cmd]”。
對于 :global命令與任意Ex命令的組合,都可以采用相同的范式。例如,假設想對某一段指定范圍內的文本內容進行縮進,用Ex命令 :>(參見:h >)就可以實現。
? :g/{/ .+1,/}/—1 >
《 6 lines >ed 1 time
3 lines >ed 1 time
{注意:}
與 :sort不同的是,每當調用 :> 命令時,Vim都會提示一條信息。如果在 [cmd] 的前面加上 :slient(參見 :h :sil ),就可以屏蔽這些信息:
? :g/{/sil .+1,/}/?1 >
此法尤其適用于 :g/{pattern} 匹配大量文本行的情況。
本文摘自《Vim實用技巧》(第2版)
Vim是一款功能豐富而強大的文本編輯器,其代碼補全、編譯及錯誤跳轉等方便編程的功能特別豐富,在程序員中得到非常廣泛的使用。Vim能夠大大提高程序員的工作效率。對于Vim高手來說,Vim能以與思考同步的速度編輯文本。同時,學習和熟練使用Vim又有一定的難度。
本書為那些想要提升自己的程序員編寫,閱讀本書是熟練掌握高超的Vim技巧的必由之路。全書共21章,包括123個技巧。每一章都是關于某一相關主題的技巧集合。每一個技巧都有針對性地解決一個或一類問題,幫助讀者提升Vim的使用技能。本書示例豐富,講解清晰,采用一種簡單的標記方法,表示交互式的編輯效果,可以幫助讀者快速掌握和精通Vim。
本書適合想要學習和掌握Vim工具的讀者閱讀,有一定Vim使用經驗的程序員,也可以參考查閱以解決特定的問題。
文:https://www.smashingmagazine.com/2019/07/margins-in-css/
譯者:前端小智
為了保證的可讀性,本文采用意譯而非直譯。
為了回饋讀者,《大遷世界》不定期舉行(每個月一到三次),現金抽獎活動,保底200,外加用戶贊賞,希望你能成為大遷世界的小錦鯉,快來試試吧
當我們學習CSS時,我們大多數人學到的第一件事是CSS中盒子的各個部分的細節,這部分通過叫做 CSS盒、模型。“盒模型”中的元素之一是margin,即盒子周圍的透明區域,它會將其他元素從盒子內容中推開。
CSS1中描述了 margin-top、margin-right、margin-bottom和margin-left屬性,以及一次設置所有四個屬性的簡寫 margin。
margin看起來是一個相當簡單的事情,但是,在本文中,咱們將看一些在使用margin一些讓人迷惑有有趣的事情。 特別是,margin之間如何相互作用,以及 margin 重疊效果。
想閱讀更多優質文章請猛戳GitHub博客,一年百來篇優質文章等著你!
CSS 盒模型
CSS 盒模型指的是一個盒子的各個部分——content、padding、border和margin,它們各自之前是如何布局及相互作用的, 如下所示:
盒子的的四個margin屬性和maring縮寫都在CSS1中定義。
CSS2.1規范有一個演示盒模型的插圖,還定義了用來描述各種盒子的術語,其中包括 content box、填padding box、border box和 margin box。
現在有一個 Level 3 Box Model specification 的草案。這個規范引用了CSS2作為盒模型和margin的定義,因此我們將在本文的大部分內容中使用CSS2定義。
margin 重疊
CSS1 規范定義了margin,也定義了垂直 margin 重疊。如果考慮到在早期,CSS被用作文檔格式語言,那么 margin 重疊是有意義的。 margin 重疊意味著,當一個有底部margin的標題后面跟著一個有頂部 margin 的段落時,它們之間就不會出現較大的空白。
當兩個 margin 發生重疊時,它們將組合在一起,兩個元素之間的空間取較大的一個。 較小的 margin 在較大的里面。
在以下情況下,margin 會重疊:
依次來看看這些場景。
相鄰的兄弟姐妹
對 margin 重疊的最初描述是演示相鄰兄弟姐妹之間的 margin 是如何重疊的。除了下面提到的情況之外,如果有兩個元素在正常流中依次顯示,那么第一個元素的底部 margin 將與下面元素的頂部 margin 一起重疊。
在下面示例中,有三個div元素。第一個 div 的頂部和底部的margin都是50px。第二個 div 的頂部和底部 margin 都是20px。第三個 div 的頂部和底部 margin 都是3em。前兩個元素之間的 margin 是50px,因為較小的頂部 margin 與較大的底部 margin 相結合。第二個元素與第三個元素之間的 margin 是 3em,因為3em大于第二個元素底部margin 20px。
html
<div class="wrapper"> <div class="box example1"> margin-top: 50px; margin-bottom: 50px; </div> <div class="box example2"> margin-top: 20px; margin-bottom: 20px; </div> <div class="box example3"> margin-top: 3em; margin-bottom: 3em; </div> </div>
css
.wrapper { border: 5px dotted black; } .example1 { margin: 50px 0 50px 0; } .example2 { margin: 20px 0 20px 0; } .example3 { margin: 3em 0 3em 0; } body { font: 1.4em/1.3 "Gill Sans", "Gill Sans MT", Calibri, sans-serif; margin: 2em 3em; } .box { background-color: rgb(55,55,110); color: white; padding: 20px; border-radius: .5em; }
運行效果:
完全空盒子
如果一個盒子是空的,那么它的頂部和底部 margin 可能會相互重疊。在下面的示例中,class為empty的元素的頂部和底部 margin 各為50px,但是,第一項和第三項之間的 margin不是100px,而是50px。這是由于兩個 margin 重疊造成的。如果向空盒子中放入內容就會阻止 margin 合并。
html
div class="wrapper"> <div class="box"> A box </div> <div class="box empty"></div> <div class="box"> Another box </div> </div>
css
.wrapper { border: 5px dotted black; } body { font: 1.4em/1.3 "Gill Sans", "Gill Sans MT", Calibri, sans-serif; margin: 2em 3em; } .box { background-color: rgb(55,55,110); color: white; border-radius: .5em; } .empty { margin: 50px 0 50px 0; }
運行效果:
父元素和第一個或最后一個子元素
margin 重疊讓人猝不及防,因為它有時候不是很直觀。在下面的示例中,有一個類名為 wrapper 的div,給這個div一個紅色的outline,這樣就可以看到它在哪里了。
這個div里面的三個子元素的 margin 都是50px。但是你會發現實際的效果是第一項和最后一項與父元素的的margin齊平,好像子元素和父元素之間沒有50px的margin一樣。
html
<div class="wrapper"> <div class="box"> Item 1 </div> <div class="box"> Item 2 </div> <div class="box"> Item 3 </div> </div>
css
.wrapper { outline: 1px solid red; } .box { margin: 50px; } body { font: 1.4em/1.3 "Gill Sans", "Gill Sans MT", Calibri, sans-serif; margin: 2em 3em; } .box { background-color: rgb(55,55,110); color: white; padding: 20px; border-radius: .5em; }
運行效果:
這是因為子節點上的margin會隨著父節點上的任何一邊的margin相互重疊,從而最終位于父節點的外部。如果使用DevTools檢查第一個子元素,就可以看到這一點,顯示的黃色區域就是是 margin。
僅塊元素 margin 重疊
在CSS2中,只指定垂直方向的 margin 重疊,即元素的頂部和底部 margin。因此,上面的左右邊距不會重疊。
值得注意的,margin 只在塊的方向上重疊,比如段落之間。
阻止 margin 重疊
如果一個元素是絕對的定位,或者是浮動的,那么它的margin永遠不會重疊。然而,假設你遇到了上面示例中的幾種情況,那么如何才能阻止 margin 重疊呢?
例如,一個完全空的盒子,如果它有border或padding,它的上下 margin就不會重疊。在下面的例子中,給這個空盒子添加了1px的padding。現在這個空盒子的的上方和下方都有一個50px的 margin。
html
<div class="wrapper"> <div class="box"> A box </div> <div class="box empty"></div> <div class="box"> Another box </div> </div>
css
.wrapper { border: 5px dotted black; } body { font: 1.4em/1.3 "Gill Sans", "Gill Sans MT", Calibri, sans-serif; margin: 2em 3em; } .box { background-color: rgb(55,55,110); color: white; border-radius: .5em; } .empty { margin: 50px 0 50px 0; padding: 1px; }
運行效果:
這背后是有邏輯,如果盒子是完全空的,沒有border或padding,它基本上是不可見的。 它可能是CMS中標記為空的段落元素。 如果你的CMS添加了多余的段落元素,你可能不希望它們在其他段落之間造成較大的空白,這時 margin 重疊就有一定的意義。
對于父元素和第一個或最后一個子元素 margin 重疊,如果我們向父級添加border,則子級上的margin會保留在內部。
... .wrapper { border: 5px dotted black; } ...
同樣,這種行為也有一定的邏輯。如果出于語義目的而對元素進行包裝,但這些元素不顯示在屏幕上,那么你可能不希望它們在顯示中引入大的 margin。當web主要是文本時,這很有意義。當我們使用元素來布局設計時,它的重疊行為就沒有多大的意義了。
創建格式化上下文(BFC)
BFC(Block Formatting Context)格式化上下文,是Web頁面中盒模型布局的CSS渲染模式,指一個獨立的渲染區域或者說是一個隔離的獨立容器。
BFC 可以阻止邊距的重疊。 如果我們再看父元素和第一個或最后一個子元素的示例,可以在 wrapper 元素加上 display: flow-root就會創建一個新的BFC,從而阻止 margin 合并
... .wrapper { outline: 1px solid red; display: flow-root; } ...
display: flow-root 是CSS3新出來的一個屬性,用來創建一個無副作用的 BFC。將overflow屬性的值設為auto也會產生同樣的效果,因為這也創建了一個新的BFC,盡管它也可能創建一些在某些場景中不需要的滾動條。
flex 和 grid 容器
flex 和 grid 容器為其子元素建立flex和grid格式化上下文,因此它們也能阻止 margin 的重疊。
還是以上面的例子為例,將 wrapper 改用 flex 布局:
... .wrapper { outline: 1px solid red; display: flex; flex-direction: column; } ...
網站 margin 策略
由于margin 會重疊,最好能找到一種一致的方法來處理網站的 margin。最簡單的方法是只在元素的頂部或底部定義 margin。這樣,就很少會遇到 margin 重疊的問題,因為有margin的邊總是與沒有margin的邊相鄰。
這個解決方案并不能解決你可能遇到的問題,因為子元素的margin會與父元素相互重疊。這個特定的問題往往不那么常見,但知道它為什么會發生可以幫助你想出一個解決方案。
對此,一個理想的解決方案是給元素設置 display: flow-root,但有的瀏覽器并不支持,可以使用overflow創建BFC、或將父元素設置成flex容器,當然還可以設置padding來解決。
百分比 margin
當你在CSS中使用百分比的時候,它必須是某個元素的百分比。使用百分比設置的 margin(或 padding)始終是父元素內聯大小(水平寫入模式下的寬度)的百分比。這意味著在使用百分比時,元素周圍的padding大小都是相同的。
在下面的示例中,有一個200px 寬的 d當,里面是一個類名為 box 的div,它的 margin值為10%,也就是 20px (200*10%)。
html
<div class="wrapper"> <div class="box"> I have a margin of 10%. </div> </div>
css
* { box-sizing: border-box; } .wrapper { border: 5px dotted black; width: 200px; } .box { background-color: rgb(55,55,110); color: white; padding: 20px; border-radius: .5em; margin: 10%; } body { font: 1.4em/1.3 "Gill Sans", "Gill Sans MT", Calibri, sans-serif; margin: 2em 3em; }
我們在本文中一直在討論垂直 margin ,然而,現代CSS傾向于以相對于流的方式而不是物理方式來考慮事情。因此,當我們討論垂直邊距時,我們實際上是在討論塊維度的邊距。如果我們在水平寫作模式下,這些 margin 將是頂部和底部,但在垂直寫作模式下,這些 margin 將是右側和左側。
一旦使用邏輯的、流相關的方向,就更容易討論塊的開始和結束,而不是塊的頂部和底部。為了簡化這一過程,CSS引入了邏輯屬性和值規范。這將流的相關屬性映射到物理屬性上。
還有兩個新的快捷鍵,可以同時設置兩個塊或者兩個內嵌塊。
在下面示例中,使用了這些流相關關鍵字,然后更改了盒子的編寫模式,你可以看到 margin 是如何遵循文本方向的:
html
<div class="wrapper horizontal-tb"> <div class="box"> A box with a horizontal-tb writing mode. </div> </div> <div class="wrapper vertical-rl"> <div class="box"> A box with a vertical-rl writing mode. </div> </div>
css
* { box-sizing: border-box; } .wrapper { border: 5px dotted black; inline-size: 200px; } .horizontal-tb { writing-mode: horizontal-tb; margin-bottom: 1em; } .vertical-rl { writing-mode: vertical-rl; } .box { background-color: rgb(55,55,110); color: white; padding: 20px; border-radius: .5em; margin-block-start: 30px; margin-block-end: 10px; margin-inline-start: 2em; margin-inline-end: 5%; } body { font: 1.4em/1.3 "Gill Sans", "Gill Sans MT", Calibri, sans-serif; margin: 2em 3em; }
需要了解更多,可以閱讀有關MDN上的邏輯屬性和值的更多信息。
代碼部署后可能存在的BUG沒法實時知道,事后為了解決這些BUG,花了大量的時間進行log 調試,這邊順便給大家推薦一個好用的BUG監控工具 Fundebug。
交流
干貨系列文章匯總如下,覺得不錯點個Star,歡迎 加群 互相學習。
https://github.com/qq449245884/xiaozhi
我是小智,公眾號「大遷世界」作者,對前端技術保持學習愛好者。我會經常分享自己所學所看的干貨,在進階的路上,共勉!
關注公眾號,后臺回復福利,即可看到福利,你懂的。
SS樣式優先權
1.寫法優先權
優先級依次是:行內樣式表 > 內部樣式表> 外部樣式表。
2.選擇符優先權
對于id 與 class 而言,id的定義優先于class 的定義。具有class屬性的比沒有class屬性的優先權要大。
id > class > 類型選擇符
樣式繼承
1.HTML 中的子標簽會繼承部分父標簽的樣式。
如: body { color:#ff0000;}那么頁面中,body之下的所有標簽及標簽下的所有子標簽的文本都將變成紅色。
2. !important
在兩行相同類型的css樣式定義中,往往優先執行后面一個;
p{font-size:14px;font-size:20px;}
但是可以通過!important 語法,提升某一句樣式表的重要性,使及優先執先 !important標注的語句。
p{font-size:14px !important;font-size:20px;}
css 代碼注釋,以 /* 開始 */ 結束。
如:/* body樣式*/
body { margin:0px; padding:0px;}
/*LOGO樣式*/
#logo{ ……}
/*導航樣式結束*/
字體樣式
1.字體
font-family設置文字名稱,可以使用多個名稱,或者使用逗號
分隔,瀏覽器則按照先后順序依次使用可用字體。
例:Arial
p { font-family:'宋體','黑體'}
2.字號
font-size設置文字的尺寸
例:p { font-size:14px;}
3.字體加粗
font-weight : normal | bold | bolder | lighter | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900
例:p { font-weight:bold;}
4.斜體
font-style : normal | italic | oblique
例:p { font-style: normal; }
p { font-style: italic; }
p { font-style: oblique; }
5.下劃線控制
text-decoration : none || underline || blink || overline || line-through
例:
p { text-decoration:overline;}
p { text-decoration:underline;}
p { text-decoration:line-through;}
6.字體樣式縮寫
font : font-style || font-variant || font-weight || font-size || line-height || font-family
例:
P {
font-style:italic;
font-weight:bold;
font-size:14px;
line-height:22px;
font-family:宋體;
}
也可以縮寫的形式:
p { font:italic bold 14px/22px 宋體}
1.行高
line-height : normal | length
例:p{ line-height:25px;} p{ line-height:150%}
2.段落縮進
text-indent : length; p{ text-indent:4px;}
3.段落對齊
text-align : left | right | center | justify
對于text-aligh,不但是文本,對象中的其它元素也能夠被text-align進行對齊方式的設置。
例:
p { text-align:right;}
p { text-align:center;}
4.文字間距
letter-spacing : normal | length
p{ letter-spacing:5px;}
關于margin外邊距和padding內邊距會在下一章中講到。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。