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、参考方式

相关推荐
十八朵郁金香8 分钟前
通俗易懂的DOM1级标准介绍
开发语言·前端·javascript
GDAL1 小时前
HTML 中的 Canvas 样式设置全解
javascript
GDAL1 小时前
HTML Canvas clip 深入全面讲解
前端·javascript·canvas
GISer_Jing1 小时前
Javascript排序算法(冒泡排序、快速排序、选择排序、堆排序、插入排序、希尔排序)详解
javascript·算法·排序算法
JustHappy2 小时前
「我们一起做组件库🌻」做个面包屑🥖,Vue的依赖注入实战💉(VersakitUI开发实录)
前端·javascript·github
拉不动的猪2 小时前
刷刷题16
前端·javascript·面试
kiramario2 小时前
【结束】JS如何不通过input的onInputFileChange使用本地mp4文件并播放,nextjs下放入public文件的视频用video标签无法打开
开发语言·javascript·音视频
支撑前端荣耀2 小时前
基于 Vue 的响应式瀑布流实现全景解析
前端·javascript·面试
化作繁星3 小时前
如何在 React 中测试高阶组件?
前端·javascript·react.js
Au_ust4 小时前
千峰React:函数组件使用(2)
前端·javascript·react.js