wswmsword / postcss-mobile-forever

一款 PostCSS 插件,将固定尺寸的视图转为可跟随宽度变化而等比例伸缩的视图。To adapt different displays by one mobile viewport.
https://wswmsword.github.io/examples/mobile-forever/vanilla/
MIT License
325 stars 19 forks source link

设置了maxDisplayWidth 之后,对于 width 设置为 100% 的元素,也会被重置为 min(100%, 500px),但是我希望忽略设置为 100% 的元素 #22

Closed 723386252 closed 10 months ago

wswmsword commented 10 months ago

在这个宽度百分百所在的选择器上面添加标记注释 /* not-root-containing-block */ 试试。

723386252 commented 10 months ago

在这个宽度百分百所在的选择器上面添加标记注释 /* not-root-containing-block */ 试试。

width:100% 涉及到的选择器还是有点多的,而且在使用中发现,有部分 width:100% 会被编译,有部分不会被编译

wswmsword commented 10 months ago

宽度百分百所在选择器内有 position: fixed; 的会被编译,想问下您这个百分百是什么场景,或者方便截图看下吗?之所以转换,是因为有最大宽度的限制,比如最大宽度 600 像素,应该是期望 fixed 定位的元素的百分百宽度也是 600 像素。

723386252 commented 10 months ago

好的,我详细描述一下我的使用场景:我的项目是移动端 web 项目,之前使用 postcss-px-to-viewport,满足了大部分需求,后来要求适配 ipad,在 ipad 场景下,因为屏幕宽度大,导致页面缩放过大,想着能限制一下最大放大比例,使用了您这边开发的工具,设置了maxDisplayWidth,但是发现这个属性好像并不是用来限制最大缩放比的,而是限制最大的窗口宽度,那么我该如何使用这个工具限制最大缩放比例呢

wswmsword commented 10 months ago

你说的缩放比和我说的限制最大宽度应该是一个意思,您有查看在线范例吗,如果范例里的样子是您预期的限制缩放比的概念,那就应该没问题的。

wswmsword commented 10 months ago

在那个范例里面,元素的比例都是不变的,比例也就是宽高比,当宽度变宽,高度也会同比例变高,但是有一个最大比例,您适配的 iPad 和移动端之间是需要用宽度来限制最大比例的,也就是 maxDisplayWidth(最大窗口宽度)。

723386252 commented 10 months ago

是的,其他的表现都与我预期的一致,只是当我使用 vant 组件库的 overlay 组件的时候,由于遮罩层是 fixed 定位,导致非 fixed 的元素保持 100% 宽度,但是遮罩层只有固定的宽度了

wswmsword commented 10 months ago

像 Vant 这种外部 ui 库,可能会有需要转换的单位不和 position: fixed; 在同一选择器的情况,我有提供 rootContainingBlockSelectorList 这个属性,要您打开开发者工具,找到对应的选择器名称,然后填进去,插件识别到这个选择器后,即时没有 position: fixed;,也会把它当作包含块是浏览器窗口来处理转换了。

wswmsword commented 10 months ago
Vant Popup

比如上面的 Vant Popup,因为它的宽度是单独的,所以可以在配置里加这个,来表示这个宽度也是基于根元素包含块的:

{
+  rootContainingBlockSelectorList: ['van-popup--bottom']
}
723386252 commented 10 months ago

可以向您请教一下吗,在 fixed 定位中,对百分比的宽度进行最大值限制的目的是什么,为什么对于其他定位的百分比宽度,不进行限制

wswmsword commented 10 months ago

目的是让桌面端和移动端看起来一样;其它定位的长度属性不是基于根包含块,只有 fixed 定位时,长度属性大部分情况是基于根包含块,而在达到最大缩放比之后,我觉得应用这时候应该期望包含块不再是根包含块了,而是被限制了最大缩放比的、处于居中的那一块应用视图,所以原来和根包含块有关的要重算。 不止百分比,如果是 position: fixed; width: 100vw; 这个宽度也和 100% 一样会重算下。

wswmsword commented 10 months ago

我觉得这么处理是比较没有争议的,比如导航栏和弹窗,弹窗如果设置了最小高度还好,如果没有设置,在宽屏上,肯定是一条长直线,相比有最大宽度的弹窗,缩放比保持最大和移动端一致,看起来会好一点,唯一的问题可能是背景半透明蒙层也限制了宽度。

723386252 commented 10 months ago

理解了,提个小建议,可以增加一个配置项来关闭这个功能,让表现和postcss-px-to-clamp一致,因为100% 宽度的移动场景是存在的

wswmsword commented 10 months ago

昨天晚上我发了个新版本 4.1.0,加了属性可以关闭这个 fixed 定位矫正,配置里您可以加个这个选项 appContainingBlock

{
+ appContainingBlock: "manual",
}

这个代表如果要调整包含块,要开发过程中手动调整,插件不矫正 fixed 定位的元素。其实是有上面说的标记注释来关闭这个功能的,需要关闭的地方不多的话用标记注释没问题。