首页 > 其他分享 >h5开发心得

h5开发心得

时间:2024-07-22 19:07:01浏览次数:4  
标签:function false h5 xhr window 开发 var scrollTop 心得

运营推广移动端开发

1.适配原理

宽的适配:flexible.js适配,是根据屏幕的宽度计算根标签的大小进行适配,
高的适配

  • 需要用vh,vh在静态页面好用,vh是根据屏幕的可视高度计算的,当页面中有输入框时vh的页面会受到挤压,如下图
  • 用百分比

2.移动端布局

  • 如果有按钮,最好让ui设计到一个层级上不要用相对定位,固定定位,因为软键盘弹起会顶起按钮,按钮会遮挡内容。
  • 尽量少用相对定位固定定位,因为不能滚动,在小屏上无法解决适配问题。

3.安卓软键盘引起的问题

1.软键盘打开会顶起页面,造成页面超出,输入框被遮挡问题。

解决方案:用resize事件监听窗口的高度变化,根据窗口变化调整页面样式高度。

// 定义一个函数来处理窗口大小变化时的逻辑
    function checkViewportSize() {
        // // 获取当前窗口的高度
        var windowHeight = window.innerHeight;
         // 更新窗口高度记录
        initialWindowHeight = windowHeight;
    }
    // 记录初始窗口高度
    var initialWindowHeight = window.innerHeight;
    // 初始化时调用一次,确保页面加载时也能记录初始窗口高度
    checkViewportSize();
    // 监听窗口大小变化事件,并在事件发生时调用处理函数
    window.addEventListener('resize', checkViewportSize);

2.软键盘弹起按钮被顶起问题

解决方式:根据窗口变化,让按钮显示隐藏

// 定义一个函数来处理窗口大小变化时的逻辑
	function checkViewportSize() {
		// 获取当前窗口的高度
		var windowHeight = window.innerHeight;

		// 判断当前窗口高度是否小于之前记录的高度
		if (windowHeight < initialWindowHeight) {
			// 可能是软键盘弹起导致的高度变小,执行你需要的逻辑
			console.log('软键盘弹起,可视区域变小');
			// 例如隐藏特定元素或调整布局
			$('.tabBox').hide()
		} else {
			// 可能是软键盘收起导致的高度变大,执行其他逻辑
			console.log('软键盘收起,可视区域恢复');
			// 例如显示特定元素或恢复布局
			$('.tabBox').show()
		}

		// 更新窗口高度记录
		initialWindowHeight = windowHeight;
	}

	// 记录初始窗口高度
	var initialWindowHeight = window.innerHeight;

	// 初始化时调用一次,确保页面加载时也能记录初始窗口高度
	checkViewportSize();

	// 监听窗口大小变化事件,并在事件发生时调用处理函数
	window.addEventListener('resize', checkViewportSize);

4.ios软件盘打开页面留白问题。

解决方案:输入框失焦window.scrollTo(0, 0);

$('#staffCode').blur(function () {
		setTimeout(() => {
			window.scrollTo(0, 0);
		}, 100);
	})

5.上拉加载

实现原理:

scrollTop:滚动视窗的高度距离window顶部的距离,它会随着往上滚动而不断增加,初始值是0,它是一个变化的值

clientHeight:它是一个定值,表示屏幕可视区域的高度;

scrollHeight:页面不能滚动时也是存在的,此时scrollHeight等于clientHeight。scrollHeight表示body所有元素的总长度(包括body元素
自身的padding)

判断是否滚动到底部的公式:scrollTop+clientHeight>=srcollHeight

触发上拉加载的时机
1.滚动到底部=》scrollTop+clientHeight>=srcollHeight
2.滚动条不在顶部
=》scrollTop!==0
3.不在刷新,
4.不在加载
5.没加载完

   $('#middle').scroll(function () {
        var content = this
        // 内容的总高度
        contentHeight = content.scrollHeight
        // 可视区域的高度
        viewportHeight = content.clientHeight
        // 当前滚动的位置
        scrollTop = content.scrollTop;
        scrollBottom = contentHeight - (scrollTop + viewportHeight);
        // 判断是否在顶部
        var atTop = scrollTop === 0;
        // 检查是否滚动到底部
        // 这里的2作为一个阈值,可以根据需要调整
        if (scrollBottom <= 100 && scrollBottom >= 0 && !isLoading && !isRefreshing && !atTop && !allDataLoaded) {
            // 到达底部,可以执行加载更多数据的操作
            console.log("到达底部");
            getItemList();
        }
    });

示例:

var page = 1;
var size = 10;
var isRefreshing = false;
var isLoading = false;
var allDataLoaded = false;

//调用:
$('#list').html('');
page = 1;
allDataLoaded = false
getBuildList()

 function getItemList() {
        if (isLoading && isRefreshing && allDataLoaded) return
        isLoading = true;
        $('#loading').show();
        $('#noData').hide();
        var result = '';
        if (xhr) {
            xhr.abort();
        }
        xhr = $.ajax({
            url: getAuthorizedGroup,
            type: 'post',
            async: true,
            data: {
                "staffCode": staffCode,
                "page": page,
                "size": size
            },
            dataType: 'json',
            success: function (res) {
                if (res.status == 1) {
                    if (res.data.status == 1) {
                        let items = res.data.rows.map(i => {
                            return {
                                ...i,
                                buildCount: i.buildCount == -1 ? '全部电站' : i.buildCount + ' 个'
                            };
                        });
                        var arrLen = items.length;
                        if (arrLen > 0) {
                            for (var i = 0; i < arrLen; i++) {
                                result += drawHtml(items[i]);
                            }
                            page++;
                            if (arrLen < 10) {
                                $('#loading').hide();
                                $('#noData').show();
                            }
                        } else {
                            $('#loading').hide();
                            allDataLoaded = true; // 所有数据已加载完毕
                            if (page == 1) {
                                result = `<div class='imgBox'><img src="./img/noActivity.png" alt="未找到推广活动"></div>`
                            } else {
                                $('#noData').show();
                            }
                        }
                    } else {
                        alert(res.data.msg)
                    }
                } else {
                    alert(res.data)
                }
                $('#list').append(result);
                isLoading = false;
            },
            error: function (xhr) {
                console.log("

标签:function,false,h5,xhr,window,开发,var,scrollTop,心得
From: https://www.cnblogs.com/hxy--Tina/p/18316687

相关文章

  • 【RK3588】正点原子RK3588开发板,旗舰八核、性能强悍!
    正点原子RK3588开发板采用瑞芯微RK3588高性能八核处理器(四核ARM Cortex-A76+四核ARMCortex-A55),支持8K视频编解码,6TOPS超强NPU算力,外设/接口资源丰富,同时提供丰富的开发资料助力开发者更加快速的上手、产品快速落地!RK3588是一颗高性能、低功耗的应用处理器芯片,集成4个Cor......
  • 踩坑记录:windows11下使用 VS2022 和 PCL1.14.1 配置点云开发环境
    闲话不多说,具体在windows下下载PCL与解压pcl可以看https://www.yuque.com/huangzhongqing/pcl/这位大佬的文章,那我就具体说一下踩过点坑:踩坑点1:按照大佬的文章的步骤进行解压与下载,我的PCL环境下在了K盘中,但是最后不知怎么的我的openni2文件夹下在了C盘里,也就是说3rdparty文件夹......
  • 医学实验室检验系统源码 C#语言LIS系统全套源码,多家大型综合医院应用案例,适合二次开发
    实验室管理信息系统LIS源码,采用.NetC#语言开发,C/S架构。支持DB2,Oracle,MSSQLServer等主流数据库。(全套LIS系统源码,自主版权,多家大型综合医院应用案例,适合二次开发,项目应用)LIS系统菜单功能:1、系统维护基础数据维护、项目相关维护、人员权限维护、打印模板维护、微生物维......
  • Qt实现简易CAD软件的开发:技术解析与实现
    文章目录简易CAD软件的开发:技术解析与实现引言项目概述程序入口主窗口的实现主窗口类定义(mainwindow.h)主窗口类实现(mainwindow.cpp)自定义绘图视图自定义绘图视图类定义(myqgraphicsview.h)自定义绘图视图类实现(myqgraphicsview.cpp)用户界面资源管理实现细节1.处理用户绘......
  • iOS开发-多线程编程
    OC中常用的多线程编程技术:1.NSThreadNSThread是Objective-C中最基本的线程抽象,它允许程序员直接管理线程的生命周期。NSThread*myThread=[[NSThreadalloc]initWithTarget:selfselector:@selector(myThreadMainMethod:)object:nil];[myThreadstart];使用NSThread时,......
  • 零基础学STM32(一)-开发软件安装
    本项目讲解所用工程均使用stm32f103C8T6芯片HAL库版本。重点!!!!安装到文件夹路径不能有中文路径软件资源keil5安装包地址:https://pan.baidu.com/s/1IUf6DU20vJC0rrIv3_DBCQ?pwd=8888 cubemx安装包地址:https://pan.baidu.com/s/1beA_TQ8qS593POVwsv-onw?pwd=8888 (各取所需......
  • 海螺 AI 测试「悬浮球」功能抢占手机桌面;小米小爱实时字幕新增日韩语翻译丨 RTE 开发
       开发者朋友们大家好: 这里是「RTE开发者日报」,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享RTE(Real-TimeEngagement)领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表编辑的个人观......
  • 【Gin】精准应用:Gin框架中工厂模式的现代软件开发策略与实施技巧(下)
    【Gin】精准应用:Gin框架中工厂模式的现代软件开发策略与实施技巧(下)大家好我是寸铁......
  • iOS开发基础135-Core Data
    Objective-C(OC)中使用CoreData是iOS应用开发中管理模型层对象的一种有效工具。CoreData使用ORM(对象关系映射)技术来抽象化和管理数据。这不仅可以节省时间,还能减少编程错误。以下是使用CoreData的详细介绍,包括示例代码,以及深入底层的一些分析。基本概念持久化......
  • 在AvaotaA1全志T527开发板上驱动WS2812 RGB LCD
    在AvaotaSBC的开发板中,通常会有几个WS2812RGBLED灯。例如AvaotaA1的如下位置:对于AvaotaOS,提供了硬件的LEDC(LightEmittingDiodeController),发光二极管控制器作为WS2812RGBLED灯的控制器。每个LED的三基色均可实现256级亮度显示,因此整个LED可完成25......