实现移动端和pc端响应式css封装

文章讲述了在前端项目中如何通过scss或less的mixin功能,将媒体查询的断点逻辑进行封装,提高代码可读性和维护性,减少CSS文件中的判断分支。
摘要由CSDN通过智能技术生成

在我们写前端项目时,经常会需要对移动端和pc端进行响应式展示,我们会用到以下的媒体查询进行打断点写样式,如果不进行封装会在css文件里出现大量的判断分支,不容易阅读和维护。

  @media (min-width: 450px) and (max-width: 680px){
  width:680px;
  }

此时可以使用scss或者less等预编译器,将打断点的代码进行封装,封装代码如下

// 屏幕宽度媒体查询打断点的逻辑
$breakpoints: (
  //手机端
  phone: 1360px,
  //平板端
  pad: (1361px, 1600px),
  //pc端
  pc: (1601px, 1660px)
);
// 检查传入的断点名称是否存在于断点映射中
@function check-breakpoint($breakname) {
  // 检查传入的断点名称是否存在于断点映射中
  // 参数:
  // $breakname: 需要检查的断点名称
  // 返回值:
  // 如果断点名称存在,则返回 true,否则抛出错误
  @if map-has-key($breakpoints, $breakname) {
    @return true;
  } @else {
    @error "The breakpoint name #{$breakname} does not exist in the breakpoint map.";
  }
}

@mixin responseTo($breakname) {//使用@mixin混入暴露一个类似js函数一样的函数
  // 根据传入的断点名称应用相应的媒体查询
  // 参数:
  // $breakname: 断点名称
  // 功能:
  // 如果断点名称存在,则根据该断点的值生成媒体查询,可以在媒体查询内部通过 @content 添加样式
  @if check-breakpoint($breakname) {
    $bp: map-get($breakpoints, $breakname);
    @if type-of($bp) == "list" {
      // 如果断点是一个列表,则处理最小宽度和最大宽度
      // 大于等于$breakpoints数组的第一项并且小于等于$breakpoints数组的第二项
      @media (min-width: nth($bp, 1)) and (max-width: nth($bp, 2)) {
        @content;
      }
    } @else {
      // 如果断点不是一个列表,只处理最小宽度
      // 小于等于$breakpoints这个变量
      @media (max-width: $bp) {
        @content;
      }
    }
  }
}

在业务组件里就可以引用这个混入,并进行样式设置,此时我们就可以单独另外写一个style标签,并注意要把这些打断点的代码放到最下面,否则会被覆盖

<style lang="scss" scoped>
// 打断点的逻辑单独写
@import '@/styles/screenWidth.scss'; //屏幕宽度媒体查询打断点的逻辑
@include responseTo(phone) {
  .history-content {
    width: 1320px;
  }
}
@include responseTo(pad) {
  .history-content {
    width: 1540px;
  }
}
@include responseTo(pc) {
  .history-content {
    width: 1620px;
  }
}
</style>

如何理解混入@mixin混入函数
1.直接使用

// 定义一个名为flex的混入
@mixin flex{
  display:flex;
  justify-content:center;
  align-items:center;
}

.header{
  width:100%;
  @include flex;//引用这个混入
}
//转义之后相当于合并这两个css
// .header{
//   width:100%;
// 	 display:flex;
// 	 justify-content:center;
//   align-items:center;
// }

2.传参的形式使用

//如果两个类引用这个混入,但是存在差异如何传参一样的使用混入
@mixin flex ($layout) {
  display:flex;
  justify-content:$layout;
  align-items:$layout;
}

//使用
.nav {
  width:100%;
  @include flex(start);//引用这个混入
}

.header{
  width:100%;
  @include flex(center);//引用这个混入
}
//编译之后
// .nav{
//   display:flex;
//   justify-content:center;
//   align-items:center;
// }
// .header{
//   width:100%;
// 	 display:flex;
// 	 justify-content:start;
//   align-items:start;
// }

3.使用传参的时候不仅仅可以传递参数,也可以把内容传过去

// 类似于vue中的插槽 
@mixin flex ($layout) {
  display:flex;
  justify-content:$layout;
  align-items:$layout;
  @content;//相当于插槽<slot/>
}

//使用
.nav {
  width:100%;
  @include flex(start){
    width:100%;
    height:50%;
  }
}

.header{
  width:100%;
  @include flex(center){
    height:50px;//这里写的东西都会在@content这个插槽位置展示出来
  }
}
//编译之后
// .nav{
//   display:flex;
//   justify-content:center;
//   align-items:center;
//   width:100%;
//   height:50px;
// }
// .header{
//   width:100%;
//   display:flex;
//   justify-content:start;
//   align-items:start;
//   height:50px;
// }
  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现响应式布局可以通过使用CSS媒体查询来适配移动端PC端。下面是一种常用的实现方式: 1. 使用Viewport meta标签:在页面的`<head>`标签中添加`<meta name="viewport" content="width=device-width, initial-scale=1.0">`,这会告诉浏览器使用设备的宽度作为视口宽度,同时禁用缩放。 2. 使用CSS媒体查询:媒体查询允许我们根据设备的特征(如屏幕宽度)应用不同的CSS样式。可以在CSS文件中使用@media规则来定义不同的布局和样式。 例如,下面的代码示例将在屏幕宽度小于等于768px时应用一种样式,而在大于768px时应用另一种样式: ```css /* 小于等于768px */ @media (max-width: 768px) { /* 移动端样式 */ } /* 大于768px */ @media (min-width: 769px) { /* PC端样式 */ } ``` 在媒体查询中,你可以指定不同的CSS属性和值来适应不同的布局需求。例如,可以修改元素的宽度、高度、字体大小等属性。 3. 弹性布局和网格系统:使用弹性盒子布局(Flexbox)和CSS网格布局(CSS Grid)可以更方便地创建响应式布局。这些布局技术可以让你以弹性的方式定义页面的结构和排列方式,适应不同的屏幕尺寸。 弹性盒子布局示例: ```css .container { display: flex; flex-wrap: wrap; } .item { flex: 1 0 200px; } ``` CSS网格布局示例: ```css .container { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); } .item { grid-column: span 1; } ``` 以上是实现响应式布局的一些常用方法,可以根据具体需求选择合适的方式来适配移动端PC端

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值