移动开发基础

移动开发学习笔记

作者:王珂
邮箱:49186456@qq.com



前言

本文主要介绍移动端开发所需具备的基础知识和技能,可当作移动端开发的参考和查阅资料。主要介绍视口、移动端开发方案、Flex布局、Rem布局、Less语法等。

一、移动端基础

1.1 基础

浏览器现状

移动端常见浏览器:UC浏览器,QQ浏览器,欧朋浏览器,百度浏览器,360安全浏览器,谷歌浏览器,搜狗手机浏览器,猎豹浏览器,以及其他杂牌浏览器。

国内的UC和QQ,百度等手机浏览器都是根据Webkit修改过来的内核,国内尚无自主研发的内核,就像国内的手机操作系统都是基于Android修改开发的一样。

总结:兼容移动端主流浏览器,处理Webkit内核浏览器即可。

手机平面现状

  • 移动端设备屏幕尺寸非常多,碎片化严重。
  • 安卓(Android)设备有多种分辨率:480x800, 480x854, 540x960, 720x1280, 1080x1920等,还有传说中的2K, 4k屏。
  • 近年来iPhone的碎片化也加剧了,其设备的主要分辨率有:640x960, 640x1136, 750x1334, 1242x2208等。
  • 作为开发者无需关注这些分辨率,因为我们常用的尺寸单位是 px。

常见的移动端平面尺寸

华为

设备尺寸(英寸)开发尺寸(px)物理像素比(dpr)

小米

设备尺寸(英寸)开发尺寸(px)物理像素比(dpr)

Oppo

设备尺寸(英寸)开发尺寸(px)物理像素比(dpr)

Vivo

设备尺寸(英寸)开发尺寸(px)物理像素比(dpr)

荣耀

设备尺寸(英寸)开发尺寸(px)物理像素比(dpr)

iPhone系列

设备尺寸(英寸)开发尺寸(px)物理像素比(dpr)
iPhone3G

1.2 视口

视口(viewport)就是浏览器显示页面内容的平面区域。视口分为布局视口、视觉视口和理想视口。

1.2.1 布局视口

Layout viewport 布局视口:

  • 一般移动设备的浏览器都默认设置了一个布局视口,用于解决早期PC端页面在手机上的问题。

  • IOS、Android基本上都将这个视口的分辨率设置微980px,所以PC上的网页大多数都能在手机上呈现,只不过元素看上去很小,一般默认可以通过手动缩放网页。
    视口

1.2.2 视觉视口

Visual Viewport 视觉视口,是用户可以看到的网站区域。可以通过缩放操作视觉视口,单不会影响布局视口,布局视口任保持原有的宽度。
视觉视口

1.2.3 理想视口

  • 为了使网站在移动端有理想的浏览和阅读而设定

  • 需要手动添加meta视口标签通知浏览器操作

  • meta视口的主要目的:布局视口的宽度应该和理想视口的宽度一致。简单理解就是设备有多宽,布局视口就有多宽。

理想视口是乔布斯提出来的

meta视口

<meta name="viewport" content="width=device-width, user-scalabe=no, inital-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"
属性说明
widthviewport的宽度,可以设置device-width的特殊值
inital-scale初始化缩放比例,大于0的数字
maximum-scale最大的缩放比例,大于0的数字
minimum-scale最小的缩放比例,大于0的数字
user-scalable用户是否可以缩放,yes或no(0或1)

1.3 二倍图

1.3.1 物理像素&物理像素比

  • 物理像素是屏幕显示的最小颗粒,是物理存在的。在出厂时厂商已经设置好了,比如:苹果6\7\8是750*1334;

  • PC端页面,1px等于1个物理像素,但是移动端就不尽相同;

  • 我们开发的时候1px不是等于1个物理像素;

  • 1个px能够显示的物理像素点的个数,称为物理像素比或屏幕像素比;

设备尺寸开发尺寸(px)物理像素比(dpr)
iPhone3.5
iPhone3G/3Gs3.5320*4801.0
iPhone4/4s3.5320*4802.0
iPhone5/5s/5c4.0320*5682.0
iPhone64.7375*6672.0
iPhone6s
iPhone6 Plus5.5414*7363.0
iPhone6s Plus2.0
iPhoneSE
iPhone7
iPhone7 Plus
iPhone84.7750*13342.0
iPhone8 Plus5.5
iPhone X5.8
iPhone XR6.1
iPhone XS5.8
iPhone XS Max6.5
iPhone 116.1
iPhone 11 Pro5.8
iPhone 11 Pro Max6.5
iPhone SE(第二代)4.7
iPhone 126.1
iPhone 12 mini5.4
iPhone 12 Pro6.1
iPhone 12 Pro Max6.7
iPhone 136.1
iPhone 13 mini5.4
iPhone 13 Pro6.1
iPhone 13 Pro Max6.7
iPhone SE(第三代)4.7
iPhone 146.1
iPhone 14 Plus6.7
iPhone 14 Pro6.1
iPhone 14 Pro Max6.7
iPhone 156.12556*1179
iPhone 15 Plus6.72796*1290
iPhone 15 Pro6.12556*1179
iPhone 15 Pro Max6.72796*1290

Retina(视网膜屏幕)是一种显示技术,可以将更多的物理像素点压缩至一块屏幕里,从而达到更高的分辨率,并提高屏幕显示的细腻程度。
视网膜屏幕

1.3.2 多倍图

  • 对于一张50px*50px的图片,在手机Retina屏中打开,按照物理像素比会放大倍数,这样会造成图片模糊;

  • 在标准viewport设置中,使用倍图来提高图片质量,解决在高清设备中的模糊问题;

  • 通常使用二倍图,因为iPhone6\7\8的影响,但是现在还存在三倍、四倍图的情况,这个看时间开发需求;

  • 北京图片注意缩放问题;

示例:当需要一个50x50像素(CSS像素)的图片,直接放到iPhone8里面会放大2倍称为100x100,此时会显示模糊。采取的策略是,放一张100*100像素的图片,然后把这个图片缩小为50x50。这种方式就是2倍图。

/* 图片为 100*100 */
img {
    width: 50px;
    height: 50px;
}

背景图片也是可以缩放的

/*
  1.如果只写一个参数,则是图片的宽度,高度会等比例缩放。
  2.里面的单位可以跟%,是相对于父盒子来说的。
*/
background-size: 图片的宽度 图片的高度;

单位:长度|百分比IcoverIcontain;
cover:把背景图像宽度高度等比例放大,以使背景图像完全覆盖背景区域。例如:将图片进行发大,如果宽度到了,但是高度未到,会一直放大直至高度到达。

contain:把背景图像宽度高度等比例放大,以使其宽度和高度完全适应内容区域。例如图片进行放大,如果宽度到了,就停止放大,尽管高度尚未到达。反之亦然。

精灵图二倍图

1)background-size将精灵图的宽度缩放为原来的一半;

2)在firework里面进行测量时,先把精灵图等比例缩放为原来的一半再测量;

二、移动端开发

2.1 移动端主流方案

单独制作移动端页面(主流)

京东商城手机版

淘宝触屏版

苏宁易购手机版

通常,网站域名前面加m(mobile)可以打开移动端。通过判断设备,如果是移动设备打开,则跳转到移动端页面。
移动网站
响应式页面兼容移动端(其次)

缺点:制作麻烦,需要花很大精力去调兼容性问题。

三星手机官网

2.2 移动端解决方案

CSS初始化normalize.css

移动端CSS初始化推荐使用normalize.css

官网:

http://necolas.github.io/normalize.css/

Normalize.css: 保护了有价值的默认值

Normalize.css: 修复了浏览器的bug
Normalize.css: 是模块化的
Normalize.css: 拥有详细的文档

特殊样式

/*CSS3盒子模型*/
box-sizing: border-box;
-webkit-box-sizing: border-box;
/*点击高亮我们需要清除 设置为transparent完成透明*/
-webkit-tap-highlight-color: transparent;
/*在移动端浏览器默认的外观在ios上加上这个属性才能给按钮和输入框自定义样式*/
webkit-appearance: none;
/*禁用长按页面时的弹出菜单*/
img,a { -webkit-touch-callout:none;}

2.3 移动端常见布局

  • 单独制作移动端页面

    1)流式布局(百分比布局)

     京东
    

    2)flex弹性布局(强烈推荐)

     携程网
    

    3)less+rem+媒体查询布局

     苏宁
    

    4)混合布局

  • 响应式页面兼容移动端

    1)媒体查询

    2)bootstrap

2.3.1 流式布局(百分比布局)

  • 流式布局,就是百分比布局,也称非固定像素布局。

  • 将盒子的宽度设置成百分比,根据屏幕的宽度来进行自动伸缩,不受固定像素的限制,内容向两侧填充。

  • 流式布局方式是移动web开发使用的比较常见的布局方式。

  • max-width 最大宽度(max-height 最大高度)

  • min-width 最小宽度(min-height 最小高度)

三、Flex布局

Flexible Box意为”弹性布局“,用来为盒装模型提供最大的灵活性,任何一个容器都可以指定为flex布局。

采用Flex布局的元素称为Flex容器(Flex container),它的所有子元素自动成为容器成员,称为Flex项目(Flex Item)。

Flex布局原理

通过给父盒子添加flex属性,来控制子盒子的位置和排列方式。

Flex布局注意点

  • 当给父盒子设置了flex布局之后,子元素的float, clear和vertical-align属性将生效。

  • 伸缩布局 = 弹性布局 = 伸缩合布局 = 弹性盒布局 = flex布局。

传统布局与Flex布局对比

传统布局Flex布局
兼容性好操作方便,布局简单,移动端应用广泛
布局繁琐PC端浏览器支撑情况较差
局限性,不能在移动端很好的布局IE11或更低版本,不支持或仅部分支持

建议:如果是PC端页面布局,还是用传统布局;如果是移动端或不考虑兼容性的PC端页面布局,建议使用flex弹性布局。

3.1 Flex布局属性

3.1.1 父项属性

1)flex-direction: 主轴方向

  • 主轴和侧轴

    在flex布局中,分为主轴和侧轴两个方向(或称:行、列;x轴、y轴)。

    默认主轴方向是x轴方向,水平向右默认侧轴方向是y轴方向,垂直向下
    在这里插入图片描述
    属性值

    属性值说明
    row默认从左到右
    row-reverse从右到左
    column从上到下
    column-reverse从小到上

2)justify-content: 主轴上子元素的排列方式

  • 主轴上子元素对齐方式

    属性值说明
    flex-start默认从头开始,如果主轴是x轴,则从做到右
    flex-end从尾部开始排列
    center在主轴居中对齐(如果主轴)
    space-around平分剩余空间
    space-between先两边贴边,再平分剩余空间

3)flex-wrap: 子元素是否换行

 默认情况下,项目都排列在主轴上。flex布局中默认是不换行的,当主轴上排列不下时,会缩小项目的宽度。

 nowrap: 不换行,默认值

 wrap: 换行

4)align-items: 设置侧轴上子元素的排列方式(单行)

  • 该属性是控制子项在侧轴(默认是y轴)上的排列方式。在子项为单项的时候使用

    属性值说明
    flex-start从上到下
    flex-end从下到上
    center垂直居中(挤在一起居中)
    stretch拉伸(注意:此时子项目不要设置高考,否则不起作用)

5)align-content: 设置侧轴上子元素的排列方式(多行)

  • 设置子项在侧轴上的排列方式,并且只能用于子项出现换行的情况(多行),在单行下没有效果。

    属性值说明
    flex-start默认值在侧轴头部开始排列
    flex-end在侧轴尾部开始排列
    center在侧轴中间显示
    space-around子项在侧轴平分剩余位置
    space-between子项在侧轴先分布在两头,再平分剩余空间
    strech设置子项高度平分父元素高度

6)flex-flow: 复合属性,相当于设置了flex-direction和flex-wrap

 flex-flow属性是flex-direction和flex-wrap属性的符合属性。

示例:flex-flow: column wrap;

3.1.2 子项属性

1)flex属性:子项占的份数

 flex属性定义子项目分配剩余空间,用flex来表示占多少份数

 flex: <number>; /* default 0 */

  flex: 1 /* 表示占1份 */

 flex: 20% /*表示占1/5*/

2)align-self控制子项自己在侧轴上的排列方式

 align-self控制子项自己在侧轴上的排列方式,允许单个项目有与其他项目不一样的对齐方式,可覆盖align-items属性。默认值:auto,表示继承父元素的align-items属性,如果没有父元素,则等同于stretch。
span:nth-child(2) {
    /* 设置自己在侧轴上的排列方式 */
    align-self: flex-end;
}

3)order子项的排列顺序(前后顺序)

数值越小,排列越靠前,默认为0。

注意:和z-index不一样。

div:nth-child(2) {
    order: -1;
}

四、Rem适配布局

4.1 Rem基础

Rem单位

rem(root em)是一个相对单位,类似em,em是父元素字体单位。

不同的是rem的基准是相对于html元素的字体大小。

比如:根元素html设置的 font-size=12px; 非根元素设置 width: 2rem; 则换成px就是24px;

Em单位

em单位是相对于父元素的字体大小来说的。

优点

rem的优点是可以通过改变html中文字的大小来改变页面中元素的大小。

4.2 媒体查询

什么是媒体查询

媒体查询(Media Query)是CSS3的新语法。

  • 使用@media查询,可以针对不同的媒体类型定义不同的样式;

  • 使用@media查询,可以针对不同的屏幕尺寸设置不同的样式;

  • 当你重置浏览器大小的过程中,页面也会根据浏览器的宽度和高度重新渲染页面;

  • 目前针对苹果手机、安卓手机、平板等设备都用到媒体查询;

媒体查询语法

@media mediatype and|not|only(media feature) {
    ...
}
  • 用@media开头声明媒体查询

  • mediatype 媒体类型

    将不同的终端设备划分成不同的类型,称为媒体类型

    解释说明
    all用于所有设备
    print用于打印机和打印预览
    screen用于电脑屏幕、平板电脑、智能手机等
  • 关键字and not only

    将媒体类型或多个媒体特性连接到一起做媒体查询的条件。

    and: 将多个媒体特性连接到一起,相当于"且"的意思

    not: 排除某个媒体类型,相当于"非"的意思,可以省略

    only: 指定某个特定的媒体类型,可以省略

  • media feature 媒体特性,必须有小括号包含

    每种媒体类型都具有各自不同的特性,根据不同的媒体类型的媒体特性设置不同的展示风格。暂时了解三个:

    解释说明
    width定义输出设备中页面可见区域的宽度
    min-width定义输出设备中页面最小可见区域的宽度
    max-width定义输出设备中页面最大可见区域的宽度

示例:根据不同的屏幕尺寸设置样式

/* 在屏幕上 并且 最大的宽度是 800px,设置需要的样式 */
/* max-width: 800px 是<= 800px */
/* 根据不同的屏幕尺寸设置样式 */
@media screen and (max-width: 800px) {
    body {
        background-color: pink;
    }
}

引入资源

当样式比较繁多的时候,我们可以针对不同的媒体使用不同stylesheets(样式表)。

原理:就是直接在link中判断设备的尺寸,然后引用不同的css文件。

语法1:

<link rel="stylesheet" media="mediatype and|not|only (media feature)" href="stylesheet.css">

示例:当我们屏幕大于等于 640px以上的,我们让div 一行显示2个;当我们屏幕小于640 我们让div一行显示一个。(建议: 我们媒体查询最好的方法是从小到大)

<link rel="stylesheet" href="style320.css" media="screen and (min-width: 320px)">
<link rel="stylesheet" href="style640.css" media="screen and (min-width: 648px)">

4.3 Rem适配方案

1)让一些不能等比自适应的元素,达到当设备尺寸发生改变的时候,等比例适配当前设备。
2)使用媒体查询根据不同设备按比例设置html的字体大小然后页面元素使用rem做尺寸单位,当html字体大小变化元素尺寸也会发生变化,从而达到等比缩放的适配。

实际开发设计方案

1)按照设计稿与设备宽度的比例,动态计算并设置html根标签的 font-size 值(媒体查询);
2)CSS中,设计稿元素的宽、高、相对位置等取值,按照同等比例换算为rem 为单位的值;

技术方案

  • 技术方案1

    less,媒体查询,rem

  • 技术方案2(推荐)

    flexible.js, rem

目前两种方案都存在,方案2更为简单。

4.3.1 Rem适配方案1

rem + 媒体查询 + less

常见设计稿尺寸宽度

设备常见宽度
iPhone4, 5640px
iPhone6, 7, 8750px
Android320px, 360px, 375px, 384px, 400px, 414px, 500px, 720px(大部分4.7~5寸的安卓设备为720px)

一般情况下,我们以一套或两套效果图适应大部分的屏幕,放弃极端屏或对其优雅降级,牺牲一些效果,现在基本以750为准。

动态设置html的font-size

1)假设设计稿是750px;
2)假设我们把整个屏幕划分为15等份(划分标准不一,可以是10等份也可以是20等份);
3)每一份作为html字体大小,这里就是750/15=50px;
4)那么在320px设备的时候,字体大小为320/15=21.33px;
5)用我们页面元素的大小 除以 不同的 html 字体大小会发现他们比例还是相同的;
6)比如我们以750为标准设计稿;
7)一个100 * 100像素的页面元素在750屏幕下,就是100/50,转换为rem是:2rem * 2rem,比例是 1比1;
8)320屏幕下,html字体大小为21.33,则2rem=42.66px 此时宽和高都是 42.66。但是 宽和高的比例还是 1比1;
9)但是已经能实现不同屏幕下 页面元素盒子等比例缩放的效果;

/* 将页面分为15等份 */
@media screen and (min-width: 320px) {
    html {
        font-size: 21.33px; /* 320px/15=21.33 */
    }
}
@media screen and (min-width: 750px) {
    html {
        font-size: 50px; /* 750px/15=50px */
    }
}

/* 一个100px * 100px 的div,换算成rem, 100 / 50 = 2rem */
div {
    width: 2rem;
    height: 2rem;
}

元素取值的方法

1)最后的公式:页面元素的rem值 = 页面元素值(px) / (屏幕宽度/划分的份数)

2)屏幕宽度/划分的份数就是html的font-size的值

3)页面元素rem值:页面元素值(px)/html的font-size的值

步骤

1)首先,我们选一套标准尺寸,750为准

2)用屏幕尺寸 / 划分的分数 得到 html的font-size值

3)用元素rem值 = 页面元素的px值 / html的font-size值

common.less

1)新建common.less 设置好最常见的屏幕尺寸,利用媒体査询设置不同的html字体大小,因为除了首页其他页面也需要;
2)我们关心的尺寸有320px、360px、375px、384px、400px、414px、424px、480px、540px、720px、750px;
3)划分的份数我们定为15等份;
4)因为我们pc端也可以打开我们苏宁移动端首页,我们默认html字体大小设置为50px,注意这句话写到最上面;

// 如果在PC端打开,直接设置字体大小50px(一定要写在最上面)
html {
    font-size: 50px;
}

// 屏幕划分的等份
@number: 15;

// 屏幕尺寸为320px
@media screen and (min-width: 320px) {
    html {
        font-size: (320px / @number);
    }
}

// 屏幕尺寸为360px
@media screen and (min-width: 360px) {
    html {
        font-size: (360px / @number);
    }
}

// 屏幕尺寸为375px
@media screen and (min-width: 375px) {
    html {
        font-size: (375px / @number);
    }
}

// 屏幕尺寸为384px
@media screen and (min-width: 384px) {
    html {
        font-size: (384px / @number);
    }
}

// 屏幕尺寸为400px
@media screen and (min-width: 400px) {
    html {
        font-size: (400px / @number);
    }
}

// 屏幕尺寸为414px
@media screen and (min-width: 414px) {
    html {
        font-size: (414px / @number);
    }
}

// 屏幕尺寸为424px
@media screen and (min-width: 424px) {
    html {
        font-size: (424px / @number);
    }
}

// 屏幕尺寸为480px
@media screen and (min-width: 480px) {
    html {
        font-size: (480px / @number);
    }
}

// 屏幕尺寸为540px
@media screen and (min-width: 540px) {
    html {
        font-size: (540px / @number);
    }
}

// 屏幕尺寸为720px
@media screen and (min-width: 720px) {
    html {
        font-size: (720px / @number);
    }
}

// 屏幕尺寸为750px
@media screen and (min-width: 750px) {
    html {
        font-size: (750px / @number);
    }
}

4.3.2 Rem适配方案2

简介高效的rem适配方案flexible.js

技术方案(推荐)

rem + flexible.js

flexible

手机淘宝团队出的简洁高效的移动端适配库,再也不需要写不同屏幕的媒体查询(flexible库已经做了处理)。

原理是把当前设备划分为10等份,但是不同设备下,比例还是一致的。我们要做的就是确定好我们当前设备的htm文字大小就可以了。比如当前设计稿是750px,那么我们只需要把html文字大小设置为75px(750px/10)就可以,里面页面元素rem值:页面元素的px值 / 75剩余的,让flexible.js来计算。

github地址

https://github.com/amfe/lib-flexible

五、Less语法

CSS的弊端

CSS 是一门非程序式语言,没有变量、函数、SCOPE(作用域)等概念。

  • CSS 需要书写大量看似没有逻辑的代码,CSS冗余度是比较高的;

  • 不方便维护及扩展,不利于复用;

  • CSS 没有很好的计算能力;

  • 非前端开发工程师会因为缺少CSS编写经验而很难写出组织良好且易于维护的CSS代码;

Less介绍

Less(Leaner Style Sheet)是一门CSS扩展语言,也称为CSS预处理器。

做为 CSS 的一种形式的扩展,它并没有减少CSS的功能,而是在现有的 CSS语法上,为CSS加入程序式语言的特性。
它在 CSS 的语法基础之上,引入了变量,Mixin(混入),运算以及函数等功能,大大简化了CSS 的编写并且降低了CSS 的维护成本,就像它的名称所说的那样,Less可以让我们用更少的代码做更多的事情。

Less中文网址

http://lesscss.cn

常见的CSS预处理器:Less、Sass、Stylus

5.1 Less的使用

扩展名.less

5.1.1 变量

语法

@变量名: 值;

变量命名规范

  • 必须有@为前缀

  • 不能包含特殊字符

  • 不能以数字开头

  • 大小写敏感

@width: 10px;
@height: @width + 10px;

#header {
  width: @width;
  height: @height;
}

5.1.2 混入

混入是一种将一组属性从一个规则集中包含(“混合进入”)到另一个规则集中的方法。

5.1.2 编译

本质上,Less包含一套自定义的语法及一个解析器,用户根据这些语法定义自己的样式规则,这些规则最终会通过解析器,编译生成对应的CSS文件。
所以,我们需要把我们的less文件,编译生成为css文件,这样我们的html页面才能使用。

VSCode Less插件:Easy LESS
在这里插入图片描述

5.1.3 嵌套

使用嵌套代替级联,或与级联结合使用。

级联CSS如下:

.header {
  color: black;
}
.header .navigation {
  font-size: 12px;
}
.header .logo {
  width: 300px;
}

修改为嵌套

.header {
  color: black;
  .navigation {
    font-size: 12px;
  }
  .logo {
    width: 300px;
  }
}

伪类(伪元素)选择器的写法

在内层选择器前添加&符号,他就被解析为父元素自身或父元素的伪类。

a {
    /* 伪类 */
    &:hover {
      color: #ccc;  
    }
    /* 为元素 */
    &::before {
       color: #bbb;
    }
}

解析之后

a:hover {
  color: #ccc;
}
a::before {
  color: #bbb;
}

嵌套的@规则和冒泡

诸如 @media@supports 之类的 @ 规则可以与选择器相同的方式嵌套。@ 规则放在最前面,与同一规则集中其他元素的相对顺序保持不变。这称为冒泡。

.component {
  width: 300px;
  @media (min-width: 768px) {
    width: 600px;
    @media  (min-resolution: 192dpi) {
      background-image: url(/img/retina2x.png);
    }
  }
  @media (min-width: 1280px) {
    width: 800px;
  }
}

5.1.4 运算

任何数字、颜色或者变量都可以参与运算。就是Less提供了加(+)、减(-)、乘(*)、除(/)算术运算。

示例:

@width: 10px + 5;
div {
    border: @width solid red;
    width: (@width + 5) * 2;
    background-color: #666 - #222;
}

注意:

  • 乘号(*)和除号(/)的写法;
  • 运算符左右有个空格隔开1px + 5;
  • 对于两个不同的单位的值之间的运算,运算结果的值取第一个值的单位;
  • 如果两个值之间只有一个值有单位,则运算结果就取该单位;

5.1.5 导入

使用@import将一个样式文件导入到另一个样式中。

@import "common"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值