CSS CORE2

____________________________________________________________________________________

动画:使得元素从一种样式逐渐变化为另一种样式(多个样式之间的平缓变化的过程)

过渡:属性的一个值到另外一个值的变换,简单的动画

动画可以通过 "关键帧" 控制动画的每一步,可以使元素从 "一种样式" 逐渐变化为另一种 "样式"

注意:动画操作有浏览器兼容性

         -moz-    -webkit-    -o-    -ms-

         元素必须是行内块元素或块级元素

使用动画步骤:① 声明动画:指定动画名称以及创建动画中的每个状态(关键帧)

                      ② 为元素调用动画:指定调用的动画名称,时长,播放次数…

1、声明动画:为动画指定名称及定义关键帧

    关键帧:当前元素状态的时间点及样式,由动作(样式)和时间组成

@keyframes  动画名称{                 /*动画名称不可使用关键字*/

  0% / from{ 动画开始时的样式 }        /*声明关键帧*/

  ……

  50%{动画执行到一半的时候的样式}       ...

  ……

  100% / to{ 动画结束时的样式 }        ...

}

使用:animation:动画名 .8s linear infinite

两段时间设置相同的帧,可以使之停顿一段时间

注意:尽量用 %,而不用 from...to(Android2.3的需要以0%开始,以100%结束)

浏览器兼容性:

@-moz-keyframes  动画名称{}

@-ms-keyframes  动画名称{}

@-o-keyframes  动画名称{}

@-webkit-keyframes  动画名称{

  0% / from{ 动画开始时的样式 }

  ...

  100% / to{ 动画结束时的样式 }

}

@keyframes  动画名称{}

使用:

-moz-animation:动画名称 .8s linear infinite;

-ms-animation:动画名称 .8s linear infinite;

-o-animation:动画名称 .8s linear infinite;

-webkit-animation:动画名称 .8s linear infinite;

animation:动画名称 .8s linear infinite;

注意: 动画名称建议使用2个单词,否则易出错

2、为元素调用动画

① 作用:指定调用的动画名称

    属性:animation-name:

             -webkit-animation-name:

② 作用:动画完成一个周期的执行时长

    属性:animation-duration:

    取值:s / ms

③ 作用:指定动画执行的速率

    属性:animation-timing-function:

    取值:ease,linear,ease-in,ease-out,ease-in-out

④ 作用:指定动画播放之前的延迟时长

    属性:animation-delay:

    取值:s / ms

    注意:当播放多次时,延迟只是指播放之前的一次延迟,下次播放不再延迟

⑤ 作用:指定动画的播放次数

    属性:animation-iteration-count:

    取值:1、具体数字

              2、关键字:infinite(无限次播放)

⑥ 作用:指定动画播放方向

    属性:animation-direction

    取值:1、normal       默认值,正向播放:0% ~ 100%

              2、reverse      逆向播放:100% ~ 0%

              3、alternate    轮流播放,奇数次时,正向播放;偶数次时,逆向播放(大于1时才有效)

⑦ 缩写:animation   下面的⑧、⑨不能简写

animation:name(必给)  duration(必给)  timing-function    delay    iteration-count    direction;

⑧ animation-fill-mode

    作用:指定动画在播放前或播放后的填充状态

    取值:1、none           不改变默认行为

             2、forwards      动画完成后,状态将保持在最后一帧状态上

             3、backwards    动画在播放前(延迟时间内)状态显示在第一帧上(只有在延迟(delay)时间内才会显示效果)

             4、both            播放前后,分别放在第一帧和最后一帧上

⑨ animation-play-state

    作用:指定动画的播放状态(运行还是暂停)

    取值:1、paused     动画暂停

              2、running    动画播放

动画声明在激发操作的属性中,网页加载完后动画运行;动画声明在声明属性中,网页加载时就开始运行

加载中动画:

.loading{

  white-space: nowrap;

  width: 60%;

  height: 50px;

  margin: 2rem auto 0;

  text-align: center;

  display: flex;

  align-items: center;

  justify-content: center;

}

.loading>div{

  width: 20px;

  height: 20px;

  border-radius: 50%;

  border: 2px solid #666;

  border-bottom-color: transparent;

  margin-right: 10%;

  -webkit-animation: loadding .8s linear infinite;

  animation: loadding .8s linear infinite;

}

@-webkit-keyframes loadding{

  0%{ -webkit-transform:rotate(0deg); transform:rotate(0deg) }

  50%{ -webkit-transform:rotate(180deg); transform:rotate(180deg) }

  100%{ -webkit-transform:rotate(360deg); transform:rotate(360deg) }

}

@keyframes loadding{

  0%{ -webkit-transform:rotate(0deg); transform:rotate(0deg)}

  50%{ -webkit-transform:rotate(180deg); transform:rotate(180deg)}

  100%{ -webkit-transform:rotate(360deg); transform:rotate(360deg)}

}

js动画和css3动画的差异性:

① 功能涵盖面,js比css大

② 实现/重构难度不一,css3比js更简单,性能调优方向固定

③ 对帧速表现不好的低版本浏览器,css3可以做到自然降级

④ css动画有天然事件支持

⑤ css3有兼容性问题

进阶********************************************************************************

Web动画性能比较:GPU硬件加速css动画 > 非硬件加速css动画 > JavaScript动画

现代浏览器在完成以下4种属性的动画时,消耗成本较低:

① position:transform: translate(Xpx, Ypx)

② scale:    transform: scale(value)

③ rotation:transform: rotate(*deg)

④ opacity: transform: 0 ... 1

开启GPU加速:

div{

  will-change: transform;

  transform: translateZ(0);    /*Safari和一些旧浏览器无法识别will-change,做的兼容性*/

}

会使声明了该样式属性的元素生成一个图形层,相当于提前告诉浏览器将会进行transform变换,让浏览器提前做好准备

但是也不要将其应用在太多的元素上,过度使用会导致页面响应缓慢或者消耗非常多的资源

_______________________________________________________________________________________

CSS3 Filter 改变模糊度、亮度、透明度...

CSS3 Filter (滤镜)属性提供了模糊和改变元素颜色的功能,常用于调整图像的渲染、背景、边框的显示效果

-webkit-filter 是css3的一个属性,Webkit率先支持了这几个功能,效果很不错

现在规范中支持的效果有:

①  blur            模糊         值为length

②  brightness   亮度         值为0-1之间的小数

③  contrast      对比度      值为num

④  grayscale     灰度        值为0-1之间的小数

⑤  hue-rotate   色相旋转  值为angle

⑥  invert          反色        值为0-1之间的小数

⑦  opacity        透明度     值为0-1之间的小数

⑧  saturate       饱和度     值为num

⑨  sepia           褐色        值为0-1之间的小数

⑩  drop-shadow  阴影

无效果    -webkit-filter: none;

①  模糊

-webkit-filter: blur(9px);

filter: blur(9px);

②  亮度

-webkit-filter: brightness(2.3);

filter: brightness(2.3);

③  对比度

-webkit-filter: contrast(4.4);

filter: contrast(4.4);

④  灰度

-webkit-filter: grayscale(1);

filter: grayscale(1);

⑤  色相旋转

-webkit-filter: hue-rotate(185deg);

filter: hue-rotate(185deg);

⑥  反色

-webkit-filter: invert(1);

filter: invert(1);

⑦  透明度

-webkit-filter: opacity(55%);

filter: opacity(55%);

⑧  饱和度

-webkit-filter: saturate(3.6);

filter: saturate(3.6);

⑨  褐色

-webkit-filter: sepia(0.77);

filter: sepia(0.77);

⑩  阴影

-webkit-filter: drop-shadow(0px 0px 5px #000);

filter: drop-shadow(0px 0px 5px #000);

____________________________________________________________________________________

在CSS3中,background-clip属性规定背景的绘制区域

它的值有3个:

border-box      背景绘制在边框方框内(border上),裁切成边框方框(默认值),最大

padding-box    背景绘制在衬距方框内(padding上),剪切成衬距方框

content-box     背景绘制在内容方框内(padding内),剪切成内容方框,最小

____________________________________________________________________________________

用户可否选中

属性:-ms-user-select   -moz-user-select   -o-user-select    -webkit-user-select   user-select

取值:① text      可以选择文本(默认值)

         ②none   文本不能被选择

         ③ all        当所有内容作为一个整体时可以被选择。如果双击或者在上下文上点击子元素,那么被选择的部分将是以该子元素向上回溯的最高祖先元素

         ④ element   可以选取文本,但选择范围受元素边界的约束

是否阻止元素成为鼠标事件目标

属性:pointer-events

取值:auto     默认,不阻止

         none    元素永远不会成为鼠标事件的target,但是,当其后代元素的pointer-events属性指定其它值时,鼠标事件可以指向其后代元素,此时,鼠标事件将在捕获/冒泡阶段触发父元素的事件监听器

_______________________________________________________________________________________

input[type=text]::-ms-clear,

input[type=tel]::-ms-clear,

input[type=number]::-ms-clear{

  display:none;                           //禁用PC端表单输入框默认清除按钮

}

____________________________________________________________________________________

resize  指定一个元素是否允许用户调整大小

取值:① none        用户无法调整元素的尺寸

         ② both         用户可调整元素的高度和宽度

         ③ horizontal 用户可调整元素的宽度

         ④ vertical     用户可调整元素的高度

注意:只有当溢出值(overflow)不为visible时才生效

____________________________________________________________________________________

text-overflow属性,规定当文本溢出包含元素时发生的事情

取值:① clip       修剪文本

         ② ellipsis    显示省略符号来代表被修剪的文本

         ③ string     使用给定的字符串来代表被修剪的文本

条件:

① 设置overflow:hidden

② 不能设置为display:inline-flex或flex

③ 强制文本在一行内显示(white-space:nowrap)

溢出显示省略号,当手指按住元素时显示全部文本

div{

  white-space:nowrap;

  text-overflow:ellipsis;

  overflow:hidden;

}

div:active{

  text-overflow:inherit;

  overflow:visible;

}

____________________________________________________________________________________

calc()    用于动态计算

注意:运算符前后各需要保留一个空格,例如:width: calc(100% - 10px)

使用:①任何长度值都可以使用calc()函数进行计算

         ② calc()函数支持 + - * /

         ③ calc()函数使用标准的数学运算优先级规则

兼容性:

-moz-calc(...);           /*Firefox*/

-webkit-calc(...);        /*chrome safari*/

calc();

$("div").css('width', 'calc(100% - 20px)');        //在jQuery中使用calc,运算符两边需要加空格

____________________________________________________________________________________

-webkit-font-smoothing    字体抗锯齿属性

对字体进行抗锯齿渲染可以使字体看起来会更清晰舒服

font-smoothing是非标准的CSS定义,它被列入标准规范的草案中,后由于某些原因从web标准中被移除了,

但可以用以下两种定义进行抗锯齿渲染

-moz-osx-font-smoothing:grayscale;        /*firefox*/

-webkit-font-smoothing:antialiased;         /*chrome、safari*/

它有三个属性值

none                         对低像素的文本比较好

subpixel-antialiased    默认值

antialiased                 抗锯齿很好

____________________________________________________________________________________

修改 overflow:auto 产生的滚动条

::-webkit-scrollbar{        /*滚动条整体*/

  width: 0;

  height: 0;

}

::-webkit-scrollbar-track{        /*滚动条的滑轨*/

  background-color: transparent;

  opacity: 0;

}

::-webkit-scrollbar-thumb{        /*滚动条的滑块*/

  background-color: transparent;

  opacity: 0;

}

::-webkit-scrollbar-button{        /*滚动条轨道两头的按钮*/

  background-color: transparent;

  opacity: 0;

}

::-webkit-scrollbar-track-piece{        /*内层轨道*/

  background-color: transparent;

  opacity: 0;

}

::-webkit-scrollbar-corner{        /*横向滚动条和纵向滚动条相交处的尖角*/

  background-color: transparent;

  opacity: 0;

}

::-webkit-resizer{        /*两个滚动条的交汇处用于调整元素大小的控件*/

  background-color: transparent;

  opacity: 0;

}

隐藏浏览器自带的滚动条:

父元素设置overflow:hidden,高为100vh,滚动元素大于父元素的width,并设置overflow:auto

section{ width:100%; height:100vh;overflow:hidden; }            /*父元素*/

section>div{ width:200%; height:100%; overflow:auto; }        /*滚动元素*/

section>div>div{ width:50%; }                                             /*存放内容的元素*/

_______________________________________________________________________________________

网格布局(Grid)

创建网格布局: ① display: grid;

                     ② display: inline-grid;

属性:

① 定义轨道宽高:

grid-template-rows: 50px 100px;    定义2个行轨道(可以是任何非负的长度值: px、%、rem等)

grid-template-columns: 90px 50px 120px;    定义3个列轨道

grid-template-columns: 1fr 1fr 2fr;              定义轨道尺寸配额,表示按配额比例分配可用空间

grid-template-columns: 3rem 25% 1fr 2fr;   fr和其它长度单位混合使用时,fr的计算基于其它单位分配后剩余的空间

grid-template-columns: minmax(auto, 50%) 1fr 3rem;   minmax()接收2个参数(第1个最小,第2个最大)

grid-template-columns: repeat(3, 1fr) 10px;   repeat()接收2个参数(第1个是重复次数,第2个轨道尺寸)

② 定义网格间隙:

grid-column-gap: 20px;    定义网格间隙(只创建在行列之间,项目与边界之间无间隙)

grid-row-gap: 5rem;

简写: grid-gap: 100px 1rem;    若只有一个值,其即表示行间隙,也表示列间隙

③ 用网格线编号定位项目:

grid-row-start:2; grid-row-end:3; grid-column-start:2; grid-column-end:3;    编号从1开始,以1为步长

简写: grid-row:2; grid-column:3/4;    若只指定一个值,则只表示开始,两个值用 / 分隔

简写: grid-area: 2/2/3/3;  分别是grid-row-start、grid-column-start、grid-row-end、grid-column-end的简写

④ 网格项目跨越行列:

网格项目默认占用一行和一列,但可以定位项目的属性来指定项目跨越多行或多列:

grid-column-start:1; grid-column-end:4;    网格项目跨越多列

grid-row:2/span 3; grid-column:span 2;    关键字span可以用来指定跨越行或列的数量

⑤ 层叠网格项目:

通过项目定位可以使多个项目层叠在一起,属性z-index可以改变层叠项目的层次

例: .item-1, .item-2{ grid-row-start:1; grid-column-end:span 2; }

     .item-1{ grid-column-start:1;z-index:1; }    .item-2{ grid-column-start:2; }

⑥ 网格项目的对齐方式:

justify-items和justify-self以行轴为参照对齐项目

align-items和align-self    以列轴为参照对齐项目

支持的值:

1、aoto

2、normal

3、start            在轴线起点处对齐

4、end             在轴线的终点处对齐

5、center         在轴线的中心处对齐

6、stretch        在轴线的方向延伸并填满整个区域

7、baseline

8、first baseline

9、last baseline

⑦ 网格轨道的对齐方式:

align-content    定义网格轨道延着行的轴线的对齐方式

justify-content  定义网格轨道延着列的轴线的对齐方式

1、normal

2、start

3、end

4、center

5、stretch

6、space-around      在每一列的两侧平均分配额外空间

7、space-between    在列与列之间平均分配额外的空间

8、space-evenly       在列与列之间及列与边界之间平均分配额外空间

9、baseline

10、first baseline

11、last baseline

_______________________________________________________________________________________

自定义属性:

a{ --focus-color1:blue; }                                   /*自定义变量focus-color,设定颜色值、应用元素*/

:root{ --focus-color2:yellow; }                           /*定义在:root伪类中,全局可用*/

a:hover{ --focus-color1:red; }                           /*hover时修改自定义的值*/

a{ background-color: var(--focus-color1); }        /*应用此自定义变量*/

a{ background-color: var(--focus-color2, #333) }    /*设置回退值#333,自定义属性无效或未设置时使用*/

注意:自定义属性区分大小写

使用js操作css自定义属性:

var elem = document.querySelector('a');

var cssStyle = getComputedStyle( elem );        //获取a标签的样式

var cssVal = String( cssStyle.getPropertyValue('--focus-color1') ).trim();    //获取css自定义属性的值

elem.style.setProperty('--focus-color1', '#999');        //修改css自定义属性

_______________________________________________________________________________________

display: contents  该元素会导致自身的盒子不生成,但所有的子元素照常生成(对于选择器没有影响),可用于弹性布局或网格布局的非直接子元素能应用这些布局

position: sticky粘性定位,让元素在页面滚动时不脱离文档流,如同在正常流中,但当其滚动到相对于视口的某个特定位置(阈值)时,会固定在屏幕上,如同fixed一样。但兼容性差,在不兼容的浏览器中会被忽略并退到设置的滚动方式(或relative)

例: {position:-webkit-sticky; position:sticky; top:0; left:0; right:0;}  此阈值为top=0

注意:

① 必须指定top,left,right,bottom四个阈值中的一个,才可使粘性定位生效

② 必须设置(或默认)  body{ overflow:visible; }

_______________________________________________________________________________________

css3混合模式:

mix-blend-mode: difference;    将文本的颜色与背景颜色互换

mix-blend-mode 定义元素与背景的混合模式,可以是元素与背景图片的混合,也可以是元素与背景色的混合

background-blend-mode  定义背景的混合模式,可以是背景图片与背景图片的混合,也可以是背景图片与背景色的混合

_______________________________________________________________________________________

clip-path 裁剪路径

clip-path: none;    不使用裁剪路径

clip-path: circle(50px at 50px 50px);  在元素的(50px, 50px)处,裁剪生成一个半径为50px的圆

clip-path: polygon(50% 0%, 80% 10%, 100% 35%, 100% 70%, 80% 90%,

                           50% 100%, 20% 90%, 0% 70%, 0% 35%, 20% 10%);    裁剪生成一个十边形

clip-path可以进行transtion过渡与animation动画切换,但进行过渡的两个状态的坐标顶点数量必须一致(但可以使其中n个坐标点重合)

shape-outside 图文混排,只能和float浮动一起使用

取值:

shape-outside:none;

shape-outside:margin-box;

shape-outside:content-box;

shape-outside:border-box;

shape-outside:padding-box;

shape-outside:circle(80px at 80px 80px);    在元素的(80px, 80px)坐标处生成一个80px半径的圆

shape-outside:ellipse();

shape-outside:inset(10px 10px 10px 10px);

shape-outside:polygon(10px 10px, 20px 20px, 30px 30px);

_______________________________________________________________________________________

伪类选择器 :focus-within

表示一个元素或该元素的后代获得焦点,都会触发 :focus-within,类似于js的冒泡

兼容性: 只有最新版浏览器支持该属性

writing-mode 改变排版规则

语法:

-ms-writing-mode: lr-tb;

writing-mode: horizontal-tb;    默认值,文本流按水平方向排列

-ms-writing-mode: tb-rl;

writing-mode: vertical-rl;        文本按垂直方向排列,阅读顺序从右向左

-ms-writing-mode: tb-lr;

writing-mode: vertical-lr;        文本按垂直方向排列,阅读顺序从左到右

注意:可设置margin:auto;用于水平方向垂直居中

         除中文外,英文、数字、字体符号会自动旋转90°

_______________________________________________________________________________________

css mask可以让蒙版区域透过去,不透明区域保留出来

用法与background基本一致

如:

img{

  -webkit-mask-image: url(图片地址);

  mask-image: url(图片地址);        图片支持svg、png、gif等

}

@supports not (mask-size: cover){

  不支持mask-image的样式

}

________________________________________________________________________________________________

浏览器平滑滚动

html, body{ scroll-behavior:smooth }    设置平滑滚动

  <a href="#">返回顶部</a>              点击可平滑滚动到顶部

_______________________________________________________________________________________

使div看上去像一个按钮(设置为none可去掉效果)

div{

  -moz-appearance: button;

  -webkit-appearance: button;

  appearance: button;

}

_______________________________________________________________________________________

根据用户设备的分辨率匹配合适的图像

div{

  background-image: image-set( url('test.png') 1x, url('test@2x.png') 2x, url('test@3x.png') 3x );

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容

  • 1 CSS属性 1.1 滤镜 1.1.1 blur属性 1.1.1.1 代码示例 CSS代码: .blur { ...
    Kevin_Junbaozi阅读 717评论 1 4
  • 选择qi:是表达式 标签选择器 类选择器 属性选择器 继承属性: color,font,text-align,li...
    love2013阅读 2,298评论 0 11
  • 各种纯css图标 CSS3可以实现很多漂亮的图形,我收集了32种图形,在下面列出。直接用CSS3画出这些图形,要比...
    剑残阅读 9,349评论 0 8
  • 风动着秋天 长街空灵 空灵着一首老歌 多想 一双大手 把这个瞬间覆盖 童心,乡音,沉沉的谷穗 只是一转身 我与昨天...
    上善若水_cd86阅读 794评论 78 107
  • 1.小程序适不适合餐饮店铺? 首先拿小程序和外卖APP平台来做对比: 第一小程序对比在外卖平台的优势,还是性价比。...
    墨鱼人生阅读 807评论 0 0