使用vw进行移动端的适配_Vue+ts下的移动端vw适配(第三方库css问题)

20190504更新

最新的postcss-px-to-viewport已经添加了exclude选项,可以根据正则忽略文件

以下为正文:

之前看了大漠老师的VW适配方案,觉得受益匪浅,对比flexible的方案,与js解耦,纯css的适配方案,关于VW的介绍里面有详细的介绍

项目基于vue-cli

首先安装所需的插件

npm i postcss-aspect-ratio-mini postcss-px-to-viewport postcss-write-svg postcss-cssnext postcss-viewport-units cssnano --S

接下来在根目录的.postcssrc.js对PostCSS插件进行配置

module.exports = {

"plugins": {

"postcss-import": {},

"postcss-url": {},

// to edit target browsers: use "browserslist" field in package.json

"postcss-write-svg": {

uft8: false

},

"postcss-cssnext": {},

"postcss-px-to-viewport": {

viewportWidth: 750, // 设计稿宽度

viewportHeight: 1334, // 设计稿高度,可以不指定

unitPrecision: 3, // px to vw无法整除时,保留几位小数

viewportUnit: 'vw', // 转换成vw单位

selectorBlackList: ['.ignore', '.hairlines'], // 不转换的类名

minPixelValue: 1, // 小于1px不转换

mediaQuery: false // 允许媒体查询中转换

},

"postcss-viewport-units": {},

"cssnano": {

preset: "advanced",

autoprefixer: false, // 和cssnext同样具有autoprefixer,保留一个

"postcss-zindex": false

}

}

}

.postcss-px-to-viewport

用来把px单位转换为vw、vh、vmin或者vmax这样的视窗单位,也是vw适配方案的核心插件之一。

我们都是使用750px宽度的视觉设计稿,那么100vw = 750px,即1vw = 7.5px。那么我们可以根据设计图上的px值直接转换成对应的vw值。在实际撸码过程,不需要进行任何的计算,直接在代码中写px。

.postcss-aspect-ratio-mini

用来处理元素容器宽高比。

.postcss-write-svg

用来处理移动端1px的解决方案。

vw兼容方案

Viewport Units Buggyfill

1. 引入js文件

2. 在HTML文件中调用viewport-units-buggyfill

window.onload = function () {

window.viewportUnitsBuggyfill.init({

hacks: window.viewportUnitsBuggyfillHacks

});

}

ps: 使用vw的polyfill解决方案会在用到的vw的地方添加content,会影响到img和伪元素,需要全局添加

`img { content: normal !important; }

小结:

这里作者用的是vue + ts环境,在引入第三方库mint-ui的时候,遇到了一些问题

第三方库引入css问题

在main.ts文件中直接引入mint-ui的css文件会找不到文件

import Vue from 'vue'

import MintUI from 'mint-ui'

import 'mint-ui/lib/style.css' // 提示找不到文件

import App from './App.vue'

Vue.use(MintUI)

new Vue({

el: '#app',

components: { App }

})

笔者在这里的了解一下在github上其他人开源的vue + ts的项目,发现部分解决方案是新建一个style文件,引入node_module内所需的所有文件

import Vue from 'vue'

import MintUI from 'mint-ui'

import '@/styles/mint-ui.styl' // 项目内新建的styl文件

import App from './App.vue'

Vue.use(MintUI)

new Vue({

el: '#app',

components: { App }

})

mint-ui.styl中

@import '../../node_modules/mint-ui/lib/style.css'

在这之前好像跟我们是vw适配没什么联系

紧接的就是第二个问题了

2. vw打包后,改变了第三方库的px也被转换成vw了

这里mint-ui使用的px为单位,所以run dev的时候看到的是正常的,但是build后,postcss-px-to-viewport会将引入的style转换成vw单位

这里以mint-ui的picker为例

dev环境时dev环境下

build后再打开build后

这里在网上查了一下,感觉关于vw的适配方案的文章并不多,没找到类似的解决方案

后来找到了一个改良版的postcss-px-to-viewport

添加了exclude选项,将node_modules目录排除掉,即不会受影响

非常开心的放到了github上 postcss-px-to-viewport,用vw的同学,有需要的可以看一下

也可以自己在node_modules中找到postcss-px-to-viewport,打开index.js

新增对exclude选项的处理

module.exports = postcss.plugin('postcss-px-to-viewport', function (options) {

var opts = objectAssign({}, defaults, options);

var pxReplace = createPxReplace(opts.viewportWidth, opts.minPixelValue, opts.unitPrecision, opts.viewportUnit);

return function (css) {

css.walkDecls(function (decl, i) {

if (options.exclude) { // 添加对exclude选项的处理

if (Object.prototype.toString.call(options.exclude) !== '[object RegExp]') {

throw new Error('options.exclude should be RegExp!')

}

if (decl.source.input.file.match(options.exclude) !== null) return;

}

// This should be the fastest test and will remove most declarations

if (decl.value.indexOf('px') === -1) return;

if (blacklistedSelector(opts.selectorBlackList, decl.parent.selector)) return;

decl.value = decl.value.replace(pxRegex, pxReplace);

});

if (opts.mediaQuery) {

css.walkAtRules('media', function (rule) {

if (rule.params.indexOf('px') === -1) return;

rule.params = rule.params.replace(pxRegex, pxReplace);

});

}

};

});

然后在.postcssrc.js添加postcss-px-to-viewport的exclude选项,亲测可用

"postcss-px-to-viewport": {

viewportWidth: 750,

viewportHeight: 1334,

unitPrecision: 3,

viewportUnit: 'vw',

selectorBlackList: ['.ignore', '.hairlines'],

minPixelValue: 1,

mediaQuery: false,

exclude: /(\/|\\)(node_modules)(\/|\\)/

},

当然也可以直接 npm install postcss-px-to-viewport-opt -S

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
移动端适配主要是指将毕业设计的校园信息交流网站进行调整和优化,使其能够在移动设备上正常显示和操作。 对于vue、node、mysql这三个技术,可以用来构建整个网站。Vue是一种轻量级的JavaScript框架,可以快速构建用户界面,可以通过Vue框架来实现前端的页面展示和交互效果;Node.js是一种基于JavaScript开发的服务器端运行环境,可以用于处理后端的逻辑和实现接口等功能;MySQL是一种关系型数据库管理系统,可以用来存储和管理网站的数据。 在进行移动端适配时,可以结合使用Vue框架的响应式布局功能,根据不同设备的屏幕尺寸和分辨率,动态调整页面的布局和样式,以适应不同大小的移动设备。可以使用弹性盒子布局(Flexbox)和媒体查询(Media Query)来实现自适应布局。 同时,需要进行移动端的交互优化,例如使用滑动功能来替代鼠标点击,提高用户的操作体验。还可以优化页面加载速度,减少网络请求和数据传输量,提高网站的加载和响应速度。 另外,在进行移动端适配时,需要考虑移动设备的性能和资源限制,避免过多的CPU和内存消耗,以保证网站的良好运行。 综上所述,移动端适配毕业设计的校园信息交流网站是一个比较重要的环节,需要结合Vue、Node和MySQL等技术来进行开发和优化。通过响应式布局、交互优化和页面加载速度的优化等手段,来实现在移动设备上的良好展示和操作体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值