点歌台项目总结

1. img标签src为空的异常样式

根据用户性别来显示不同的图标,但是如果获取失败,导致img的src为空从而显示异常处理

1
2
3
4
5
// 解决src为空的异常样式
img[src=""],
img:not([src]) {
opacity: 0;
}

2.Safari碰到的问题

2.1 伪类active失效

在按钮元素或body/html上绑定一个touchstart事件才能激活:active状态

1
document.body.addEventListener('touchstart', function () {});

2.2 input和textarea有上内阴影

1
-webkit-appearance: none;

3.移动端布局

image-20200818013423199

1
2
3
4
5
6
7
<div class="page">
<div class="header">header</div>
<div class="content">
<div>1</div><div>2</div><div>3</div><div>4</div><div>5</div><div>6</div><div>7</div><div>8</div><div>9</div><div>10</div><div>11</div><div>12</div>
</div>
<div class="footer">footer</div>
</div>
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
.page {		// 整体flex竖式布局
display: flex;
flex-direction: column;
height: 100vh;
overflow: hidden;
}

.content { // 内容容器
flex: 1;
overflow-y: scroll;
-webkit-overflow-scrolling: touch; // 移动回弹

&::-webkit-scrollbar {
display: none;
}

div { // 具体内容
margin: 10px 0;
height: 50px;
background-color: #999;
}
}

.footer {
height: 60px;
}

4. textarea把icon图片显示在输入前

image-20200818014542667

1
2
3
4
5
6
7
textarea {
text-indent: 23px;

&::placeholder {
text-indent: 23px;
}
}

利用text-indent来使输入光标后置,然后图片用定位设置在指定位置

5. ios弹键盘 上移布局且不恢复

1
<input @blur.prevent="checkValue" type="text" />
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
checkValue () { 
inputBlur()
this.$emit('checkValue')
}

inputBlur() {
let u = navigator.userAgent;
let isIOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/);
if (isIOS) {
setTimeout(() => {
const scrollHeight =
document.documentElement.scrollTop || document.body.scrollTop || 0;
window.scrollTo(0, Math.max(scrollHeight - 1, 0));
}, 200);
}
}

6.滑块样式

slide-btn

1
<input type="checkbox" class="slide-btn"/>
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
.slide-btn {
position: relative;
-webkit-appearance: none;
width: 50px;
height: 23px;
border: 1px solid #e9e9e9;
border-radius: 30px;
outline: none;
}
.slide-btn:before {
content: "";
position: absolute;
top: 50%;
transform: translateY(-50%);
left: 1px;
width: 18px;
height: 18px;
border-radius: 50%;
background: #e9ddd8;
transition: all 0.2s linear;
}

.slide-btn:checked {
background: #fff4f0;
border: 1px solid #fff4f0;
}
.slide-btn:checked:before {
left: 29px;
background-color: #ff935f;
transition: all 0.2s linear;
}

7. 背景颜色和背景图片同时设置

前面的背景会叠在之后的背景之上,所以背景色通常都定义在最后一组上,避免背景色将图像盖住

8. 文字超出处理

8.1 一行超出省略

1
2
3
white-space: nowrap;	 // 不换行
overflow: hidden;
text-overflow: ellipsis; // 省略号

触发text-overflow需要

  • overflow为非visible
  • 显式或隐式定义width值
  • white-space为非nowrap值

8.2 最多两行,超出利用展开收起

兼容性不太好

1
2
3
4
5
6
7
8
9
10
11
12
13
.show2line {
display: -webkit-box;
overflow: hidden;
-webkit-line-clamp: 2; /* 限制在一个块元素显示的文本的行数 */
-webkit-box-orient: vertical; /* 垂直排列 */
text-overflow: ellipsis;
}

.showAll {
display: block;
overflow: auto;
height: auto;
}

9. 部分机型设置透明度0.x会完全透明

10. 刷新会导致vuex丢失一段时间

目前的解决方案是存localstorage或者从router.query获取,还看到有用vuex-persistedstate。

作者

Liang

发布于

2020-08-18

更新于

2021-12-25

许可协议


评论