pc和mobile切换方式

最近看了游戏站点https://yandex.com/games/zh/category/simulator,在他们的游戏站发现一个很有趣的现象:就是他们在pc端进行窗口变化时,界面也会跟着响应式变化。但是这时候切换到移动端,仍然是pc端的样式。如果这时候刷新页面,就会以一个新的样式展示。在不同端分别查看html的网络请求,发现预览的结果与真实页面一样,dom结构基本已经处理好了。

1、pc端和移动端切换的主要方式

  • 1、通过css媒体查询和弹性布局(弹性盒子布局、网格布局)
  • 2、常规使用rem、vh、vm、百分比等处理
  • 3、基于URL参数或者路径进行切换
  • 4、网页加载时检查用户的User-Agent字符串,然后加载不同样式、资源和其他js。或者直接通过nginx处理

上述站点大概是采用第4种和第1种方式结合处理,本文主要使用第四种方式演示。

2、基于nginx+User-Agent进行切换

使用Nginx的ngx_http_map_module模块来根据用户的设备类型进行重定向或代理到不同的站点

  • a、新建一个D:\nginx\config\nginx.conf文件
ini 复制代码
user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    # 定义一个映射,根据User-Agent判断设备类型(同时忽略大小写匹配)
    map $http_user_agent $device_type {
        default         pc;
        ~*mobile|android|iphone        mobile;
        ~*ipad          tablet;
    }


server {
        listen       80;
        listen  [::]:80;
        server_name  localhost;

        location / {
            root   /usr/share/nginx/html/pc;
            if ($device_type = mobile){
                 root   /usr/share/nginx/html/mobile;
            }
            index  index.html index.htm;

        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }

    }
}
  • b、新建一个D:\nginx\html\mobile\index.html文件
xml 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>移动端</title>
</head>
<body>
    移动端
</body>
</html>
  • c、新建一个D:\nginx\html\pc\index.html文件
xml 复制代码
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>电脑端</title>
</head>

<body>
    电脑端
</body>

</html>
  • d、执行docker指令去运行nginx测试
docker 复制代码
docker run --name some-nginx -p 8801:80 -v D:/nginx/html:/usr/share/nginx/html:ro -v D:/nginx/config/nginx.conf:/etc/nginx/nginx.conf -d nginx

3、参考方式

相关推荐
CHNE_TAO_EMSM38 分钟前
Android studio 打开文件时自动下载源码
前端·javascript·android studio
竹林8183 小时前
从 ethers.js 迁移到 Viem:一个签名验证 Bug 让我彻底放弃旧爱
javascript
你挚爱的强哥3 小时前
Vue2 实现 1.5s 十连击监听(连续点击若干次),封装通用可复用点击检测工具,不用 data!Vue 封装通用连击监听方法,支持自定义时长与点击次数
前端·javascript·vue.js
半个落月3 小时前
用 LangChain.js 手写一个能读写文件和执行命令的 Mini Cursor
javascript·人工智能·后端
天外天-亮4 小时前
HBuilder X 使用 uview-plus 方式
开发语言·javascript·hbuilder x·uview-plus
donoot5 小时前
一次 Nginx 502 问题的深度排查:从 SELinux 到容器网络
nginx·docker·selinux·反向代理·502 bad gateway
我有满天星辰5 小时前
Vue项目脚手架之争:create-vue与Vue CLI全面对比
前端·javascript·vue.js
多加点辣也没关系8 小时前
JavaScript|第9章:对象 — 基础
开发语言·javascript·ecmascript
我有满天星辰8 小时前
Vue 2 与 Vue 3 计算属性完全指南:从 Options API 到组合式 API 的演进
前端·javascript·vue.js
后台开发者Ethan9 小时前
setState组件更新
前端·javascript·react