前端CSS常见面试题(一)

前言

  • 各位小伙伴好,之前给大家分享了有关网络基础和JavaScript知识的常见面试题,今天给大家分享的是前端CSS常见面试题。

CSS基础知识

选择器上的优先级和覆盖原则

对于选择器的优先级

  • 标签选择器、伪元素选择器:1
  • 类选择器、伪类选择器、属性选择器:10
  • id 选择器:100
  • 内联样式:1000

注意事项:

  • !important 声明的样式的优先级最高;
  • 如果优先级相同,则最后出现的样式生效;
  • 继承得到的样式的优先级最低;
  • 通用选择器(*)、子选择器(>)和相邻同胞选择器(+)并不在这四个等级中,所以它们的权值都为 0;
  • 样式表的来源不同时,优先级顺序为:内联样式 > 内部样式 > 外部样式 > 浏览器用户自定义样式 > 浏览器默认样式。

简单记住结论:!important>行内样式>id 选择器>class 选择器/属性选择器>标签选择器>通配符*

覆盖原则:

  • 规则一:由于继承而发生样式冲突时,最近祖先获胜。
  • 规则二:继承的样式和直接指定的样式冲突时,直接指定的样式获胜。
  • 规则三:直接指定的样式发生冲突时,样式权值高者获胜。
  • 规则四:样式权值相同时,后者获胜。
  • 规则五:!important 的样式属性不被覆盖。

CSS3 中有哪些新特性

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

CSS 动画如何实现

创建动画序列,需要使用 animation 属性或其子属性,该属性允许配置动画时间、时长 以及其他动画细节,但该属性不能配置动画的实际表现,动画的实际表现是 由 @keyframes 规则实现。transition 也可实现动画。transition 强调过渡,是元素的一个或多个属性发生变化时产生 的过渡效果,同一个元素通过两个不同的途径获取样式,而第二个途径当某种改变发生 (例如 hover)时才能获取样式,这样就会产生过渡动画。

animation


描述


@keyframes

定义一个动画,@keyframes 定义的动画名称用来被 animation-name 所使用


animation-name

检索或设置对象所应用的动画名称 ,必须与规则@keyframes 配合使用,因为动画名称由@keyframes 定义

animation-duration

检索或设置对象动画的持续时间

animation-timing-function

检索或设置对象动画的过渡类型

animation-delay

检索或设置对象动画的延迟时间

animation-iteration-count

检索或设置对象动画的循环次数

animation-direction

检索或设置对象动画在循环中是否反向运动

animation-play-state

检索或设置对象动画的状态

  • animation-timing-function:检索或设置对象动画的过渡类型

描述

linear

动画从头到尾的速度是相同的。

ease

默认。动画以低速开始,然后加快,在结束前变慢。

ease-in

动画以低速开始。

ease-out

动画以低速结束。

ease-in-out

动画以低速开始和结束。

cubic-bezier(n,n,n,n)

在 cubic-bezier 函数中自己的值。可能的值是从 0 到 1 的数值。

  • animation-iteration-count:检索或设置对象动画的循环次数
infinite,意思是动画将会无限次的执行,这也就达到了循环的效果,还可以给它具体的数值,当执行你设置的次数后它会自动停止。

  • animation-direction:检索或设置对象动画在循环中是否反向运动

描述

normal

默认值。动画按正常播放。

reverse

动画反向播放。

alternate

动画在奇数次(1、3、5...)正向播放,在偶数次(2、4、6...)反向播放。

alternate-reverse

动画在奇数次(1、3、5...)反向播放,在偶数次(2、4、6...)正向播放。

initial

设置该属性为它的默认值。

inherit

从父元素继承该属性。

transition

描述

transition-duration

transition 效果需要指定多少秒或毫秒才能完成

transition-property

指定 CSS 属性的 name,transition 效果

transition-timing-function

指定 transition 效果的转速曲线

transition-delay

定义 transition 效果开始的时候

  • transition-property:指定 CSS 属性的 name,transition 效果
    div{
        width:100px;
        height:100px;
        border-radius: 50%;
        background:#f40;
        transition-duration:1s;
        transition-property:width;
    }
    div:hover{
        height:150px;	
        width:150px;
    }

    这里transition-property值仅为 width,意思是只给width加动画,所以会呈现这种效果,同样如果换成了height,那么将会是变高才有动画。

    CSS 中可继承与不可继承属性有哪些

    无继承性的属性

    • display:规定元素应该生成的框的类型
    • 文本属性
      • vertical-align:垂直文本对齐
      • text-decoration:规定添加到文本的装饰
      • text-shadow:文本阴影效果
      • white-space:空白符的处理
      • unicode-bidi:设置文本的方向
    • 盒子模型的属性:width、height、margin、border、padding
    • 背景属性:background、background-color、background-image、background-repeat、background-position、background-attachment
    • 定位属性:float、clear、position、top、right、bottom、left、min-width、min-height、max-width、max-height、overflow、clip、z-index

    有继承性的属性

    • 字体系列属性
      • font-family:字体系列
      • font-weight:字体的粗细
      • font-size:字体的大小
      • font-style:字体的风格
    • 文本系列属性
      • text-indent:文本缩进
      • text-align:文本水平对齐
      • line-height:行高
      • word-spacing:单词之间的间距
      • letter-spacing:中文或者字母之间的间距
      • text-transform:控制文本大小写(就是 uppercase、lowercase、capitalize 这三个)
      • color:文本颜色

    align-items 和 align-content 的区别

    • align-items:对于每一个单行容器居中,而不是整个。
    • align-content:只适用于多行的容器,并且当交叉轴上有多余的空间,将 flex 线在伸缩容器内对齐。

    display的属性值及其作用

    属性值 作用

    none

    元素不显示,并且会从文档流中移除。

    block

    块类型。默认宽度为父元素宽度,可设置宽高,换行显示。

    inline

    行内元素类型。默认宽度为内容宽度,不可设置宽高,同行显示。

    inline-block

    默认宽度为内容宽度,可以设置宽高,同行显示。

    list-item

    像块类型元素一样显示,并添加样式列表标记。

    table

    此元素会作为块级表格来显示。

    inherit

    规定应该从父元素继承display属性的值。

    display的block、inline和inline-block的区别

    block: 会独占一行,多个元素会另起一行,可以设置width、height、margin和padding属性;

    inline: 元素不会独占一行,设置width、height属性无效。但可以设置水平方向的margin和padding属性,不能设置垂直方向的padding和margin;

    inline-block: 将对象设置为inline对象,但对象的内容作为block对象呈现,之后的内联对象会被排列在同一行内。

    对于行内元素和块级元素,其特点如下:

    行内元素

    • 设置宽高无效;
    • 可以设置水平方向的margin和padding属性,不能设置垂直方向的padding和margin;
    • 不会自动换行;

    块级元素

    • 可以设置宽高;
    • 设置margin和padding都有效;
    • 可以自动换行;
    • 多个块状,默认排列从上到下。

    隐藏元素的方哪些

    • display: none:渲染树不会包含该渲染对象,因此该元素不会在页面中占据位置,也不会响应绑定的监听事件。
    • visibility: hidden:元素在页面中仍占据空间,但是不会响应绑定的监听事件。
    • opacity: 0:将元素的透明度设置为 0,以此来实现元素的隐藏。元素在页面中仍然占据空间,并且能够响应元素绑定的监听事件。
    • position: absolute:通过使用绝对定位将元素移除可视区域内,以此来实现元素的隐藏。
    • z-index: 负值:来使其他元素遮盖住该元素,以此来实现隐藏。
    • clip/clip-path :使用元素裁剪的方法来实现元素的隐藏,这种方法下,元素仍在页面中占据位置,但是不会响应绑定的监听事件。
    • transform: scale(0,0):将元素缩放为 0,来实现元素的隐藏。这种方法下,元素仍在页面中占据位置,但是不会响应绑定的监听事件。

    link和@import的区别

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

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

    伪类和伪元素

    • 伪类就是一个选择处于特定状态的元素的选择器,比如某一个 clsss 的第一个元素,某个被 hover 的元素等等,我们可以理解成一个特定的 CSS 类,但与普通的类不一样,它只有处于 DOM 树无法描述的状态下才能为元素添加样式,所以将其称为伪类。
    • 伪元素和伪类很像,但是伪元素类似于增添一个新的 DOM 节点到 DOM 树中,而不是改变元素的状态。注意了,这里是类似,而不是真的增加一个节点,这也是其被称为伪元素的原因(实质上,元素被创建在文档外)。
    • 伪类是操作文档中已有的元素,而伪元素是创建了一个文档外的元素,两者最关键的区别就是这点。此外,为了书写 CSS 时进行区分,一般伪类是单冒号,如:hover,而伪元素是双冒号::before。

    盒模型

    1.盒模型都是由四个部分组成的,分别是margin、border、padding和content。

    2.标准盒模型和IE盒模型的区别在于设置width和height时,所对应的范围不同:

    • 标准盒模型的width和height属性的范围只包含了content,
    • IE盒模型的width和height属性的范围包含了border、padding和content。

    可以通过修改元素的box-sizing属性来改变元素的盒模型:

    • box-sizeing: content-box表示标准盒模型(默认值)
    • box-sizeing: border-box表示IE盒模型(怪异盒模型)

    CSS预处理器/后处理器是什么?为什么要使用它们?

    预处理器, 如:lesssassstylus,用来预编译sass或者less,增加了css代码的复用性。层级,mixin, 变量,循环, 函数等对编写以及开发UI组件都极为方便。

    后处理器, 如: postCss,通常是在完成的样式表中根据css规范处理css,让其更加有效。目前最常做的是给css属性添加浏览器私有前缀,实现跨浏览器兼容性的问题。

    css预处理器为css增加一些编程特性,无需考虑浏览器的兼容问题,可以在CSS中使用变量,简单的逻辑程序,函数等在编程语言中的一些基本的性能,可以让css更加的简洁,增加适应性以及可读性,可维护性等。

    其它css预处理器语言:Sass(Scss), Less, Stylus, Turbine, Swithch css, CSS Cacheer, DT Css

    使用原因:

    • 结构清晰, 便于扩展
    • 可以很方便的屏蔽浏览器私有语法的差异
    • 可以轻松实现多重继承
    • 完美的兼容了CSS代码,可以应用到老项目中

    ::before 和 :after 的双冒号和单冒号有什么区别?

    • 冒号(:)用于CSS3伪类,双冒号(::)用于CSS3伪元素。
    • ::before就是以一个子元素的存在,定义在元素主体内容之前的一个伪元素。并不存在于dom之中,只存在在页面之中。
    注意: :before:after 这两个伪元素,是在CSS2.1里新出现的。起初,伪元素的前缀使用的是单冒号语法,但随着Web的进化,在CSS3的规范里,伪元素的语法被修改成使用双冒号,成为::before::after

    双边距重叠问题(外边距重叠)

    • 多个相邻(兄弟或者父子关系)普通流的块元素垂直方向 marigin 会重叠
    • 折叠的结果为:

    两个相邻的外边距都是正数时,折叠结果是它们两者之间较大的值。 两个相邻的外边距都是负数时,折叠结果是两者绝对值的较大值。 两个外边距一正一负时,折叠结果是两者的相加的和。

    单行、多行文本溢出隐藏

    • 单行文本溢出
    overflow: hidden;            // 溢出隐藏
    text-overflow: ellipsis;      // 溢出用省略号显示
    white-space: nowrap;         // 规定段落中的文本不进行换行
    • 多行文本溢出
    overflow: hidden;            // 溢出隐藏
    text-overflow: ellipsis;     // 溢出用省略号显示
    display:-webkit-box;         // 作为弹性伸缩盒子模型显示。
    -webkit-box-orient:vertical; // 设置伸缩盒子的子元素排列方式:从上到下垂直排列
    -webkit-line-clamp:3;        // 显示的行数

    注意:由于上面的三个属性都是 CSS3 的属性,没有浏览器可以兼容,所以要在前面加一个-webkit- 来兼容一部分浏览器。

    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;

    场景题

    实现一个三角形

    div {
        width: 0;
        height: 0;
        border-bottom: 50px solid red;
        border-right: 50px solid transparent;
        border-left: 50px solid transparent;
    }

    实现一个扇形

    div{
        border: 100px solid transparent;
        width: 0;
        heigt: 0;
        border-radius: 100px;
        border-top-color: red;
    }
    

    画一条0.5px的线

    transform: scale(0.5,0.5);

    移动端1px的问题

    1px 问题指的是:在一些 Retina屏幕 的机型上,移动端页面的 1px 会变得很粗,呈现出不止 1px 的效果。

    解决办法

    这个思路就是对 meta 标签里几个关键属性下手:

    <meta name="viewport" content="initial-scale=0.5, maximum-scale=0.5, minimum-scale=0.5, user-scalable=no">
    

    这里针对像素比为2的页面,把整个页面缩放为了原来的1/2大小。这样,本来占用2个物理像素的 1px 样式,现在占用的就是标准的一个物理像素。根据像素比的不同,这个缩放比例可以被计算为不同的值,用 js 代码实现如下:

    const scale = 1 / window.devicePixelRatio;
    // 这里 metaEl 指的是 meta 标签对应的 Dom
    metaEl.setAttribute('content', `width=device-width,user-scalable=no,initial-scale=${scale},maximum-scale=${scale},minimum-scale=${scale}`);
    

    这样解决了,但这样做的副作用也很大,整个页面被缩放了。这时 1px 已经被处理成物理像素大小,这样的大小在手机上显示边框很合适。但是,一些原本不需要被缩小的内容,比如文字、图片等,也被无差别缩小掉了。

  • 分割线

    • 未完待续~~
    #高频知识点汇总##学习路径##前端工程师##面经#
    全部评论
    🎉恭喜牛友成功参与 【创作激励计划】高频知识点汇总专场,并通过审核! 前50位用户可直接获得牛可乐抱枕1个哦~ ------------------- 创作激励计划5大主题专场等你来写,最高可领取500元京东卡和500元实物奖品! 👉快来参加吧:https://www.nowcoder.com/discuss/804743
    点赞 回复
    分享
    发布于 2021-11-22 11:16
    内容已整理到牛客博客,且附PDF和markdown文档网盘链接供大家下载
    点赞 回复
    分享
    发布于 2022-01-13 09:35
    联想
    校招火热招聘中
    官网直投

    相关推荐

    24 105 评论
    分享
    牛客网
    牛客企业服务