css前端面试题(三)

2023-09-15 18:06:41

1、可继承属性和不可继承属性

我的观点是记住可继承属性就好了,其它的都是不可继承属性,而且开发过程中,如果发现样式问题,而代码又没加这样的样式,则有可能是样式从父级那里继承过来的。

字体系列属性

font-family:字体系列
font-weight:字体的粗细
font-size:字体的大小
font-style:字体的风格

文本系列属性

text-indent:文本缩进
text-align:文本水平对齐
line-height:行高
word-spacing:单词之间的间距
letter-spacing:中文或者字母之间的间距
text-transform:控制文本大小写(就是uppercase、lowercase、capitalize这三个)
color:文本颜色

元素可见性

visibility:控制元素显示隐藏

列表布局属性

list-style:列表风格,包括list-style-type、list-style-image等

光标属性

cursor:光标显示为何种形态

2、link和@import的区别

引用外部css的方式通常就是这两种,

<style>
    @import url("./style.css");
</style>
	或者
<link rel="stylesheet" href="./style.css">

1、link是XHTML标签,除了加载CSS外,还可以定义RSS等其他事务;@import属于CSS范畴,只能加载CSS。link标签除了引用css文件外,还可以引用其它文件。
2、link引用CSS时,在页面载入时同时加载;@import需要页面网页完全载入以后加载。所以,如果遇到样式闪烁的问题,就用link标签引用css。
3、link是XHTML标签,无兼容问题;@import是在CSS2.1提出的,低版本的浏览器不支持。
4、可以通过JS操作DOM,插入link标签来改变样式;@import 肯定没办法通过js来添加。

3、css优化

选择器优化:

  1. 尽量避免使用 * {},很多项目中会为了解决浏览器兼容问题,将所有标签自带的margin和padding取消掉,然后就会写出如下的样式,*{}计算次数惊人,整个页面所有的dom都会被这个样式规则纳入计算。
* {
	margin: 0;
	padding: 0;
}
  1. 尽量少的去对标签进行选择,而是用class。这个很容易理解,使用class更容易维护,后继维护者更改标签后,可以不需要更改样式。

  2. 尽量少的去使用后代选择器 后代选择器会影响到某个dom节点之下所有的dom,即便某些dom不符合条件,但也会被这条规则遍历一次来判断是否符合条件。

  3. 熟练运用继承属性,可以减少css代码的编写。比如父dom的样式中已经有font-size或者line-height,子dom就不需要添加这些样式了,因为这些样式可以继承。

  4. 样式选择器嵌套不要超过三层!这很重要,浏览器渲染时是会遍历css树的,如果层级太深,性能将会受到影响。而且真没必要为了防止样式权重不够,通过嵌套来提高权重。

渲染性能优化:

  1. 属性值为0时,不加单位。

  2. 属性值为浮动小数0.xx,可以省略小数点之前的0。

  3. css雪碧图,同一页面相近部分的小图标,方便使用,减少页面的请求次数,但是同时图片本身会变大,使用时,优劣考虑清楚,再使用。

  4. 尽量减少页面重排、重绘。这个问题涉及的注意点很多,比如动画移动时,通过transform 来控制,而不是通过margin或者padding来控制。

  5. 正确使用display的属性,由于display的作用,某些样式组合会无效,徒增样式体积的同时也影响解析性能。比如 本来是inline的标签span,就不要设置为block,设置为inline-block。

让样式更优雅:

  1. 将具有相同属性的样式抽离出来,整合并通过class在页面中进行使用,提高css的可维护性。这个很有意思,其实就是样式的封装,比如我们希望所有的a标签有一个特别的样式,在main.css中加上
.custom-a {
	xxx
}

当a标签希望使用这个样式的时候,直接给a标签加上这个类名,够灵活,够节省。

  1. 样式与内容分离:将css代码定义到外部css中。这其实就是在强调不要使用内联样式,不便于维护和修改。

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

我们常听说什么是css预处理器,但css后处理器是什么?
css 预处理器:less、sass
后处理器:postcss

现在的许多项目中,我们直接编写的样式代码一般都不是css,以less举例,它可以定义变量,选择器嵌套,混入复用,函数,循环等更自由的方式实现样式编码,这样能节省开发者的时间。

但最终,浏览器不认识less编写的代码,所以还要将less 转译为 css,这一部分的工作,一般交给其它工具来完成,比如webpack中的less-loader。

将less转为css后自然就能被浏览器识别,根直接写的css样式没啥区别,但也许你自己开发的浏览器显示没问题,但不能保证所有用户的浏览器都能正常显示,因为某些css语言针对不同的浏览器,不同的版本,存在兼容性的问题。

如果让人为来实现兼容大多数浏览器样式问题的工作,太痛苦,所以还需要postcss来进行再次编译。

postcss会为许多有兼容性问题的样式属性添加前缀,添加所有相同语义但写法不同的其它css样式语法,以确保不同的浏览器,总有一种写法能够匹配生效。并且越新的写法被放置在样式的最下面,这样一来新的浏览器将总是被最新的css语法匹配。

普通的前端开发者很难接触到postcss,一般在项目成立时,就已经设置好了,平时开发不会去重新配置,但你每一次编译,打包都会用上它,webpack中,它就是postcss-loader

扩展一下,我们已经知道了css大概经历的一个编译过程,所以,在webpack中,是先less-loader,后面才会有postcss-loader,所以postcss-loader总会写在less-loader的左边,因为webpack的loader执行规则是从下往上,从右至左的。

 {
   test: /\.less$/,
   use: ['style-loader', 'css-loader', 'postcss-loader', 'less-loader'],
 },

5、单行、多行文本溢出隐藏

这个可不是面试造航母,工作拧螺丝,确实经常用到,如果不想每次都要去查,最好记一下

单行文本溢出

overflow: hidden;            // 溢出隐藏
text-overflow: ellipsis;      // 溢出用省略号显示
white-space: nowrap;         // 规定段落中的文本不进行换行

多行文本溢出

overflow: hidden;            // 溢出隐藏
text-overflow: ellipsis;     // 溢出用省略号显示
display:-webkit-box;         // 作为弹性伸缩盒子模型显示。
-webkit-box-orient:vertical; // 设置伸缩盒子的子元素排列方式:从上到下垂直排列
-webkit-line-clamp:3;        // 显示的行数

6、实现一个扇形

实现扇形的方式和实现三角行的方式思路一致,只是将一个矩形变成椭圆形而已。

div {
    border: 100px solid transparent;
    width: 0;
    heigt: 0;
    // 没有这个border-radius就是一个三角形
    border-radius: 100px;
    border-top-color: red;
}

7、实现一个自适应的正方形

  1. 通过vw来实现
    有两个神奇的单位vw和vh,100vw就是浏览器可视化区域宽度的100%。
.square {
  width: 10vw;
  height: 10vw;
  background: red;
}
  1. 利用元素的margin/padding百分比是相对父元素width的性质来实现:
.square {
  width: 10%;
  padding-top: 10%;
  background: red;
}

8、为什么现在的设备分辨率差异很大,2.5k屏幕都已经出现,css中还在使用1px ?

这其实是在考查设备的物理像素和css中像素单位之间的关系。

window.devicePixelRatio = 设备的物理像素 / CSS像素。

正常的pc端这个值为1,以csdn我的博客首页为例

在这里插入图片描述
iPhone se 时devicePixelRatio 就为 2 了。
在这里插入图片描述
devicePixelRatio = 2 为例,css为1px时,在物理屏幕上就会渲染2个像素点,所以比例看起来就很合理。
物理分辨率越高,devicePixelRatio 的值就会越大,所以内容呈现将会更加清晰,iPhone 12 pro 时devicePixelRatio 就为 3 了。

在这里插入图片描述

更多推荐

【深度学习】Pytorch 系列教程(二):PyTorch数据结构:1、Tensor(张量): GPU加速(GPU Acceleration)

目录一、前言二、实验环境三、PyTorch数据结构0、分类1、张量(Tensor)1.维度(Dimensions)2.数据类型(DataTypes)3.GPU加速(GPUAcceleration)一、前言ChatGPT:PyTorch是一个开源的机器学习框架,广泛应用于深度学习领域。它提供了丰富的工具和库,用于构建和训

学会用AI:释放创意,解放双手,工作再多也不慌

随着人工智能(AI)技术日渐成熟,AI在软件开发领域的应用也更加广泛。以前我们谈到AI时,常常会想到复杂的算法和深奥的理论,但如今,AI正在悄然改变着程序员的日常工作方式。从AI代码生成模型到AI编程助手应用,它们不仅仅是一小部分,更是未来程序开发的新趋势。过去,编写代码一直是一项枯燥乏味、需要长时间投入的工作。尤其是

SQL server 创建存储过程

SQLServer如何创建存储过程存储过程:可以理解为完成特定功能的一组SQL语句集,存储在数据库中,经过第一次编译,之后的运行不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来调用存储过程。如何创建存储过程创建存储过程可以有两种方式:一是在SSMS中界面操作创建存储过程,而后修改其中的S

【MediaSoup---源码篇】(二)Router

概述Router:路由对象,类似于房间的功能,保存了流之间的订阅关系,它接收Producer的数据并转发给订阅该Producer的ConsumerRouter继承了以下类:RTC::Transport::Listener,RTC::RtpObserver::Listener,Channel::ChannelSocket

全面解析缓存应用经典问题

1、前言随着互联网从简单的单向浏览请求,发展为基于用户个性信息的定制化以及社交化的请求,这要求产品需要做到以用户和关系为基础,对海量数据进行分析和计算。对于后端服务来说,意味着用户的每次请求都需要查询用户的个人信息和大量的关系信息,此外大部分场景还需要对上述信息进行聚合、过滤、排序,最终才能返回给用户。CPU是信息处理

接口自动化测试完整版(文档+视频)

1.什么是接口测试顾名思义,接口测试是对系统或组件之间的接口进行测试,主要是校验数据的交换,传递和控制管理过程,以及相互逻辑依赖关系。其中接口协议分为HTTP,WebService,Dubbo,Thrift,Socket等类型,测试类型又主要分为功能测试,性能测试,稳定性测试,安全性测试等。在分层测试的“金字塔”模型中

QT windows dpi变化导致的界面异常处理

问题:已经在UI界面中利用布局设计好界面,但是运行程序后显示的界面出现错乱,而且在做出一些修改后重新构建,运行时界面无变化。目录一、解决UI设计界面与运行时显示界面不一致的问题1、导致该现象的原因有:显示屏分辨率过高2、使用布局和设置控件sizePolicy二、解决修改界面后重构,运行无变化的问题一、解决UI设计界面与

Spring | Spring监听器使用与入门

引言在复杂的软件开发环境中,组件之间的通信和信息交流显得尤为重要。Spring框架,作为Java世界中最受欢迎的开发框架之一,提供了一种强大的事件监听器模型,使得组件间的通信变得更加灵活和解耦。本文主要探讨Spring事件监听器的原理、使用方法及其在实际开发中的应用,希望为广大开发者提供实用的参考。1.1Spring事

2023年中国研究生数学建模竞赛赛题浅析

为了更好的帮助大家第一天选题,这里首先为大家带来各个赛题的赛题浅析,分析对应赛题之后做题阶段可能会遇到的各种难点。稍后会带来D题的详细解析思路,以及相关的其他版本解题思路成品论文等资料。赛题难度评估:A、B>C>E、F>D选题人数评估:D>E、F>C>A、BA题WLAN网络信道接入机制建模B题DFT类矩阵的整数分解逼近

【Java 并发编程】CopyOnWriterArrayList 详解

CopyOnWriterArrayList详解1.ArrayList1.1ArrayList和LinkedList的区别1.2ArrayList如何保证线程安全2.CopyOnWriteArrayList原理3.CopyOnWriteArrayList的优缺点3.1优点3.2缺点4.源码分析4.1两个成员变量4.2构造

通过篡改cred结构体实现提权利用

前言在之前的HeapOverflow文章中,作者还构造了任意地址读写的操作,使用了任意地址读写去进行提权,还挺有意思的,记录一下如何利用任意地址读写进行提权。作者利用任意地址读写分别改写modprobe_path以及cred结构体去实现提权的操作,由于改写modprobe_path的方法之前已经研究过了,因此现在详细记

热文推荐