master
xingyy 2 months ago
parent 486f2ea9bb
commit bfa6690a4d

@ -12,6 +12,7 @@
"@unocss/reset": "^0.61.9", "@unocss/reset": "^0.61.9",
"cnjm-postcss-px-to-viewport": "^1.0.1", "cnjm-postcss-px-to-viewport": "^1.0.1",
"jsdom": "^24.0.0", "jsdom": "^24.0.0",
"lodash": "^4.17.21",
"path": "^0.12.7", "path": "^0.12.7",
"postcss-preset-env": "^10.0.0", "postcss-preset-env": "^10.0.0",
"postcss-px-to-viewport": "^1.1.1", "postcss-px-to-viewport": "^1.1.1",

@ -17,6 +17,9 @@ importers:
jsdom: jsdom:
specifier: ^24.0.0 specifier: ^24.0.0
version: 24.1.1 version: 24.1.1
lodash:
specifier: ^4.17.21
version: 4.17.21
path: path:
specifier: ^0.12.7 specifier: ^0.12.7
version: 0.12.7 version: 0.12.7

@ -1,3 +1,3 @@
export const sizes = [ export const sizes = [
{maxWidth:'375px'}, {maxWidth:'768px'}, {maxWidth:'1440px'}, {maxWidth:'1920px'} {minWidth:'375px',maxWidth:'768px'}, {minWidth:'768px',maxWidth:'1440px'}, {minWidth:'1440px',maxWidth: '1920px'}, {minWidth:'1920px'}
] ]

@ -1,46 +1,60 @@
import { ref, onMounted, onBeforeUnmount } from 'vue' import { ref, onMounted, onBeforeUnmount } from 'vue';
export function useAdaptation(sizes, handleChange) { import debounce from 'lodash/debounce'
const mediaQueryLists = sizes.map(size => window.matchMedia(`(max-width: ${size.maxWidth})`));
const currentDevice = ref(getCurrentDevice()) export function useAdaptation(ranges, handleChange) {
function getCurrentDevice() { // 创建 media query 对象列表
const mediaQueryLists = ranges.map(range => {
const minQuery = range.minWidth ? window.matchMedia(`(min-width: ${range.minWidth})`) : null;
const maxQuery = range.maxWidth ? window.matchMedia(`(max-width: ${range.maxWidth})`) : null;
return { minQuery, maxQuery };
});
// 定义当前匹配的区间
const currentRange = ref(getCurrentRange());
// 获取当前匹配的区间
function getCurrentRange() {
for (let i = 0; i < mediaQueryLists.length; i++) { for (let i = 0; i < mediaQueryLists.length; i++) {
if (mediaQueryLists[i].matches) { const { minQuery, maxQuery } = mediaQueryLists[i];
return sizes[i].maxWidth; const minMatches = minQuery ? minQuery.matches : true;
const maxMatches = maxQuery ? maxQuery.matches : true;
if (minMatches && maxMatches) {
return ranges[i];
} }
} }
return sizes[sizes.length - 1].maxWidth return ranges[ranges.length - 1];
} }
const changeHandler = (newValue) => { // 处理窗口大小变化(加上防抖)
if (typeof handleChange === 'function') { const handleDeviceChange = debounce(() => {
handleChange(newValue); const newRange = getCurrentRange();
if (currentRange.value !== newRange) {
currentRange.value = newRange;
if (typeof handleChange === 'function'&&newRange) {
handleChange(newRange);
} }
};
const mediaQueryChangeHandler = () => {
const newDevice = getCurrentDevice();
if (currentDevice.value !== newDevice) {
currentDevice.value = newDevice;
changeHandler(newDevice);
} }
}; }, 200);
let cleanupHandlers = [];
// 在组件挂载时添加事件监听器
onMounted(() => { onMounted(() => {
mediaQueryLists.forEach(query => { mediaQueryLists.forEach(({ minQuery, maxQuery }) => {
query.addEventListener('change', mediaQueryChangeHandler); if (minQuery) minQuery.addEventListener('change', handleDeviceChange);
cleanupHandlers.push(() => query.removeEventListener('change', mediaQueryChangeHandler)); if (maxQuery) maxQuery.addEventListener('change', handleDeviceChange);
}); });
// Ensure the initial value is correct and trigger the changeHandler with the initial value
const initialDevice = getCurrentDevice(); // 初始调用以设置正确的区间
currentDevice.value = initialDevice; handleDeviceChange();
changeHandler(initialDevice);
}); });
// 在组件卸载时移除事件监听器
onBeforeUnmount(() => { onBeforeUnmount(() => {
cleanupHandlers.forEach(cleanup => cleanup()); mediaQueryLists.forEach(({ minQuery, maxQuery }) => {
if (minQuery) minQuery.removeEventListener('change', handleDeviceChange);
if (maxQuery) maxQuery.removeEventListener('change', handleDeviceChange);
});
}); });
return { maxWidth: currentDevice }; // 返回当前匹配的区间
return { currentRange };
} }

@ -4,13 +4,10 @@ import {sizes} from "@/dict/index.js";
import size375 from '@/views/login/size375/index.vue' import size375 from '@/views/login/size375/index.vue'
import size768 from '@/views/login/size768/index.vue' import size768 from '@/views/login/size768/index.vue'
import {computed} from "vue"; import {computed} from "vue";
const {maxWidth}= useAdaptation(sizes,(maxWidth)=>{ const {currentRange }= useAdaptation([ {minWidth:'0px',maxWidth:'768px'}, {minWidth:'768px',maxWidth:'1440px'}, {minWidth:'1440px',maxWidth: '1920px'}, {minWidth:'1920px'}])
console.log('maxWidth',maxWidth.value)
})
const viewComponent = computed(()=>{ const viewComponent = computed(()=>{
switch (maxWidth.value){ switch (currentRange.value?.minWidth){
case '375px': case '0px':
return size375 return size375
case '768px': case '768px':
return size768 return size768
@ -19,7 +16,7 @@ switch (maxWidth.value){
</script> </script>
<template> <template>
<component :is="viewComponent"></component> <component :is="viewComponent"></component>
</template> </template>
<style scoped lang="scss"> <style scoped lang="scss">

@ -7,13 +7,13 @@ const { maxWidth } = useAdaptation([
</script> </script>
<template> <template>
<div class="container"> <div class="box-border relative w-screen h-screen bg-center bg-no-repeat bg-cover bg-[url('@/assets/image/gdz53@2x.png')]">
<div class="content1"></div> <div class="relative z-10 flex items-center flex-col"> <div class="content1 mb-[123px] shrink-0 "></div>
<div class="content2"> <div class="content2">
<div class="wrap1"> <div class="wrap1">
<div class="wrap1_1">手机号</div> <div class="wrap1_1">手机号</div>
<div class="wrap1_2"> <div class="wrap1_2">
<input class="pl-[61px] w-[1174px] h-[174px] focus:outline-none placeholder:text-primary focus: bg-[#DCE5E9] border-none" placeholder="请输入手机号" type="text"> <input class="pl-[61px] w-[1174px] h-[174px] focus:outline-none placeholder:text-primary placeholder:text-[72px] focus: bg-[#DCE5E9] focus:text-[72px] border-none" placeholder="请输入手机号" type="text">
</div> </div>
</div> </div>
<div class="wrap2"> <div class="wrap2">
@ -29,38 +29,17 @@ const { maxWidth } = useAdaptation([
</div> </div>
<div class="content3"> <div class="content3">
<img src="@/assets/image/gdz27.png" alt=""> <img src="@/assets/image/gdz27.png" alt="">
</div> </div></div>
<div class="content4">
<img src="@/assets/image/zu733@2x.png" alt=""> <div class="content4 absolute bottom-[200px] left-[50%] transform translate-x-[-50%]">
<img class="w-[1270px] h-[145px]" src="@/assets/image/zu733@2x.png" alt="">
</div> </div>
</div> </div>
</template> </template>
<style scoped lang="scss"> <style scoped lang="scss">
.container {
box-sizing: border-box;
position: relative;
width: 1920px;
height: 100vh;
background-repeat: no-repeat;
background-size: cover;
background-image: url("@/assets/image/zu3237.png");
display: flex;
align-items: center;
flex-direction: column;
.content4 { .content3 {
position: absolute;
bottom: 200px;
img {
width: 1270px;
height: 145px;
}
}
.content3 {
position: absolute; position: absolute;
top: 0; top: 0;
left: 0; left: 0;
@ -70,18 +49,17 @@ const { maxWidth } = useAdaptation([
width: 671px; width: 671px;
height: 728px; height: 728px;
} }
} }
.content1 { .content1 {
margin-top: 835px; margin-top: 835px;
background-size: cover; background-size: cover;
width: 1074px; width: 1074px;
height: 178px; height: 178px;
background-repeat: no-repeat; background-repeat: no-repeat;
background-image: url("@/assets/image/zu3310@2x.png"); background-image: url("@/assets/image/zu3310@2x.png");
} }
.content2 { .content2 {
margin-top: 123px;
background-size: cover; background-size: cover;
width: 1654px; width: 1654px;
height: 1285px; height: 1285px;
@ -162,7 +140,6 @@ const { maxWidth } = useAdaptation([
font-size: 72px; font-size: 72px;
} }
} }
}
} }
</style> </style>

@ -6,7 +6,6 @@ const parseStyle = (style) => {
export default defineConfig({ export default defineConfig({
presets: [ presets: [
presetWind(), // 使用默认的 UnoCSS 预设 presetWind(), // 使用默认的 UnoCSS 预设
presetAttributify(), // 支持属性模式
presetIcons() presetIcons()
], ],
theme: { theme: {

Loading…
Cancel
Save