CSS 基础总结

引入CSS

内联样式

<h1 style="text-align: center; color: red"></h1>

style标签

<style>
    body {background-color: grey;}
</style>

外部样式

a.css

body {background-color: grey;}

index.html

<link rel="stylesheet" href="./a.css">

CSS之间引入(不常用)

a.css

@import url(./b.css);
div {background-color: red;}

调整样式的技巧

取色、量尺寸、预览字体

  • 使用截图、取色工具:QQ、ColorPix;
  • 字体可能有多种颜色,此时需要查看网页源代码:Chrome开发者工具下选择Elements的Computed属性(计算出来的属性值);
  • 设置属性值:直接在开发者工具上测试修改,或查看MDN;
  • 测量某些条件下的尺寸时(如hover)启用截图工具可能使效果消失,此时可以在开发者工具中找到该元素、把触发条件固定再测量;

添加border

添加样式无明显效果时,可以给添加样式的元素添加带颜色和宽度的边框观察变化。

知识点

伪元素

  • 只能展示(默认以span的形式展示,display: block则为div),不能被选中(不是真实的元素);
  • 必须添加content才可见(content可以为'');
  • 可以代替一层div(before/after后面不能再继续加)。
div::before{
    content: '['
}
div::after{
    content: ']'
}

属性继承

  • 把父元素下的子元素的公共属性样式提取出来,写为父元素的样式属性;
  • 部分属性可修改值为inhert,表示继承祖先元素属性。

默认边距

很多标签都存在默认边距(如body标签默认外边距8px),应该修改为0,再根据实际情况调整。

* {
    margin: 0;
    padding: 0;
}

伪类

如包含尺寸相关的样式(如border),伪类属性(如鼠标经过)引起改变时可能会造成“抖动”,此时应设置样式默认存在、颜色为透明,如设置边框:

a {
    border-bottom: 1px solid transparent;
}
a:hover {
    border-bottom: 1px solid red;
}

其他常用的伪类还有:nth-child(2)、first-child、:lang等。

a标签

  • a标签作为子标签时,父标签可能不能完全包住a标签(a是内联元素),此时修改a标签的display属性为block即可;
  • 设置a标签的边界与文字之间的边距(内边距),可以使用padding属性;
  • a标签默认为蓝色、有下划线,应该修改全局a标签属性color: inherit继承祖先元素的颜色、text-decoration: none去除下划线。

span标签

span与span之间无论相隔多少空的内容(空格、换行等),都会被认为是一个空格,而在某些span之间不需要空或空格宽度不合要求的的场合应该把span同行靠在一起,再通过margin调整间距。

元素的高度

文档流

文档流即文档内元素的流动方向:

  • 内联元素从左往右,受到阻挡时换行继续向右流动,其中:
    • span元素会被截断成两部分出现在两行;
    • 一连串的英文字符会被认为是一个单词,因此不会换行(由word-break属性控制);
  • 块级元素(独占一行)从上往下流动。

块级元素(div)的高度:文档流

  • 块级元素的高度由其内部文档流元素的高度总和决定(不是相加);
  • 可以使用display属性修改其文档流展示特性(不建议);
  • 可以使用height属性固定高度(不建议)。

内联元素(span)的高度

  • 同行元素依基线(单词本的第三线)对齐;
  • 换行元素相隔“建议行高”:如span中包含文字,则建议行高约为字体像素大小的1.4倍高(可以由height、line-height属性控制,因字体而异,前端无法准确决定);
  • 字体的像素大小:把所有文字排成一行,最顶端到最低端的距离;
  • 多个元素同行排放:取行高最大值;
  • 注意内联元素只有左右padding有效果,上下padding没有。

内联元素无法准确确定高度,字体较小时可以通过line-height控制(当line-height与height一致时会在外层元素中自动居中),也可以通过padding调节。

背景图

  • 自适应(宽高、位置):
banner {
    background-image: url(xxx);
    background-position: center center;
    background-size: cover;
}
  • 遮罩层:放在背景图div的内层,宽高与背景图相等(注意自适应时不需要指定),设置为黑色、调整透明度即可(如background-color: rgba(0, 0, 0, 0.8))

自适应

  • div动态宽度:使用max-width属性表示最宽不会超过该值,而窗口较小时会随窗口缩小;
  • div居中:margin: auto;;
  • span居中:计算宽度、高度差,调整height = padding + line-height、text-align控制;
  • 同行元素对齐:调整同行不同元素的border、padding(修改padding时注意上下都要同时修改,否则不对称);
  • 列表两边对齐:如要使dl > dt, dd占满一行且占据在两边:
dl dt,
dl dd{
    float: left;
    width: 50%;
}

重叠

  • 可以调整margin外边距使元素与其他同级元素重叠,只需要设置margin为负数;
  • 另一个方法是使用相对定位(父)-绝对定位(子),不建议。

形状

搜素:CSS Tricks Shape

三角形

  • 首先让边框与宽度和高度相等
  • 使宽度和高度等于0,即得到一个正方形;
  • 取需要的指定方向的三角形、使其他三个边框颜色为透明即可得到一个等腰直角三角形;
  • 调节边框宽度,可以得到不同角度、不同大小的三角形。
div {
    border: 10px solid red;
    width: 10px;
    height: 10px;
    border-top-color: black;
    border-top-color: blue;
    border-top-color: greed;
}

最后把透明的边框属性删去,得到:

div {
    border: 100px solid transparent;
    width: 0px;
    border-left-color: #E6686A;
    border-top-width: 0px;
}

圆形

  • div加上border-radius属性可得到弧形的边框,其中50%即为圆;
  • 注意div必须指定width和height。

其他特殊效果

  • 渐变(linear gradient generator)
  • 动画(CSS Animation)
  • 阴影(Shadow generator)
  • 过渡:transition: xxx 1s;

图标

使用SVG:

svg {
    width: 100px;
    height: 100px;
    fill: 100%;
    vertical-align: top;
}

关于布局的总结

一些设计原则

  • 不混用行布局和列布局(比如当一行多个div、且下一个div位于另一行时:在同行的div们外层套一个div,再与下一行的div组成列布局);
  • 使用max-width能根据窗口大小自动调节div宽度,比width更灵活;
  • 使用display属性可以改变标签的展示方式,而不是为了方便再内容外面先套上一个div;
  • 上一行的div与当前行div没有关系,如无必要不应该用一个div把两者包在一起,而是根据内容划分层次。

多列

单列、多行排放的元素可通过float修改为横向、多列布局:

.child {
    float: left
}

在其父元素清除浮动带来的副作用:

.clearfix::after{
    content: '';
    display: block;
    clear: both;
}

另外也可以使用绝对定位-相对定位做多列布局,不建议。

双列布局

标签定义如下:

<div class="clearfix">
    <div class="left">left</div>
    <div class="right">right</div>
</div>

两列自适应:

<style>
.clearfix::after{
    content: '';
    display: block;
    clear: both;
}
.left {
    background-color: red;
    width: 50%;
    float: left
}
.right {
    background-color: blue;
    width: 50%;
    float: left
}
</style>

固定一列,另一列自适应:

<style>
.clearfix::after{
    content: '';
    display: block;
    clear: both;
}
.left {
    background-color: red;
    width: 300px;
    float: left;
}
.right {
    background-color: blue;
    margin-left: 300px;
}
</style>

三列布局

标签定义如下:

<div class="clearfix">
    <div class="left">left</div>
    <div class="right">right</div>
    <div class="middle">middle</div>
</div>

固定两边,中间自适应(注意要把页面上需要自适应的元素代码写在最后,因此固定中间和左/右、另一边自适应同理):

<style>
.clearfix::after{
    content: '';
    display: block;
    clear: both;
}
.left {
    background-color: red;
    width: 300px;
    float: left;
}
.middle {
    background-color: yellow;
    margin-left: 300px;
    margin-right: 100px;
}
.right {
    background-color: blue;
    width: 100px;
    float: right;
}
</style>

三列自适应与两列自适应类似,不作赘述。

居中

水平居中

元素 属性
inline 父元素text-align: center
block 定宽:margin-left: auto; margin-right: auto
不定宽:子元素display: inline,再以内联元素的方法设置
flex 父元素display: flex; justify-content: center;

垂直居中

元素 属性
inline 单行:父元素height=line-height
多行:父元素display:table-cell或inline-block; vertical-align:middle;
block 子元素position: absolute; top: 0; bottom: 0
父元素position: relative; margin: auto;
flex 父元素display: flex; min-height: 100vh;
子元素margin:auto;

定位

固定定位

使用position属性可以脱离文档流(“浮”在上层),如position: fixed属性定位的元素:

  • 不再受其父元素控制,其位置是相对于屏幕而言的;
  • 其宽不会向两边扩展(而是向一边缩),可通过width: 100%控制(不建议,可能会越出其父元素);
  • 在fixed定位的元素中套一层div,通过修改该div的padding属性达到控制边距的效果。

相对定位、绝对定位

绝对定位必为block,使用绝对定位不会影响父元素、可以避免页面元素改变时影响布局(比如div挤压)。

使用浮动元素/绝对定位时没有指定宽度会默认自动换行,需要同行展示可以设置white-space: nowrap。

  • 父元素:position: relative;
  • 子元素:position: absolute;(相对于祖先中的第一个relative素定位)
  • 子元素中通过top、bottom、left、right属性调节定位(表示到该边的距离)。

更多高级的布局方法见:CSS布局十八般武艺都在这里了

周边工具

  • LESS CSS:一种简化、功能更多的CSS语言;
  • SASS:一种简化、功能更多的CSS 语言(请自行搜索中英文官网);
  • PostCSS:一种 CSS 处理程序。

学习资源

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,727评论 1 92
  • 学会使用CSS选择器熟记CSS样式和外观属性熟练掌握CSS各种选择器熟练掌握CSS各种选择器熟练掌握CSS三种显示...
    七彩小鹿阅读 6,304评论 2 66
  • 选择qi:是表达式 标签选择器 类选择器 属性选择器 继承属性: color,font,text-align,li...
    love2013阅读 2,303评论 0 11
  • 选择qi:是表达式 标签选择器 类选择器 属性选择器 继承属性: color,font,text-align,li...
    wzhiq896阅读 1,730评论 0 2
  • 最近住酒店碰到一个很尴尬的事情:快捷酒店如家觉得档次太低,希尔顿又太贵。 所以,但朋友提起“亚朵”时我很兴奋,虽然...
    马达哥阅读 140评论 0 0