link 和@import 的区别

两者都是外部引用 CSS 的方式,它们的区别如下:

  • link 是 XHTML 标签,除了加载 CSS 外,还可以定义 RSS 等其他事务;@import 属于 CSS 范畴,只能加载 CSS。
  • link 引用 CSS 时,在页面载入时同时加载;@import 需要页面网页完全载入以后加载。
  • link 是 XHTML 标签,无兼容问题;@import 是在 CSS2.1 提出的,低版本的浏览器不支持。
  • link 支持使用 Javascript 控制 DOM 去改变样式;而@import 不支持。

    CSS选择器

    CSS 选择器及其优先级

    对于选择器的优先级从高到低的权重

  • 内联样式:1000

  • id 选择器:100
  • 类选择器、伪类选择器、属性选择器:10
  • 标签选择器、伪元素选择器:1

注意事项:

  • !important 声明的样式的优先级最高;
  • 如果优先级相同,则最后出现的样式生效
  • 继承得到的样式的优先级最低
  • 通用选择器(*)、子选择器(>)和相邻同胞选择器(+)并不在这四个等级中,所以它们的权值都为 0 ;
  • 样式表的来源不同时,优先级顺序为:内联样式 > 内部样式 > 外部样式 > 浏览器用户自定义样式 > 浏览器默认样式。 | 选择器 | 格式 | 优先级权重 | | —- | —- | —- | | id 选择器 | #id | 100 | | 类选择器 | #classname | 10 | | 属性选择器 | a[ref=“eee”] | 10 | | 伪类选择器 | li:last-child | 10 | | 标签选择器 | div | 1 | | 伪元素选择器 | li::after | 1 | | 相邻兄弟选择器 | h1+p | 0 | | 子选择器 | ul>li | 0 | | 后代选择器 | li a | 0 | | 通配符选择器 | * | 0 |

css选择器“+”和“~”的区别

  • ‘+’是指紧跟在后面的某同级元素
  • ‘~’是指某些同级元素

    伪元素和伪类的区别和作用?

  • 伪元素:在内容元素的前后插入额外的元素或样式,但是这些元素实际上并不在文档中生成。它们只在外部显示可见,但不会在文档的源代码中找到它们,因此,称为“伪”元素。例如:

    1. p::before {content:"第一章:";}
    2. p::after {content:"Hot!";}
    3. p::first-line {background:red;}
    4. p::first-letter {font-size:30px;}
  • 伪类:将特殊的效果添加到特定选择器上。它是已有元素上添加类别的,不会产生新的元素。例如:

    1. a:hover {color: #FF00FF}
    2. p:first-child {color: red}

    总结:伪类是通过在元素选择器上加⼊伪类改变元素状态,⽽伪元素通过对元素的操作进⾏对元素的改变。

    布局

    盒模型的理解

    盒就是浏览器定位的基本单位
    在定位的时候,浏览器就会根据元素的盒类型和上下文对这些元素进行定位。有三种定位方案,分别是常规流,浮动和绝对定位。
    盒模型都是由四个部分组成的,分别是 marginborderpaddingcontent

    盒模型的宽度应该如何计算

    offsetWidth:它返回该元素的像素宽度,宽度包含内边距(padding)和边框(border),不包含外边距(margin),是一个整数,单位是像素 px,也就是border-box模型的计算。
    box-sizing定义如何计算一个元素的总宽度和高度。

  • content-box:标准盒子模型,默认值。宽度仅包含内容区 。

  • border-box:IE 盒子模型,宽度包含内容,边框、内边距。

    BFC的理解和应用?

    1、Block format context,块级格式上下文,它是一块独立渲染区域内部元素不会影响外部元素。
    2、形成 BFC 的条件
    最常见的是overflow:hiddenfloat:left/rightposition:absolute

  • overflow的值为:hidden、auto、scroll;

  • 元素设置浮动float不是none
  • 元素设置绝对定位positionabsolutefixed
  • 行内块:display: inline-block;
  • 表格单元格:display: table-cell
  • 弹性盒:display: flex

3、BFC 的特点

  • 垂直方向上,自上而下排列,和文档流的排列方式一致。
  • BFC 中上下相邻的两个容器的 margin 会重叠
  • 计算 BFC 的高度时,需要计算浮动元素的高度
  • BFC 区域不会与浮动的容器发生重叠
  • BFC 是独立的容器,容器内部元素不会影响外部元素。
  • 每个元素的左 margin 值和容器的左 border 相接触

4、BFC的常见应用

  • 解决 margin 的重叠问题:由于 BFC 是一个独立的区域,内部的元素和外部的元素互不影响,将两个元素变为两个 BFC,就解决了 margin 重叠的问题。
  • 解决高度塌陷的问题:清除浮动

    1. .bfc {
    2. overflow:hidden;
    3. }
  • 创建自适应两栏布局:可以用来创建自适应两栏布局:左边的宽度固定,右边的宽度自适应。 ```typescript .left{ width: 100px; height: 200px; background: red; float: left; } .right{ height: 300px; background: blue; overflow: hidden; }

  1. 左侧设置float:left,右侧设置overflow: hidden。这样右边就触发了 BFCBFC 的区域不会与浮动元素发生重叠,所以两侧就不会发生重叠,实现了自适应两栏布局。
  2. <a name="cmqAu"></a>
  3. ## margin纵向重叠问题
  4. **1、垂直方向margin重叠**<br />**相邻元素的**`**margin-top**`**和**`**margin-bottom**`**会发生重叠,**其大小会取其中外边距值大的那个,这种行为就是外边距折叠。需要注意的是,**浮动的元素和绝对定位**这种脱离文档流的元素的外边距不会折叠。重叠只会出现在**垂直方向**。<br />**计算原则:**<br />折叠合并后外边距的计算原则如下:
  5. - 如果两者都是正数,那么就去最大者
  6. - 如果是一正一负,就会正值减去负值的绝对值
  7. - 两个都是负值时,用 0 减去两个中绝对值大的那个
  8. **解决办法:**<br />对于折叠的情况,主要有两种:**兄弟之间重叠**和**父子之间重叠**<br />(1)兄弟之间重叠
  9. - 底部元素变为行内盒子:`display: inline-block`
  10. - 底部元素设置浮动:float
  11. - 底部元素的 position 的值为absolute/fixed
  12. 2)父子之间重叠
  13. - 父元素加入:overflow: hidden
  14. - 父元素添加透明边框:border:1px solid transparent
  15. - 子元素变为行内盒子:display: inline-block
  16. - 子元素加入浮动属性或定位。
  17. **2、空白内容的**`**<p></p>**`**也会重叠**<br />AAABBB的距离是15px
  18. ```typescript
  19. <style type="text/css">
  20. p {
  21. font-size: 16px;
  22. line-height: 1;
  23. margin-top: 10px;
  24. margin-bottom: 15px;
  25. }
  26. </style>
  27. <body>
  28. <p>AAA</p>
  29. <p></p>
  30. <p></p>
  31. <p></p>
  32. <p>BBB</p>
  33. </body>

margin负值问题

对margin的top、left、right、bottom设置赋值,有何效果?

  • margin-topmargin-left赋值,元素向上、向左移动
  • **margin-right**负值,右侧元素左移,自身不受影响。对除了自身以外的元素来说,具体表现就是
  • **margin-bottom**负值,下方元素上移,自身不受影响

    Float布局问题

    为什么需要清除浮动?清除浮动的方式

    浮动的工作原理:
    元素浮动后,不属于文档流中的普通流,此时文档流的普通流会表现得该浮动框不存在一样的布局模式。当包含框的高度小于浮动框的高度时,会出现高度坍塌,导致常规流环绕在浮动流周边,除非设置clear属性。
    清除浮动的方式如下:

  • 给父级 div 定义height属性

  • 最后一个浮动元素之后添加一个空的 div 标签,并添加clear:both样式。
  • 包含浮动元素的父级标签添加overflow:hidden或者overflow:auto。(BFC)
  • 使用 :after伪元素。由于 IE6-7 不支持 :after,使用 zoom:1 触发 hasLayout。

使用 clear 属性清除浮动的原理?

  1. clear:none|left|right|both

“元素盒子的边不能和前面的浮动元素相邻”,对元素设置 clear 属性是为了避免浮动元素对该元素的影响,而不是清除掉浮动。
还需要注意 clear 属性指的是元素盒子的边不能和前面的浮动元素相邻,注意这里“前面的”3 个字,也就是 clear 属性对“后面的”浮动元素是不闻不问的。考虑到 float 属性要么是 left,要么是 right,不可能同时存在,同时由于 clear 属性对“后面的”浮动元素不闻不问,因此,当 clear:left 有效的时候,clear:right 必定无效,也就是此时 clear:left 等同于设置 clear:both;同样地,clear:right 如果有效也是等同于设置 clear:both。由此可见,clear:left 和 clear:right 这两个声明就没有任何使用的价值,至少在 CSS 世界中是如此,直接使用 clear:both 吧。
一般使用伪元素的方式清除浮动:
clear 属性只有块级元素才有效的,而::after 等伪元素默认都是内联水平,这就是借助伪元素清除浮动影响时需要设置 display 属性值的原因。

  1. /* 手写 clearfix */
  2. .clearfix:after {
  3. content: '';
  4. display: block;
  5. clear: both;
  6. }


如何实现圣杯布局和双飞翼布局

1、圣杯布局和双飞翼布局的目的

  • 三栏布局,中间一栏最先加载和渲染
  • 两侧内容固定,中间内容随宽度自适应

2、技术要点

  • 使用float布局
  • 两侧使用margin负值,以便和中间内容横向重叠
  • 防止中间内容被两侧覆盖,一个用padding 一个用margin
  1. <body>
  2. <div class="container">
  3. <header>我是头部</header>
  4. <div class="main">
  5. <article class="mainContent">我是内容</article>
  6. <aside class="left">我是左边</aside>
  7. <aside class="right">我是右边</aside>
  8. </div>
  9. <footer>我是脚</footer>
  10. </div>
  11. </body>
  1. <style>
  2. .container {
  3. min-height: 100vh;
  4. background-color: red;
  5. display: flex;
  6. flex-direction: column;
  7. }
  8. header {
  9. height: 100px;
  10. background-color: yellow;
  11. }
  12. .main {
  13. flex: 1;
  14. display: flex;
  15. }
  16. .mainContent {
  17. flex: 1;
  18. }
  19. .left {
  20. flex: 0 0 12em;
  21. order: -1;
  22. background-color: green;
  23. }
  24. .right {
  25. flex: 0 0 12em;
  26. background-color: chocolate;
  27. }
  28. footer {
  29. background-color: blueviolet;
  30. height: 100px;
  31. }
  32. </style>
  1. .container {
  2. min-height: 100vh;
  3. min-width: 650px;
  4. }
  5. header {
  6. height: 100px;
  7. background-color: yellow;
  8. }
  9. .main {
  10. padding-left: 200px;
  11. padding-right: 200px;
  12. background-color: aqua;
  13. }
  14. .mainContent {
  15. float: left;
  16. width: 100%;
  17. }
  18. .left {
  19. float: left;
  20. width: 200px;
  21. background-color: green;
  22. //会让left这个元素往左边挤100%(.container宽度)就会挤到最左边去了。
  23. margin-left: -100%;
  24. // 然后因为container有padding:200px,所以这里需要再相对自身宽度往右移动
  25. position: relative;
  26. right: 200px;
  27. }
  28. .right {
  29. float: left;
  30. width: 200px;
  31. background-color: chocolate;
  32. // 本来都是三者都是浮动元素,main是100%。.right被挤下去了
  33. // margin-right等于负值的时候,它对外界来说,它的宽度在缩小。
  34. // 所以宽度是-200px时,他就挤上去了。
  35. margin-right: -200px;
  36. }
  37. footer {
  38. background-color: blueviolet;
  39. height: 100px;
  40. }
  41. .clearfix::after {
  42. content: '';
  43. display: table;
  44. clear: both;
  45. }

实现两栏布局

一般两栏布局指的是左边一栏宽度固定,右边一栏宽度自适应,两栏布局的具体实现:

  • 利用浮动,将左边元素宽度设置为 200px,并且设置向左浮动。将右边元素的 margin-left 设置为 200px,宽度设置为 auto(默认为 auto,撑满整个父元素)。
  • 利用浮动,左侧元素设置固定大小,并左浮动,右侧元素设置 overflow: hidden; 这样右边就触发了 BFC,BFC 的区域不会与浮动元素发生重叠,所以两侧就不会发生重叠。
  • 利用 flex 布局,将左边元素设置为固定宽度 200px,将右边的元素设置为 flex:1。
  • 利用绝对定位,将父级元素设置为相对定位。左边元素设置为 absolute 定位,并且宽度设置为 200px。将右边元素的 margin-left 的值设置为 200px。
  • 利用绝对定位,将父级元素设置为相对定位。左边元素宽度设置为 200px,右边元素设置为绝对定位,左边定位为 200px,其余方向定位为 0。

    三栏布局实现

    三栏布局一般指的是页面中一共有三栏,左右两栏宽度固定,中间自适应的布局,三栏布局的具体实现:

  • 利用绝对定位,左右两栏设置为绝对定位,中间设置对应方向大小的 margin 的值。

  • 利用 flex 布局,左右两栏设置固定大小,中间一栏设置为 flex:1。
  • 利用浮动,左右两栏设置固定大小,并设置对应方向的浮动。中间一栏设置左右两个方向的 margin 值,注意这种方式,中间一栏必须放到最后。
  • 圣杯布局,利用浮动和负边距来实现。父级元素设置左右的 padding,三列均设置向左浮动,中间一列放在最前面,宽度设置为父级元素的宽度,因此后面两列都被挤到了下一行,通过设置 margin 负值将其移动到上一行,再利用相对定位,定位到两边。
  • 双飞翼布局,双飞翼布局相对于圣杯布局来说,左右位置的保留是通过中间列的 margin 值来实现的,而不是通过父元素的 padding 来实现的。本质上来说,也是通过浮动和外边距负值来实现的。


    flex布局

    Flex是FlexibleBox的缩写,意为”弹性布局”,用来为盒状模型提供最大的灵活性。任何一个容器都可以指定为Flex布局。行内元素也可以使用Flex布局。注意,设为Flex布局以后,子元素的float、clear和vertical-align属性将失效
    采用Flex布局的元素,称为Flex容器(flex container),简称”容器”。
    它的所有子元素自动成为容器成员,称为Flex项目(flex item),简称”项目”。
    容器默认存在两根轴:水平的主轴(main axis)和垂直的交叉轴(cross axis),项目默认沿水平主轴排列。

以下6个属性设置在容器上

  • flex-direction属性决定主轴的方向(即项目的排列方向)。
  • flex-wrap属性定义,如果一条轴线排不下,如何换行。
  • flex-flow属性是flex-direction属性和flex-wrap属性的简写形式,默认值为row nowrap。
  • justify-content属性定义了项目在主轴上的对齐方式。
  • align-items属性定义项目在交叉轴上如何对齐。
  • align-content属性定义了多根轴线的对齐方式。如果项目只有一根轴线,该属性不起作用。

以下6个属性设置在项目上

  • order属性定义项目的排列顺序。数值越小,排列越靠前,默认为0。
  • flex-grow属性定义项目的放大比例,默认为0,即如果存在剩余空间,也不放大。
  • flex-shrink属性定义了项目的缩小比例,默认为1,即如果空间不足,该项目将缩小。
  • flex-basis属性定义了在分配多余空间之前,项目占据的主轴空间。浏览器根据这个属性,计算主轴是否有多余空间。它的默认值为auto,即项目的本来大小。
  • flex属性是flex-grow,flex-shrink和flex-basis的简写,默认值为0 1 auto。
  • align-self属性允许单个项目有与其他项目不一样的对齐方式,可覆盖align-items属性。默认值为auto,表示继承父元素的align-items属性,如果没有父元素,则等同于stretch。

    flex实现一个三色子

    CSS - 图1
  1. .box {
  2. width: 200px;
  3. height: 200px;
  4. border: 2px solid #ccc;
  5. border-radius: 10px;
  6. padding: 20px;
  7. display: flex;
  8. justify-content: space-between;
  9. }
  10. .item {
  11. display: block;
  12. width: 40px;
  13. height: 40px;
  14. border-radius: 50%;
  15. background-color: #666;
  16. }
  17. .item:nth-child(2) {
  18. align-self: center;
  19. }
  20. .item:nth-child(3) {
  21. align-self: end;
  22. }
  23. <div class="box">
  24. <span class="item"></span>
  25. <span class="item"></span>
  26. <span class="item"></span>
  27. </div>

flex:1代表什么?

flex:1是单值语法。当只有一个无单位数值时,表示flex-grow:1。
flex:1 0 auto。
代表增长系数为1,空间不足会缩小,有剩余宽度适合展示项目原有的大小。

定位

水平垂直居中的方式

CSS - 图2

  • margin : auto

为什么只能实现水平居中不能实现垂直居中?
auto的意思是自动填充剩余空间。
块级元素,即便我们设置了宽度,他还是自己占一行,在css的规范中,元素他的左外边距+左边框宽度+左内边距+内容的宽度+右内边距+右边框+右外边距=包含块的宽度,如果我们给他的左右外边距设置为auto的时候,他会实现平分剩下的距离,从而达到一个水平居中的效果
但是块级元素的高度并不会自动扩充,所以他的外部尺寸是不自动充满父元素的,也没有剩余的空间,因此margin上下设置auto不能实现垂直居中。
当我们给他定位让他上下左右都是0的时候,我们就有了多余空间,auto就能平分剩余的空间去实现水平垂直居中

  1. width: 200px;
  2. height: 200px;
  3. background-color:steelblue;
  4. position: absolute;
  5. top: 0;
  6. left: 0;
  7. right: 0;
  8. bottom: 0;
  9. margin:auto;
  • flex布局

父元素设置了flex布局,只需要给子元素加上margin:auto;就可以实现垂直居中布局

  1. .parent{
  2. display:flex;
  3. }
  4. .child{
  5. margin: auto;
  6. }
  • table布局

组合使用display:table-cell和vertical-align、text-align,使父元素内的所有垂直居中(内部div设置display:inline-block即可)。这在子元素不确定宽高和数量时,非常实用。

  1. #app {
  2. background: yellow;
  3. height: 500px;
  4. width: 500px;
  5. display: table;
  6. }
  7. .box {
  8. // 子元素table-cell会自动撑满父元素。
  9. display: table-cell;
  10. vertical-align: middle;
  11. width: 100px;
  12. height: 100px;
  13. text-align: center;
  14. background: red;
  15. }

z-index 属性在什么情况下会失效

通常 z-index 的使用是在有两个重叠的标签,在一定的情况下控制其中一个在另一个的上方或者下方出现。z-index 值越大就越是在上层。z-index 元素的 position 属性需要是 relative,absolute 或是 fixed。
z-index 属性在下列情况下会失效:

  • 父元素 position 为 relative 时,子元素的 z-index 失效。解决:父元素 position 改为 absolute 或 static;
  • 元素没有设置 position 属性为非 static 属性。解决:设置该元素的 position 属性为 relative,absolute 或是 fixed 中的一种;
  • 元素在设置 z-index 的同时还设置了 float 浮动。解决:float 去除,改为 display:inline-block;

图文样式

line-height如何继承

  • 写具体数值,如30px,则继承该值
  • 写比例,如2/1.5 ,则继承该比例
  • 写百分比,如200%,则继承计算后的值。 ```typescript

AAA

  1. <a name="fEKP3"></a>
  2. ## 单行、多行文本溢出隐藏
  3. - 单行文本溢出
  4. ```typescript
  5. overflow: hidden; // 溢出隐藏
  6. text-overflow: ellipsis; // 溢出用省略号显示
  7. white-space: nowrap; // 规定段落中的文本不进行换行
  • 多行文本溢出

    1. overflow:hidden;
    2. text-overflow: ellipsis;
    3. display: -webkit-box; // 作为弹性伸缩盒子模型显示。
    4. -webkit-box-orient:vertical; // 设置伸缩盒子的子元素排列方式:从上到下垂直排列
    5. -webkit-line-clamp:3; // 显示的行数

    如何判断一个元素 CSS 样式溢出,从而可以选择性的加 title 或者 Tooltip?

    **Element.scrollWidth**这个只读属性是元素内容宽度的一种度量,包括由于overflow溢出而在屏幕上不可见的内容。
    **HTMLElement.offsetWidth**是一个只读属性,返回一个元素的布局宽度

    1. function isEllipsisActive(e) {
    2. return (e.offsetWidth < e.scrollWidth);
    3. }

    画一条0.5px的线

  • 采用transform: scale()的方式,该方法用来定义元素的2D 缩放转换:

    1. transform: scale(0.5,0.5);
  • 采用meta viewport的方式

    1. <meta name="viewport" content="width=device-width, initial-scale=0.5, minimum-scale=0.5, maximum-scale=0.5"/>

    这样就能缩放到原来的0.5倍,如果是1px那么就会变成0.5px。viewport只针对于移动端,只在移动端上才能看到效果

    设置小于12px的字体

    在谷歌下css设置字体大小为12px及以下时,显示都是一样大小,都是默认12px。
    解决办法:

  • 使用Webkit的内核的-webkit-text-size-adjust的私有CSS属性来解决,只要加了-webkit-text-size-adjust:none;字体大小就不受限制了。但是chrome更新到27版本之后就不可以用了。所以高版本chrome谷歌浏览器已经不再支持-webkit-text-size-adjust样式,所以要使用时候慎用。

  • 使用css3的transform缩放属性-webkit-transform:scale(0.5); 注意-webkit-transform:scale(0.75);收缩的是整个元素的大小,这时候,如果是内联元素,必须要将内联元素转换成块元素,可以使用display:block/inline-block/…;
  • 使用图片:如果是内容固定不变情况下,使用将小于12px文字内容切出做图片,这样不影响兼容也不影响美观。

    实现一个扇形

    用CSS实现扇形的思路和三角形基本一致,就是多了一个圆角的样式,实现一个90°的扇形:

    1. div{
    2. border: 100px solid transparent;
    3. width: 0;
    4. heigt: 0;
    5. border-radius: 100px;
    6. border-top-color: red;
    7. }

    实现一个宽高自适应的正方形

    1. .square {
    2. width: 10%;
    3. height: 10vw; //注意是vw不是vh!
    4. background: tomato;
    5. }
  • 利用元素的margin/padding百分比是相对父元素width的性质来实现:

    1. .square {
    2. width: 20%;
    3. height: 0;
    4. padding-top: 20%; // 相对父元素width
    5. background: orange;
    6. }
  • 利用子元素的margin-top的值来实现:

    1. .square {
    2. width: 30%;
    3. overflow: hidden; // 父元素上触发 BFC,防止和子元素的外边距折叠。
    4. background: yellow;
    5. }
    6. .square::after {
    7. content: '';
    8. display: block;
    9. margin-top: 100%; /* margin 百分比相对父元素宽度计算 */
    10. }

    响应式

    相应式布局的原则就是按比例还原设计稿,视口宽度必去无限接近理想视口。

  • 视口宽度:layout viewport

  • 理想视口:visual viewport

我们把pc端的网页放在移动端屏幕,整个有横向滚动条的就是layout viewport。我们可视区,就是visual viewport

  1. <meta name="viewport" content="width=device-width">

什么是物理像素,逻辑像素和像素密度,为什么在移动端开发时需要用到@3x, @2x 这种图片?

  • 物理像素:组成屏幕的最小单位。
  • 逻辑像素(dpi):独立像素 css的1px。
  • 设配像素比(dpr):dpr = 物理像素/ 逻辑像素,越大线看起来越粗

    rem相应式布局如何实现

    1、原理是根据不同屏幕宽度设置根元素font-size
    工程实践:

    • lib-flexible: 根据不同dpr设置不同的缩放比,不同屏幕大小设置不同的根字体大小
    • px2rem-loader:把px转成rem

2、rem的弊端:

  • 阶梯性:根据媒体查询不同屏幕的不同尺寸去设置根字体尺寸。
  • 理念问题:屏幕越大(想看更多内容),结果内容没变多,各种元素还变大了。
  • 安卓机的dpr都是1,其它奇怪的dpr会有问题。
  • 不支持iframe
    • 网页视口尺寸

CSS - 图3

Veiwport方案

工程实践
postcss-px-to-viewport,大于1px的容器,文本、边距、圆角都可以用。
缺点
1、1px不会被转换。无法解决1px物理尺寸的问题:ostcss-write-svg,设置border-image设置1px的图片
2、px转vw不能整除时,存在像素差

如何解决1px物理尺寸的问题

问题由来
retina 屏的 1px 线会显得比较粗,设计美感欠缺;在视觉设计师眼里的 1px 是指设备像素 1px,而如果我们直接写 css 的大小 1px,那在 dpr = 2 时,则等于 2px 设备像素,dpr = 3 时,等于 3px 设备像素。
解决:
1、媒体查询不同的屏幕dpr进行相应缩放。

  1. /* 2倍屏 */
  2. @media only screen and (-webkit-min-device-pixel-ratio: 2.0) {
  3. .border-bottom::after {
  4. -webkit-transform: scaleY(0.5); transform: scaleY(0.5);
  5. }
  6. } /* 3倍屏 */
  7. @media only screen and (-webkit-min-device-pixel-ratio: 3.0) {
  8. .border-bottom::after {
  9. -webkit-transform: scaleY(0.33); transform: scaleY(0.33);
  10. }
  11. }

2、

CSS3

transition 和 animation 的区别

  • transition 是过度属性,强调过度,它的实现需要触发一个事件(比如鼠标移动上去,焦点,点击等)才执行动画。它类似于 flash 的补间动画,设置一个开始关键帧,一个结束关键帧。
  • animation 是动画属性,它的实现不需要触发事件,设定好时间之后可以自己执行,且可以循环一个动画。它也类似于 flash 的补间动画,但是它可以设置多个关键帧(用@keyframe 定义)完成动画。

CSS3 中有哪些新特性

  • 新增各种 CSS 选择器 (: not(.input):所有 class 不是“input”的节点)
  • 圆角 (border-radius:8px)
  • 多列布局 (multi-column layout)、flex 布局
  • 阴影和反射 (Shadoweflect)
  • 文字特效 (text-shadow)
  • 文字渲染 (Text-decoration)
  • 线性渐变 (gradient)
  • 旋转 (transform)
  • 增加了旋转,缩放,定位,倾斜,动画,多背景


    CSS工程化

    Sass、Less 是什么?为什么要使用他们?

    他们都是 CSS 预处理器,是 CSS 上的一种抽象层。他们是一种特殊的语法/语言编译成 CSS。 例如 Less 是一种动态样式语言,将 CSS 赋予了动态语言的特性,如变量,继承,运算, 函数,LESS 既可以在客户端上运行 (支持 IE 6+, Webkit, Firefox),也可以在服务端运行 (借助 Node.js)。
    为什么要使用它们?

  • 结构清晰,便于扩展。 可以方便地屏蔽浏览器私有语法差异。封装对浏览器语法差异的重复处理, 减少无意义的机械劳动。

  • 可以轻松实现多重继承。 完全兼容 CSS 代码,可以方便地应用到老项目中。LESS 只是在 CSS 语法上做了扩展,所以老的 CSS 代码也可以与 LESS 代码一同编译。

    PostCss 是如何工作的?我们在什么场景下会使用 PostCss

    Sass、less是预处理器。
    PostCss,后处理器,是css编译器,和babel类似,原理也是通过改写AST来达到转换。
    它可以编译尚未被浏览器广泛支持的先进的 CSS 语法,还可以自动为一些需要额外兼容的语法增加前缀。更强的是,由于 PostCss 有着强大的插件机制,支持各种各样的扩展,极大地强化了 CSS 的能力。
    image.png
    使用场景非常多:

  • 解决全局css问题,比如提供css module支持

  • 使用未全面兼容的css特性,比如autoprefixer
  • 格式化,提高css可读性
  • 图片和文字处理
  • linters,比如stylelint
  • 不同语法的css支持,比如postcss-html可以解析类html文件中