2024-08-23

在Flutter中,Flexible、Expanded和Spacer是布局中常用的三个widget,以下是它们的简单介绍和使用示例:

  1. Flexible:用于在Row、Column或Flex中使用,允许子widget按比例伸缩。



Row(
  children: <Widget>[
    Flexible(
      flex: 2,
      child: Container(color: Colors.red),
    ),
    Flexible(
      flex: 1,
      child: Container(color: Colors.blue),
    ),
  ],
)
  1. Expanded:用于在Row、Column或Flex中使用,允许子widget占用剩余空间。



Column(
  children: <Widget>[
    Expanded(
      flex: 2,
      child: Container(color: Colors.red),
    ),
    Expanded(
      flex: 1,
      child: Container(color: Colors.blue),
    ),
  ],
)
  1. Spacer:在Row或Column中使用,可以自动填充空白空间。



Row(
  children: <Widget>[
    Container(color: Colors.red),
    Spacer(), // 填充空白空间
    Container(color: Colors.blue),
  ],
)

以上代码展示了如何在不同的布局widget中使用Flexible、Expanded和Spacer,以达到不同的布局效果。

2024-08-20

以下是一个基于 Webpack 的配置示例,用于将 postcss-pxtorem 插件集成到项目中,以支持在不同分辨率设备上自适应显示。




// webpack.config.js
const pxtorem = require('postcss-pxtorem');
 
module.exports = {
  // ... 其他webpack配置
  module: {
    rules: [
      // ... 其他loader配置
      {
        test: /\.css$/,
        use: [
          'style-loader',
          'css-loader',
          {
            loader: 'postcss-loader',
            options: {
              plugins: [
                require('autoprefixer')(), // 自动添加浏览器厂商前缀
                pxtorem({
                  rootValue: 37.5, // 设计稿宽度的1/10,这里以375px设计稿宽为例
                  propList: ['*'], // 转换所有属性
                  unitPrecision: 5, // 单位精度
                  minPixelValue: 0, // 小于或等于1px则不转换
                  mediaQuery: false, // 不转换媒体查询中的单位
                  replace: true, // 转换完成后直接更换原来的值
                }),
              ],
            },
          },
        ],
      },
      // ... 其他文件loader配置
    ],
  },
  // ... 其他配置
};

在这个配置中,postcss-pxtorem 插件被用来将 CSS 中的 px 单位转换成 rem 单位,这样就可以实现响应式布局。rootValue 设置为37.5是因为在大多数移动设备上,375px的视口宽度能够使页面以大约100%的缩放比例显示,这样有利于提高移动端页面的可读性和可操作性。

2024-08-16

在Flutter中,FlexibleExpandedSpacer是用于构建灵活布局的组件。以下是它们的简单使用示例:




import 'package:flutter/material.dart';
 
void main() => runApp(MyApp());
 
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Column(
          children: <Widget>[
            Flexible(
              flex: 2,
              child: Container(color: Colors.red,),
            ),
            Expanded(
              child: Container(color: Colors.green,),
            ),
            Flexible(
              flex: 1,
              child: Container(color: Colors.blue,),
            ),
          ],
        ),
      ),
    );
  }
}

在这个例子中:

  • Flexible 用于在Column中创建一个可以伸缩的空间。flex属性定义了该空间相对于其他可伸缩空间的伸缩比例。
  • Expanded 用于在ColumnRow中填充剩余的空间。如果有多个Expanded组件,则它们会平分可用空间。

如果你需要在两个组件之间添加空白空间,可以使用Spacer,它会在ColumnRow中填充空白空间。




Column(
  children: <Widget>[
    Flexible(
      child: Container(color: Colors.red),
    ),
    Spacer(), // 添加空白空间
    Flexible(
      child: Container(color: Colors.blue),
    ),
  ],
),

Spacer本身是一个Flexible组件,默认占用0个视口单位,在ColumnRow中表现为0宽度,在FlexColumn中表现为0高度。

2024-08-16

在Vue项目中,自适应布局通常使用lib-flexible库结合postcss-pxtorempostcss-px2rem插件来实现。

  1. lib-flexible:这是一个用于设置 rem 布局的库,它会根据屏幕宽度动态调整根字体大小。
  2. postcss-pxtorem:一个PostCSS插件,用于将像素单位转换成rem单位。
  3. postcss-px2rem: 一个PostCSS插件,用于将像素单位转换成rem单位。

安装依赖




npm install lib-flexible --save

对于postcss-pxtorempostcss-px2rem,选择其一进行安装:




npm install postcss-pxtorem --save-dev
# 或者
npm install postcss-px2rem --save-dev

配置postcss-pxtorempostcss-px2rem

postcss的配置文件postcss.config.js中,配置相关选项:




module.exports = {
  plugins: {
    autoprefixer: {},
    'postcss-pxtorem': {
      rootValue: 37.5, // 设计稿宽度/10,这里以设计稿宽度为375px为例
      propList: ['*'], // 需要转换的属性,这里选择转换所有属性
    },
    // 或者使用 postcss-px2rem
    'postcss-px2rem': {
      rootValue: 37.5, // 设计稿宽度/10,这里以设计稿宽度为375px为例
      propList: ['*'], // 需要转换的属性,这里选择转换所有属性
    },
  },
};

配置lib-flexible

在项目入口文件main.js中引入lib-flexible




import 'lib-flexible/flexible'

注意

  • 确保lib-flexible在项目中首先引入,以保证根据屏幕宽度动态调整根字体大小的特性。
  • postcss-pxtorempostcss-px2rem的配置中,rootValue通常设置为设计稿宽度的1/10,这样可以使得计算更加方便。
  • 在使用时,选择其中一个插件进行配置,并确保在postcss.config.js文件中正确配置。

以上步骤完成后,你的Vue项目就可以使用rem单位进行自适应布局设计了。

2024-08-15

在CSS中,弹性盒子(Flexible Box,Flexbox)是一种现代化的布局模型,用于更简单、更灵活的方式排列容器内的项目。

以下是一个简单的弹性盒子布局示例:

HTML:




<div class="container">
  <div class="item">1</div>
  <div class="item">2</div>
  <div class="item">3</div>
</div>

CSS:




.container {
  display: flex; /* 指定为弹性盒子布局 */
  flex-wrap: wrap; /* 允许换行 */
  gap: 10px; /* 设置项目之间的间隔 */
}
 
.item {
  width: 100px; /* 设置项目宽度 */
  height: 100px; /* 设置项目高度 */
  background-color: skyblue; /* 设置背景颜色 */
  display: flex; /* 内部使用弹性盒子布局 */
  justify-content: center; /* X轴对齐方式 */
  align-items: center; /* Y轴对齐方式 */
}

这个例子中,.container 类使用 display: flex 将其设置为弹性盒子布局,.item 类则用于定义每个子项的样式。弹性盒子提供了很多属性来控制布局,如 flex-direction 控制项目的排列方向,justify-content 控制项目在主轴上的对齐方式,align-items 控制项目在交叉轴上的对齐方式等。

2024-08-15



(function flexible(window, document) {
  var docEl = document.documentElement;
  var dpr = window.devicePixelRatio || 1;
  // adjust body font size
  function setBodyFontSize() {
    if (document.body) {
      document.body.style.fontSize = 12 * dpr + 'px';
    }
    else {
      document.addEventListener('DOMContentLoaded', setBodyFontSize);
    }
  }
  setBodyFontSize();
 
  // set 1rem = viewWidth / 10
  function setRemUnit() {
    var rem = docEl.clientWidth / 10;
    docEl.style.fontSize = rem + 'px';
  }
 
  setRemUnit();
 
  // reset rem unit on page resize
  window.addEventListener('resize', setRemUnit);
  window.addEventListener('pageshow', function(e) {
    if (e.persisted) {
      setRemUnit();
    }
  });
 
  // detect 0.5px supports
  if (dpr >= 2) {
    var fakeBody = document.createElement('body');
    var testElement = document.createElement('div');
    testElement.style.border = '.5px solid transparent';
    fakeBody.appendChild(testElement);
    docEl.appendChild(fakeBody);
    if (testElement.offsetHeight === 1) {
      docEl.classList.add('hairlines');
    }
    docEl.removeChild(fakeBody);
  }
}(window, document));

这段代码实现了移动端页面的自适应布局,通过设置document.body.style.fontSizedocument.documentElement.style.fontSize来分别定义了不同元素的基础字体大小。其中,document.documentElement指的是文档根元素,在HTML中通常是<html>标签。通过监听窗口大小变化,代码能够实时调整基础字体大小,从而实现响应式布局。

2024-08-14

flexible.js 是一个用于在移动端自适应的脚本,可以帮助我们在开发响应式网页时处理不同屏幕尺寸的显示问题。以下是一个简单的使用示例:

首先,在你的HTML文件中引入flexible.js




<script src="path/to/flexible.js"></script>

然后,你可以通过CSS媒体查询和百分比宽度来创建一个响应式布局。例如:




/* 设置基本字体大小 */
html {
    font-size: 10px;
}
 
/* 通过媒体查询调整基本字体大小 */
@media screen and (min-width: 320px) {
    html {
        font-size: 10px;
    }
}
 
@media screen and (min-width: 360px) {
    html {
        font-size: 11.25px; /* 10px * (360/320) */
    }
}
 
/* 使用rem单位设置元素宽度和字体大小 */
.container {
    width: 6.25rem; /* 62.5px */
    font-size: 0.875rem; /* 8.75px */
}

在这个例子中,我们设置了基本的字体大小为10px,然后通过媒体查询调整不同屏幕宽度下的字体大小比例。这样,我们就可以用rem单位来设置元素的宽度和字体大小,这些值会根据根元素(html)的字体大小变化而自适应。

注意,flexible.js 会根据屏幕宽度动态调整html元素的字体大小,所以不需要手动设置固定的字体大小。只需要使用rem单位来定义布局尺寸,就可以实现响应式设计。