移动端适配-CSS篇


2019-9-11 css

通过scss或者less等CSS预处理器来设定一些特定函数,来达到适配兼容写法,下面列举一些例子:

base.scss

html {
  font-size: 16px;
}

@media screen and (min-width: 320px) {
  html {
    /* iPhone5 每100像素宽字体增加1px(14px-16px) */
    @include prefixer-value(font-size, calc(87.5% + 2 * (100vw - 320px) / 27.5), webkit moz o ms);
    @include prefixer-value(font-size, calc(14px + 2 * (100vw - 320px) / 27.5), webkit moz o ms);
  }
}

@media screen and (min-width: 375px) {
  html {
    /* iPhone6的375px尺寸作为16px基准,414px正好18px大小, 600 20px */
    @include prefixer-value(font-size, calc(100% + 2 * (100vw - 375px) / 39), webkit moz o ms);
    @include prefixer-value(font-size, calc(16px + 2 * (100vw - 375px) / 39), webkit moz o ms);
  }
}

@media screen and (min-width: 414px) {
  html {
    /* 414px-1000px每100像素宽字体增加1px(18px-22px) */
    @include prefixer-value(font-size, calc(112.5% + 4 * (100vw - 414px) / 586), webkit moz o ms);
    @include prefixer-value(font-size, calc(18px + 4 * (100vw - 414px) / 586), webkit moz o ms);
  }
}

@media screen and (min-width: 600px) {
  html {
    /* 600px-1000px每100像素宽字体增加1px(20px-24px) */
    @include prefixer-value(font-size, calc(125% + 4 * (100vw - 600px) / 400), webkit moz o ms);
    @include prefixer-value(font-size, calc(20px + 4 * (100vw - 600px) / 400), webkit moz o ms);
  }
}

@media screen and (min-width: 1000px) {
  html {
    /* 1000px往后是每100像素0.5px增加 */
    @include prefixer-value(font-size, calc(137.5% + 6 * (100vw - 1000px) / 1000), webkit moz o ms);
    @include prefixer-value(font-size, calc(22px + 6 * (100vw - 1000px) / 1000), webkit moz o ms);
  }
}
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
43

compass.scss

$prefixForWebkit: true !default;
$prefixForMozilla: true !default;
$prefixForMicrosoft: true !default;
$prefixForOpera: true !default;
$prefixNo: true !default;

/* 给属性加浏览器前缀 */
@mixin prefixer($property, $value, $prefixes: o webkit) {
  @each $prefix in $prefixes {
    @if $prefix==webkit and $prefixForWebkit==true {
      -webkit-#{$property}: $value;
    }

    @else if $prefix==moz and $prefixForMozilla==true {
      -moz-#{$property}: $value;
    }

    @else if $prefix==ms and $prefixForMicrosoft==true {
      -ms-#{$property}: $value;
    }

    @else if $prefix==o and $prefixForOpera==true {
      -o-#{$property}: $value;
    }
  }

  @if $prefixNo {
    #{$property}: $value;
  }
}

/* 给属性值加浏览器前缀 */
@mixin prefixer-value($property, $value, $prefixes: webkit moz) {
  @each $prefix in $prefixes {
    @if $prefix==webkit and $prefixForWebkit==true {
      #{$property}: -webkit-#{$value};
    }

    @else if $prefix==moz and $prefixForMozilla==true {
      #{$property}: -moz-#{$value};
    }

    @else if $prefix==o and $prefixForMozilla==true {
      #{$property}: -o-#{$value};
    }

    @else if $prefix==ms and $prefixForMicrosoft==true {
      #{$property}: -ms-#{$value};
    }
  }

  @if $prefixNo {
    #{$property}: $value;
  }
}

/* 给keyframes动画加前缀 */
@mixin prefix-keyframes($animation-name) {
  @keyframes #{$animation-name} {
    @content;
  }

  @-webkit-keyframes #{$animation-name} {
    @content;
  }

  @-moz-keyframes #{$animation-name} {
    @content;
  }

  @-o-keyframes #{$animation-name} {
    @content;
  }

  @-ms-keyframes #{$animation-name} {
    @content;
  }
}

/* px转rem */
@function px2rem($px) {
  $baseFontSize: 16px;

  @return ($px / $baseFontSize)+rem;
}
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85

特别鸣谢:YIXIU;

Thomas: 10/11/2019, 3:49:46 PM