CSS你必须知道的移动布局方案

本篇主要研究移动端布局方案和一些布局经验
写前端之前,必须引入一个reset.scss来重置浏览器默认样式,不然会因为脏样式,影响最终效果
下面我整理了几大必要项目

一、样式篇

1.清除默认样式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
html,body{height:100%;}
html,body,h1,h2,h3,h4,h5,h6,div,dl,dt,dd,ul,ol,li,p,blockquote,pre,hr,figure,table,caption,th,td,form,fieldset,legend,input,button,textarea,menu{margin:0;padding:0;}
header,footer,section,article,aside,nav,hgroup,address,figure,figcaption,menu,details{display:block;}
table{border-collapse:collapse;border-spacing:0;}
caption,th{text-align:left;font-weight:normal;}
html,body,fieldset,img,iframe,abbr{border:0;}
i,cite,em,var,address,dfn{font-style:normal;}
[hidefocus],summary{outline:0;}
li{list-style:none;}
h1,h2,h3,h4,h5,h6,small{font-size:100%;}
sup,sub{font-size:83%;}
pre,code,kbd,samp{font-family:inherit;}
q:before,q:after{content:none;}
textarea{overflow:auto;resize:none;}
label,summary{cursor:default;}
a,button{cursor:pointer;}
h1,h2,h3,h4,h5,h6,em,strong,b{font-weight:bold;}
del,ins,u,s,a,a:hover{text-decoration:none;}
body,textarea,input,button,select,keygen,legend{font:12px/1.14 Microsoft YaHei,arial,\5b8b\4f53;color:#333;outline:0;}
body{background:#fff;}
a,a:hover{color:#333;}
*{box-sizing: border-box;}

2.去除input默认填充的背景颜色

1
2
3
input:-webkit-autofill {
-webkit-box-shadow: 0 0 0px 1000px white inset;
}

3.清除input[type=number]的默认样式

1
2
3
4
5
6
7
8
input[type=number] {
-moz-appearance:textfield;
}
input[type=number]::-webkit-inner-spin-button,
input[type=number]::-webkit-outer-spin-button {
-webkit-appearance: none;
margin: 0;
}

4.清除移动端 a 标签等点击区域变色

1
2
3
*{
-webkit-tap-highlight-color: rgba(255, 255, 255, 0);
}

5.清除移动端 input 样式

1
2
3
4
5
6
7
8
input{
border: none;
-moz-appearance:none;
-webkit-appearance : none ; /*解决ios上按钮的圆角问题*/
border-radius: 0; /*解决ios上输入框圆角问题*/
outline:medium; /*去掉鼠标点击的默认黄色边框*/
background-color: transparent;
}

6.避免ios滑动滚动条卡顿

1
2
3
*{
-webkit-overflow-scrolling : touch
}

二、midea媒体查询

orientation 方向
resolution 分辨率
dpr === dppx

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
/* 横屏 */
@media screen and (orientation:landscape){

}
/* 竖屏 */
@media screen and (orientation:portrait){

}
/* 窗口宽度<960,设计宽度=768 */
@media screen and (max-width:959px){

}
/* 窗口宽度<768,设计宽度=640 */
@media screen and (max-width:767px){

}
/* 窗口宽度<640,设计宽度=480 */
@media screen and (max-width:639px){

}
/* 窗口宽度<480,设计宽度=320 */
@media screen and (max-width:479px){

}
/* 设备像素比为2 */
/* 常用于1px边框,还应规定 3dppx 的情况 */
@media (min-resolution: 2dppx) {

}
/* windows UI 贴靠 */
@media screen and (-ms-view-state:snapped){

}
/* 打印 */
@media print{

}

三、强制横(竖)屏

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
.landscape-container {
position: absolute;
overflow: hidden;
}

// 竖屏
@media screen and (orientation: portrait) {
.landscape-container {
width: 100vh;
height: 100vw;
top: calc((100vh - 100vw) / 2);
left: calc((100vw - 100vh) / 2);
transform: rotate(90deg);
transform-origin: 50% 50%;
}
}

// 横屏
@media screen and (orientation: landscape) {
.landscape-container {
width: 100vw;
height: 100vh;
top: 0;
left: 0;
transform: none;
transform-origin: 50% 50%;
}
}

四、rem单位设置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
(function (doc, win) {
var docEl = doc.documentElement
var resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize'

function recalc() {
var designWidth = 750
var clientWidth = docEl.clientWidth
if (!clientWidth || clientWidth > designWidth) return
docEl.style.fontSize = (100 * clientWidth / designWidth) + 'px'
}

if (!doc.addEventListener) return
win.addEventListener(resizeEvt, recalc, false)
doc.addEventListener('DOMContentLoaded', recalc, false)
})(document, window)

五、垂直居中

未知父元素高度

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
.parentElement {
position: relative;
// 方法1 transform: translateY(-50%);
.childElement {
position: absolute;
top: 50%;
transform: translateY(-50%);
}
// 方法2
.childElement {
position: absolute;
top: 0;
bottom: 0;
margin: auto;
}
}

已知父元素高度,仅有一个子元素

1
2
3
4
5
6
7
8
.parentElement {
height: xxx;
.childElement {
position: relative;
top: 50%;
transform: translateY(-50%);
}
}

六、图文居中

1
2
3
4
<div class="container">
<img src="../../public/images/bg1.jpg">
<span>安能摧眉折腰事权贵,使我不得开心颜</span>
</div>
1
2
3
4
5
6
.container{
padding:15px 0;
img{
vertical-align: middle;
}
}

七、文本行超出显示省略号

单行文字:

1
2
3
4
5
6
7
// 注意宽度是必须的
.article-container {
width: 500px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}

多行文字:

1
2
3
4
5
6
7
8
.article-container {
display: -webkit-box;
word-break: break-all;
-webkit-box-orient: vertical;
-webkit-line-clamp: 4; //需要显示的行数
overflow: hidden;
text-overflow: ellipsis;
}