在前端日常开发中,经常会遇到各种各样的兼容性问题,或者各种各样的奇葩问题,无论是css
,html
还是js
都会有一些小的问题所在,特记录下平常可能遇到的问题和一些解决方法.
p标签解析问题
当一个元素指定多个 class 时,class 的优先级与指定顺序无关,而是和 class 的定义顺序有关。后声明的优先级高。
1 | <style> |
隐藏元素的方法异同
- Display:non e;隐藏盒子,并且不占位置
- Overflow:hidden;隐藏超出部分
- Visibility:hidden;隐藏盒子,占位置
- Opacity:0;隐藏盒子,占位置
- Position-left/top:-999em;隐藏盒子,测试不占位置
BFC(Block formatting context) 块级格式化上下文
决定元素的内容如何渲染及与其他元素的关系的交互
- BFC的规则
- BCF具有隔离作用,内部元素不会受到外部元素的影响
- BFC内的内容不会与外面的浮动元素重叠
- BFC内的元素按正常流排列,元素之间的间隙由元素的外边距控制
哪些元素或属性会生成BFC
1
2
3
4
51. 根元素 html
2. float属性不为none 浮动框
3. position为absolute或fixed
4. display为inline-block, table-cell, table-caption, flex, inline-flex 非块框的块容器
5. overflow不为visible的块级元素BFC 作用
- 解决清除浮动问题 BFC包含浮动元素,BFC会根据子元素的情况自动适应高度
- 解决margin 合并问题
- BFC可以阻止元素被浮动元素覆盖(解决文字环绕)
屏蔽右键菜单
<body oncontextmenu="return false" ondragstart="return false" onselectstart="return false"></body>
常用正则整理
1 | var reg = { |
calc使用问题
1 | 在使用calc(100% - 20px + 5px*2)) |
a标签点击事件与href中代码执行顺序问题
1 | <ul onclick="javascript:console.log('ul-click')"> |
some()
不会对空数组进行检测,不会改变原始数组。对于空数组上的任何条件,此方法返回false。every()
不会对空数组进行检测,不会改变原始数组。对于空数组上的任何条件,此方法返回true。switch case
的条件判断是全等于即===test.toFixed(2)
返回值类型的是字符串 test必须是数字类型 不能是字符串ios不支持2018-09-09这类时间格式
字体颜色渐变 ios 存在标签兼容问题 android正常
移动端 border-radius 小于6像素 设置正园时 变形问题 采用transform:scale(0.5)进行缩放 缩放会占位 采用margin负值调整即可
禁用的input框在ios和android下表现不一致
1
2
3
4
5
6
7input:disabled, input[disabled]{
background-color : #fff; //修改默认灰色样式
color: #666;
-webkit-text-fill-color:#666; //字体颜色安卓与IOS适配
-webkit-opacity:1; // 不透明级别安卓与IOS适配
opacity:1; // ios默认的不透明级别为0.3
}URL 全称是 Uniform Resource Locator ,中文译名为“统一资源定位符”,用于完整地描述 Internet 上某一处资源的地址。一般称之为 URL 地址,或者 Web 地址,俗称“网址”
URI 全称是 Uniform Resource Identifier ,中文译名为“统一资源标识符”,用来唯一地标识一个资源。而URL是一种具体的URI,我们可以简单地 URI和URL 看作同一个东西
var val = tel.replace(/[^\d]/g, '') //只能输入数字
scrollTop在有些机型获取不是整数的问题 数值为小数
解决CSS position:fixed 抖动问题, fixed元素设置 -webkit-transform: translateZ(0);
QQ 分享问题 不是QQ好友 分享有问题
页面上的图片没有找到 使用类似404图片
1
2
3
4
5
6
7
8<script type="text/javascript">
function nofind(){
var img=event.srcElement;
img.src="images/logoError.png";
img.onerror = null; // 控制不要一直跳动
}
</script>
<img src="images/logo.png" onerror="nofind()" />美化表单元素
禁用select默认箭头,::-ms-expand修改表单控件下拉箭头,设置隐藏并使用背景图片来修饰
select::-ms-expand { display:none; }
禁用radio和checkbox默认样式,::-ms-check修改表单复选框或单选框默认图标,设置隐藏并使用背景图片来修饰
input[type=radio]::-ms-check,input[type=checkbox]::-ms-check { display:none; }
禁用pc端表单输入框默认清除按钮,::-ms-clear修改清除按钮,设置隐藏并使用背景图片来修饰
input[type=text]::-ms-clear,input[type=tel]::-ms-clear,input[type=number]::-ms-clear { display:none; }
内容多左对齐, 内容少居中对齐
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
/* 方法一 利用 inline-block 重新创造一个新的盒模型环境 */
div{ background: red;text-align: center; }
p{ display:inline-block;text-align: left; }
/* 方法二 table */
div{ background: red; }
p { margin: 0 auto;display: table; }
/* 方法三 fit-content */
div{ background: red; }
p { margin: 0 auto;width:fit-content;}
</style>
</head>
<body>
<div>
<p>内容多左对齐, 内容少居中对齐内容多左对齐, 内容少居中对齐内容多左对齐, 内容少居中对齐内容多左对齐, 内容少对齐内容多左对齐, 内容少对齐内容多左对齐, 内容少对齐内容多左对齐, 内容少居中对齐内容多左对齐, 内容少居中对齐内容多左对齐, 内容少居中对齐</p>
</div>
</body>
</html>实现多行文本上下居中
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
/* 方法一 */
.method1{
height: 100px;
width: 200px;
font-size: 12px;
border: 1px solid #000;
line-height: 100px;
}
.method1 span{
display: inline-block;
line-height: normal;
vertical-align: middle;
}
/* 方法二 */
.method2{
height: 100px;
width: 200px;
font-size: 12px;
border: 1px solid #000;
vertical-align: middle;
display: table-cell;
}
</style>
</head>
<body>
<!-- 方法一 利用 inline-block 重新创造一个新的盒模型环境 -->
<div class="method1">
<span>多行文本居中多行文本居中多行文本居中多行文本居中多多行</span>
</div>
<!-- 方法二 采用 display: table-cell -->
<div class="method2">
多行文本居中多行文本居中多行文本居中多行文本居中多多行
</div>
</body>
</html>
Doctype含义?
- Doctype声明不属于HTML标签,它是一条指令,告诉浏览器编写页面所使用的的HTML或XHTML版本
img的alt与title有何异同? strong与em的异同?
- alt(alt text):为图片加载失败无法正常显示时用来指定替换文字
- title(tool tip):为元素提供额外说明信息,鼠标移入时显示
- strong:粗体强调标签,强调,表示内容的重要性
- em:斜体强调标签,更强烈强调,表示内容的强调点
行内元素和块级元素的具体区别是什么?行内元素的padding和margin可设置吗?
- 块级元素(block)特性:总是独占一行 宽度(width)、高度(height)、内边距(padding)和外边距(margin)都可控制
- 内联元素(inline)特性:和相邻的内联元素在同一行 宽度(width)、高度(height)、上下内边距和上下外边距无效
- 行内块(inline-block): 拥有内在尺寸,可设置高宽,但不会自动换行 如
<input> 、<img> 、<button> 、<texterea> 、<label>
rgba()和opacity的透明效果有什么不同?
- opacity作用于元素,以及元素内的所有内容的透明度,
- rgba()只作用于元素的颜色或其背景色。(设置rgba透明的元素的子元素不会继承透明效果!)
display:none与visibility:hidden的区别是什么?
- display: 隐藏对应的元素但不保留该元素原来的空间。
- visibility: 隐藏对应的元素但保留元素原来的空间。
哪些css属性可以继承?
- 可继承:font系列 line-height text-align text-indent color list-style cursor visibility等
- 不可继承:border padding margin width height
link和@import的区别是?
A. Link属于HTML标签,而@import是css提供的
B. 页面被加载时,link会同时被加载,而@import会等到引用的它的css文件加载完再加载
C. Import只在IE以上才能识别,而link是html标签,无兼容性问题
D. Link方式样式的权重高于@import
什么是CSS Hack?
1 | // 1、条件Hack |
CSS样式的优先级?
- !important > 内联样式 > id > class > 标签
重排与重绘
- 重绘: 当在页面上修改了一些不需要改变定位的样式的时候(比如background-color),浏览器只会将新的样式重新绘制给元素
- 重排: 当页面上的改变影响了文档内容,结构或者元素定位时,就会发生重排(或称重新布局).
重排通常由以下改变触发:
1)Dom操作(元素增,删,改或者改变元素顺序)
2)内容的改变,包括Form表单中文字的变化
3)计算或改变css属性
4)增加或删除一个样式表
5)浏览器窗口的操作(改变大小,滚动窗口)
常见浏览器的内核
- IE: trident内核
- Firefox:gecko内核
- Safari:webkit内核
- Opera:以前是presto内核,Opera现已改用Google Chrome的Blink内核
- Chrome:Blink(基于webkit,Google与Opera Software共同开发)
对前端工程师这个职位你是怎么样理解的?
a. 前端是最贴近用户的程序员,前端的能力就是能让产品从 90分进化到 100 分,甚至更好
b. 参与项目,快速高质量完成实现效果图,精确到1px;
c. 与团队成员,UI设计,产品经理的沟通;
d. 做好的页面结构,页面重构和用户体验;
e. 处理hack,兼容、写出优美的代码格式;
f. 针对服务器的优化、拥抱最新前端技术。