网页里经常需要“点图片跳转”,但HTML并没有给图片单独提供链接属性,必须靠结构或样式配合实现。常见路线有两条,一条是用a标签包裹img,另一条是给元素设置CSS背景图再用a包裹。两者看起来效果一样,但在语义、SEO、无障碍、加载时机、点击区域和踩坑点上差别很大,选错很容易出现点了没反应、图片被裁、搜索收录不到等问题。
HTML本身只负责结构,真正让页面动起来的是JavaScript。把JS接入页面的路径主要有内联脚本、外部脚本、事件属性、动态加载和javascript伪协议五种。它们看似都能跑代码,但在执行时机、可维护性、安全性和对性能的影响上差别很大。很多页面白屏、点击没反应、被CSP拦截,往往就是选错了接入方式。下面逐一说明技术要点和适用场景。
div本身没有位置概念,默认就是按文档流从上往下排列,真正决定它位置的是CSS的position属性以及flex、grid等布局方式。很多页面出现元素跑到角落、父容器高度塌陷、弹窗被遮挡,根源都是没搞清定位参照和是否脱离文档流。下面梳理div常见的几种定位方法、适用场景和容易踩的坑。
absolute是CSS里最容易被滥用也最容易踩坑的定位方式。很多人写top、left发现元素跑到页面角落,或者父容器高度突然变成0,基本都是没理解它的包含块和脱离文档流这两个本质。掌握绝对定位,关键是搞清楚它相对谁定位、会不会占位、会不会被遮挡,以及和transform、层叠上下文的关系。
很多开发者以为只要调用cancel就能彻底停掉定时任务,实际线上经常遇到两种诡异现象:一是调用Timer.cancel后再schedule直接抛IllegalStateException,二是明明调用了TimerTask.cancel,Activity还是被泄漏引用。根源在于Timer和TimerTask的cancel语义完全不同,一个终止整个调度器,一个只标记单个任务。搞清源码层面的差异,才能避免踩坑。
很多开发者以为调用一下cancel就能彻底搞定Timer,实际在Android上,Timer带来的内存泄漏、任务突然全停、更新UI崩溃等问题,往往就出在没搞清它的取消语义和线程模型。Timer属于Java标准库,内部维护一个后台线程和任务队列,通过延迟或固定周期触发TimerTask,它本身完全不感知Android组件生命周期,也不保证调度的实时性。下面从取消机制、资源管理、典型场景三方面梳理。
build.prop是Android系统里存放系统属性的配置文件,通常位于/system目录,记录了设备型号、制造商、屏幕密度、系统版本等信息,也包含不少影响系统行为的开关。它常被拿来和Windows注册表类比,改对能实现定制,改错可能直接导致系统不稳定甚至无法开机。随着Android版本升级,系统分区普遍只读并开启dm-verity校验,直接改文件的难度和风险都比早年高很多,现在更推荐用模块化方式覆盖属性。
浏览器自带的alert和confirm虽然简单,但样式无法控制、会阻塞主线程,代码会一直等待用户响应,点击确定返回true、取消返回false,体验比较粗糙。实际项目里通常需要自定义对话框,既能承载表单、富文本、图片等复杂内容,又能配合动画和主题。常见实现路径有四种:手写div加遮罩、使用原生dialog元素、封装Promise式函数调用、借助UI组件库。下面分别说明实现思路和关键细节。
网页里经常需要“点图片跳转”,但HTML并没有给图片单独提供链接属性,必须靠结构或样式配合实现。常见路线有两条,一条是用a标签包裹img,另一条是给元素设置CSS背景图再用a包裹。两者看起来效果一样,但在语义、SEO、无障碍、加载时机、点击区域和踩坑点上差别很大,选错很容易出现点了没反应、图片被裁、搜索收录不到等问题。
HTML本身只负责结构,真正让页面动起来的是JavaScript。把JS接入页面的路径主要有内联脚本、外部脚本、事件属性、动态加载和javascript伪协议五种。它们看似都能跑代码,但在执行时机、可维护性、安全性和对性能的影响上差别很大。很多页面白屏、点击没反应、被CSP拦截,往往就是选错了接入方式。下面逐一说明技术要点和适用场景。
div本身没有位置概念,默认就是按文档流从上往下排列,真正决定它位置的是CSS的position属性以及flex、grid等布局方式。很多页面出现元素跑到角落、父容器高度塌陷、弹窗被遮挡,根源都是没搞清定位参照和是否脱离文档流。下面梳理div常见的几种定位方法、适用场景和容易踩的坑。
absolute是CSS里最容易被滥用也最容易踩坑的定位方式。很多人写top、left发现元素跑到页面角落,或者父容器高度突然变成0,基本都是没理解它的包含块和脱离文档流这两个本质。掌握绝对定位,关键是搞清楚它相对谁定位、会不会占位、会不会被遮挡,以及和transform、层叠上下文的关系。
很多开发者以为只要调用cancel就能彻底停掉定时任务,实际线上经常遇到两种诡异现象:一是调用Timer.cancel后再schedule直接抛IllegalStateException,二是明明调用了TimerTask.cancel,Activity还是被泄漏引用。根源在于Timer和TimerTask的cancel语义完全不同,一个终止整个调度器,一个只标记单个任务。搞清源码层面的差异,才能避免踩坑。
很多开发者以为调用一下cancel就能彻底搞定Timer,实际在Android上,Timer带来的内存泄漏、任务突然全停、更新UI崩溃等问题,往往就出在没搞清它的取消语义和线程模型。Timer属于Java标准库,内部维护一个后台线程和任务队列,通过延迟或固定周期触发TimerTask,它本身完全不感知Android组件生命周期,也不保证调度的实时性。下面从取消机制、资源管理、典型场景三方面梳理。
build.prop是Android系统里存放系统属性的配置文件,通常位于/system目录,记录了设备型号、制造商、屏幕密度、系统版本等信息,也包含不少影响系统行为的开关。它常被拿来和Windows注册表类比,改对能实现定制,改错可能直接导致系统不稳定甚至无法开机。随着Android版本升级,系统分区普遍只读并开启dm-verity校验,直接改文件的难度和风险都比早年高很多,现在更推荐用模块化方式覆盖属性。
浏览器自带的alert和confirm虽然简单,但样式无法控制、会阻塞主线程,代码会一直等待用户响应,点击确定返回true、取消返回false,体验比较粗糙。实际项目里通常需要自定义对话框,既能承载表单、富文本、图片等复杂内容,又能配合动画和主题。常见实现路径有四种:手写div加遮罩、使用原生dialog元素、封装Promise式函数调用、借助UI组件库。下面分别说明实现思路和关键细节。