不使用iframe,CSS媒体查询依旧生效

这段 SCSS 代码定义了用于处理响应式设计和媒体查询的功能和混合器。以下是对这段代码的逐行解释:

```scss
$mediaMinWidth: 1024px;
```

  


定义了一个变量 `$mediaMinWidth`,其值为 1024 像素。

```scss
@function translate-media-condition($c) {
$condMap: (
"screen": "only screen",
">minWidth": "(min-width: #{$mediaMinWidth + 1})",
"<minWidth": "(max-width: #{$mediaMinWidth})",
// <=1200px
"md": ".ui-screen-md",
// <=1024px
"sm": ".ui-screen-sm",
// <=767px
"xs": ".ui-screen-xs"
);
@return map-get($condMap, $c);
}
```

 


这个函数 `translate-media-condition` 接受一个参数 `$c`,从一个映射表 `$condMap` 中获取对应的媒体查询条件或类名。比如:
- `"screen"` 返回 `"only screen"`
- `">minWidth"` 返回 `"(min-width: 1025px)"`
- `"<minWidth"` 返回 `"(max-width: 1024px)"`
- `"md"` 返回 `".ui-screen-md"`
- `"sm"` 返回 `".ui-screen-sm"`
- `"xs"` 返回 `".ui-screen-xs"`

```scss
@function responsive-media-condition($c) {
$condMap: (
"md": "only screen and (min-width: 1025px)",
"sm": "only screen and (max-width: 1024px)",
"xs": "only screen and (max-width: 767px)"
);
@return map-get($condMap, $c);
}
```

 


这个函数 `responsive-media-condition` 接受一个参数 `$c`,从一个映射表 `$condMap` 中获取对应的响应式媒体查询条件。比如:
- `"md"` 返回 `"only screen and (min-width: 1025px)"`
- `"sm"` 返回 `"only screen and (max-width: 1024px)"`
- `"xs"` 返回 `"only screen and (max-width: 767px)"`

```scss
@mixin media($args...) {
$query: "";
@each $arg in $args {
$op: "";
@if ($query != "") {
$op: " and ";
}
$query: $query + $op + translate-media-condition($arg);
}
@media #{$query} {
@content;
}
}
```

 


`media` 混合器接受多个参数 `$args...`,并将这些参数转换为媒体查询条件,通过 `translate-media-condition` 函数获取对应的查询条件。最终,使用 `@media` 来应用这些条件并包含混合器的内容。

```scss
@mixin responsive($arg) {
$query: translate-media-condition($arg);
$mediaCondition: responsive-media-condition($arg);
$self: &;
@media #{$mediaCondition} {
@content
};

@if ($arg != 'md') {
@at-root #{$query} #{$self} {
@content;
}
}
}
```

 

`responsive` 混合器接受一个参数 `$arg`,首先使用 `translate-media-condition` 函数获取查询条件 `$query`,然后使用 `responsive-media-condition` 函数获取响应式媒体查询条件 `$mediaCondition`。在媒体查询条件下包含混合器的内容。如果 `$arg` 不等于 `'md'`,则在根上下文中直接应用对应的类名和内容。

总结:
- 这段代码定义了一些函数和混合器来处理响应式设计中的媒体查询。
- `translate-media-condition` 和 `responsive-media-condition` 函数用于从映射表中获取对应的查询条件或类名。
- `media` 混合器用于将多个查询条件组合成一个媒体查询,并包含混合器的内容。
- `responsive` 混合器用于根据参数应用响应式媒体查询条件,并在根上下文中直接应用类名和内容(如果参数不是 `'md'`)。

这段 SCSS 代码实现了灵活的响应式设计,方便在不同的屏幕尺寸下应用不同的样式。

 

如下 case, 实际类名编译实现不同的media 生效 

编译前

.items {
    width: 100%;

    // max-width: 1024px
    @include responsive("sm") {
        width: 80%;
    }

    // max-width: 767px
    @include responsive("xs") {
        width: 60%;
    }
}

编译后

.items {
    width: 100%;
}
@media only screen and (max-width: 1024px) {
    .items {
        width: 80%;
    }
}
.ui-screen-sm .items {
    width: 80%;
}
@media only screen and (max-width: 767px) {
    .items {
        width: 60%;
    }
}
.ui-screen-xs .items {
    width: 60%;
}

 

 

 
posted @ 2024-07-03 17:22  小前端学习  阅读(2)  评论(0编辑  收藏  举报