整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          Vim實用技巧:global命令

          Vim實用技巧:global命令

          global命令結合了Ex命令與Vim的模式匹配這兩方面能力。憑借該命令,可以在某個指定模式的所有匹配行上運行Ex命令。就處理重復工作的效率而言,global 命令是除點范式以及宏之外,最為強大的Vim工具之一。

          技巧98 認識global命令

          :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中講解這項強大的技術。

          技巧99 刪除所有包含模式的文本行

          將 :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命令分別取出這兩組數據。

          用 ‘:g/re/d’ 刪除所有的匹配

          如果只想保留 <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”已然呼之欲出了。

          用 ‘:v/re/d’ 只保留匹配行

          這一次,我們將進行相反的操作。正如我們前面提到的,: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/">

          僅僅憑借一條命令,整篇文檔就被精煉為我們感興趣的文本段了。

          技巧100 將TODO項收集至寄存器

          通過把 :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命令一起使用時不太干凈利落。

          技巧101 將CSS文件中所有規則的屬性按照字母排序

          當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-top=margin-block-start
          • margin-right=margin-inline-end
          • margin-bottom=margin-block-end
          • margin-left=margin-inline-start

          還有兩個新的快捷鍵,可以同時設置兩個塊或者兩個內嵌塊。

          • margin-block
          • margin-inline

          在下面示例中,使用了這些流相關關鍵字,然后更改了盒子的編寫模式,你可以看到 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內邊距會在下一章中講到。


          主站蜘蛛池模板: 久久人妻无码一区二区| 日韩精品一区二区三区中文字幕| 亚洲av无码一区二区三区人妖| 精品乱码一区二区三区在线| 久久一区二区精品综合| 视频一区二区精品的福利| 亚洲一区二区三区播放在线| 人妻无码一区二区三区| 国产成人精品一区二区A片带套| 人妻少妇精品一区二区三区| 国产成人av一区二区三区不卡 | 精品国产日韩一区三区| 人妻AV中文字幕一区二区三区| 国产无套精品一区二区| 一区免费在线观看| 性色AV 一区二区三区| 无码国产精品一区二区免费模式 | 色综合一区二区三区| 精品无码国产一区二区三区51安| 国产精品久久久久久麻豆一区| 色窝窝无码一区二区三区 | 好爽毛片一区二区三区四无码三飞| 色婷婷综合久久久久中文一区二区| 日产一区日产2区| 日本成人一区二区三区| 麻豆一区二区99久久久久| 日韩免费无码一区二区三区 | 久久精品国产一区二区三区肥胖 | 伦理一区二区三区| 成人无码AV一区二区| 中文字幕日本精品一区二区三区| 中文字幕日本一区| 亚洲成AV人片一区二区| 91久久精品国产免费一区| 亚洲AV成人一区二区三区在线看 | 国产成人精品久久一区二区三区av| 日本一区午夜爱爱| 亚洲韩国精品无码一区二区三区 | 亚洲午夜一区二区三区| 欧美日韩一区二区成人午夜电影| 夜夜高潮夜夜爽夜夜爱爱一区|