css基础重拾

css基础重拾

1、核心知识

@规则
  • @namespace 告诉 CSS 引擎必须考虑XML命名空间。
  • @media, 如果满足媒体查询的条件则条件规则组里的规则生效。
  • @page, 描述打印文档时布局的变化.
  • @font-face, 描述将下载的外部的字体。
  • @keyframes, 描述 CSS 动画的关键帧。
  • @document, 如果文档样式表满足给定条件则条件规则组里的规则生效。 (推延至 CSS Level 4 规范)
  • @charset用于定义样式表使用的字符集,不能再html页面使用,而是在
层叠性

层叠样式表自我的理解就是我们再给html某个标签设置样式的时候,有很多css声明作用到的时候,应该听那一个css声明

优先级:

  • 最低的就是浏览器自带的一些样式
  • 第二作者自己声明的样式,这里面作者自己声明的样式也有优先级
    • 优先级最高的是id选择器
    • 然后是class类选择器
    • 最后是标签选择器
  • 最高的就是!important声明
选择器
基础选择器:
  • 标签选择器:h1
  • 类选择器:.checked
  • ID 选择器:#picker
  • 通配选择器:*
组合选择器:
  • 相邻兄弟选择器:A + B
  • 普通兄弟选择器:A ~ B
  • 子选择器:A > B
  • 后代选择器:A B

属性选择器:

  • [attr]:指定属性的元素;
  • [attr=val]:属性等于指定值的元素;
  • [attr*=val]:属性包含指定值的元素;
  • [attr^=val] :属性以指定值开头的元素;
  • [attr$=val]:属性以指定值结尾的元素;
  • [attr~=val]:属性包含指定值(完整单词)的元素(不推荐使用);
  • [attr|=val]:属性以指定值(完整单词)开头的元素(不推荐使用);
伪类
常用的伪类:
  • :active:鼠标激活的元素;
  • :hover: 鼠标悬浮的元素;
  • ::selection:鼠标选中的元素;
  • :link:未访问的链接元素;
  • :visited:已访问的链接元素;
为元素:
  • ::before:在元素前插入内容;
  • ::after:在元素后插入内容;
css优先级
  • 10000:!important;
  • 01000:内联样式;
  • 00100:ID 选择器;
  • 00010:类选择器、伪类选择器、属性选择器;
  • 00001:元素选择器、伪元素选择器;
  • 00000:通配选择器、后代选择器、兄弟选择器;
css继承

子元素继承部分父元素的样式,这样做的目的就是这样可以减少css文件的大小

color(颜色,a元素除外)
direction(方向)
font(字体)
font-family(字体系列)
font-size(字体大小)
font-style(用于设置斜体)
font-variant(用于设置小型大写字母)
font-weight(用于设置粗体)
letter-spacing(字母间距)
line-height(行高)
text-align(用于设置对齐方式)
text-indent(用于设置首航缩进)
text-transform(用于修改大小写)
visibility(可见性)
white-space(用于指定如何处理空格)
word-spacing(字间距)

//这个里面注意,在继承颜色的时候,a标签是不继承的
//不继承的元素有width、height、margin 、border、padding、主要是宽高,内外边距,边框等

文档流

概念:文档流就是把内容按照从左到右,从上到下的顺序一行一行的排列展示

如何脱离文档流呢?

  • 使用浮动(float)会将元素脱离文档流,移动到容器左/右侧边界或者是另一个浮动元素旁边,该浮动元素之前占用的空间将被别的元素填补,另外浮动之后所占用的区域不会和别的元素之间发生重叠;
  • 使用绝对定位(position: absolute;)或者固定定位(position: fixed;)也会使得元素脱离文档流,且空出来的位置将自动被后续节点填补。
  • flex布局也可以脱离文档流
盒模型

在 CSS 中任何元素都可以看成是一个盒子,而一个盒子是由 4 部分组成的:内容(content)、内边距(padding)、边框(border)和外边距(margin)。

标准盒模型认为:盒子的实际尺寸 = 内容(设置的宽/高) + 内边距 + 边框

img

所以 .box 元素内容的宽度就为 200px,而实际的宽度则是 width + padding-left + padding-right + border-left-width + border-right-width = 200 + 10 + 10 + 1 + 1 = 222。

display相关知识
1、盒子的显示和隐藏
  • 显示,display: block;
  • 隐藏,display: none

2、块级和行内盒子:

  • 块级盒子:display 为 block、list-item、table、flex、grid、flow-root 等;
  • 行内级盒子:display 为 inline、inline-block、inline-table 等;

block

  • 占满一行,默认继承父元素的宽度;多个块元素将从上到下进行排列;
  • 设置 width/height 将会生效;
  • 设置 padding 和 margin 将会生效;

inline

  • 不会占满一行,宽度随着内容而变化;多个 inline 元素将按照从左到右的顺序在一行里排列显示,如果一行显示不下,则自动换行;
  • 设置 width/height 将不会生效;
  • 设置竖直方向上的 padding 和 margin 将不会生效;

inline-block

  • 是行内块元素,不单独占满一行,可以看成是能够在一行里进行左右排列的块元素;
  • 设置 width/height 将会生效;
  • 设置 padding 和 margin 将会生效;
BFC应用:

1、 自适应两栏布局

应用原理:BFC 的区域不会和浮动区域重叠,所以就可以把侧边栏固定宽度且左浮动,而对右侧内容触发 BFC,使得它的宽度自适应该行剩余宽度。

<div class="layout">
    <div class="aside">aside</div>
    <div class="main">main</div>
</div>

.aside {
    float: left;
    width: 100px;
}
.main {
    <!-- 触发 BFC -->
    overflow: auto;
}

2、清除浮动

问题:浮动产生的问题就是父盒子的高度塌陷

解决方法:1、给父盒子设置高度,2、给父盒子设置overflow: hidden;

层叠上下文

层叠顺序

  • 层叠上下文的 border 和 background
  • z-index < 0 的子节点
  • 标准流内块级非定位的子节点
  • 浮动非定位的子节点
  • 标准流内行内非定位的子节点
  • z-index: auto/0 的子节点
  • z-index > 0的子节点

如何比较两个元素的层叠等级?

  • 在同一个层叠上下文中,比较两个元素就是按照上图的介绍的层叠顺序进行比较。
  • 如果不在同一个层叠上下文中的时候,那就需要比较两个元素分别所处的层叠上下文的等级。
  • 如果两个元素都在同一个层叠上下文,且层叠顺序相同,则在 HTML 中定义越后面的层叠等级越高。
值和单位

CSS 的声明是由属性和值组成的,而值的类型有许多种:

  • 数值:长度值 ,用于指定例如元素 width、border-width、font-size 等属性的值;
  • 百分比:可以用于指定尺寸或长度,例如取决于父容器的 width、height 或默认的 font-size;
  • 颜色:用于指定 background-color、color 等;
  • 坐标位置:以屏幕的左上角为坐标原点定位元素的位置,比如常见的 background-position、top、right、bottom 和 left 等属性;
  • 函数:用于指定资源路径或背景图片的渐变,比如 url()、linear-gradient() 等;
PX

在这里px在正常的屏幕下面1px就是2个像素点,而在设备像素比(devicePixelRatio) 为 2 的 Retina 屏幕下,它就有 16 个像素点。所以屏幕尺寸一致的情况下,屏幕分辨率越高,显示效果就越细腻。

em

em 是 CSS 中的相对长度单位中的一个。居然是相对的,那它到底是相对的谁呢?它有 2 层意思:

  • 在 font-size 中使用是相对于父元素的 font-size 大小,比如父元素 font-size: 16px,当给子元素指定 font-size: 2em 的时候,经过计算后它的字体大小会是 32px;
  • 在其他属性中使用是相对于自身的字体大小,如 width/height/padding/margin 等;

我们都知道每个浏览器都会给 HTML 根元素 html 设置一个默认的 font-size,而这个值通常是 16px。这也就是为什么 1em = 16px 的原因所在了。

em 在计算的时候是会层层计算的,比如:

<div>
    <p></p>
</div>
复制代码
div { font-size: 2em; }
p { font-size: 2em; }
复制代码

对于如上一个结构的 HTML,由于根元素 html 的字体大小是 16px,所以 p 标签最终计算出来后的字体大小会是 16 * 2 * 2 = 64px

rem

rem(root em) 和 em 一样,也是一个相对长度单位,不过 rem 相对的是 HTML 的根元素 html。

rem 由于是基于 html 的 font-size 来计算,所以通常用于自适应网站或者 H5 中。

比如在做 H5 的时候,前端通常会让 UI 给 750px 宽的设计图,而在开发的时候可以基于 iPhone X 的尺寸 375px * 812px 来写页面,这样一来的话,就可以用下面的 JS 依据当前页面的视口宽度自动计算出根元素 html 的基准 font-size 是多少。

(function (doc, win) {
    var docEl = doc.documentElement,
        resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize',
        psdWidth = 750,  // 设计图宽度
        recalc = function () {
            var clientWidth = docEl.clientWidth;
            if ( !clientWidth ) return;
            if ( clientWidth >= 640 ) {
                docEl.style.fontSize = 200 * ( 640 / psdWidth ) + 'px';
            } else {
                docEl.style.fontSize = 200 * ( clientWidth / psdWidth ) + 'px';
            }
        };

    if ( !doc.addEventListener ) return;
    // 绑定事件的时候最好配合防抖函数
    win.addEventListener( resizeEvt, debounce(recalc, 1000), false );
    doc.addEventListener( 'DOMContentLoaded', recalc, false );
    
    function debounce(func, wait) {
        var timeout;
        return function () {
            var context = this;
            var args = arguments;
            clearTimeout(timeout)
            timeout = setTimeout(function(){
                func.apply(context, args)
            }, wait);
        }
    }
})(document, window);
复制代码

比如当视口是 375px 的时候,经过计算 html 的 font-size 会是 100px,这样有什么好处呢?好处就是方便写样式,比如从设计图量出来的 header 高度是 50px 的,那我们写样式的时候就可以直接写:

header {
    height: 0.5rem;
}
复制代码

img

每个从设计图量出来的尺寸只要除于 100 即可得到当前元素的 rem 值,都不用经过计算,非常方便。偷偷告诉你,如果你把上面那串计算 html 标签 font-size 的 JS 代码中的 200 替换成 2,那在计算 rem 的时候就不需要除于 100 了,从设计图量出多大 px,就直接写多少个 rem。

媒体查询

谈这个问题,主要是考虑应用移动端不同设备,不同屏幕,不同分辨率,甚至是考虑pc端的响应式布局。

css2就引入了media-dependent样式表,开发者可以利用他们为不同媒体类型创建独立样式表;

例如:

或者将其添加至外联样式表标签:

再或者使用@media标签讲样式添加至已有的样式表中:

@media print{

//add styles

}

media的值可以是以下几种:

---- all 所有媒体类型

---- aural 语音合成器

---- braille 盲文装置

---- embossed 分页盲文打印机

---- handheld 小型设备,通常为单色

---- print 纸张格式及“打印预览”

---- projection 投影仪

---- tty 有固定字符网格的电传打字设备

---- tv 具有低分辨率、色彩及声音的电视设备

---- screen 彩色电脑屏幕

就目前来讲,我们并不会遇到上面所列出的那么多媒体类型,screen是我们使用最多的类型。

在响应式布局的网页或者应用中,视觉呈现需要根据设备屏幕的大小的变化而做出改变,以展示最佳效果。

利用媒体查询,就可以编写css,自动将设计更改为提供不同屏幕大小的最佳UI体验。

当然我要应用的场景是移动设备,这里记录的也是css3规范中对媒体查询通过表达式进行的扩展。利用这些表达式,我们可以更精确的,更灵敏的在不同情况下使用不同的样式。因此下面的例子目前只能在ff,chrome,safari,opera中得到支持。

*媒体查询规则

@media all and (min-width: 800px) { ... }

所有最小水平屏幕宽度为800像素都应该使用如下css规则。

· @media all 是媒体类型,表示将该css应用于所有媒体类型

·(min-width:800px)是包含媒体查询的表达式,如果最小宽度为800像素,则为true,并告诉浏览器运行下列css

其中all可省略,表示应用于所有媒体类型

and也一样可选。

@media (min-width:800px) and (max-width:1200px) { ... }

当设备最小宽度为800px,最大宽度为1200px的时候应用下列css。

这里如果我们想检测手机或这平板设备是横向的还是纵向的,该如何呢?

@media (min-width:800px) and (max-width:1200px) and (orientation:portrait) { ... }

可以使用orientation来检测设备当前的显示方向:,他有两个值,landscape(横向)和portrait(纵向)

链接表达式还有一个关键词or,可以理解为“||”,即逻辑或运算,条件中有一个为true,结果就为true

and跟你用“&&”一样,即逻辑与运算,条件中都为true,结果才为true

not逻辑非运算,举个例子:

@media (not min-width:800px) { ... }

表示:当最小宽度不是800像素时,会应用下列css。

最后差点忘了,还可以把表达式应用在link标签上,如下:

<link rel="stylesteet" href="style.css" media="only screen and (max-width:800px)">



<link rel="stylesteet" href="style.css" media="only screen and (max-width:800px) and (min-width:400px)">
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值