前端八股-他人分享
1.app怎么做适配的
1. 基于手机系统开发的原生 App (Android/iOS):
- Android: Android 开发通常使用
dp
(Density-independent Pixels) 作为单位,它会根据屏幕密度自动进行缩放,从而在不同分辨率的设备上保持一致的外观。此外,还可以使用ConstraintLayout
等布局工具来创建灵活的布局,并根据屏幕尺寸和方向进行调整。 - iOS: iOS 开发通常使用
Auto Layout
和Size Classes
来实现适配。Auto Layout
可以定义视图之间的约束关系,使布局能够自动适应不同的屏幕尺寸和方向。Size Classes
则可以根据屏幕尺寸和方向定义不同的布局方案。
2. Web App:
设置 viewport meta 标签:
1
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
width=device-width
: 将视口宽度设置为设备宽度,确保页面宽度与设备宽度一致。initial-scale=1.0
: 设置初始缩放比例为 1.0,即页面不进行缩放。maximum-scale=1.0
: 设置最大缩放比例为 1.0,禁止用户放大页面。user-scalable=no
: 禁止用户缩放页面。
使用媒体查询和响应式做适配:
- 通过媒体查询,可以根据不同的屏幕尺寸、方向等特性应用不同的 CSS 样式,从而实现页面的自适应布局。
- 优点:可以精确控制不同屏幕尺寸下的布局和样式。
- 缺点:需要编写大量的媒体查询规则,维护成本较高。
使用 rem 或 vw/vh 等相对单位:
rem
(root em) 是相对于根元素字体大小的单位,可以根据根元素字体大小的变化自动调整元素尺寸。vw
(viewport width) 和vh
(viewport height) 是相对于视口宽度和高度的单位,可以根据视口尺寸的变化自动调整元素尺寸。- 优点:可以实现更灵活的布局,代码更简洁。
- 缺点:需要对页面进行整体的布局规划,才能更好地利用这些单位。
使用 flexible.js 等适配方案:
- flexible.js 是一个常用的 Web App 适配方案,它通过动态修改
html
元素的font-size
来实现适配。 - 原理:根据屏幕宽度计算出一个合适的
font-size
,然后使用rem
作为单位进行布局。 - 优点:使用简单,适配效果较好。
- 缺点:可能会影响页面的性能,需要谨慎使用。
- flexible.js 是一个常用的 Web App 适配方案,它通过动态修改
2.rem em vw vw 百分比区别
- px (像素): 绝对单位,表示屏幕上的一个物理像素点。在不同分辨率的屏幕上,相同像素值的元素大小可能会有所不同。
- rem (root em): 相对单位,相对于根元素 (
<html>
) 的字体大小。如果根元素的字体大小设置为 16px,那么 1rem 就等于 16px。 - em (element em): 相对单位,相对于当前元素的字体大小。如果当前元素的字体大小设置为 14px,那么 1em 就等于 14px。如果当前元素没有设置字体大小,则会继承父元素的字体大小。
- vw (viewport width): 相对单位,相对于视口宽度的百分比。1vw 等于视口宽度的 1%。
- vh (viewport height): 相对单位,相对于视口高度的百分比。1vh 等于视口高度的 1%。
- 百分比 (%): 相对单位,相对于父元素的宽度或高度的百分比。
相同点:
它们都是 CSS 中用于设置尺寸的单位。
不同点:
它们参照的对象不同,导致在不同场景下的表现也不同。
注意:
vw
和vh
是相对于视口 (viewport) 的,而视口指的是浏览器窗口中可以显示网页内容的区域,不包括浏览器工具栏、地址栏等。- 当页面存在滚动条时,
100vw
表示视口内容区域的宽度,不包括滚动条的宽度;而100%
表示包含滚动条在内的整个浏览器窗口的宽度。
3.750px 设计稿,20px 为多少 rem?
首先设计图是UI设计提供给前端开发工程师的设计稿,750的设计图出自于手机屏幕为375px*667px的iphone678手 机屏幕的设计稿,这里也可以称之为2倍图。20px的字体大小涉及到了单位的转换,页面中默认的字体大小为16px, 那么此时的1rem = 16px; 那么20px通过计算得出公式 1rem = 16px; ?rem = 20px; 得出结果为:1.25rem
代码示例:
1 |
|
4.简单的一个盒子移动到另一个盒子,你用什 么方式实现动画效果
1.使用HTML+CSS里面的transition过渡动画结合2d的位移translate设置
1 |
|
2.使用HTML5+CSS3中的animation动画属性结合2d里面的位移translate进行实现
1 |
|
3.可以使用js封装一个动画函数,直接使用鼠标移动移入事件或者点击事件触发 移动
div {
float: left;
}
.box1 {
width: 300px;
height: 300px;
background-color: red;
}
.box2 {
width: 100px;
height: 100px;
background-color: green;
position: relative; /* 添加 position: relative; 使得可以使用 left 属性进行定位 */
}
</style>
<script>
// 获取元素
const box1 = document.querySelector('.box1');
const box2 = document.querySelector('.box2');
// 设置初始位置
let x = 0;
// 绑定鼠标移入事件
box1.addEventListener('mouseover', () => {
let intervalId = setInterval(() => {
x -= 1; // 每次向左移动 1px
box2.style.left = x + 'px';
}, 10); // 每 10 毫秒移动一次
// 鼠标移出 box1 时清除定时器
box1.addEventListener('mouseout', () => {
clearInterval(intervalId);
});
});
// 绑定鼠标移出事件
box1.addEventListener('mouseout', () => {
let intervalId = setInterval(() => {
x += 1; // 每次向右移动 1px
box2.style.left = x + 'px';
if (x >= 0) { // 当回到初始位置时停止
clearInterval(intervalId);
x = 0;
}
}, 10); // 每 10 毫秒移动一次
});
</script>
5、boder实现0.5像素
实现方法:CSS3有缩放的属性,我们可以利用这个属性,缩小50%的1px的边框,来实现这个功能代码如下:
::before
伪元素的主要原因是为了避免直接修改元素本身的边框属性 ,从而保持元素的原始尺寸和布局。
* { margin: 0; padding: 0; } .border3 { position: relative; /* 使其成为相对定位元素,以便伪元素可以相对于它进行定位 */ } .border3::before { content: ''; /* 伪元素必须有 content 属性,即使为空 */ position: absolute; /* 使伪元素绝对定位 */ width: 200%; /* 将伪元素的宽度设置为父元素的两倍 */ height: 200%; /* 将伪元素的高度设置为父元素的两倍 */ border: 1px solid red; /* 设置 1px 的红色边框 */ transform-origin: 0 0; /* 将变换的原点设置为左上角 */ transform: scale(0.5, 0.5); /* 将伪元素缩小 50% */ box-sizing: border-box; /* 将边框和内边距包含在元素的总宽度和高度中 */ }
1
2
3
4
5
# 6.场景题(两个盒子,左边固定宽,右边自适 应,你能想到几种方法)
#### 方法一:float来和BFC实现
.content {
border: 1px solid #000;
height: 800px;
padding: 20px;
}
.left {
width: 200px;
height: 100%;
background: red;
float: left;
}
.right {
height: 100%;
background: pink;
overflow: hidden; /* 触发 BFC */
}
1 |
|
.content {
border: 1px solid #000;
height: 800px;
padding: 20px;
position: relative; /* 使 .content 成为相对定位元素 */
}
.left {
width: 200px;
height: 100%;
background: red;
position: absolute; /* 绝对定位 */
}
.right {
height: 100%;
background: pink;
margin-left: 200px; /* 留出左侧元素的空间 */
}
1 |
|
.content {
border: 1px solid #000;
height: 800px;
padding: 20px;
}
.left {
width: 200px;
height: 100%;
background: red;
float: left;
}
.right {
height: 100%;
background: pink;
float: left;
width: calc(100% - 200px); /* 使用 calc() 函数计算宽度 */
}
1 |
|
.content {
border: 1px solid #000;
height: 800px;
padding: 20px;
display: flex;
}
.left {
width: 200px;
height: 100%;
background: red;
}
.right {
height: 100%;
background: pink;
flex: 1; /* 自动填充剩余空间 */
}
1 |
|
.content {
border: 1px solid #000;
width: 100%;
height: 800px;
display: table;
}
.left {
width: 200px;
height: 100%;
background: red;
display: table-cell;
}
.right {
height: 100%;
background: pink;
display: table-cell;
}
1 |
|
方法二:弹性盒子
1 |
|
8.css引入的方式有哪些,link和@import的 区别是什么
XHTML(可扩展超文本标记语言)是一种标记语言,它具有与 HTML 相同的表达能力,但语法更加严格。它是 HTML 的一个更严格和更纯净的版本,基于 XML 标准。
XHTML 的主要特点:
- 基于 XML 标准: XHTML 的语法规则遵循 XML 标准,这意味着它必须符合 XML 的严格语法要求。
- 大小写敏感: XHTML 标签和属性名都是大小写敏感的,例如
<p>
和<P>
是不同的标签。 - 标签必须正确嵌套: XHTML 标签必须正确嵌套,例如
<p><b>This is bold text.</p></b>
是错误的,正确的写法是<p><b>This is bold text.</b></p>
。 - 所有标签必须关闭: XHTML 中的所有标签都必须关闭,即使是空标签,例如
<br>
必须写成<br />
。 - 属性值必须用引号括起来: XHTML 中的属性值必须用引号括起来,例如
<p class="example">This is an example.</p>
。
区别1:link属于XHTML标签,而@import完全是CSS提供的一种方式。
区别2:当一个页面被加载的时候(就是被浏览者浏览的时候),link引用的CSS会同时被加载,而 @import引用的CSS会等到页面全部被下载完再被加载。所以有时候浏览@import加载CSS的页面时 开始会没有样式(就是闪烁),网速慢的时候明显。
区别3:@import是CSS2.1提出的,所以老的浏览器不支持,@import只有在IE5以上的才能识别,而 link标签无此问题。
区别4:使用dom(document object model文档对象模型 )控制样式时的差别:当使用javascript控制 dom去改变样式的时候,只能使用link标签,因为@import不是dom可以控制的.
9.一个容器(页面),里面有两个div左 右摆放并且高度和容器高度一致,左div不会随 着页面左右伸缩而变化,右div随页面左右伸缩 宽度自适应
1 |
|
10.CSS3动画知道吗,怎么实现的
CSS3动画主要是通过animation这个属性来进行实现,使用动画的时候需要先进行声明动画然后再去调用,哪里需要产生动画效果哪里就使用animation进行调用
1 |
|
animation:复合属性
animation-name 规定需要绑定到选择器的 keyframe 名称。
animation-duration 规定完成动画所花费的时间,以秒或毫秒计。
animation-timing-function 规定动画的速度曲线。
animation-delay 规定在动画开始之前的延迟。
animation-iteration-count 规定动画应该播放的次数。
animation-direction 规定是否应该轮流反向播放动画。
form 初始状态 to 结束装填 可以替换成 0% 初始状态 100% 结束状态 后面的百分比可以称之为关键帧动画
11.CSS3新增了哪些东西
1. 选择器:
- 结构性伪类选择器:
:first-of-type
选择属于其父元素的首个元素的每个
元素。
:last-of-type
:only-of-type
:only-child
:nth-child(n)
:nth-last-child(n)
:nth-of-type(n)
:nth-last-of-type(n)
选择属于其父元素的第二个子元素的每个元素。
- 目标伪类选择器:
:target
- UI 元素状态伪类选择器:
:enabled
:disabled
:checked
- 属性选择器:
[attribute]
[attribute=value]
[attribute~=value]
[attribute|=value]
[attribute^=value]
[attribute$=value]
[attribute*=value]
2. 盒子模型:
border-radius
: 创建圆角边框。box-shadow
: 为元素添加阴影效果。box-sizing
: 控制盒子模型的计算方式 (content-box
或border-box
)。border-image
: 使用图片作为边框。
3. 背景和边框:
background-size
: 设置背景图片的大小。background-origin
: 指定背景图片的定位区域。background-clip
: 指定背景的绘制区域。multiple backgrounds
: 允许为一个元素设置多个背景图片。linear-gradient()
和radial-gradient()
: 创建渐变背景。
4. 文本效果:
text-shadow
: 为文本添加阴影效果。word-wrap
(现已更名为overflow-wrap
): 控制文本的换行行为。text-overflow
: 指定当文本溢出容器时如何显示。word-break
: 指定如何断开单词。
5. 字体:
@font-face
规则: 允许使用自定义字体。
6. 2D/3D 变换:
transform
属性: 实现元素的 2D 或 3D 变换,例如旋转、缩放、平移等。transform-origin
属性: 设置变换的原点。perspective
属性: 设置 3D 变换的透视效果。
7. 过渡和动画:
transition
属性: 实现平滑的过渡效果。animation
属性: 创建复杂的动画效果。@keyframes
规则: 定义动画的关键帧。
8. 多列布局:
column-count
: 指定列数。column-gap
: 设置列之间的间距。column-rule
: 设置列之间的分割线。column-fill
: 控制列的填充方式。column-span
: 指定元素是否跨越多个列。column-width
: 设置列的宽度。
9. 其他特性:
- 媒体查询 (Media Queries): 允许根据不同的设备特性应用不同的样式。
- 响应式设计: 使用 CSS3 的新特性,例如媒体查询、弹性布局等,可以创建适应不同屏幕尺寸的网页。
12.当margin-top、padding-top 的值是百分比 时,分别是如何计算的?
如果没有为元素声明width,在这种情况下,元素框的总宽度包括外边距取决于父元素的width,这 样可能得到“流式”页面,即元素的外边距会扩大或缩小以适应父元素的实际大小。如果对这个文档 设置样式,使其元素使用百分数外边距,当用户修改浏览窗口的宽度时,外边距会随之扩大或缩 小。
为什么margin-top/margin-bottom的百分数也是相对于width而不是height呢
正常流中的大多数元素都会足够高于包含其后代元素(包括外边距),如果一个元素的 上下外边距是父元素的height的百分数,就可能导致一个无限循环,父元素的height会增加,以适 应后代元素上下外边距的增加,而相应的,上下外边距因为父元素height的增加也会增加,如此循 环。
13.定位知道吗,说下几种不同的定位分别有什么特点,详细说明
static静态定位,是元素自带的默认的定位方式。
relative是相对定位,他是基于元素本身的位置进行定位的,不会脱离文档流。
fixed是固定定位是基于浏览器窗口进行定位的,会脱离文档流。参照物是浏览器可视窗口位置的左上角进行位置调整,不会受到滚动条的滚动而影 响
absolute是绝对定位,是基于最近的被设置了非静态定位的上级元素进行定位的,他会脱离文 档流,常用的场景是子绝父相。
sticky是粘性定位,是css新增的属性值;可以说是相对定位relative和固定定位fixed的结合;它主要用在对scroll事件的监听上,简单说在滑动过程中,某个元素距离其父元素的距离达到 sticky 粘性定位 要求时;position:sticky 这时的效果就相对于 fixed 定位,固定到适当的位置。
14.display有哪几种属性值?分别代表什么? Img属于什么元素?
display控制元素的显示类型
常用的 display
属性值:
none
: 元素不显示,并且不占据任何空间。它就像从文档流中被移除一样,后续元素会占据其原本的位置。常用于隐藏元素。block
: 元素显示为块级元素。块级元素会独占一行,并且可以设置宽度和高度。常见的块级元素有div
、p
、h1
-h6
、ul
、ol
、li
等。inline
: 元素显示为行内元素。行内元素不会独占一行,其宽度和高度由内容决定,并且会与其他行内元素排列在同一行。常见的行内元素有a
、span
、img
、strong
、em
等。inline-block
: 元素显示为行内块元素。行内块元素结合了块级元素和行内元素的特点,既可以设置宽度和高度,又可以与其他行内元素排列在同一行。常见的行内块元素有input
、button
、textarea
等。flex
: 将元素转换为 Flex 容器,启用 Flexbox 布局。Flexbox 布局是一种强大的布局方式,可以轻松地创建灵活、响应式的布局。grid
: 将元素转换为 Grid 容器,启用 Grid 布局。Grid 布局是一种二维布局方式,可以轻松地创建复杂的网格布局。table
、table-row
、table-cell
等: 将元素转换为表格元素,用于创建表格布局。
其他 display
属性值:
除了以上常用的属性值之外,display
属性还有其他一些不太常用的属性值,例如 list-item
(此元素会作为列表显示。)、run-in
(此元素会根据上下文作为块级元素或内联元素显示。)、table
等
img属于什么元素:浏览器中的computed计算属性中的图片的display的取值为inline,虽然为inline 但是实际开发的时候图片是作为行内块元素进行使用的,因为遵循能设置宽度高度,并且还能横向 显示;所以属于行内块元素,但是有些程序员也会把图片认为是行内元素也是可以(由于 img
元素可以设置宽度和高度,并且可以与其他行内元素排列在同一行,因此它在实际应用中更像是行内块元素。),从另一个角度 讲img也称作是置换元素;置换元素是指其内容不受 CSS 的控制,而是由外部资源决定的元素。常见的置换元素还有 iframe
、video
、audio
等。
15.display:inline-block后为什么有间距
display:inline-block是让元素在一行显示,但是这些元素在html里面是上下行排列的,所以中间有换行符,于是并排显示就有了换行符带来的空隙。
解决这种问题的方式有:
将html标签要display:inline-block 的元素写在一行。缺点:代码可读性差。
给元素设置float:left,缺点需要清除浮动。
设置父元素 display:table;word-spacing:-1em;目前这个方法可以完美解决,且兼容其他浏览器。
16.Doctype的作用? 严格模式和混杂模式的区 分,以及如何触发这2种模式?
Doctype的作用
1.<!DOCTYPE>声明叫做文档类型DTD,它的作用就是用来标识浏览器使用哪种文档类型,让 浏览器知道以何种方式解析文档。
2.必须位于HTML文档的第一行,处于标签之前,但是不属于HTML文档标签。
3.声明文档的解析类型(document.compatMode),是为了避免浏览器的怪异模式。
核心区别:
- 严格模式 (Standards Mode): 浏览器按照 W3C 标准解析渲染页面,确保跨浏览器一致性。
- 混杂模式 (Quirks Mode): 浏览器模拟旧版浏览器的行为,以兼容早期网页的渲染方式,但可能导致不同浏览器显示差异。
触发模式的关键:DOCTYPE 声明
- 严格模式:
- 使用 严格的 DOCTYPE 声明 ,例如:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
- 使用 HTML5 的 DOCTYPE 声明:
<!DOCTYPE html>
(HTML5 没有严格意义上的 DTD,但默认使用严格模式)
- 使用 严格的 DOCTYPE 声明 ,例如:
- 混杂模式:
- 缺少 DOCTYPE 声明
- 使用不规范或错误的 DOCTYPE 声明
- 使用过渡型 DOCTYPE 声明,但缺少 URL,例如:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
关键渲染差异 (示例):
特性 | 严格模式 | 混杂模式 |
---|---|---|
行内元素尺寸 | 无法设置宽度和高度 | 可以设置宽度和高度 |
百分比高度 | 需要父元素定义高度才能生效 | 即使父元素没有高度也可能生效 |
盒模型 | width /height 只包含内容 |
width /height 包含内容、内边距和边框 |
margin: 0 auto |
水平居中 | 可能失效 |
图片 padding |
生效 | 失效 |
HTML5 的影响:
HTML5 简化了 DOCTYPE 声明 (<!DOCTYPE html>
), 并鼓励使用严格模式,以提高网页的跨浏览器兼容性和可维护性。
17.对WEB标准以及w3c的理解与认识?
web标准可以分为结构、表现和行为
W3C对web标准提出了规范化的要求,也就是在实际 编程中的一些代码规范:包含如下几点 1.对于结构要求:(标签规范可以提高搜索引擎对页面的抓取效率,对SEO很有帮助 1)标签字母要小写 2)标签要闭合 3)标签不允许随意嵌套 2.对于css和js来说 1)尽量使用外链css样式表和js脚本。是结构、表现和行为分为三块,符合规范。同时提 高页面渲染速度,提高用户的体验。 2)样式尽量少用行间样式表,使结构与表现分离,标签的id和class等属性命名要做到见 文知义,标签越少,加载越快,用户体验提高,代码维护简单,便于改版 3)不需要变动页面内容,便可提供打印版本而不需要复制内容,提高网站易用性。
18.FireFox中标签的居中问题的解决办法
1 |
|
text-align:center;针对行内元素、文本
margin:0 auto针对块级元素
19.Flex的横向平铺填充
1 |
|
flex用法场景:
移动端和PC端布局中;能够高效解决间距调整的问题(移动端布局和PC端布局)
能快速高效实现元素水平垂直居中(点击删除的弹窗)
能够实现快速元素均分,避免了百分比设置的不确定性
快速实现多列布局,能高效实现瀑布流布局
后台管理系统的两栏和三栏布局
20.flex:0 1 100px什么意思?flex两个参数,三个 参数什么意思?表示三个参数,flex-grow、 flex-shrink、flex-basis
1.flex:1 解析为 flex:1 1 0%。2.flex:auto解析为 flex:1 1 auto。3.flex:none解析为 flex:0 0auto。4.flex:解析为flex:0 0 auto。4.flex:0 auto解析为flex:0 1 auto。
- flex属性是flex-grow(放大)、flex-shrink(缩小)、flex-basis(宽度)的简写属性。
- flex-grow默认值为0,当值大于0时,当父元素有剩余空间时当前元素放大,父元素没有剩余 空间时,该元素不放大。
- flex-shrnk默认值为1,父元素有剩余空间时,该元素不缩小,父元素没有剩余空间时,该元素缩小。
- flex-basis相当于width属性。
21.父元素visibility:hidden;子元素设置 visibility:visible,子元素显示吗
这时候子元素是显示的,原理如下: 当只是给父元素添加visibility:hidden,子元素会继承父元素的visibility:hidden的值,也会跟着父 元素隐藏。 如果给父元素添加visibility:hidden;同时在给子元素添加visibility:visible,子元素是显示的。
原 因:添加给子元素visibility:visible是大于父元素添加的visibility:hidden的。所以优先执行子元素 的visibility:visible属性。
22.知道渐变嘛,说下你的了解
线性渐变(Linear Gradients)- 向下/向上/向左/向右/对角方向
基本语法:background-image: linear-gradient(direction, color-stop1, color-stop2, …);
径向渐变(Radial Gradients)- 由它们的中心定义
基本语法:background-image: radial-gradient(shape size at position, start-color, …, lastcolor);
为了创建一个径向渐变,你也必须至少定义两种颜色节点。 颜色节点即你想要呈现平稳过渡的颜色。
size的取值 closest-side,farthest-side,closest-corner,farthest-corner
重复渐变:repeating-linear-gradient() 函数用于重复线性渐变:
#grad { /* 标准的语法 */ background-image: repeating-linear-gradient(red, yellow 10%, green 20%); }
23.一条0.5px的线,几种方法
1.transform: scale(0.5,0.5);
1 |
|
3.border: 0.5px solid red;//ios8以上支持,以下显示为0
渐变模拟:设置 1px 通过 css 实现的背景图片,50%有颜色,50%透明。
-webkit-box-shadow: 0 1px 1px -1px rgba(0, 0, 0, 0.5);