效果展示

实现代码
| 12
 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
 86
 
 | <template><div class="page-root">
 <div class="header"></div>
 <div class="content">
 <div class="car-item" v-for="item in 9"></div>
 </div>
 </div>
 </template>
 
 <script setup>
 
 </script>
 
 <style scoped lang="scss">
 // 断点列表
 $breakpoints: (
 's':(
 320px,
 767px
 ),
 'm':(
 768px,
 991px
 ),
 'l':(
 992px,
 1200px
 ),
 'xl':1201px,
 );
 
 // 混合
 @mixin respond-to($name){
 $bp:map-get($breakpoints,$name);
 @if type-of($bp) == "list"{
 $min:nth($bp,1);
 $max:nth($bp,2);
 
 @media (min-width:$min) and (max-width:$max){
 @content;
 }
 }
 @else{
 @media (min-width:$bp){
 @content;
 }
 }
 }
 
 .page-root{
 background-color: #f1f1f1;
 height: 100vh;
 width: 100vw;
 padding: 20px 10%;
 overflow: auto;
 @include respond-to('s'){
 padding: 10px;
 }
 @include respond-to('m'){
 padding: 20px 5%;
 }
 .header{
 height: 60px;
 width: 100%;
 background-color: white;
 }
 .content{
 margin-top: 15px;
 display: grid;
 grid-template-columns: repeat(3,1fr);
 gap: 15px;
 @include respond-to('s'){
 gap: 10px;
 margin-top: 10px;
 grid-template-columns: repeat(1,1fr);
 }
 @include respond-to('m'){
 grid-template-columns: repeat(2,1fr);
 }
 .car-item{
 aspect-ratio: 16/9;
 background-color: white;
 }
 }
 }
 </style>
 
 | 
代码解析
- $breakpoints用作定义一个map,代码中我们定义了不同屏幕的尺寸,如果值是一个数组,也用小括号包裹起来
- map-get($breakpoints,$name)从map中获取指定的value,第一个参数时map,第二个参数是key
- type-of用于判断一个值的类型,如果是数组类型则返回 list
- nth($bp,1)从数组中获取第一项
- @content类似与插槽,在- @include的方法体中编写的样式会被用于这里
基于以上我们就实现了一个通用的媒体查询代码,以后在开发过程中如果需要适配不同的设备,我们只需要使用 @include 为不同大小的设备编写不同的样式即可,不需要每次都去编写重复的媒介查询代码