深入解析:@scqilin/phone-ui 手机外观组件库

news/2025/9/28 18:53:22/文章来源:https://www.cnblogs.com/ljbguanli/p/19117400

深入解析:@scqilin/phone-ui 手机外观组件库

@scqilin/phone-ui 手机外观组件库

实际项目演示,左边编辑,右边预览,完美。

写在最前面

最近开发一个移动端编辑器,我需要一个非常轻量的“手机壳”来把内容包起来用于预览与截图。于是做了 @scqilin/phone-ui:一个零依赖、用原生 TypeScript 写的手机外观渲染库,核心目标是简单、可复用、易适配。我的目标很明确:

  • 零依赖:能用在任何项目里,不管是 Vue、React 还是原生 JS。
  • 纯粹:只做“手机外观”这一件事,保持轻量。
  • 易用:API 简单,上手快。

✨ 特点

安装

npm install @scqilin/phone-ui

快速开始

把下面这段代码扔进你的项目,就能看到效果。

HTML 结构:

<div id="phone-demo" style="width: 500px; height: 900px;"></div>

JS 调用:

import { createPhoneUI } from '@scqilin/phone-ui';
const container = document.getElementById('phone-demo');
// 方式一:使用预设机型
createPhoneUI({
container,
phoneType: 'iphone16pro'
});
// 方式二:完全自定义
createPhoneUI({
container,
width: 400,
height: 800,
frameColor: '#1a1a1a',
screenColor: '#ffffff',
showButtons: true
});

设计思路与权衡

1. 为什么是原生库,而不是 Vue/React 组件?

最开始我也想直接写个 Vue 组件,但很快发现,把核心做成原生库更灵活。

2. 样式隔离

为了避免污染宿主页面的样式,我没有让用户引入 CSS 文件,而是通过 JS 动态创建 <style> 标签并注入到 head 中。所有样式都带上了 phone-ui- 前缀,并通过 CSS 变量暴露定制接口,比如 --phone-ui-frame-color

API 文档

createPhoneUI(options)

参数类型必填说明
containerHTMLElement渲染目标容器
phoneTypestring机型名称,支持 'iphone16', 'iphone16plus', 'iphone16pro', 'iphone16promax'
widthnumber自定义宽度(phoneType 存在时无效)
heightnumber自定义高度(phoneType 存在时无效)
frameColorstring边框颜色,默认 '#1a1a1a'
screenColorstring屏幕颜色,默认 '#ffffff'
showButtonsboolean是否显示侧边按钮,默认 true
borderRadiusnumber圆角大小,默认 30

支持的机型

机型phoneType尺寸 (宽×高)
iPhone 16'iphone16'402×874
iPhone 16 Plus'iphone16plus'440×950
iPhone 16 Pro'iphone16pro'402×874
iPhone 16 Pro Max'iphone16promax'440×950

常见问题

关于 Vue 的适配

我最初尝试在 Vue 项目里直接用这个原生库,但发现不太“顺手”:

  1. 插槽不好用:想用 Vue 的 <slot> 功能把内容放进“手机屏幕”里,操作起来很别扭。
  2. 生命周期问题:必须在 onMounted 之后手动调用,在 onBeforeUnmount 手动销毁,很繁琐。

为了解决这个问题,我另外写了一个轻量的 Vue 3 适配包,它做的事情很简单:

  • 把原生库的 API 封装成一个真正的 Vue 组件。
  • onMountedonBeforeUnmount 管理生命周期。
  • 把组件的默认插槽内容正确地渲染到手机屏幕里。

现在,在 Vue 里可以这样用:


<script setup>
// 假设你已经安装并配置了 vue 适配包
import PhoneUi from '@scqilin/phone-ui-vue';
</script>

这样就舒服多了。这个 Vue 适配包是独立的项目,你可以在这里找到它:

  • Vue 适配包仓库: https://github.com/scqilin/phone-ui-vue
  • 相关博文: https://juejin.cn/post/7536120422825033743

结语

如果你对这个小项目感兴趣,或者希望支持其他机型,欢迎在 GitHub 上提 Issue 或 PR!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/920999.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

北京网站设计权威乐云践新站建设 app开发网站

原 Linux搭建SVN 服务器 发表于1年前(2014-08-05 17:55) 阅读&#xff08;12257&#xff09; | 评论&#xff08;3&#xff09; 31人收藏此文章, 我要收藏赞3摘要 Linux搭建SVN 服务器目录[-] Linux搭建SVN 服务器1 安装SVN2 使用客户端连接2.1 使用…

全景网站如何建设虚拟主机登录wordpress管理后台

本篇文章包含内容较多&#xff0c;请参照目录浏览,在每一部分结束或,有该部分可能遇到的问题0、开始本教程前请先备份电脑中的重要文件&#xff01;&#xff01;&#xff01;&#xff01;一、Ubuntu20.04 搭建更详细的内容请参照该博客&#xff1a;https://www.cnblogs.com/mas…

Tita项目与绩效一体化管理:驱动企业效能跃升的数字化引擎

在数字经济时代,企业竞争的核心已从单一业务能力转向组织整体效能的协同释放。项目管理作为企业战略落地的关键抓手,正面临从”任务执行”到”价值创造”的范式转变。Tita项目经营管理一体化平台,凭借其独特的项目与…

第七篇

今天是9月28日,今天是星期日但是补星期三的课,调休这玩意真是烦,早上上的离散和马克思主义基本原理,离散没咋明白,马原倒是听进去不少。

网站建设制作方法怎样建自己的网站免费的

1.IDEA修改maven路径无效 创建spring项目&#xff0c;Maven导入报错&#xff0c;无法正常导入jar报&#xff0c;发现setting中设置的maven路径不是自己下载的路径&#xff0c;修改后无效。运行之后maven路径又恢复为其默认的路径 解决方案&#xff1a; 删除.mvn文件&#xff0…

升级openssl影响

升级openssl影响在 CentOS(或者 RHEL 系)里,要判断 哪些软件依赖 OpenSSL,可以用几个不同层级的办法:1️⃣ 查询已安装软件包依赖(RPM 层面) # 哪些包依赖 openssl-libs rpm -q --whatrequires openssl-libs# 或…

Day23抽象类

package oop1.Demo8;//抽象类中,所由继承了它的子类,必须要实现它的方法~除非子类也是抽象类,那就继续套娃 public class A extends Action{@Overridepublic void dosomething() {} }package oop1.Demo8;//抽象类 …

陕西正天建设有限公司网站可以自己做网站赚钱吗

在宝塔面板环境下安装nps服务端 一、所需环境二、开始安装三、打开nps控制台四、更改默认账号密码和连接秘钥五、反向代理挂载SSL证书 一、所需环境 阿里云轻应用服务器&#xff08;选择宝塔应用镜像&#xff09;域名&#xff08;最好也是阿里注册的域名&#xff09;对应的ssl…

做影视网站犯法吗不用wordpress 知乎

总结&#xff1a; 初级&#xff1a;简单修改一下超参数&#xff0c;效果一般般但是够用&#xff0c;有时候甚至直接不够用 中级&#xff1a;optuna得出最好的超参数之后&#xff0c;再多一些epoch让train和testloss整体下降&#xff0c;然后结果就很不错。 高级&#xff1a;…

完整教程:开源的 CSS 动画库

完整教程:开源的 CSS 动画库pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco"…

ES 是否有类似mysql explain的语句诊断用法

目录一、explain API:分析查询匹配与索引使用1. 基本用法方式1:查询时添加 explain=true方式2:针对单个文档分析(推荐)2. 核心返回结果解读二、profile API:分析查询执行性能1. 基本用法2. 核心返回结果解读三、…

让每次语音唤醒都可靠,公牛沐光重构可观测体系

本文详细介绍了公牛沐光团队如何从开源监控方案 SkyWalking 成功迁移到阿里云 ARMS,构建起一套集观测、追踪、日志分析与智能告警于一体的全栈式可观测平台的实践历程。作者:公牛集团,周施乐 王雷 欧阳绩新;阿里云…

【2025-09-27】连岳摘抄

23:59自信与骄傲有异:自信者常沉着,而骄傲者常浮扬。——梁启超高三可能是人生压力最大的一年。高三生身体上发育成熟了,但大脑还没有,不能很好地控制自己的情绪。压力巨大与大脑未成熟,这对矛盾造成高三生容易暴…

第三周预习作业(AI)

第三周预习作业(AI)20231406王浩霖《密码系统设计》第三周预习报告 学习内容 《嗨翻C语言》第4章函数的使用与定义 参数传递与返回值 变量的作用域 头文件与多文件编程《Windows C/C++加密解密实战》第4章重点4.2, 4…

Python 爬虫 HTTPS 实战,requests httpx aiohttp 抓取技巧、证书问题与抓包调试全流程 - 教程

Python 爬虫 HTTPS 实战,requests httpx aiohttp 抓取技巧、证书问题与抓包调试全流程 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !imp…

网站建设中图片多少钱jsp网站开发 心得

Flask介绍 Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架&#xff0c;对于Werkzeug本质是Socket服务端&#xff0c;其用于接收http请求并对请求进行预处理&#xff0c;然后触发Flask框架&#xff0c;开发人员基于Flask框架提供的功能对请求进…

Codeforces 补题笔记

发现之前几乎所有的 Codeforces 场都是只打不补,意识到了只打不补本质上无任何提升的事实/ll Codeforces Round 1048 (Div. 2) 补题笔记

使用 Python 基于Ollama构建个人私有知识库(AI生成)

使用 Python 基于 Ollama 构建个人私有知识库是一个非常实用的项目,可以实现本地化、隐私安全的文档问答系统。以下是完整的路径和步骤,帮助你从零开始搭建一个基于 Ollama 的本地知识库系统。🌟 目标 构建一个本地…