vue 利用CSS 的 transform属性 对 页面布局进行自适应缩放

标签: 自适应布局  javascript  jquery

问题描述

需求要求在不同的适配器上,都需要保证页面的整体布局无误,只能对页面的字体进行一定比例的缩放,才能实现这样的效果。

下图:是在1920*1080显示屏上呈现的正常效果

在这里插入图片描述
但是在小屏幕显示的错误效果

在这里插入图片描述
或者打开开发工具,显示的错误效果

在这里插入图片描述

解决方案

  1. 动态计算整体布局的高度和宽度
    (1) 利用jQuery的 $(window).width() 获取对应的当前宽度(不包含 任务栏的宽度+菜单栏的宽度 + 滚动条的宽度)
    (2)同理 利用 $(window).height() 获取对应当前的高度 (不包含 任务栏的高度+菜单栏的高度 + 滚动条的高度)
    (3)当屏幕小于1920像素时,固定设置 宽度为1920px ,高度为 1080px

  2. 动态根据 当前宽度 / 屏幕宽度 计算缩放比例值 $(window).width() / ($('body').width();

  3. 给body标签,利用 css的transform进行缩放。

  $('body').css({
        transform: "scale(" + $(window).width() / ($('body').width()+ ")",
        transformOrigin: "left top",
        backgroundSize: "100%"
      });

其中 transformOrigin: 'left top' 保证整体内容 从左上角开始显示。默认是居中显示。
backgroundSize: "100%" 保证X轴,全铺满。

具体代码如下:

window.global = window;
  (function () {
    if ($(window).width() >= 1920) {
      $(window).width() && $('body').css('width', $(window).width());
      $(window).height() && $('body').css('height', $(window).height());
    } else {
      $(window).width() && $('body').css('width', "1920px");

      var ratio = $(window).width() / (1920 || $('body').width());
      $('body').css({
        transform: "scale(" + ratio + ")",
        transformOrigin: "left top",
        backgroundSize: "100%",
        height: "1080px"
      });
    }
    $('head').append('<meta name="viewport" content="width=' + $(window).width() + '"/>');

    //监听页面是否发生改变
    $(window, document).resize(function () {
      resize();
    })

    function resize() {
      if (window.screen.display == 2) { // 等比缩放高度铺满
        resizeCenter();
      } else if (window.screen.display == 3) { //全屏铺满
        resizeFull();
      } else if (window.screen.display == 4) { //等比缩放高度铺满并且可以左右移动
        resizeHeight();
      } else { // 等比缩放宽度铺满
        resizeWidth();
      }

    }
    function resizeWidth() {
      window.location.reload()
      if ($(window).width() >= 1920) {
        var ratio = $(window).width() / ($(window).width() || $('body').width());
        $(window).height() && $('body').css('height', $(window).height());
      } else {
        $('body').css('height', "1080px");
      }
      var ratio = $(window).width() / (1920 || $('body').width());
      $('body').css({
        transform: "scale(" + ratio + ")",
        transformOrigin: "left top",
        backgroundSize: "100%"
      });
    }
    function resizeCenter() {
      if (!window.screen.height || !window.screen.width) return resizeCenterBak();
      var ratio = $(window).height() / window.screen.height;

      $('body').css({
        transform: "scale(" + ratio + ")",
        transformOrigin: "left top",
        backgroundSize: 100 * (window.screen.width / $(window).width() * ratio) + "%" + ' 100%',
        backgroundPosition: ($(window).width() - $('body').width() * ratio) / 2 + "px top",
        marginLeft: ($(window).width() - $('body').width() * ratio) / 2
      });
    }

    function resizeHeight() { //
      if (!window.screen.height || !window.screen.width) return resizeCenterBak();
      var ratio = $(window).height() / window.screen.height;

      $('body').css({
        transform: "scale(" + ratio + ")",
        transformOrigin: "left top",
        backgroundSize: 100 * (window.screen.width / $(window).width() * ratio) + "%" + ' 100%',
        backgroundPosition: ($(window).width() - $('body').width() * ratio) / 2 + "px top",
        // marginLeft: ($(window).width() - $('body').width() * ratio) / 2
      });
      $('html').css({
        overflowX: 'scroll',
      })
    }

    function resizeFull() {
      if (!window.screen.height || !window.screen.width) return resizeFullBak();
      var ratioX = $(window).width() / window.screen.width;
      var ratioY = $(window).height() / window.screen.height;

      $('body').css({
        transform: "scale(" + ratioX + ", " + ratioY + ")",
        transformOrigin: "left top",
        backgroundSize: "100% 100%",
      });
    }

    function resizeCenterBak() {
      var ratioX = $(window).width() / $('body').width();
      var ratioY = $(window).height() / $('body').height();
      var ratio = Math.min(ratioX, ratioY);

      $('body').css({
        transform: "scale(" + ratio + ")",
        transformOrigin: "left top",
        backgroundSize: (1 / ratioX) * 100 * ratio + "%",
        backgroundPosition: ($(window).width() - $('body').width() * ratio) / 2 + "px top",
        marginLeft: ($(window).width() - $('body').width() * ratio) / 2
      });
    }
    function resizeFullBak() {
      var ratioX = $(window).width() / $('body').width();
      var ratioY = $(window).height() / $('body').height();

      $('body').css({
        transform: "scale(" + ratioX + ", " + ratioY + ")",
        transformOrigin: "left top",
        backgroundSize: "100% " + ratioY * 100 + "%",
      });
    }
  })();

最终呈现效果
小屏幕全屏效果
在这里插入图片描述

打开F12效果

在这里插入图片描述
在小屏幕显示效果,带有滚动条,但是全屏显示,则无滚动条(但火狐浏览器小屏幕会有一部分空白区域)

在这里插入图片描述

版权声明:本文为xiaohuli_hyr原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/xiaohuli_hyr/article/details/108119712

智能推荐

CSS3 transform属性

transfrom transform 是CSS3新增的,用来设置元素的形状改变。这个属性不需要用其他属性来定义直接运用,它有rotate ,scale ,translate ,skew 等属性 rotate 旋转 通过指定角度对元素进行旋转度数为正顺时针旋转,如果设置的值为正数表示顺时针旋转,如果设置的值为负数,则表示逆时针旋转。 例: 效果: scale 缩放 scale 具有三种情况: sc...

css3 transform属性

Transform字面上就是变形,改变的意思。在CSS3中transform主要包括以下几种:旋转rotate、扭曲skew、缩放scale和移动translate等。 语法:transform: rotate | scale | skew | translate 一、旋转rotate rotate(<angle>) :通过指定的角度参数对原元素指定一个2D rotation(2D 旋...

【CSS 学习】transform 属性详解

transform 属性的值 translate(x,y)、translateX(x)、translateY(y)、translateZ(z)、translate3d(x,y,z) 定义位置的移动距离 scale(x,y)、scaleX(x)、scaleY(y)、scaleZ(z)、scale3d(x,yz) 定义元素的缩放比例 rotate(angle)、rotateX(angle)、rotat...

目标检测随笔。anchor的生成

目标的真实边界(ground_truth bounding box)。 而以像素为中心生成多个大小和宽高比(aspect ratio)的边界框,称为anchor box。基于深度学习的目标检测不使用传统的滑窗生成所有的窗口作为候选区域,FasterRCNN提出的RPN网络,处理较少但准确的候选区域。锚框即可理解为某个检测点处的候选区域。 假设图像高hhh,宽为www。以每个像素为中心,大小s&is...

数据结构与算法C++描述(14)---二叉搜索树

1、二叉搜索树的概念 二叉搜索树是一棵可能为空的二叉树,一棵非空的二叉搜索树有满足如下特征: 二叉树中所有的键值都是唯一的; 根节点所有左子树的键值(如果有的话)小于根节点的键值; 根节点所有右子树的键值(如果有的话)大于根节点的键值; 根节点的左右子树也都是二叉搜索树。 三个二叉搜索树如下: 2、二叉搜索树的C++描述 对于二叉搜索树,主要操作有插入一个元素(Insert)删除键值为k的元素(D...

猜你喜欢

数据库

什么是数据库? 简单的说,数据库就是一个存放数据的仓库,这个仓库是按照一定的数据结构(数据结构是指数据的组织形式或数据之间的联系)来组织,存储的,我们可以通过数据库提供的多种方法来管理数据库里的数据。 数据库诞生于1950年,随着信息技术的发展和人类社会的不断进步,特别是2000年后,数据库不在仅仅是存储和管理数据了,而转变成用户所需要的各种数据管理的方式,数据库有很多种类和功能,从最简单的存储有...

Centos7搭建Hadoop3.1.3完全分布模式

详细搭建可以参考我的Hadoop2.8.0安装 准备 本文下载的是3.1.3版本的Hadoop 关闭防火墙 虚拟机的准备 安装3个虚拟机并实现ssh免密码的登录 安装3个centos7虚拟机 安装3个机器,机器分别叫master slave1 slave2 在/etc/hostname下修改主机名 其他两台也是一样 修改主机映射 修改/etc/hosts文件 修改这3台机器的/etc/hosts文...

【u-boot-2016到s5pv210】2.7 uboot NandFlash驱动

【u-boot-2016到s5pv210】2.7 uboot NandFlash驱动 本章的问题: 1 nandflash是flash吗? 2 nandflash的常用接口 3 nandflash的特性是什么? 4 ok210上s5pv210是怎么控制nandflash的 5 u-boot-2016.09.01中,nandflash的流程 6 nandflash在u-boot驱动中的关注点是什么?...

muduo库之thread类

Thread类图 Thread::start()调用的是startThread(…) 关于startThread(…)函数,它的形参是ThreadDate类,下面是该类的结构体 `struct ThreadData { typedef muduo::Thread::ThreadFunc ThreadFunc; ThreadFunc func_; string name_...

Qt音视频开发26-ffmpeg播放器

一、前言 用ffmpeg来实现自己的播放器,这是一直以来的一个目标,之前的难点卡在音视频同步以及如何播放声音这两点(尽管之前已经进行过不少的尝试和探索,但是问题还是挺多,比如音视频同步不完美,有些文件正常而有些文件不准,声音播放采用的sdl总感觉多了个依赖怪怪的,而且很多初学者也反映希望采用Qt自身的类来播放),近期正好把这两个难点一一攻破了,音视频同步采用的外部时钟同步,声音播放采用的Qt自带的...