post:增加响应式样式文章。
This commit is contained in:
parent
69ddf62f90
commit
56f7f11f3d
156
source/_posts/responsive-flex.md
Normal file
156
source/_posts/responsive-flex.md
Normal file
|
@ -0,0 +1,156 @@
|
||||||
|
---
|
||||||
|
title: 一套通用的响应式布局
|
||||||
|
tags:
|
||||||
|
- 前端
|
||||||
|
- CSS
|
||||||
|
- Less
|
||||||
|
- 响应式布局
|
||||||
|
- Responsive
|
||||||
|
- Flex
|
||||||
|
categories:
|
||||||
|
- - 前端
|
||||||
|
- CSS
|
||||||
|
date: 2021-04-27 14:49:29
|
||||||
|
---
|
||||||
|
|
||||||
|
响应式布局通常都是使用`@media`媒体查询来完成,但是要实现每一套查询都需要编写大量重复的CSS代码,借用Less预处理器提供的函数功能,可以非常有效的将它们抽象出来。<!--more-->
|
||||||
|
|
||||||
|
## 公共函数代码
|
||||||
|
|
||||||
|
```less 公共布局函数
|
||||||
|
.flex(@media) {
|
||||||
|
display: flex;
|
||||||
|
&.row-@{media} {
|
||||||
|
flex-direction: row;
|
||||||
|
}
|
||||||
|
&.row-@{media}-inv {
|
||||||
|
flex-direction: row-reverse;
|
||||||
|
}
|
||||||
|
&.col-@{media} {
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
&.col-@{media}-inv {
|
||||||
|
flex-direction: column-reverse;
|
||||||
|
}
|
||||||
|
@main-axis-align: {
|
||||||
|
start: flex-start;
|
||||||
|
center: center;
|
||||||
|
end: flex-end;
|
||||||
|
space: space-around;
|
||||||
|
even: space-evenly;
|
||||||
|
between: space-between;
|
||||||
|
baseline: baseline;
|
||||||
|
}
|
||||||
|
each(@main-axis-align, {
|
||||||
|
&.rm-@{key}-@{media} {
|
||||||
|
justify-content: @value;
|
||||||
|
}
|
||||||
|
&.cm-@{key}-@{media} {
|
||||||
|
align-content: @value;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
@cross-axis-align: {
|
||||||
|
start: flex-start;
|
||||||
|
center: center;
|
||||||
|
end: flex-end;
|
||||||
|
stretch: stretch;
|
||||||
|
baseline: baseline;
|
||||||
|
}
|
||||||
|
each(@cross-axis-align, {
|
||||||
|
&.rc-@{key}-@{media} {
|
||||||
|
align-items: @value;
|
||||||
|
}
|
||||||
|
.as-@{key}-@{media} {
|
||||||
|
align-self: @value;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
each(range(1, 10), .(@i) {
|
||||||
|
.extend-@{i}-@{media} {
|
||||||
|
flex-grow: @i;
|
||||||
|
}
|
||||||
|
.shrink-@{i}-@{media} {
|
||||||
|
flex-shrink: @i;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
@special-width: {
|
||||||
|
min: min-content;
|
||||||
|
max: max-content;
|
||||||
|
fit: fit-content;
|
||||||
|
};
|
||||||
|
each(@special-width, {
|
||||||
|
.w-@{key}-@{media} {
|
||||||
|
width: @value;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
@basis-percent: 2, 3, 4, 5, 8, 10, 12, 16, 20, 24;
|
||||||
|
each(@basis-percent, .(@max) {
|
||||||
|
each(range(1, @max), .(@i) {
|
||||||
|
.b-@{i}-@{max}-@{media} {
|
||||||
|
flex-basis: percentage(@i / @max);
|
||||||
|
}
|
||||||
|
.w-@{i}-@{max}-@{media} {
|
||||||
|
width: percentage(@i / @max);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
@wrap-modes: {
|
||||||
|
none: nowrap;
|
||||||
|
wrap: wrap;
|
||||||
|
inv: wrap-reverse;
|
||||||
|
}
|
||||||
|
each(@wrap-modes, {
|
||||||
|
&.w-@{key}-@{media} {
|
||||||
|
flex-wrap: @value;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 使用方法
|
||||||
|
|
||||||
|
假设上面这段Less代码存放在`common.less`文件里,那么可以构建出以下响应式样式定义。
|
||||||
|
|
||||||
|
```less 响应式样式定义
|
||||||
|
@import "common.less";
|
||||||
|
|
||||||
|
/* 全局样式部分 */
|
||||||
|
.flex {
|
||||||
|
.flex(a);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 小尺寸屏幕样式 */
|
||||||
|
@media screen and (max-width: 639px) {
|
||||||
|
.flex {
|
||||||
|
.flex(s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 中等尺寸屏幕样式 */
|
||||||
|
@media screen and (min-width: 640px) and (max-width: 959px) {
|
||||||
|
.flex {
|
||||||
|
.flex(m);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 大尺寸屏幕样式 */
|
||||||
|
@media screen and (min-width: 960px) {
|
||||||
|
.flex {
|
||||||
|
.flex(l);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## HTML示例
|
||||||
|
|
||||||
|
下面通过一个简单的HTML示例,来说明这段响应式布局的使用。这个HTML示例可以达到小屏幕采用纵向排列,中等屏幕采用水平可换行排列,大屏幕采用水平不换行排列,所有元素均采用两端对齐。
|
||||||
|
|
||||||
|
```html 响应式布局示例
|
||||||
|
<div class="flex col-n row-a w-wrap-m rm-between-a rc-center-a">
|
||||||
|
<div class="squre w-2-2-n w-1-3-m w-2-12-l">Squre 1</div>
|
||||||
|
<div class="squre w-2-2-n w-1-3-m w-2-12-l">Squre 2</div>
|
||||||
|
<div class="squre w-2-2-n w-1-3-m w-2-12-l">Squre 3</div>
|
||||||
|
<div class="squre w-2-2-n w-1-3-m w-2-12-l">Squre 4</div>
|
||||||
|
<div class="squre w-2-2-n w-1-3-m w-2-12-l">Squre 5</div>
|
||||||
|
<div class="squre w-2-2-n w-1-3-m w-2-12-l">Squre 6</div>
|
||||||
|
</div>
|
||||||
|
```
|
0
source/_posts/responsive-flex/.gitkeep
Normal file
0
source/_posts/responsive-flex/.gitkeep
Normal file
Loading…
Reference in New Issue
Block a user