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小时内与您取得联系。