一加 Ace 3 从 LineageOS 回到 ColorOS

<p>我至少从 <a href="https://cyrusyip.org/zh-cn/posts/2022/04/22/flash-miui-eu-on-xiaomi9se/#2023-05-19-%E6%9B%B4%E6%96%B0%E6%94%B9%E7%94%A8-lineageos">2023 年 5 月 19 日</a>就开始用 LineageOS,用了快 3 年了,一开始觉得不错,但是长期用下来真是感觉问题不少,和原厂系统比就是弊大于利。</p> <p>用 LineageOS 主要有两类问题,一是解锁 bootloader(引导程序)导致的问题,二是 LineageOS 的问题。每天经历种种不方便,我最后决定装回原厂系统。</p> <h2 class="heading" id="lineageos-的问题"> LineageOS 的问题<span class="heading__anchor"> <a href="#lineageos-%e7%9a%84%e9%97%ae%e9%a2%98">#</a></span> </h2><ul> <li>自动亮度功能很差,忽明忽暗(应该和机型相关,但是我用的手机都不正常)</li> <li>耗电(LineageOS 本身不会更耗电,但是根本管不动偷偷耗电的应用。我曾经用 Brevent 管理后台,然后发现应用宝居然 2 分钟内启动 18 次,被 Brevent 关闭了 18 次。用 Ice Box 也不好使,不见得省电,冷启动应用还更慢)</li> <li>没有钱包功能(银行卡 NFC 支付、交通卡、门禁卡,原厂系统才有)</li> <li>相机拍照质量没原厂系统好</li> <li>通话录音不好用(只能录通话,而且还是自己手动按的,不能录应用)</li> <li>农业银行应用经常闪退,不知道怎么回事</li> <li>在微信打开云闪付的活动链接会一片空白,不知道怎么回事</li> <li>没有之前用那么流畅了</li> </ul> <h2 class="heading" id="解锁-bootloader-的问题"> 解锁 bootloader 的问题<span class="heading__anchor"> <a href="#%e8%a7%a3%e9%94%81-bootloader-%e7%9a%84%e9%97%ae%e9%a2%98">#</a></span> </h2><p>解锁 bootloader 会破坏 TEE(trusted execution environment)和 Play Integrity,导致功能异常。</p> <ul> <li>指纹支付无法使用(支付宝是例外)</li> <li>部分银行应用无法使用</li> <li>铁路 12306 无法使用</li> <li>交管 12123 无法使用</li> </ul> <h2 class="heading" id="不知道什么原因导致的问题"> 不知道什么原因导致的问题<span class="heading__anchor"> <a href="#%e4%b8%8d%e7%9f%a5%e9%81%93%e4%bb%80%e4%b9%88%e5%8e%9f%e5%9b%a0%e5%af%bc%e8%87%b4%e7%9a%84%e9%97%ae%e9%a2%98">#</a></span> </h2><ul> <li>抖音无法使用(不记得什么报错)</li> <li>美团无法使用(提示网络问题)</li> </ul> <h2 class="heading" id="备份"> 备份<span class="heading__anchor"> <a href="#%e5%a4%87%e4%bb%bd">#</a></span> </h2><p>重装系统前先备份资料,参考以下帖子:</p> <ul> <li><a href="https://cyrusyip.org/zh-cn/posts/2025/10/11/oneplus-ace-3-install-lineageos-22/">给一加 Ace 3 安装 LineageOS 22.2 | 叶寻的博客</a></li> <li><a href="https://cyrusyip.org/zh-cn/posts/2022/04/22/flash-miui-eu-on-xiaomi9se/">小米 9 SE 刷欧版 MIUI 记录 | 叶寻的博客</a></li> </ul> <p>备份的内容:</p> <ul> <li><input checked="" disabled="" type="checkbox"> 备份微信聊天记录到电脑</li> <li><input checked="" disabled="" type="checkbox"> 截图记录,传到电脑 <ul> <li><input checked="" disabled="" type="checkbox"> 闹钟</li> <li><input checked="" disabled="" type="checkbox"> Outlook 账号</li> <li><input checked="" disabled="" type="checkbox"> 谷歌账号</li> <li><input checked="" disabled="" type="checkbox"> 星标联系人</li> </ul> </li> <li><input checked="" disabled="" type="checkbox"> 图片与文件(这次清理一下手机,不要图片了) <ul> <li><input disabled="" type="checkbox"> DCIM</li> <li><input disabled="" type="checkbox"> Download</li> <li><input disabled="" type="checkbox"> Documents</li> <li><input disabled="" type="checkbox"> Pictures</li> </ul> </li> <li><input checked="" disabled="" type="checkbox"> 应用列表 <ul> <li><input checked="" disabled="" type="checkbox"> 使用 <a href="https://play.google.com/store/apps/details?id=com.github.keeganwitt.applist">App List</a> 导出列表为 csv 传到电脑上,用 Office 应用可以看 csv 文件(注意把文件后缀改成 .csv)</li> </ul> </li> <li><input checked="" disabled="" type="checkbox"> 最后看一遍所有应用,看是否需要额外备份(多数联网应用都不需要备份,登录好就有数据了)</li> </ul> <h2 class="heading" id="下载工具"> 下载工具<span class="heading__anchor"> <a href="#%e4%b8%8b%e8%bd%bd%e5%b7%a5%e5%85%b7">#</a></span> </h2><p>这台手机之前用了以下系统:</p> <ol> <li>ColorOS 15</li> <li>LineageOS 22.2</li> <li>LineageOS 23.0(从 LineageOS 22.2 升级到这个版本)</li> </ol> <p>因为之前用 ColorOS 15,所以还是安装这个大版本。</p> <p>在<a href="https://yun.daxiaamu.com/OnePlus_Roms/%E4%B8%80%E5%8A%A0OnePlus%20Ace%203/ColorOS%20PJE110_15.0.0.870%28CN01%29%20C.48/">一加OnePlus Ace 3/ColorOS PJE110_15.0.0.870(CN01) C.48 - 一加手机官方ROM - 一加真我OPPO手机官方ROM下载</a>复制一个链接,用 aria2 下载。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">aria2c <span class="s2">&#34;https://gauss-componentotacostmanual-cn.allawnfs.com/remove-3c8478687554b5ab5861428600b9972c/component-ota/25/10/06/bbd6953c3313468aa9dbe4909ea8ad57.zip&#34;</span> </span></span></code></pre></td></tr></table> </div> </div><p>重命名安装包为 <code>PJE110_15.0.0.870.zip</code></p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">mv bbd6953c3313468aa9dbe4909ea8ad57.zip PJE110_15.0.0.870.zip </span></span></code></pre></td></tr></table> </div> </div><p>下载 <a href="https://t.me/gt3neo5hub/521/432865">Fastboot Firmware Flasher 1.0.2.1</a>(需要用到 Telegram)。打开 FastbootFirmwareFlasher_1.0.2.1.sfx.exe,选择解压目录(建议自己新建一个空目录),点击下面靠左的按钮解压。</p> <h2 class="heading" id="安装-coloros-15"> 安装 ColorOS 15<span class="heading__anchor"> <a href="#%e5%ae%89%e8%a3%85-coloros-15">#</a></span> </h2><p>安装 ColorOS 需要用 Windows 电脑,使用 fastboot 和 fastbootd 安装。</p> <p>可以先看 <a href="https://www.youtube.com/watch?v=OFQ3BJ60PzM">Fastboot Firmware Flasher 1.0.1.1 Update - YouTube</a>,了解整个安装流程。</p> <p>把手机重启到 fastboot(重启手机的瞬间按住音量下键)。</p> <p>打开桌面的 Fastboot Firmware Flasher,界面语言和系统语言一致。每个汉字我都认识,加起来就看不懂了,不对劲。没找到切换语言的地方,只好将系统语言设置为英文。</p> <p>打开 Fastboot Firmware Flasher,先检查 fastboot 和 fastbootd:</p> <ol> <li>选择左边的 「Drivers」</li> <li>点击「Delete Old Drivers」</li> <li>点击 「Install New Drivers」</li> <li>点击「Start test」,5 个步骤都走完了,没问题</li> </ol> <p>重启到 fastboot 模式:</p> <ol> <li>点击左边的「Device Control」</li> <li>点击中间的「Fastboot-Reboot to Bootloader」</li> <li>点击右边的「Fastboot-Refresh」,显示处于 Bootloader 模式</li> </ol> <p>解压固件:</p> <ol> <li>点击左边的「Firmware Unpacker」</li> <li>点击「File Picker」,选择「PJE110_15.0.0.870.zip」</li> <li>Select Mode 选择「Full」,点击 「Unpack」,点击「OK」</li> <li>显示「Unpacking Completed」就完成了</li> </ol> <p>安装固件:</p> <ol> <li>手机重启到系统,打开开发者模式和 ADB</li> <li>关闭 Fastboot Firmware Flasher,再打开(一开始没检测到解压好的固件,所以重新打开)</li> <li>点击左边的「Firmware Flasher」</li> <li>点击中间的「Firmware Flasher - Start」,这里显示了固件信息</li> <li>点击「Start」</li> <li>点击「Confirm」</li> <li>询问是否要 root 权限,选择 No(后续锁定 bootloader,不能有 root 权限)</li> <li>「reboot option」显示「Reboot from system」,没问题</li> <li>「Android version」显示「13-16」,没问题</li> <li>选择「Start Flashing」</li> <li>「USB Cable Test」通过,点击「Continue」</li> <li>显示「Stage 1 complete」,点击「Continue」</li> <li>显示「Flashing Complete」,点击「Delete Data」</li> <li>安装耗时 07:53,成功重启</li> </ol> <h2 class="heading" id="第二次安装-coloros-15"> 第二次安装 ColorOS 15<span class="heading__anchor"> <a href="#%e7%ac%ac%e4%ba%8c%e6%ac%a1%e5%ae%89%e8%a3%85-coloros-15">#</a></span> </h2><p>手机打开开发者模式和 USB 调试。现在再次安装 ColorOS 15,确保 a/b 槽位都是原厂系统,避免锁定 bootloader 时出错。</p> <p>电脑打开 Fastboot Firmware Flasher,点击左边的「Device Control」和右边的「ADB」和「Refresh」,可以看到槽位(Slot)是 <code>_a</code>。 再次用这个软件安装系统,详细步骤看前面。安装完系统槽位还是 <code>_a</code>,不过应该两个槽位都是原装系统了吧。</p> <p>这里没有使用手机本地安装,是因为解锁了 bootloader,系统禁止使用本地安装。</p> <h2 class="heading" id="测试-oneplus-pay"> 测试 OnePlus Pay<span class="heading__anchor"> <a href="#%e6%b5%8b%e8%af%95-oneplus-pay">#</a></span> </h2><p>添加中行和建行的信用卡,都显示银行卡不支持。看样子似乎没上锁的系统用不了。添加云闪付卡可以,但点击卡片显示 NFC 错误,感觉不太行。</p> <h2 class="heading" id="锁定-bootloader"> 锁定 bootloader<span class="heading__anchor"> <a href="#%e9%94%81%e5%ae%9a-bootloader">#</a></span> </h2><p>打开 Fastboot Firmware Flasher,锁定 bootloader:</p> <ol> <li>点击「Device Control」</li> <li>点击「ADB」</li> <li>点击「Reboot to Bootloader」</li> <li>点击「Fastboot」</li> <li>点击「Lock Bootloader」</li> <li>手机上用音量键和电源键确认锁定</li> </ol> <p>成功进入系统。将手机重启到 fastboot,可以看到底下写着 locked。</p> <p>再次测试 OnePlus Pay,四大银行(中国银行、农业银行、建设银行、工商银行)里面工行和中行不支持 NFC 支付,真差劲。更低端的红米 Turbo 3 都比一加 Ace 3 好,至少它四个银行都支持。</p> <h2 class="heading" id="升级系统"> 升级系统<span class="heading__anchor"> <a href="#%e5%8d%87%e7%ba%a7%e7%b3%bb%e7%bb%9f">#</a></span> </h2><p>在设置里面升级系统到最新的 ColorOS 16.0.5.701。</p> <h2 class="heading" id="恢复备份与设置"> 恢复备份与设置<span class="heading__anchor"> <a href="#%e6%81%a2%e5%a4%8d%e5%a4%87%e4%bb%bd%e4%b8%8e%e8%ae%be%e7%bd%ae">#</a></span> </h2><ul> <li><input checked="" disabled="" type="checkbox"> 在设置将分辨率设置到最高(一加这省电方式真不体面)</li> <li><input checked="" disabled="" type="checkbox"> 在设置关闭自动更新</li> <li><input checked="" disabled="" type="checkbox"> 安装 Google Play,登录谷歌账号</li> <li><input checked="" disabled="" type="checkbox"> 安装 BitWarden</li> <li><input checked="" disabled="" type="checkbox"> 根据应用列表安装应用</li> <li><input checked="" disabled="" type="checkbox"> 恢复微信聊天</li> <li><input checked="" disabled="" type="checkbox"> 恢复截图记录 <ul> <li><input checked="" disabled="" type="checkbox"> 设置闹钟</li> <li><input checked="" disabled="" type="checkbox"> 登录 Outlook 账号,同步联系人</li> <li><input checked="" disabled="" type="checkbox"> 登录谷歌账号</li> <li><input checked="" disabled="" type="checkbox"> 设置星标联系人</li> </ul> </li> </ul> <h2 class="heading" id="清理"> 清理<span class="heading__anchor"> <a href="#%e6%b8%85%e7%90%86">#</a></span> </h2><ul> <li><input checked="" disabled="" type="checkbox"> 删除微信聊天记录</li> <li><input checked="" disabled="" type="checkbox"> 删除电脑上的软件和安装包</li> </ul> <h2 class="heading" id="coloros-的问题"> ColorOS 的问题<span class="heading__anchor"> <a href="#coloros-%e7%9a%84%e9%97%ae%e9%a2%98">#</a></span> </h2><p>从 LineageOS 转到 ColorOS,也遇到了一些问题。</p> <table> <thead> <tr> <th>问题</th> <th>解决方法</th> </tr> </thead> <tbody> <tr> <td>Outlook 和 Google Tasks 无法发送通知</td> <td>在电池设置中允许后台运行</td> </tr> <tr> <td>无法单独给某个应用设置语言</td> <td>使用 <a href="https://github.com/VegaBobo/Language-Selector">Language-Selector</a>,要在开发者选项关闭权限监控,Shizuku 才能正常运行</td> </tr> <tr> <td>用 adb 安装应用,不能静默安装,会弹窗</td> <td>没发现解决方法</td> </tr> </tbody> </table> <h2 class="heading" id="coloros-使用体验"> ColorOS 使用体验<span class="heading__anchor"> <a href="#coloros-%e4%bd%bf%e7%94%a8%e4%bd%93%e9%aa%8c">#</a></span> </h2><p>这台一加 Ace 3,一开始是 ColorOS 14,现在升级到 ColorOS 16,依然流畅,比 Lineageos 还流畅。更省电更少发热。虽然有些小毛病,但总体还是优点更多,我感觉很满意。</p> <!-- 以下是安装驱动的步骤,后面发现 Fastboot Firmware Flasher 可以装驱动就删掉了。 在 [How To Guide - Flashing stock firmware on 12r/Ace 3 from fastboot. | XDA Forums](https://xdaforums.com/t/flashing-stock-firmware-on-12r-ace-3-from-fastboot.4719377/) 下载 USB 驱动,解压为 usb_driver。 接下来检查 fastboot 和 fastbootd,将手机插到电脑上,重启至 fastboot。 ```shell # 检查 fastboot 连接,显示设备就成功 fastboot devices # 重启到 fastbootd fastboot reboot fastboot ``` 现在手机显示 fastbootd,电脑显示 waiting for any device,卡住了,说明电脑检测不到 fastbootd 状态下的手机,要安装驱动。 在电脑打开设备管理器,找到其他设备,里面的 PJE110(也就是一加 Ace 3 的型号)有感叹号,右击。 1. 点击「更新驱动设备」 1. 点击「浏览我的电脑以查找驱动程序」 1. 选择「usb_driver」文件夹 1. 点击「下一步」 1. 点击「安装」 1. 显示成功 现在把手机重启到 fastboot,重新检测 fastboot 和 fastbootd。 ``` # 检查 fastboot 连接,显示设备就成功 fastboot devices # 重启到 fastbootd(这次显示 Finished) fastboot reboot fastboot # 检查 fastbootd 连接(显示有设备) fastboot devices ``` 已确认可以检测 fastboot 和 fastbootd。 -->

2026/5/16
阅读更多

傻屄不是傻逼

<!-- 语言腐化 --> <!-- 粗话弱化和日常化 --> <p>傻屄不是傻逼<br> 傻屌不是沙雕<br> 我肏不是卧槽</p> <!-- 贬义变褒义 --> <p>走心不是用心<br> 辞退不是毕业<br> 失业不是灵活就业</p> <!-- 加密词语 --> <p>拼多多不是拼夕夕<br> 淘宝不是橙色软件<br> 闲鱼不是海鲜市场</p> <!-- 注:「走心」意思是「变心」或者「走神」 -->

2026/4/16
阅读更多

可复现不沾铁锅

<p>让铁锅不沾非常简单,<strong>用红外线测温枪<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>来测铁锅温度,把倒入锅里的油加热到 300 摄氏度即可</strong>。先加热锅再倒油(热锅冷油),或者先倒油再加热(冷锅冷油),总之最后油温要达到 300 度。油温到 300 度后放凉到 200 度再开始炒菜也行。</p> <p>300 度时油烟较大,建议开窗开抽油机,还可以戴口罩。我用 KN95 级别带呼吸阀的口罩。</p> <p>这个方法我已经用两个星期了,非常有效。炒肉再也不怕粘锅了。</p> <hr> <p>正文写完了,再来多聊几句。我是从硬核料理男子 tiger 的两个视频学到的铁锅不沾方法:</p> <ol> <li><a href="https://www.youtube.com/watch?v=Sjkm33U7RuM">热锅冷油,到底要多热?无涂层不粘锅的本质和操作解析(第1期) - YouTube</a></li> <li><a href="https://www.youtube.com/watch?v=ho9TE5B_CUk">热锅冷油,所有油都一样吗?无涂层不粘锅中,食用油不粘性能测试(第2期) - YouTube</a></li> </ol> <p>哔哩哔哩也有同名视频。</p> <p>视频里面说油温 270 度至 280 度就可以了,我这边加热到 300 度更容易成功,可能是温度枪有些误差。</p> <p>传统的热锅冷油有效,但是不好量化。油温太低会粘锅,太高会多油烟、煮糊东西、甚至着火,我之前经常煮糊蒜末。铁锅真的让我感觉很挫败,差点想买回不粘锅。</p> <p>用测温枪基本上每次都能复现不沾,炒菜信心又增加了,它绝对是本年度最佳厨房工具!感谢<a href="https://meta.appinn.net/t/topic/80355/31">小众论坛的 baowenbei</a>和<a href="https://www.youtube.com/@tiger-sk8kz">硬核料理男子 tiger</a>。</p> <div class="footnotes" role="doc-endnotes"> <hr> <ol> <li id="fn:1"> <p>我买的是人民电器牌的测温枪,33.9 元。&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p> </li> </ol> </div>

2026/4/6
阅读更多

工行爱车信用卡:每月加油可省 20 元

<p>最近每升油价涨了五六毛,不知道各位读者加油的时候有没有心痛。如果有,可以试试工商银行爱车信用卡简约白金卡。它是可免年费的车主卡,已经帮我省下 50 元了,非常好用。</p> <h2 class="heading" id="年费与权益"> 年费与权益<span class="heading__anchor"> <a href="#%e5%b9%b4%e8%b4%b9%e4%b8%8e%e6%9d%83%e7%9b%8a">#</a></span> </h2><p>工行爱车卡年费 1000 元,<strong>消费 5 笔或者 5000 元即可免年费</strong>。不用担心年费,加油、充话费几次就解决了。</p> <p>工行爱车卡的优点是按比例返还现金,没有消费门槛,不像一些车主卡要求加油到某个数值(比如 200 元)、每月消费达标,或者要抢优惠券。<strong>周末(周六周日)加油后次日返还现金 10%,每周最多返还 10 元,每月最多返还 20 元</strong>。简单来说,每月加 200 元最划算,可以省 20 元,再多加就没返现了。</p> <p>工行爱车卡<strong>每月有 2 次充电 15 元减 5 元</strong>优惠,具体用法请看<a href="https://www.icbc.com.cn/column/796035264404348929.html">工商银行爱车信用卡简约白金卡官方介绍</a>。</p> <h2 class="heading" id="申请方法"> 申请方法<span class="heading__anchor"> <a href="#%e7%94%b3%e8%af%b7%e6%96%b9%e6%b3%95">#</a></span> </h2><p>工行爱车卡可以在中国工商银行 App 或者工银e生活 App 申请。注意卡片名称是爱车信用卡简约白金卡,不要搞错了。其他工行车主卡要么收年费,要么返现力度低。</p> <p>如果你是第一次申请工行的信用卡,记得到 e 生活微信小程序点击「新客有礼」,领取新客礼品。工行的优惠基本都在 e 生活领取,可以多去看看。</p> <h2 class="heading" id="注意事项"> 注意事项<span class="heading__anchor"> <a href="#%e6%b3%a8%e6%84%8f%e4%ba%8b%e9%a1%b9">#</a></span> </h2><p>用工行爱车卡有三点要注意,一是确认资金池未用完,二是去合作的加油站,三是按照正确的方式支付。</p> <h3 class="heading" id="资金池"> 资金池<span class="heading__anchor"> <a href="#%e8%b5%84%e9%87%91%e6%b1%a0">#</a></span> </h3><p>每月返现额度有限,加油前先确认返现资金池没被用完。查看方法:打开「工银e生活」,搜索「返现专区」,点击进入,点击「10%超级车返现 工银爱车信用卡」。资金池更新时间有延迟,我遇过 1 号看是 100%,2 号就是 12% 了。</p> <h3 class="heading" id="合作加油站"> 合作加油站<span class="heading__anchor"> <a href="#%e5%90%88%e4%bd%9c%e5%8a%a0%e6%b2%b9%e7%ab%99">#</a></span> </h3><p>加油要到工行合作的加油站才能返现,具体请看商户列表(点击<a href="https://www.icbc.com.cn/column/796035264404348929.html">爱车卡介绍</a>,在里面点击「车商户清单点击附件」,就可以下载商户表格)。可以先在地图搜索附近的加油站,再在车商户列表里面搜索是否有这一家加油站。多数中国石油加油站都可以。</p> <h3 class="heading" id="支付方式"> 支付方式<span class="heading__anchor"> <a href="#%e6%94%af%e4%bb%98%e6%96%b9%e5%bc%8f">#</a></span> </h3><p>支付时要通过工商银行的刷卡机(POS 机),用银联结算(支付宝和微信支付不行)。我试过用云闪付、闪付、手机闪付、插卡,次日下午 4 点都能收到返现。</p> <h2 class="heading" id="加油策略"> 加油策略<span class="heading__anchor"> <a href="#%e5%8a%a0%e6%b2%b9%e7%ad%96%e7%95%a5">#</a></span> </h2><p>最佳的加油策略是在每月首周加油 100 元,下周再加 100 元,这样可以趁早拿完返现额度,避免资金池耗尽。如果没到 100 元就加满也没关系,下周再加,直至拿够 20 元返现。</p> <p>工行爱车卡不是最省钱的车主卡,但大概是最省心的车主卡。</p>

2026/3/15
阅读更多

自己动手去除车玻璃油膜

<p>油膜是车玻璃上的顽固污垢,会影响视线,用玻璃水和雨刷(雨刮器)无法清除。油膜折磨我很久了,下雨天开雨刷,就是在均匀涂抹油膜,非常影响视线。终于自己动手解决了,很有成就感,嘻嘻😁。</p> <p>车玻璃去油膜需要氧化铈清洁剂,大概步骤如下:</p> <ol> <li>开车到自助洗车店(需要用高压水枪)。</li> <li>打开雨刷检修模式,自行抬起雨刷。</li> <li>喷水清洗玻璃,去除沙尘。</li> <li>将氧化铈清洁剂<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>(玻璃抛光剂)滴到玻璃上,用羊毛毡海绵均匀转圈揉搓整面挡风玻璃,如果擦不干净就稍微加大力度擦。这个方法的原理就是通过轻微抛光把玻璃表面的油膜擦掉。</li> <li>喷水清洗玻璃上的清洁剂。</li> <li>观察玻璃,确认清洗干净。如果仍不干净,可再滴清洁剂重复擦拭,然后喷水冲洗。</li> <li>用湿抹布擦干净残留的清洁剂。</li> <li>喷水清洗玻璃。</li> <li>放下雨刷。</li> <li>如果用雨刷之后又模糊,就是雨刷胶条脏了,换掉雨刷胶条即可。</li> </ol> <p>用氧化铈毕竟是打磨玻璃,建议清洁过后平时多清洁玻璃,避免油膜。</p> <hr> <p>下面是我的清洁记录。</p> <p>一开始用氧化铈清洁剂擦了三四轮挡风玻璃,玻璃干净了。用布擦了雨刷胶条,胶条还是能擦出黑色的污渍。喷玻璃水后用雨刷,玻璃又模糊了。上网买了雨刷胶条(雨刮片/雨刷片),自己换上后用雨刷也不脏了。</p> <p>我还买了防冻米其林玻璃水,它号称去污去除虫胶鸟粪。轩逸经典引擎支撑架居然在引擎上,怪不得我一开始找了很久没找到,看手册找到玻璃水仓。加玻璃水一定要看手册确认位置,注意不要倒去机油仓或者冷却液仓。大概花了 2 分钟喷完车里的玻璃水,倒了 2.4 升玻璃水也没倒满。以后打算开车前都喷玻璃水清洁玻璃,希望没那么快有油膜。</p> <p>极旅汽车玻璃油膜抛光剂(150 ML 清洁剂(成分:去离子水、氧化铈、分散剂NNO)、羊毛毡海绵、毛巾)约 17 元人民币,万孚雨刮片约 22.5 元,米其林玻璃水约 19 元,洗车约 15 元,共计 73.5 元。</p> <hr> <p>用氧化铈去油膜的方法是我在<a href="https://www.xiaoyuzhoufm.com/episode/693dcb342a383da167f2a8ec">粉丝惨遭二手车商套路,40天找不到车?告诉你怎么把黑车贩子干到破产! - 百车全说</a>这期节目听到的,感谢主播三刀。<a href="https://www.bilibili.com/video/BV1Sh4y197CR/">自己洗车|除油膜最靠谱的方法是。。。_哔哩哔哩_bilibili</a>这个视频讲得也不错,可以参考。</p> <div class="footnotes" role="doc-endnotes"> <hr> <ol> <li id="fn:1"> <p>氧化铈粉末比调配好的清洁剂便宜,但是有意外吸入的风险。我建议买调配好的清洁剂和配套工具,额外戴手套和口罩操作。&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p> </li> </ol> </div>

2026/1/4
阅读更多

PRORASO 桉树薄荷剃须皂使用体验

<p>PRORASO 桉树薄荷剃须皂(绿色包装)是一款经典的剃须皂,平时价格 50 元人民币左右,我发现天猫自营有 33.95 元的就买了。</p> <p>这款皂装在碗里,质地不硬,可以轻松用勺子挖出来。打泡沫有一点点难,没有 <a href="https://cyrusyip.org/zh-cn/posts/2025/09/29/arko-shaving-soap-stick-review/">Arko 皂棒</a>那么简单。打泡沫时少量多次加水,试多几次就会了。打好泡沫之后,把泡沫摸到手指再洗掉,手指会变得防滑。</p> <p>这款皂清凉舒爽,可提神和舒缓伤口。热天用很爽,冷天用有点凉。泡沫容易洗掉,不会像 Arko 那样让脸变干。</p> <p>已经用 2 个月了,还没用完,体验不错,没发现它有什么明显的缺点。</p>

2025/12/13
阅读更多

我不用或少用的剃须装备和护肤品

<p>本文列举了我不用或少用的剃须装备和护肤品,供对剃须和护肤感兴趣的读者参考。</p> <p>请注意,每个人肤质、胡须和需求不同,这里列举的产品只是不适合我,不一定就是坏产品。</p> <p>关于我目前用的剃须装备和护肤品,请看<a href="https://cyrusyip.org/zh-cn/posts/2025/12/13/shaving-and-skincare-products-i-use/">这篇文章</a>。</p> <h2 class="heading" id="剃须润滑--刀"> 剃须(润滑 / 刀)<span class="heading__anchor"> <a href="#%e5%89%83%e9%a1%bb%e6%b6%a6%e6%bb%91--%e5%88%80">#</a></span> </h2><p>剃须润滑产品:</p> <ul> <li>罐装剃须泡沫(刺激皮肤,不如剃须皂耐用)</li> <li>剃须啫喱(黏糊糊,沾到剃须刀上难清洁,在脸上也不容易洗掉,不如剃须皂耐用)</li> <li><a href="https://cyrusyip.org/zh-cn/posts/2025/09/29/arko-shaving-soap-stick-review/">Arko 皂棒(会让皮肤变干,洗脸后仍有部分残留在脸上)</a></li> </ul> <p>起泡碗:</p> <ul> <li>宠物慢食碗 350 毫升款(起泡碗,凸起太高,剃须皂残留在碗底,浪费剃须皂,打泡沫时阻力大)</li> </ul> <p>剃须刀:</p> <ul> <li>大多数盒式剃须刀(不耐用,贵,多达 5 层的刀片会更快刮掉保护皮肤的角质层) <ul> <li>舒适水次元 5 智能调压敏感肌(Schick Hydro Sensitive Skin Razor)</li> <li><a href="https://cyrusyip.org/zh-cn/posts/2025/09/05/gillette-skinguard-review/">吉列云感(Gillette SkinGuard)</a></li> <li>吉列锋隐至顺(Gillette ProGlide)</li> <li>吉列极光(GilletteLabs with Exfoliating Bar)</li> </ul> </li> <li>犀牛牌剃须刀(塑料材质太轻,剃须时需要自己额外加压力,操作难度大)</li> <li>百利 179D(我买的第一把双刃剃须刀,难操作,刮完皮肤火辣辣的。它差点让我弃用双刃剃须刀,坏的开始是失败的一半)</li> </ul> <p>顺便说个冷知识,其实犀牛牌剃须刀是吉列的产品。</p> <h2 class="heading" id="须后--保湿"> 须后 / 保湿<span class="heading__anchor"> <a href="#%e9%a1%bb%e5%90%8e--%e4%bf%9d%e6%b9%bf">#</a></span> </h2><ul> <li>大宝水凝保湿精华水 150ML(刺激皮肤)</li> <li>百雀羚维生素 E 精华乳(用了后皮肤有点紧绷)</li> </ul>

2025/12/12
阅读更多

我用的剃须装备和护肤品

<p>本文列举了我目前使用的剃须装备和护肤品,供对剃须和护肤感兴趣的读者参考。</p> <p>请注意,每个人肤质不同,这里列举的产品可能不适合你。</p> <p>我懒得写价钱,感兴趣的读者可以留言让我补充。</p> <p>关于我不用或少用的剃须装备和护肤品,请看<a href="https://cyrusyip.org/zh-cn/posts/2025/12/13/shaving-and-skincare-products-i-dont-use/">这篇文章</a>。</p> <h2 class="heading" id="须前--清洁"> 须前 / 清洁<span class="heading__anchor"> <a href="#%e9%a1%bb%e5%89%8d--%e6%b8%85%e6%b4%81">#</a></span> </h2><ul> <li>旁氏米粹洁面乳</li> <li>旁氏米粹洁面泡泡</li> </ul> <h2 class="heading" id="剃须皂--刷--支架--碗--刀--包--刀片"> 剃须(皂 / 刷 / 支架 / 碗 / 刀 / 包 / 刀片)<span class="heading__anchor"> <a href="#%e5%89%83%e9%a1%bb%e7%9a%82--%e5%88%b7--%e6%94%af%e6%9e%b6--%e7%a2%97--%e5%88%80--%e5%8c%85--%e5%88%80%e7%89%87">#</a></span> </h2><p>剃须皂和配套工具:</p> <ul> <li><a href="https://cyrusyip.org/zh-cn/posts/2025/12/14/proraso-shaving-soap-refreshing-review/">PRORASO 桉树薄荷剃须皂(绿色包装)</a></li> <li>10 厘米不锈钢勺子(用于挖剃须皂)</li> <li>FRUIT SONG 芦荟凝胶(加一些到剃须泡沫,泡沫会绵密水润)</li> <li>甘油(作用如上)</li> </ul> <p>剃须刷:</p> <ul> <li>2 个 YAQI 盲盒瑕疵剃须刷(第 2 只本来打算送给朋友,但是拿到手太喜欢就自己用了,哈哈)</li> </ul> <p>支架:</p> <ul> <li>2 个 YAQI 瑕疵剃须支架(可以同时放剃须刷和剃须刀,我一般只放剃须刷)</li> </ul> <p>起泡碗(内面有突起的碗更容易打泡沫,不过光滑的碗也是可以的):</p> <ul> <li>日式浮雕陶瓷碗</li> </ul> <p>剃须刀和配套工具:</p> <ul> <li>同诗 S9 电动剃须刀</li> <li>穆乐 Muhle R89 闭合式双刃剃须刀</li> <li>RazoRock OLD TYPE(UFO 手柄)开放式双刃剃须刀(RazoRock 的手柄防滑且沉重,非常好用,我用其他剃须刀也喜欢接这个手柄)</li> <li>超级蓝吉列(SUPER Gillette BLUE)闭合式双刃剃须刀</li> <li>帝诗便携安全剃须刀包</li> <li><a href="https://cyrusyip.org/zh-cn/posts/2025/09/29/schick-exacta-2-review/">舒适超巧(Schick Exacta 2)</a></li> </ul> <p>双刃刀片和配套产品(建议先买刀片体验套装,不同刀片的使用感受不一样,遇到合适的再多买):</p> <ul> <li>Astra Superior Platinum(俗称绿A)</li> <li>Bic Chrome Platinum(俗称黄比克)</li> <li>Derby Premium(俗称黑德比)</li> <li>Feather Hi-Stainless(俗称黄羽毛)</li> <li>Feather New Hi-Stainless(俗称黑羽毛)</li> <li>Perma-Sharp(俗称黄脸、马杀鸡<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>)</li> <li>Gillette Platinum(包装蓝底白字,俗称吉列纸飞机,中国产)</li> <li>软木塞(用刀片划软木塞,可以消除刀刃的毛刺)</li> <li>骰子(放在刀片旁标记使用次数)</li> </ul> <h2 class="heading" id="须后--保湿"> 须后 / 保湿<span class="heading__anchor"> <a href="#%e9%a1%bb%e5%90%8e--%e4%bf%9d%e6%b9%bf">#</a></span> </h2><p>止血:</p> <ul> <li><a href="https://cyrusyip.org/zh-cn/posts/2025/09/29/isooqi-alum-stick-review/">ISOOQI 60 克明矾棒</a>(涂了皮肤会干,所以只有出血的时候用)</li> </ul> <p>须后水 / 爽肤水:</p> <ul> <li>吾诺 UNO 爽肤水 200 ML(带柑橘味和一点酒精味)</li> </ul> <p>保湿:</p> <ul> <li>大宝 SOD 清爽保湿凝露(蓝瓶,热天用)</li> <li>大宝 SOD 蜜(红瓶,冷天用)</li> <li>曼秀雷敦润唇膏 SPF 15</li> </ul> <h2 class="heading" id="防晒"> 防晒<span class="heading__anchor"> <a href="#%e9%98%b2%e6%99%92">#</a></span> </h2><ul> <li>ANESSA 防晒霜 60ML</li> </ul> <div class="footnotes" role="doc-endnotes"> <hr> <ol> <li id="fn:1"> <p>搞不懂为什么 Perma-Sharp 被称为马杀鸡。这种让人摸不著头脑的黑话只会增加新手学习门槛。&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p> </li> </ol> </div>

2025/12/12
阅读更多

将一加 Ace 3 从 LineageOS 22.2 升级到 23.0

<p><a href="https://cyrusyip.org/zh-cn/posts/2025/10/11/oneplus-ace-3-install-lineageos-22/">昨天才装好 LineageOS 22.2</a>,今天就推出 23.0 了。这时 LineageOS 大版本升级保留数据的优势就体现出来了。</p> <p>虽然大版本升级会保留数据,但还是用 <a href="https://github.com/XayahSuSuSu/Android-DataBackup">DataBackup</a> 备份数据和应用,以防不测。将备份文件复制到 U 盘。</p> <p>按照<a href="https://wiki.lineageos.org/devices/aston/upgrade/">升级教程</a>来升级系统。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span><span class="lnt">4 </span><span class="lnt">5 </span><span class="lnt">6 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">adb -d reboot sideload </span></span><span class="line"><span class="cl">adb -d sideload lineage-23.0-20251012-nightly-aston-signed.zip </span></span><span class="line"><span class="cl"><span class="c1"># 重启至 recovery,安装谷歌套件(之前安装过,升级的时候也要安装新版本)</span> </span></span><span class="line"><span class="cl">adb -d sideload MindTheGapps-16.0.0-arm64-20250812_214353.zip </span></span><span class="line"><span class="cl"><span class="c1"># 安装 KernelSU Next 内核</span> </span></span><span class="line"><span class="cl">adb -d sideload ksu-next.zip </span></span></code></pre></td></tr></table> </div> </div><p>搞定,重启到系统,一切正常,删除 U 盘的备份。</p>

2025/10/11
阅读更多

给一加 Ace 3 安装 LineageOS 22.2

<p><strong>2025 年 10 月 12 日更新</strong>:LineageOS 已经更新到 23 版了,建议安装 23 版。安装了 22.2 版还得<a href="https://cyrusyip.org/zh-cn/posts/2025/10/12/oneplus-ace-3-from-lineageos-22-to-23/">升级到 23 版本</a>。</p> <p>PixelOS 15 三四个月没更新,我发现 LineageOS 22.2 已经支持一加 Ace 3,所以打算安装 LineageOS。我更喜欢 LineageOS,因为它每周更新,还支持大版本更新。</p> <h2 class="heading" id="备份"> 备份<span class="heading__anchor"> <a href="#%e5%a4%87%e4%bb%bd">#</a></span> </h2><ul> <li><input checked="" disabled="" type="checkbox"> 备份微信 1 到电脑</li> <li><input checked="" disabled="" type="checkbox"> 备份微信 2 到电脑</li> <li><input checked="" disabled="" type="checkbox"> 截图记录闹钟</li> <li><input checked="" disabled="" type="checkbox"> 截图记录 Outlook 账号</li> <li><input checked="" disabled="" type="checkbox"> 截图记录谷歌账号</li> <li><input checked="" disabled="" type="checkbox"> 截图记录星标联系人</li> <li><input checked="" disabled="" type="checkbox"> 截图记录 root 模块</li> <li><input checked="" disabled="" type="checkbox"> 用 <a href="https://github.com/XayahSuSuSu/Android-DataBackup">DataBackup</a> 备份(需要 root 权限) <ul> <li><input checked="" disabled="" type="checkbox"> DCIM</li> <li><input checked="" disabled="" type="checkbox"> Download</li> <li><input checked="" disabled="" type="checkbox"> Documents</li> <li><input checked="" disabled="" type="checkbox"> Pictures</li> <li><input checked="" disabled="" type="checkbox"> 应用(显示一个应用出错,不是微信就行)</li> <li><input checked="" disabled="" type="checkbox"> 测试删除应用后是否可以恢复</li> </ul> </li> <li><input disabled="" type="checkbox"> 将备份复制到电脑(显示需要一个半小时,USB 2.0 好慢,复制还会报错)</li> <li><input checked="" disabled="" type="checkbox"> 将备份复制到 U 盘(备份 50G,可以放到 64G 的 U 盘)</li> </ul> <h2 class="heading" id="退出谷歌账号"> 退出谷歌账号<span class="heading__anchor"> <a href="#%e9%80%80%e5%87%ba%e8%b0%b7%e6%ad%8c%e8%b4%a6%e5%8f%b7">#</a></span> </h2><p>退出谷歌账号,以免手机安装系统后被锁定。</p> <h2 class="heading" id="安装-lineageos-222"> 安装 LineageOS 22.2<span class="heading__anchor"> <a href="#%e5%ae%89%e8%a3%85-lineageos-222">#</a></span> </h2><p>先看完<a href="https://wiki.lineageos.org/devices/aston/install">安装教程</a>,要求手机使用 Android 15 固件。我的一加 Ace 3 之前用 ColorOS 15.0.0.500 系统,后来又安装了 15.0.0.820 固件,<a href="https://xdaforums.com/t/rom-official-lineageos-22-weeklies-for-oneplus-12r-ace-3.4669911/post-90320270">符合安装要求</a>。</p> <p>以下是安装流程记录(你安装的时候应该看教程,不要抄我的步骤):</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span><span class="lnt">4 </span><span class="lnt">5 </span><span class="lnt">6 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">fastboot flash boot boot.img </span></span><span class="line"><span class="cl">fastboot flash dtbo dtbo.img </span></span><span class="line"><span class="cl">fastboot flash init_boot init_boot.img </span></span><span class="line"><span class="cl">fastboot flash vbmeta vbmeta.img </span></span><span class="line"><span class="cl">fastboot flash vendor_boot vendor_boot.img </span></span><span class="line"><span class="cl">fastboot flash recovery recovery.img </span></span></code></pre></td></tr></table> </div> </div><p>在手机用音量键选择 Recovery mode,按电源键确认。</p> <p>清除数据:Factory Reset -&gt; Format data / factory reset</p> <p>安装系统:Apply Update -&gt; Apply from ADB</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-gdscript3" data-lang="gdscript3"><span class="line"><span class="cl"><span class="n">adb</span> <span class="o">-</span><span class="n">d</span> <span class="n">sideload</span> <span class="n">lineage</span><span class="o">-</span><span class="mf">22.2</span><span class="o">-</span><span class="mi">20251010</span><span class="o">-</span><span class="n">nightly</span><span class="o">-</span><span class="n">aston</span><span class="o">-</span><span class="n">signed</span><span class="o">.</span><span class="n">zip</span> </span></span></code></pre></td></tr></table> </div> </div><p>电脑显示 47% 进度,手机已经安装完系统了,询问是否重启到 recovery,选择 Yes。</p> <p>安装谷歌套件:Apply Update -&gt; Apply from ADB</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-gdscript3" data-lang="gdscript3"><span class="line"><span class="cl"><span class="n">adb</span> <span class="o">-</span><span class="n">d</span> <span class="n">sideload</span> <span class="n">MindTheGapps</span><span class="o">-</span><span class="mf">15.0</span><span class="o">.</span><span class="mi">0</span><span class="o">-</span><span class="n">arm64</span><span class="o">-</span><span class="mi">20250812</span><span class="n">_214357</span><span class="o">.</span><span class="n">zip</span> </span></span></code></pre></td></tr></table> </div> </div><p>手机显示 Signature verification failed(签名认证失败),选择 Yes,继续安装。</p> <p>选择 Reboot system now,进入系统。</p> <h2 class="heading" id="获取-root-权限"> 获取 root 权限<span class="heading__anchor"> <a href="#%e8%8e%b7%e5%8f%96-root-%e6%9d%83%e9%99%90">#</a></span> </h2><p>恢复备份需要 root 权限,试一下我之前没用过的 KernelSU Next。</p> <p>内核在 <a href="https://github.com/inferno0230/kernel_oneplus_sm8550-CI/releases">https://github.com/inferno0230/kernel_oneplus_sm8550-CI/releases</a> 下载。这次我用的是 <a href="https://github.com/inferno0230/kernel_oneplus_sm8550-CI/releases/download/LineageOS_OPSM8550-v5.15.189-20251008/ksu-next.zip">https://github.com/inferno0230/kernel_oneplus_sm8550-CI/releases/download/LineageOS_OPSM8550-v5.15.189-20251008/ksu-next.zip</a>。</p> <p>管理器在 <a href="https://github.com/KernelSU-Next/KernelSU-Next/releases">https://github.com/KernelSU-Next/KernelSU-Next/releases</a> 下载,这次我用的是 <a href="https://github.com/KernelSU-Next/KernelSU-Next/releases/download/v1.1.1/KernelSU_Next_v1.1.1-spoofed_12851-release.apk">https://github.com/KernelSU-Next/KernelSU-Next/releases/download/v1.1.1/KernelSU_Next_v1.1.1-spoofed_12851-release.apk</a>。</p> <p>在手机开启开发者模式,开启 USB debugging,连接电脑,同意 USB debugging。</p> <p>安装管理器:</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">adb install KernelSU_Next_v1.1.1-spoofed_12851-release.apk </span></span></code></pre></td></tr></table> </div> </div><p>按住电源下键,重启手机到 fastboot,再进入 recovery。</p> <p>安装内核:Apply Update -&gt; Apply from ADB</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-gdscript3" data-lang="gdscript3"><span class="line"><span class="cl"><span class="n">adb</span> <span class="o">-</span><span class="n">d</span> <span class="n">sideload</span> <span class="n">ksu</span><span class="o">-</span><span class="n">next</span><span class="o">.</span><span class="n">zip</span> </span></span></code></pre></td></tr></table> </div> </div><p>手机显示 Signature verification failed(签名认证失败),选择 Yes,继续安装。</p> <p>选择 Reboot system now,进入系统。</p> <p>打开 KernelSU Next,显示 working(运作中)。</p> <p>安装 <a href="https://github.com/ZG089/Re-Malwack">Re-Malwack</a> 和 <a href="https://github.com/gloeyisk/universal-gms-doze">universal-gms-doze</a>。</p> <h2 class="heading" id="恢复备份"> 恢复备份<span class="heading__anchor"> <a href="#%e6%81%a2%e5%a4%8d%e5%a4%87%e4%bb%bd">#</a></span> </h2><ul> <li><input checked="" disabled="" type="checkbox"> 复制备份到手机</li> <li><input checked="" disabled="" type="checkbox"> 恢复数据</li> <li><input checked="" disabled="" type="checkbox"> 恢复应用(高德地图恢复失败,其他没事)</li> </ul> <h2 class="heading" id="删除备份"> 删除备份<span class="heading__anchor"> <a href="#%e5%88%a0%e9%99%a4%e5%a4%87%e4%bb%bd">#</a></span> </h2><ul> <li><input checked="" disabled="" type="checkbox"> 删除 U 盘的应用和数据备份</li> <li><input checked="" disabled="" type="checkbox"> 删除电脑的微信聊天记录备份</li> </ul> <h2 class="heading" id="设置"> 设置<span class="heading__anchor"> <a href="#%e8%ae%be%e7%bd%ae">#</a></span> </h2><ul> <li><input checked="" disabled="" type="checkbox"> 登录 Bitwarden</li> <li><input checked="" disabled="" type="checkbox"> 登录 Outlook <ul> <li><input checked="" disabled="" type="checkbox"> 开启联系人同步</li> </ul> </li> <li><input checked="" disabled="" type="checkbox"> 登录谷歌账号</li> <li><input checked="" disabled="" type="checkbox"> 登录支付宝。居然可以用指纹支付了,惊喜!微信和云闪付还是无法开启指纹支付。</li> <li><input checked="" disabled="" type="checkbox"> 锁屏时关闭敏感通知</li> <li><input checked="" disabled="" type="checkbox"> 设置星标联系人</li> <li><input checked="" disabled="" type="checkbox"> 设置闹钟</li> <li><input disabled="" type="checkbox"> 安装 <a href="https://github.com/althafvly/ih8sn/releases/tag/latest">althafvly/ih8sn</a>(用 recovery 安装了 2024-11-16 发布的版本)。安装后无法启动系统,我就卸载掉了。安装<a href="https://github.com/ItsVixano/ih8sn/releases">ItsVixano/ih8sn</a>,系统能开机,但是不能通过 Play Integrity 和 SafetyNet,所以还是卸载掉了。目前 Play Integrity 检测结果是都不通过。</li> </ul> <h2 class="heading" id="lineageos-22-和-pixelos-的功能对比"> LineageOS 22 和 PixelOS 的功能对比<span class="heading__anchor"> <a href="#lineageos-22-%e5%92%8c-pixelos-%e7%9a%84%e5%8a%9f%e8%83%bd%e5%af%b9%e6%af%94">#</a></span> </h2><p>PixelOS 的特色功能:</p> <ul> <li>人脸识别解锁</li> <li>通过 Play Integrity 的前两项</li> </ul> <p>LineageOS 的特色功能:</p> <ul> <li>通话录音(需要手动按)</li> </ul>

2025/10/10
阅读更多

别过度手动剃须

<p>最近两三天,我每天手动剃须一到两次。无论是用我很熟悉的<a href="https://cyrusyip.org/zh-cn/posts/2025/09/29/schick-exacta-2-review/">舒适超巧</a>还是新买的百利 179D,脸部皮肤都有刺痛感和灼烧感(razor burn),涂明矾后刺激感尤其明显。之前用舒适超巧没出现这样的问题。</p> <p>通过一段时间的实验,我发现问题的原因是手动剃须频率太高。将剃须频率降低到两三天一次后就没事了。</p> <p>用手动剃须刀时,刮掉的不仅仅是胡子,还有皮肤最外面的角质层。频繁剃须让角质层被刮得比生长得快,进而导致皮肤受伤。</p> <p>两三天才刮一次胡子,那胡子长出来怎么办?当然是用不会刮掉角质层的电动剃须刀。顺便说一句,电动剃须刀也得清洗和换刀头。刀片切过胡子,一定会越来越钝,太钝的刀片会扯胡子。不清洗剃须刀,剃须刀里面会滋生细菌,臭烘烘的,这些细菌甚至会感染皮肤,让皮肤又红又痒。</p>

2025/10/7
阅读更多

同诗 S9 便携剃须刀使用体验

<p>平时我用手动剃须刀,剃须少说也要十分钟,还要配套工具。有时候没时间或者不方便用手动剃须刀,所以我打算买一把便携剃须刀备用。我希望这把剃须刀在用着舒适的情况下,尽量剃得干净。</p> <p>我买的同诗 S9 价格是 367.2 元人民币。一组刀头价格是 49 元,替换成本不算高,花费可能比盒式剃须刀还便宜。同诗 S9 使用后还可以无理由退货(建议购买前向客服确认),好评!</p> <p>选择同诗 S9 主要是看中它转速高(单个刀头每分钟最高 5000 转)、外观好看、小巧便携、USB Type-C 充电。这里批评一下商品页面写得 10000 rpm 转速,看起来很快,但这个转速简直是误导消费者,这 10000 rpm 是两个刀头的转速相加。转速根本就不能加起来,一个刀头它最高速度就是 5000 rpm。举个例子,两个人并排跑步,速度都是 10 km/h,你不能说他们速度加起来是 20 km/h,一起跑步又不会变快。</p> <p>我买的颜色是冰河银。外观确实不错,表面看起来是金属,拿着重量也是金属,但是摸起来却是光滑的感觉。表面摸多了就有点黏糊糊的。我还以为贴了膜,刮半天发现并没有膜。有收纳袋,但是没有刀头保护盖。</p> <p>正面写着 PUNK(朋克)和 CHAOKU SHAVER(超酷剃须刀)。你的外观已经够酷了,不用说出来,好吗?</p> <p>同诗 S9 用 3 种颜色表示 3 个档位。什么颜色对应什么档位呢?<del>看说明书</del>闭上眼睛仔细地听吧。</p> <p>听,<del>海哭</del>刀片的声音~叹息着谁又被伤了心~</p> <p>蓝色是 1 档,最低速。青色是 2 档。绿色是 3 档。长按开关会启动旅行锁,此时按开关不会启动剃须刀,长按开关即可解锁旅行锁。</p> <p>从档位显示这里就可以看出这是一把极简的剃须刀,所以电量显示肯定没有,只有低电量的时候才闪灯提醒。同诗 S9 电量不足时会扯胡子,所以最好提前充电,避免电量不足,它闪灯就不要用了。</p> <p>同诗 S9 剃须舒适,有盒式剃须刀七八成的效果,不会让脸看着邋遢。刀网压在皮肤上可以剃得更干净,但是这样会痛。刮下巴底下的胡子有时候会痛。</p> <p>最近用盒式剃须刀刮上唇附近的胡子时不时刮伤,我就用同诗 S9 比较多。因为电动剃须刀有刀网保护皮肤,所以不会刮伤。即使电动剃须刀剃得不是很干净,也可以多剃几次。盒式剃须刀的刀片直接接触皮肤,刮多了容易把皮肤磨掉。</p> <p>同诗 S9 是便携式剃须刀,可以轻松放进裤袋。出行的时候带它,确实比带盒式剃须刀省事多了。盒式剃须刀配套的装备比较多,有洗面奶、剃须皂、剃须刷、明矾、面霜。</p> <p>说明书没写拆卸刀头的方法,要问客服要视频。要用牙签挑出来,后续安装有点麻烦。同诗 S9 的刀头是磁吸的,方便拿下来。我剃了胡子之后就取下刀头,抓着刀头,把底部往洗手盆拍,把胡渣拍出来。我每天睡前取下刀头后用水冲洗刀头和传动轴,再放着晾干。第二天早上刀头和机身都干了,可以继续用了。按照这个清洗方法,用了一段时间,刀头不臭。</p> <p>这把剃须刀可以湿剃,我试过搭配剃须啫喱或者剃须皂,都是没有干剃那么顺。尤其是剃须皂,用了之后刀头在皮肤移动时有阻力。</p> <p>评价后送电动鼻毛修剪器,Type-C 充电,机身小巧,全身可水洗。我用了 1 次,效果不错,但鼻子痒痒的,会打喷嚏。</p> <p>用同诗 S9 两个多星期了,剃须效果有点超出预期,满意。写完这段话没多久,有个刀头有异响,于是换货了。换货后用了 10 天,没问题。</p> <p>最后给厂商一些建议:加上档位和电量显示灯、把表面做成清爽的、把刀头设计成容易拆卸的。</p>

2025/9/29
阅读更多

Arko 剃须皂棒使用体验

<p><strong>2025-12-13 更新</strong>:Arko 会让皮肤变干,而且洗脸后还是有部分残留在脸上。<a href="https://cyrusyip.org/zh-cn/posts/2025/12/14/proraso-shaving-soap-refreshing-review/">PRORASO 桉树薄荷剃须皂</a>就没有这些缺点。</p> <hr> <p>买了 Arko 75g 皂棒 + 便携瓶子,21.8 元人民币。我还买了 YAQI 盲盒刷子(25 元),350 毫升宠物慢食碗(10.8 元,用来打泡沫)。</p> <p>剃须皂棒的用法:</p> <ol> <li>冲洗碗</li> <li>冲一下皂棒</li> <li>把皂棒按到碗里,旋转几下,留一些皂在碗里</li> <li>用刷子放到碗里旋转,顺时针旋转和逆时针旋转,很快出泡沫</li> <li>用刷子把泡沫抹到脸上,用刷子在脸上旋转</li> <li>剃须</li> <li>再次剃须前重新往脸抹泡沫</li> </ol> <p>这是我第一次用剃须皂,就和剃须啫喱对比一下吧。</p> <p>Arko 剃须皂防刮伤的效果比花王 Success 剃须啫喱(粉色保湿型、金色多刀片型)好很多,现在刮上唇和鼻子之间的胡子没那么容易受伤。</p> <p>用刷子抹泡沫非常方便,刮同一个地方前随时可以抹泡沫。用啫喱就比较麻烦,按出来涂了脸还得洗手(啫喱很滑)。</p> <p>剃须皂打出来的泡沫一冲就走,剃须啫喱则会粘在刀头上,水压不够冲不掉就得用牙刷配合,边刷边冲。</p> <p>Arko 皂棒的味道是老式肥皂的味道,我挺喜欢这种香味。Arko 皂棒的味道大,最好晾干后密封装到瓶子里,不然整个房间都是肥皂味。</p> <p>用了 Arko 皂棒之后脸有点干,要涂面霜保湿。Arko 皂棒被我扭断捏扁后放到京都念慈庵薄荷糖的圆盒(60 克)了,这个盒子正好可以放下皂棒。如果你也打算将皂棒放到圆盒,建议把整个皂棒扭成圆球再压进去,不要想我一样扭断皂棒。</p> <p>已经用了两三个星期 Arko 皂,感觉没用多少,真是便宜耐用。</p>

2025/9/28
阅读更多

ISOOQI 明矾棒使用体验

<p><strong>2025-10-28 更新</strong>:</p> <p>皮肤科医生告诉我:剃须后没有明显不适的话,不需要用须后产品(比如明矾),剃须后皮肤有细微刮伤不要紧,皮肤会在三至五天内自行恢复。</p> <p>明矾的副作用是让皮肤变干变紧绷,所以用了明矾要额外涂面霜补水。我建议只有明显出血或者刮伤才涂明矾,不要每次都涂明矾,以免皮肤失水。靓仔,你也不想让你帅气的脸庞变得干巴巴的,对吧。先失水再补水简直是在折磨皮肤啊。</p> <hr> <p>在淘宝买了 ISOOQI 明矾棒,60 克,有盖子,14.39 元人民币。商家说是 100% 钾明矾。</p> <p>明矾在剃须的主要作用是止血消炎。剃须后把明矾涂到脸上,痛表示刮伤了,不痛表示没刮伤。手指沾水后摸一下明矾,可以让手指变得防滑。</p> <p>刚打开明矾棒的时候凑过去问,明矾和盖子内部有股臭味。用了一次之后把明矾和盖子放桌子上,过了一天就不臭了。</p> <p>用水冲一下明矾棒,剃胡子后抹脸上,有伤口就会刺痛(明矾是一种盐,体会到伤口上撒盐的感觉了)。流血了抹几下也很快止血。</p> <p>十多二十秒后洗掉脸上的明矾,皮肤有点紧绷。</p> <p>明矾棒太小了,涂很多次才能涂满脸。更大面积的明矾块应该会比较好用。</p> <p>有可以拧紧的盖子,方便外出携带。</p> <p>明矾是物美价廉的剃须装备,推荐购买。明矾就像救护车,平时不一定会用,但是有它在就更安心。</p> <p>这款明矾棒底部会积水,盖上盖子闷着容易长疙瘩,用了不擦干也会起疙瘩。如果用力甩干水,明矾棒底部会松动,容易从底座掉落。</p> <p>2025-10-11 更新:拿到 40 天后,明矾棒已经从底座脱落,表面还有不少疙瘩。</p>

2025/9/28
阅读更多

舒适超巧:也许是盒式剃须刀的终点

<p>一把舒适牌的剃须刀,内含 2 层美国产刀片,你猜猜多少钱?</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span><span class="lnt">14 </span><span class="lnt">15 </span><span class="lnt">16 </span><span class="lnt">17 </span><span class="lnt">18 </span><span class="lnt">19 </span><span class="lnt">20 </span><span class="lnt">21 </span><span class="lnt">22 </span><span class="lnt">23 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">分 </span></span><span class="line"><span class="cl">割 </span></span><span class="line"><span class="cl">线 </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">分 </span></span><span class="line"><span class="cl">割 </span></span><span class="line"><span class="cl">线 </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">分 </span></span><span class="line"><span class="cl">割 </span></span><span class="line"><span class="cl">线 </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">分 </span></span><span class="line"><span class="cl">割 </span></span><span class="line"><span class="cl">线 </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">分 </span></span><span class="line"><span class="cl">割 </span></span><span class="line"><span class="cl">线 </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">分 </span></span><span class="line"><span class="cl">割 </span></span><span class="line"><span class="cl">线 </span></span></code></pre></td></tr></table> </div> </div><p>不要二十九块九,不要九块九。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span><span class="lnt">14 </span><span class="lnt">15 </span><span class="lnt">16 </span><span class="lnt">17 </span><span class="lnt">18 </span><span class="lnt">19 </span><span class="lnt">20 </span><span class="lnt">21 </span><span class="lnt">22 </span><span class="lnt">23 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">分 </span></span><span class="line"><span class="cl">割 </span></span><span class="line"><span class="cl">线 </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">分 </span></span><span class="line"><span class="cl">割 </span></span><span class="line"><span class="cl">线 </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">分 </span></span><span class="line"><span class="cl">割 </span></span><span class="line"><span class="cl">线 </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">分 </span></span><span class="line"><span class="cl">割 </span></span><span class="line"><span class="cl">线 </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">分 </span></span><span class="line"><span class="cl">割 </span></span><span class="line"><span class="cl">线 </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">分 </span></span><span class="line"><span class="cl">割 </span></span><span class="line"><span class="cl">线 </span></span></code></pre></td></tr></table> </div> </div><p>只需要三块三人民币。你没有听错,9.9 元就可以买到 3 把舒适超巧(Schick Exacta 2)剃须刀。是 3 把完整的剃须刀,不是 1 把刀架 + 3 个刀头。我在京东自营买了 3 把。一次买 12 把的话,1 把仅需 2.075 元。</p> <p>舒适超巧在旗舰店的价格:</p> <ul> <li>9.9 元 3 把,1 把 3.3 元</li> <li>14.9 元 6 把,1 把约 2.483 元</li> <li>24.9元 12 把,1 把 2.075 元</li> </ul> <p>我还在拼多多花 21.42 元买了 15 把,1 把仅需 1.428 元,用了 1 把,质量没问题。</p> <p>超巧刀头刀架一体,非常轻,可谓是把钱花到刀刃上。超巧只有两层刀片,配合刀头背部的按钮可以推出胡渣,一开水龙头就冲开胡渣了,但是直接把刀片间的位置做空不是更容易清洗吗?</p> <p>超巧刀头不可旋转,一次刮的距离应该尽量短。润滑条效果差,只能用一次。剃须一次后润滑条变大,有点突出,我们可以用指甲顶把润滑条边缘顶起来,再撕掉。2 层刀片其实是优点。盒式剃须刀的刀片不是越多越好,5 层刀片刮 1 次就相当于 1 层刀片刮 5 次,刮多了容易磨破皮肤。5 层刀片还会把胡子拉起来一点再切掉,用着有点不舒服。</p> <p>这几次剃须用的皂是 Arko 皂棒,以下是 6 次使用感受。</p> <p>第 1 次用,锋利度不错,但不太顺滑。剃须后涂明矾,刺激感 1/10 分。</p> <p>第 2 次用,锋利度还行。剃须后涂明矾,只有下巴周边有点刺激感,刺激感 1/10 分。</p> <p>第 3 次用,刮到 1 个小伤口(不痛),刮到 1 个小痘痘。剃须后涂明矾,只有那 2 个小伤口痛,刺激感 2/10 分。</p> <p>第 4 次用,没出血。剃须后涂明矾,极少刺激感,刺激感 1/10。这次感觉比较钝了。</p> <p>第 5 次用,刀片明显变钝。没刮出血,但是涂明矾后刺激感比较重,刺激感 3/10 分。感觉再继续用就危险了。</p> <p>第 6 次使用和第 5 次使用发生于同一天。刀片非常钝。我很自然地加大力度刮胡子,下巴有 1 处刮出血。还没涂明矾就觉得脸有点痛了,涂了明矾就更痛了,上唇周围和下巴周围都痛,刺激感 5/10 分。这把刀真的不能再用了,丢了。</p> <p>用完这把超巧后又用了两三把,没问题。</p> <p>我的胡子硬,长得快。超巧剃须刀最多用 4 次,只用 2 次会更舒服。</p> <p>我每天手动剃须 1 次。如果每把超巧用 2 次,每月需要花大概 31 元(<code>30/2*2.075</code>),这只是 1 个中高端盒式剃须刀刀头的价格;如果每把超巧用 3 次,每月需要花费 20.75 元;如果每把超巧用 4 次,每月需要花费大概15.56 元;</p> <p>虽然超巧剃须刀物美价廉,但也有缺点。超巧的缺点就是对新手来说难用,你需要一定的技术。第一,超巧刀头不可旋转,所以拉长距离刮有弧度的皮肤会容易刮伤。第二,超巧很轻,你可能会不自觉在剃须中用力按压,这可能导致刀片陷入皮肤造成受伤。换个角度想,超巧没有安全功能反而可以纠正错误的剃须手法。技术是可以磨练的,不必过于担心。</p> <p>盒式剃须刀有个问题,刀头贵。盒式剃须刀的刀片往往用几次就钝,如果一个刀头用 5 次就丢,刀头 30 元,那每月要花 180 元(<code>30/5*30</code>)。超巧哪怕用 2 次就丢,每月才花 31 元。超巧价格低廉,它也许是盒式剃须刀的终点。</p> <p>超巧也可以是盒式剃须刀的起点,如果你想以最低成本体验盒式剃须刀,那就买超巧和一瓶剃须泡沫。超巧并不适合没经验的新手,我更推荐新手用吉列云感。</p> <p>为什么标题说盒式剃须刀终点,因为盒式剃须刀只是手动剃须刀的一种,前方还有安全剃须刀和直剃刀等着你呢。</p> <p>超巧剃须刀评分:</p> <ul> <li>锋利:8/10</li> <li>顺滑:6/10</li> <li>安全:4/10</li> <li>性价比:10/10</li> </ul>

2025/9/28
阅读更多

第一次独自开车

<h2 class="heading" id="总结和感受"> 总结和感受<span class="heading__anchor"> <a href="#%e6%80%bb%e7%bb%93%e5%92%8c%e6%84%9f%e5%8f%97">#</a></span> </h2><p>独自开车第一感觉是紧张,没有老司机在旁边答疑解惑,出状况要怎么办?其实我已经有独自开车的能力,就差迈出这一步。</p> <p>除了紧张,独自开车的感受就是超爽!随时出发,随时休息。不用在乎乘客的感受,随时大脚油门,管它速度变化平不平稳,反正我开得爽,哈哈。随便开运动模式,顿挫也不管。我很喜欢开车,这次真是过足瘾了。</p> <p>丙地市区的交通状况较差,道路设计不合理,有时候要在很短的距离变换车道。司机有点野蛮,会挤来挤去。不过在这里开了几次之后就有信心在城市开车了。之前我在乡下开车没问题,到城市就怕。</p> <p>在城市开车的难点是经常变车道、找停车位。车道的话,看导航画面上方,尽量提前进入合适的车道。太经常看画面会分心,要学会听导航。变道要打转向灯请求旁边车道的司机让路。停车位的话,可以搜索目的地附近的停车场,也可以用百度地图的街景功能看路边有没有停车位。</p> <p>高速路有不少慢车在最左的快车道,降低通行效率。限速 120 km/h,这些车只有 100 km/h,而且它们前方一望无际。有些慢速车甚至和大车并排,让其他车无法超车。</p> <p>保持安全车距很重要,这样可以避免急刹和追尾。</p> <p>这次开车之后信心增长了很多,有勇气独自去陌生的地方了。</p> <h2 class="heading" id="第一天甲地到乙地"> 第一天:甲地到乙地<span class="heading__anchor"> <a href="#%e7%ac%ac%e4%b8%80%e5%a4%a9%e7%94%b2%e5%9c%b0%e5%88%b0%e4%b9%99%e5%9c%b0">#</a></span> </h2><p>先去加油站加满油,下午出发。地图显示 180 公里,大概 2 小时,95% 高速。实际用时 2 小时 25 分(中途休息)。</p> <p>开车前喝了东鹏提神,上高速没多久就下大雨,开了雨刷、近光灯和雾灯。开了大概十多分钟天又晴朗了。</p> <p>遇到几次道路施工。有些地方没有提前提示,只是接近施工处才出现椎桶。我有点没反应过来,快速看后视镜后换道,幸好没车在旁边车道。下次要尽快变道,如果太接近施工处还是先刹车,直接变道太危险。</p> <p>这次开车刻意练习扭头观察盲区(shoulder check),汇入主路和变道的时候都会用到。我扭头观察之后,车会左右偏移,不知道我的操作问题还是车的问题。</p> <p>进弯道前变道至弯道外侧,视野好了很多。开到一半就去服务站休息。喝完剩下的东鹏,吃面包,喝了些矿泉水。</p> <p>后半程比较多车,遇到危险情况。我在左车道,前方中间车道和右车道有货车并排,中间货车稍微压左线。我自己偏左一点加速超越,有嘟嘟嘟的声音,可能左轮压到排水渠了,车也飘了,吓死我。抓紧方向盘继续开,没撞到左边围栏和右边的货车。下次应该拉开距离,先闪灯鸣笛提醒货车开到车道中间,实在没条件就拉开距离等待机会吧。</p> <p>驶出高速,在市区开了十多分钟。市区车比较多,要提前打转向灯请求变道,不然有时候观察很久也没有变道条件。电动两轮车的行驶轨迹比较随机,要多加注意。</p> <p>到一个路口前时速 70 km/h,我想着降挡减速。从 D 挡挂到 L 挡,发动机嗡嗡响,转速涨到 5000 多,吓得我赶紧踩刹车,生怕转速超过警戒线。</p> <h2 class="heading" id="第二天乙地到丙地"> 第二天:乙地到丙地<span class="heading__anchor"> <a href="#%e7%ac%ac%e4%ba%8c%e5%a4%a9%e4%b9%99%e5%9c%b0%e5%88%b0%e4%b8%99%e5%9c%b0">#</a></span> </h2><p>早上 11 点左右出发。先找好目的地附近的停车场,高德地图显示 84 公里,1 小时 13 分,高速 81%。实际驾驶了 1 小时 21 分(不在最后一个高速服务站休息一会,没算停车花费的时间)。</p> <p>第一次从乙地开车到丙地,有点紧张。</p> <p>在高速路基本没什么问题,就是遇到一辆匝道汇入主路的车连续变道到左车道,我闪灯制止了。11 点多的阳光很晒,手的皮肤被晒得有点疼。</p> <p>离开高速前 2 公里,右车道有货车,我先从中间车道超越再转右车道。这个过程比较匆忙,要是右侧车多很可能没机会变道。2 公里很快走完,下次还是老老实实在右道吧,跟着大货车也不会很久。</p> <p>离开高速路后开了一段乡村道路,弯弯绕绕的,急刹了一次,后车司机按喇叭了。遇到一辆靠右的大货车,车打了左转灯但没动,我急刹后等待,两三秒大货车都不动。我往左借道超车,大货车就慢慢左转了,猛踩油门超越,有点后怕。</p> <p>然后进到市区,因为提前导航到停车场,所以不是很紧张。</p> <p>进停车场停好车,突发感觉不对劲。我以为找到是地面停车场,结果进到地下停车场了。换了另一个地图应用,刚出地下停车场,就发现地上停车场在右边,原来一开始来的时候没看到。开进去,停车位的线不明显,我参照周围车辆停车。第一次停的时候挡到前面的电动车位,又后退了一点。</p> <h2 class="heading" id="第三天在丙地探亲"> 第三天:在丙地探亲<span class="heading__anchor"> <a href="#%e7%ac%ac%e4%b8%89%e5%a4%a9%e5%9c%a8%e4%b8%99%e5%9c%b0%e6%8e%a2%e4%ba%b2">#</a></span> </h2><p>下午 6 点多出发去探亲,才 8.5 公里的路,开了半小时,下班时间的市区真堵车。这段路开得我头皮发麻,车挤车,导航时不时识别不到我在哪个车道。变道的时候扭头看盲区,脖子都累了。市区好多车,扭头看盲区很重要,只看后视镜是不够的。</p> <p>导航显示前方路口右转,我提前走到最右边。突然前面有临时停车的车辆,急刹,看后视镜,扭头看盲区,左转。开到路口前一两百米,右转道路才出现。这是什么设计呐,非要在路口前面变道吗!</p> <p>好多电动车钻缝隙,你们不怕小车,我怕你们。</p> <p>这段路真是锻炼车技,经常开几百米就要变车道,反应要快,打灯观察变道一气呵成。开到目的地,看了一下车,没剐蹭。</p> <h2 class="heading" id="第四天在丙地去吃饭逛景点去乙地"> 第四天:在丙地去吃饭逛景点,去乙地<span class="heading__anchor"> <a href="#%e7%ac%ac%e5%9b%9b%e5%a4%a9%e5%9c%a8%e4%b8%99%e5%9c%b0%e5%8e%bb%e5%90%83%e9%a5%ad%e9%80%9b%e6%99%af%e7%82%b9%e5%8e%bb%e4%b9%99%e5%9c%b0">#</a></span> </h2><p>和亲戚去吃饭,客人多,停车位不足。亲戚让我停在一辆车旁边,他把车停到外面。</p> <p>离开饭店的时候,走错方向,只好在窄路掉头,在两个方向的车来到之前搞定,史上最快的掉头。</p> <p>开车去景点,还是经常要换车道。快到路口的时候想往右边车道,突然发现地上是实线,又打方向回来。这次没观察就打方向了,幸好没事。</p> <p>开车去乙地,地图显示,61公里,50分钟。实际开了52分钟。</p> <h2 class="heading" id="第五天去办事去超市去甲地"> 第五天:去办事、去超市、去甲地<span class="heading__anchor"> <a href="#%e7%ac%ac%e4%ba%94%e5%a4%a9%e5%8e%bb%e5%8a%9e%e4%ba%8b%e5%8e%bb%e8%b6%85%e5%b8%82%e5%8e%bb%e7%94%b2%e5%9c%b0">#</a></span> </h2><p>去一个地方办事,说是有停车位,去到那里,门口都停满了。停了周围的停车位。</p> <p>去超市地下停车场,消费后到自助机器输入车牌号,可以免费停车 2 小时。</p> <p>买完东西,到地下停车场,找了很久车。到陌生的地方还是要拍视频拍照记录好停车位置。</p> <p>从丙地到甲地,选了另一条有段国道的路线,出高速走 12 公里国道。这段国道很多弯,晚上光线不好。今天又遇到前方弯道超车的,超讨厌这样的司机,这种人不出事完全是因为别人的忍让。看来进弯道前还是要开慢点,再加上闪灯和鸣笛。</p>

2025/9/10
阅读更多

吉列云感:适合新手的剃须刀

<p>在京东自营买了吉列云感(SkinGuard,绅适)剃须刀。1 刀架 + 2 刀头,附赠 2 瓶 20g 云感洗面奶,共 69.7 元人民币。这次买的刀柄产地为波兰,刀头产地为德国。</p> <p>云感剃须刀的特点是舒适安全,有双层刀片,刀片间有减压梳。云感用着确实不容易刮伤,给了我逆刮胡子的自信。我不会逆刮胡子,随便试试,居然只是有轻微刮伤,没有明显出血。</p> <p>两层刀片的剃须效果一般,剃须时需要多刮几遍。刀头背面有精细修毛刀。</p> <p>用大概十多次,刮胡子的时候感到有阻力,用更大力刮,嘴唇上面那里刮出三四个伤口。换了新刀头之后刮胡子就像一开始那样顺畅。</p> <p>云感可以用锋隐(Fusion)系列的刀柄。锋隐致顺(ProGlide)刀柄可以像左右两侧旋转刀头,把云感刀头安上去就更安全了。</p> <p>附赠的云感洗面奶难闻,没剃须啫喱好用,顶多应急的时候用。</p> <p>如果你是第一次尝试手动剃须刀,推荐你用云感,减少受伤机会,减少挫败感。</p> <p>最后推荐大家看大佳刮胡的视频评测:<a href="https://www.youtube.com/watch?v=1rJXkzFFuMI">【刮鬍刀評測】吉列刮鬍刀的誠意之作 吉列紳適 GILLETTE SKINGUARD RAZOR REVIEW - YouTube</a>。</p>

2025/9/4
阅读更多

赌气跟随超车的惊魂时刻

<p>开车到十字路口,我左转上坡时,有辆五菱右转挨着我嗖的一下上坡了。明明我左转有优先权,气得我深踩油门跟上去,准备用远光灯和喇叭警告五菱司机。</p> <p>坡道宽度刚好能过两辆小车,五菱前面有台两轮电动车,它开到左边超越电动车。我也跟着五菱超车,五菱超车完回右边之后,我前面出现一台三轮摩托车,damn,吓死我😱,好怕撞到!我稍微右转,夹在摩托车和电动车之间刀片超车了。</p> <p>在我惊魂未定的时候,五菱已不见踪影。跟随超车真危险,因为视野受限(前车能躲障碍物,我可能躲不过)和没有安全距离(前车急刹,我就追尾)。开车赌气也不好,要是心态冷静就不会经历这些了。</p>

2025/6/28
阅读更多

开自动挡不看挡杆换挡教程

<p>看到这篇文章你可能会想:「开自动挡挂 D 挡就走了,切换到 P/R/N 挡时车子都停下来了,看着挡杆也无妨。有必要不看挡杆换挡(盲操挡杆)吗。」当然有必要,不看挡杆换挡更帅啊,也更安全,更快。自动挡的前进档不止 D 挡,还有 S 挡、M 挡、L 挡。开车时需要根据情况换挡,低头看挡杆换挡会很危险,时速 60km/h 时,看 2 秒挡杆,相当于闭眼开了 33 米。下面是不看挡杆换挡的教程。</p> <p><strong>第一步,学会左手单手开车</strong>。左手可以抓方向盘的 6 点、9 点或者 12 点位置。不需要一直左手开车,换挡的时候控制好车就行。</p> <p><strong>第二步,记住档位顺序</strong>。以轩逸经典 2022 款的机械档杆为例,<strong>挡位从上到下是 P、R、N、D(Ds<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>)、L</strong>。<strong>进入N挡和D挡不需要按解锁键</strong>,这是盲操的关键,知道这个之后盲操一般就是动 1 格或者推拉到底。仪表盘会显示目前档位,换挡后可以看仪表盘确认是否进入目标挡位。</p> <p>自动挡挡位切换还有一些规律:</p> <ol> <li><strong>同方向挡位切换不需要踩刹车</strong>,比如:D 挡到 M 挡或者 L 挡(都是前进)。不同方向挡位切换要踩刹车(因为在行进时突然变方向会伤车),比如从 D 挡到 R 挡(前进到倒退)。</li> <li><strong>进入 N 挡不需要踩刹车</strong>(车子行进时不要挂 N 挡,N 挡没有发动机制动,不安全)。开车的时候如果不小心挂到 N 挡,踩着油门时车的转速会飙升,此时松油门挂回 D 挡就好,不需要刹停。</li> </ol> <p>介绍几个常用操作:</p> <ol> <li>起步(P-&gt;D): <ol> <li>踩刹车,按解锁键,下拉挡杆 1 格,进入 R 挡。不要松刹车,以免倒车。</li> <li>松开解锁键,下拉挡杆到底(没按解锁键,不会进 L 挡),进入 D 挡,松刹车。</li> <li>为什么不按下解锁键拉 3 格呢,因为这样要在心里数,会分心,力度也不好控制。</li> </ol> </li> <li>停车(D-&gt;N-&gt;P): <ol> <li>踩刹车,上推挡杆到底进入 N 挡,松刹车。</li> <li>踩刹车,按住解锁键,上推挡杆到底,进入 P 挡,松刹车。</li> </ol> </li> <li>进入陡坡(D-&gt;L): <ol> <li>按解锁键,下拉到底,进入 L 挡。</li> </ol> </li> <li>倒车(D-&gt;R): <ol> <li>踩刹车至车停下来,上推挡杆到底,进入 N 挡。</li> <li>按住解锁键,上推挡杆 1 格,进入 R 挡,松刹车。</li> </ol> </li> <li>临时停车等绿灯<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>(D/L -&gt; N): <ol> <li>踩刹车至车停下来,上推挡杆到底,进入 N 挡。</li> <li>拉起手刹,松刹车。</li> </ol> </li> </ol> <p>其他操作我就不写了,留给你自己想。</p> <p><strong>第三步,练习</strong>。先原地练习,熟练后再去空旷安全的路上练。记住进 N 挡 和 D 挡不需要解锁键,要么动 1 格,要么推拉到底。</p> <p>自己练的话,可以给自己定一个目标挡位,从其他挡位切进去。也可以设定一个起始挡位,切换到其他挡位。还可以叫朋友给你随机播报挡位,你来换挡。</p> <p>盲操其他类型的挡杆应该也差不多吧,就是单手开车、记住挡位顺序、练习。</p> <div class="footnotes" role="doc-endnotes"> <hr> <ol> <li id="fn:1"> <p>Ds 是轩逸的运动模式,在 D 挡状态时按下挡杆左边的小按钮即可使用。轩逸也有运动模式,想不到吧。&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p> </li> <li id="fn:2"> <p>在路口遇到红灯,明明是在等绿灯,为什么大家都说等红灯呢。&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p> </li> </ol> </div>

2025/6/27
阅读更多

英语的语气(陈述语气、祈使语气、虚拟语气)

<p>英语的常见语气(mood)有陈述语气(indicative mood)、祈使语气(imperative mood)、虚拟语气(subjunctive mood)。</p> <h2 class="heading" id="陈述语气indicative-mood"> 陈述语气(indicative mood)<span class="heading__anchor"> <a href="#%e9%99%88%e8%bf%b0%e8%af%ad%e6%b0%94indicative-mood">#</a></span> </h2><p>陈述语气用于陈述事实。</p> <p>例句:</p> <blockquote> <p>The cat ate a mouse.</p> <p>那只猫吃了一只老鼠。</p> </blockquote> <h2 class="heading" id="祈使语气imperative-mood"> 祈使语气(imperative mood)<span class="heading__anchor"> <a href="#%e7%a5%88%e4%bd%bf%e8%af%ad%e6%b0%94imperative-mood">#</a></span> </h2><p>祈使语气表示希望或者要求。祈使语气中开头一般是 you must 或者 you should,但这部分被省略,所以祈使语气以动词原形(不含 to 的动词不定式)开头。</p> <p>例句:</p> <blockquote> <p>(You must) Watch out! A car is coming.</p> <p>小心!有辆车来了。</p> <p>(You mustn&rsquo;t) Don&rsquo;t run!</p> <p>别跑!</p> </blockquote> <h2 class="heading" id="虚拟语气subjunctive-mood"> 虚拟语气(subjunctive mood)<span class="heading__anchor"> <a href="#%e8%99%9a%e6%8b%9f%e8%af%ad%e6%b0%94subjunctive-mood">#</a></span> </h2><p>虚拟语气表示期待或者非事实的情况,一般用于条件句。</p> <p><strong>使用虚拟语气时需要将动词倒退一个时态来表示非事实</strong>,例子:</p> <blockquote> <p>If I <strong>were</strong> rich, I <strong>would</strong> buy a big house.</p> <p>如果我有钱,我就买大房子。——现在时间非事实,其实我没钱,也没买大房子。</p> </blockquote> <p>时态倒退的动词写法是表示虚拟的标记。如果虚拟语气不改变动词的写法,那就和陈述语气一样,听者分不清是真是假。正是奇怪的写法才能让人知道这是虚拟语气。至于为什么用时态倒退的写法,<del>我怎么知道</del>可以理解为时光倒流才能改变已经发生的事情(这只是帮助理解的比喻)。</p> <h3 class="heading" id="与现在事实相反"> 与现在事实相反<span class="heading__anchor"> <a href="#%e4%b8%8e%e7%8e%b0%e5%9c%a8%e4%ba%8b%e5%ae%9e%e7%9b%b8%e5%8f%8d">#</a></span> </h3><p>使用与现在事实相反的虚拟语气时,动词写法要往过去倒退一个时态,也就是使用过去时的写法。条件句用过去时,主句用过去时助动词。注意 be 动词的过去式要用 were,不过也有人用 was 这样不正式的用法。</p> <p>句型:</p> <blockquote> <p>If + 主语 + 过去时动词, 主语 + would/could/might/should/ought to + 原形动词.</p> </blockquote> <p>非事实例句:</p> <blockquote> <p>If I <strong>were</strong> rich, I <strong>would</strong> buy a big house.</p> <p>如果我有钱,我就买大房子。</p> <p>If I <strong>had</strong> an apple, I <strong>could</strong> give it to you.</p> <p>如果我有一个苹果,我可以给你。</p> </blockquote> <p>事实例句:</p> <blockquote> <p>Because I am not rich, I can&rsquo;t buy a big house.</p> <p>因为我没钱,所以无法买大房子。</p> <p>I can&rsquo;t give you an apple, because I don&rsquo;t have one(one 指代前面的 apple).</p> <p>我不能给你一个苹果,因为我没有。</p> </blockquote> <h3 class="heading" id="与过去事实相反"> 与过去事实相反<span class="heading__anchor"> <a href="#%e4%b8%8e%e8%bf%87%e5%8e%bb%e4%ba%8b%e5%ae%9e%e7%9b%b8%e5%8f%8d">#</a></span> </h3><p>使用与现在事实相反的虚拟语气时,动词写法要往过去倒退一个时态,也就是使用过去完成时的写法。条件句用「had + 过去分词」,主句用「助动词过去时 + have + 过去分词」。</p> <p>句型:</p> <blockquote> <p>If + 主语 + had + 过去分词, 主语 + would/could/might/should/ought to + have + 过去分词.</p> </blockquote> <p>例句:</p> <blockquote> <p>If I <strong>had studied</strong> harder, I <strong>would have passed</strong> the exam.</p> <p>要是我当时更努力学习,我就通过考试了。</p> </blockquote> <h3 class="heading" id="将来低可能性"> 将来低可能性<span class="heading__anchor"> <a href="#%e5%b0%86%e6%9d%a5%e4%bd%8e%e5%8f%af%e8%83%bd%e6%80%a7">#</a></span> </h3><p>将来的事尚未发生,所以不存在将来事实。所谓与将来事实相反的虚拟语气,就是未来事件的低可能性和有一定可能性。下面先介绍低可能性的用法。</p> <p>使用与将来低可能性的虚拟语气时,如果动词直接倒退一个时态就变成现在时了,这样就无法和陈述语气区分开。要借助助动词表示将来虚拟语气,条件句用 should(should 是 shall 的过去时,此处的 should 没有「应该」的含义)或者 were to(be going to 的一种变体),主句用过去时助动词(表示低可能性)。If…should… 可翻译为「万一」。</p> <p>句型:</p> <blockquote> <p>If + 主语 + should/were to + 原形动词, 主语 + would/could/might/should/ought to + 原形动词.</p> </blockquote> <p>例句:</p> <blockquote> <p>If I <strong>should</strong> win the lottery, I <strong>would</strong> buy a car.</p> <p>如果我中了彩票,我会买一辆车。——将来中奖的可能性低。</p> <p>If aliens <strong>were to</strong> invade the Earth, humans <strong>might</strong> be defeated.</p> <p>万一外星人入侵地球,人类可能被击败。</p> </blockquote> <h3 class="heading" id="将来一定可能性"> 将来一定可能性<span class="heading__anchor"> <a href="#%e5%b0%86%e6%9d%a5%e4%b8%80%e5%ae%9a%e5%8f%af%e8%83%bd%e6%80%a7">#</a></span> </h3><p>表达将来一定可能性时,条件句用 should,主语用现在时的助动词。</p> <p>句型:</p> <blockquote> <p>If + 主语 + should+ 原形动词, 主语 + will/can/may/should/ought to + 原形动词.</p> </blockquote> <p>例句:</p> <blockquote> <p>If it <strong>should</strong> rain, I <strong>will</strong> stay home.</p> <p>万一下雨,我就待在家里。——有可能下雨,如果下雨了我就待在家里。</p> </blockquote> <h3 class="heading" id="混杂时间或者语气"> 混杂时间或者语气<span class="heading__anchor"> <a href="#%e6%b7%b7%e6%9d%82%e6%97%b6%e9%97%b4%e6%88%96%e8%80%85%e8%af%ad%e6%b0%94">#</a></span> </h3><p>从句和主句的时间或者语气可以不一致。</p> <p>例句:</p> <blockquote> <p>If I <strong>had invested</strong> in Bitcoin in 2010, I <strong>would</strong> be a billionaire now.</p> <p>要是我 2010 年投资了比特币,我现在就是亿万富翁了。——前半句与过去事实相反,后半句与现在事实相反。</p> <p>I <strong>should have</strong> paid for the meal, but I <strong>was</strong> too mean.</p> <p>我应该请客,但我那时太吝啬了。——过去时间,前半句非真实,后半句真实。</p> </blockquote> <h3 class="heading" id="省略-if-hadshouldwere-存在时"> 省略 if (had/should/were 存在时)<span class="heading__anchor"> <a href="#%e7%9c%81%e7%95%a5-if-hadshouldwere-%e5%ad%98%e5%9c%a8%e6%97%b6">#</a></span> </h3><p>如果条件句中有 had/should/were,可以将 if 省略,将 had/should/were 置于主语前。</p> <p>例句:</p> <blockquote> <p>If I <strong>were</strong> you, I <strong>would accept</strong> the job.</p> <p>= <strong>Were</strong> I you, I <strong>would accept</strong> the job.</p> <p>如果我是你,我会接受这份工作。——与现在事实相反。</p> </blockquote> <blockquote> <p>If they <strong>had known</strong> the truth, they <strong>would have stopped</strong> him.</p> <p>= <strong>Had they known</strong> the truth, they <strong>would have stopped</strong> him.</p> <p>要是他们知道真相,就会阻止他了。——与过去事实相反。</p> </blockquote> <blockquote> <p>If you <strong>should need</strong> help, I <strong>would give</strong> you a hand.</p> <p>= <strong>Should you need</strong> help, I <strong>would give</strong> you a hand.</p> <p>万一你需要帮忙,我会帮你。——与将来事实相反。</p> </blockquote> <h3 class="heading" id="条件句类别"> 条件句类别<span class="heading__anchor"> <a href="#%e6%9d%a1%e4%bb%b6%e5%8f%a5%e7%b1%bb%e5%88%ab">#</a></span> </h3><p>虚拟语气也可以归类到<a href="https://en.wikipedia.org/wiki/English_conditional_sentences">条件句(conditional sentences)</a>中,所以在这里顺便介绍一下条件句。</p> <p>英文条件句可以分为 4 类。</p> <ol> <li>零条件句(zero conditional):表明事实与真理,从句与主句都用一般现在时。</li> <li>第一条件句(first conditional):表明肯定的预测,条件句用一般现在时,主句用将来时(简称「主将从现」)。</li> <li>第二条件句(second conditional):与现在或者将来事实相反,也就是现在或者将来的虚拟语气。</li> <li>第三条件句(third conditional):与过去事实相反,也就是过去的虚拟语气。</li> </ol> <p>零条件句和第一条件句的例句:</p> <blockquote> <p>If you <strong>don&rsquo;t eat</strong> for a long time, you <strong>become</strong> hungry.(零条件句)</p> <p>如果你长时间不吃东西,你会饿。</p> <hr> <p>If you <strong>make</strong> a mistake, someone <strong>will</strong> let you know.(第一条件句)</p> <p>如果你犯错,有人会告诉你。</p> </blockquote> <h2 class="heading" id="参考资料"> 参考资料<span class="heading__anchor"> <a href="#%e5%8f%82%e8%80%83%e8%b5%84%e6%96%99">#</a></span> </h2><ul> <li><a href="https://book.douban.com/subject/25974373/">《赖氏经典英语语法新版》,2017 年 2 月第 1 版</a></li> <li><a href="https://book.douban.com/subject/34840714/">《旋元佑文法》,2021 年 3 月 初版</a></li> <li><a href="https://www.youtube.com/watch?v=-Skm12wNLa8">英语&quot;虚拟语气&quot;就是这么简单(看完就懂!) - YouTube</a>(<a href="https://www.bilibili.com/video/BV1bt4y1S779">哔哩哔哩</a>)</li> <li><a href="https://en.wikipedia.org/wiki/English_conditional_sentences">English conditional sentences - Wikipedia</a></li> </ul>

2025/6/24
阅读更多

开车通过路口和人行道的注意事项

<ol> <li>进入路口和人行道前松开油门,准备刹车减速,必要时刹车。</li> <li>身体前倾扩大视野,左右观察路况。</li> <li>遵守交通规则,按照地面标志和红绿灯通行。</li> <li>不要超越其他车道前面的车(不超齐头车),它会阻挡我们的视野,超过它可能就撞到横穿的车辆。如果前面的车刹停,司机可能在避让行人或者车,此时我们贸然超车就很危险。</li> <li>通行优先级(从高到低):行人 &gt; 直行车 &gt; 左转车 &gt; 右转车。</li> <li>转弯要打转向灯。</li> <li>如果转弯时如果自己通行优先级较低,就减速停车等待。</li> <li>如果直行时有车接近,按喇叭警示,看情况加速或者减速。</li> <li>转弯时不要跨越车道。比如:从左边第一车道左转,左转完还是在左边第一车道,不能在第二车道。</li> <li>左转转大弯,右转转小弯。也就是左转时靠近路口中心点左侧,右转时远离路口中心点。</li> </ol>

2025/6/16
阅读更多

触发 ABS,克服急刹恐惧

<p>我刚开车的时候不敢踩尽油门(感觉会很快),在朋友的鼓励下试着踩尽油门,发现其实加速没有我想象的快,踩多几次也就不怕了。后来开一台动力更强的车,借道超车踩尽油门,速度有点快,吓死我。还是得适应不同的车。</p> <p>油门敢踩尽了,刹车倒是不太敢踩尽,怕车子失控。虽然知道车子有 ABS(Anti-lock Braking System,防抱死制动系统),急刹也不会翻车,但心里还是害怕。</p> <p>今天下雨,就试试踩尽刹车触发 ABS 吧。开车去一个没人没车的地方,戴好安全带,观察四周,确定没人没人,开始尝试。用户手册说 ABS 在时速 5~10 km/h 以上才会触发,还要用力踩下刹车并踩住。</p> <p>一开始上坡速度是 20 km/h,用力踩刹车,没有触发 ABS。换成下坡,挂 D 挡,踩尽油门,时速到 30 km/h 的时候用力踩尽刹车,刹车踏板快速反复上下抖动(其实就是快速点刹,比人脚快多了),发出嘟嘟嘟的声音,此时我还是踩尽踏板。再试了两次,也触发 ABS 了。</p> <p>虽然观察路况提前刹车比较好,但遇到突发状况还是需要急刹,试过 ABS 之后就不怕急刹了。</p> <p>ABS 启动时会刹车踏板会弹脚,没遇到过可能一紧张就松开刹车了,正确做法是一直踩刹车。如果你还没试过,建议找个安全的地方试试。</p> <p>也许是太紧张,练完后呼吸胸口有点痛,半小时之后就没事了。这次有进步,之前练习急刹,踩了几下,没踩出 ABS,我就已经晕车想吐了。这次只是肚子不太舒服,还没晕车想吐。</p>

2025/6/13
阅读更多

从看蔡徐坤的迷因到听蔡徐坤的歌

<p>第一次知道蔡徐坤,是因为他的迷因(梗)太火爆了,在网上经常看到「鸡你太美<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>」和「蔡徐坤打篮球」的迷因视频。我还挺爱看蔡徐坤的迷因,哈哈。</p> <p>蔡徐坤的迷因影响力不小,我在现实中好多次听到小学生把用「坤」指代「鸡」。有武术门派叫坤门。有时间单位叫坤年(两年半)。</p> <p>后来看到蔡徐坤发律师函给哔哩哔哩表示滥用肖像,我就感觉他有点小气。我对蔡徐坤的印象比较片面,感觉他就是流量明星,没多少才华。</p> <p>再后来在《奔跑吧》节目看到蔡徐坤,感觉这个认真的男人还蛮帅。蔡徐坤有疑似强迫堕胎的争议之后,《奔跑吧》延迟播出,播出后蔡徐坤的画面都删除了。蔡徐坤仍然在新加坡开了场演唱会。之后就没看蔡徐坤有什么公共活动了。啊,迷因没有新素材了。</p> <p>偶然在 Youtube 听到蔡徐坤在 2024 年发布了 <a href="https://www.youtube.com/watch?v=5wCOON4TxwU">Remedy</a>。嗯,好听耶,MV 也很有格调,蔡徐坤的英语非常标准。原来蔡徐坤是歌手!单曲循环听了好几天,还去 KTV 唱过两三次,嘻嘻!情人我也听了,在 KTV 唱感觉有点油腻。</p> <p>最近发现蔡徐坤出了新歌 <a href="https://www.youtube.com/watch?v=TPyS382hHYM">Deadman</a>,一样好听(我不懂音乐,只能这样夸了),MV 画面更精良。1分钟开始那几段受伤画面太美啦!又开始单曲循环了,希望下次去 KTV 能点到这首歌。</p> <div class="footnotes" role="doc-endnotes"> <hr> <ol> <li id="fn:1"> <p>「只因你太美」这句歌词听着像「鸡你太美」。&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p> </li> </ol> </div>

2025/6/3
阅读更多

第一次交通事故

<p>前段时间经过限宽墩的时候撞到右前轮,车子弹出去,方向盘无法控制右前轮。我没事,车子也没撞到其他东西。</p> <p>下面是处理事故的大致过程:</p> <ol> <li>开危险警示灯</li> <li>报交警</li> <li>拍照(车子四边,坏掉的轮子远近各一张,共六张)</li> <li>尝试把车子往路边开,只挪动了一点</li> <li>交警到位,帮忙推车,维护交通秩序</li> <li>交警叫修理厂的师傅来把车子拖到修理厂(也可以拖到交警的停车场,但是最后还是要拖出来去修理厂,干脆就拖去修理厂吧)</li> <li>我和车子到修理厂后,拿上行驶证和驾驶证(可以用电子版)去交警那里要个交通事故责任认定书(我全责)</li> <li>报保险,让维修师傅和保险那边沟通(其实一开始就可以报保险了)</li> <li>等五六天车就修好了,维修费和拖车费都是保险报销</li> </ol> <p>事后想了下,应该是过限宽墩时没完全摆正车身,车速太快(三四十 km/h 吧)所以碰到一点限宽墩车子就弹出去了。开快大概是因为自己处于开车新手膨胀期,之前过了几次那个限宽墩都没问题,就过度自信了,通过时没有降低到合适的速度,也没怎么观察。</p> <p>幸好无人员伤亡,也没损害别的车子。以后不要过度自信。上哔哩哔哩学习了过限宽墩的方法,也就是车身摆正,尽量偏左,但不要碰到限宽墩左边,这样右边肯定够位置。这次撞限宽墩之后我都害怕再经过那个墩,后来按照方法慢慢开了几次又恢复信心了。</p>

2025/6/3
阅读更多

自动挡挡位的英文全称、含义和用法

<h2 class="heading" id="挡位含义"> 挡位含义<span class="heading__anchor"> <a href="#%e6%8c%a1%e4%bd%8d%e5%90%ab%e4%b9%89">#</a></span> </h2><ul> <li>P(park):驻车挡位,锁定变速器齿轮,通常配合手刹使用,长时停车时使用。</li> <li>R(reverse):倒挡,向后行驶时使用。</li> <li>N(neutral):空挡,变速器齿轮分离,发动机不提供动力。临时停车(如等红绿灯)搭配手刹使用,被拖车时也使用 N 挡。</li> <li>D(drive):前进挡,向前行驶时使用。</li> <li>L(low):低速挡,动力强速度慢,适合上陡坡和下陡坡,相当于 1 挡或者 2 挡。</li> <li>S(sport):运动模式,动力更强的 D 挡,转速提升,更费油;此挡位下更容易降挡,更难升挡。适合超车、上坡(动力强)、下坡(有发动机制动,避免过多使用脚刹使刹车片过热导致刹车失灵)。如果下坡还是过快就改用 L 挡。</li> <li>M(manual):手动模式,用法和手动挡汽车类似,司机使用拨片或者挡杆切换挡位,上下坡可以用低挡位,超车可以降挡。</li> </ul> <p>备注:N(neutral)的字面意思是中立,可以理解为车子不进不退。</p> <h2 class="heading" id="使用建议"> 使用建议<span class="heading__anchor"> <a href="#%e4%bd%bf%e7%94%a8%e5%bb%ba%e8%ae%ae">#</a></span> </h2><p>建议自动挡司机不要只用 D 挡,了解一下手动挡的挡位和自己车上的 L 挡、S 挡、M 挡,下坡的时候使用低挡位利用发动机制动。</p> <p>D 挡、L 挡、S 挡、M 挡是一组前进挡,和 P 挡、R 挡、N 挡之间切换需要刹停车子继续踩刹车来切换。</p> <p>D 挡、L 挡、S 挡、M 挡之间切换不需要踩刹车。注意不要在高速时切换到 L 挡,那样会导致发动机转速过快,建议刹车降速到 40 km/h 以下再换 L 挡。</p>

2025/5/29
阅读更多

新手开车感受

<h2 class="heading" id="慌张"> 慌张<span class="heading__anchor"> <a href="#%e6%85%8c%e5%bc%a0">#</a></span> </h2><p>虽然拿到了自动挡驾照,但在驾校只是学了通过驾考的方法,真的开车感觉很慌张,怕撞人或者撞车。我请朋友教我开车,练习几次之后好多了,但还是判断不好车的左右距离。我看了「<a href="https://www.bilibili.com/video/BV1J8411U7f2/?vd_source=877b7d3563ccffad2c1c51d28e0a197c">坐在车内,准确判断左右前后车距的方法,新手掌握后避免各种剐蹭 - 哔哩哔哩 bilibili</a>」这个视频,在车上画了两根线<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>,东西在线外就不会撞到。能判断左右距离之后基本就不慌张了。</p> <h2 class="heading" id="开心"> 开心<span class="heading__anchor"> <a href="#%e5%bc%80%e5%bf%83">#</a></span> </h2><p>学会开车之后感觉很开心,开小车可以免于日晒雨淋,可以自由地去更远的地方。开小车也更安全,毕竟是铁包肉,车里还有安全带和安全气囊。</p> <h2 class="heading" id="恼怒"> 恼怒<span class="heading__anchor"> <a href="#%e6%81%bc%e6%80%92">#</a></span> </h2><p>开车多了,在路上就容易感到愤怒,因为很多交通参与者不讲规矩,通常不尊重路权(道路优先权),也有影响别人驾驶。</p> <p>举些例子:</p> <ol> <li>小车不打转向灯突然切换车道</li> <li>塞车时有前车有空位,马上超车挤进去</li> <li>车在晚上一直开远光灯,对向来车时也不调成近光灯,无视对向来车开远近交替灯提醒</li> <li>电动车骑手在十字路口想着两点直线距离最近,不观察路况,不打转向灯</li> <li>行人不走人行道和人行横道,直接走在马路上,而且不靠边</li> <li>行人穿过马路不观察,而且跑得飞快</li> </ol> <p>今年的粗话肯定九成都是在车上说的,马路上的傻屄怎么那么多啊!开车不仅要自己开好,还要避开潜在危险。要观察路面情况,预测交通参与者的行为,还要设想前方道路的情况,开着开着就感觉脑子好累。</p> <div class="footnotes" role="doc-endnotes"> <hr> <ol> <li id="fn:1"> <p>调过座位之后这两根线没那么准了。&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p> </li> </ol> </div>

2025/5/21
阅读更多

自动挡半坡起步方法(手刹、左脚刹车、右脚刹车、上坡辅助、自动驻车、电子手刹)

<p>上坡起步的难点在于车子因重力而后溜,所以要先使用脚刹或者手刹防止车子后溜,再让车子有前进的力,这样松开刹车时车就不会后溜。虽然 C2 自动挡驾考不考上坡起步,但实际开车会用的上,比如:停车场出口、坡道堵车。</p> <p>本文介绍上坡起步的 3 个手动操作方法(手刹法、左脚刹车法、右脚刹车法)和 3 个电子辅助方法(上坡辅助法、自动驻车法、电子刹车法)。使用电子辅助方法前请看用户手册确认是否有相关功能:上坡辅助(hill-start assist control / HAC)、自动驻车(auto hold)、电子手刹(Electronic Parking Brake / EPB),如果没有相关功能,请使用手动操作方法。</p> <p><strong>注意:因为我开的车没有电子辅助功能,所以我只测试了 3 个手动操作方法。3 个电子辅助方法是我看资料总结的,如果你测试能行,欢迎留言告知,谢谢!</strong></p> <p>上坡结束后可以从 L 挡调到 D 挡。L 挡和 D 挡都是前进挡,所以换挡时不需要刹车。</p> <p>起步除了感觉车子是否移动,还可以参考转速表,一般 1500~2000 转之间即可。建议先在安全的平地练习,熟练后再去坡道练习。</p> <h2 class="heading" id="手刹法"> 手刹法<span class="heading__anchor"> <a href="#%e6%89%8b%e5%88%b9%e6%b3%95">#</a></span> </h2><ol> <li>右脚踩刹车,拉起手刹。</li> <li>松开刹车,确保车不后溜。车后溜则说明坡道太陡,手刹制动力度不足,请改用脚刹法。</li> <li>右脚踩刹车,调到动力更强的 L 挡<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>。</li> <li>左手抓稳方向盘,右脚踩油门,感觉车子动了就用右手放下手刹继续踩油门,右手放回方向盘。</li> </ol> <h2 class="heading" id="左脚刹车法"> 左脚刹车法<span class="heading__anchor"> <a href="#%e5%b7%a6%e8%84%9a%e5%88%b9%e8%bd%a6%e6%b3%95">#</a></span> </h2><ol> <li>左脚踩刹车,调到 L 挡,放下手刹,左脚一直踩刹车。如果右脚已经踩着刹车,那就右脚踩着刹车慢慢往右挪动,腾出空间让左脚踩上刹车。</li> <li>右脚踩油门,感觉车子动了就左脚松开放到一边,右脚继续踩油门。</li> </ol> <p>在平地以这样的方式用 D 挡起步速度更快,这叫弹射起步。不建议在上坡堵车走走停停时使用左脚刹车法,多次使用会让你分不清该用哪只脚踩刹车。</p> <p>均匀地松左脚会让起步更平稳,听到刹车发出吱吱声表示动力够了。</p> <h2 class="heading" id="右脚刹车法跟趾动作"> 右脚刹车法(跟趾动作)<span class="heading__anchor"> <a href="#%e5%8f%b3%e8%84%9a%e5%88%b9%e8%bd%a6%e6%b3%95%e8%b7%9f%e8%b6%be%e5%8a%a8%e4%bd%9c">#</a></span> </h2><ol> <li>右脚趾踩刹车,调到 L 挡,放下手刹,右脚趾一直踩刹车。</li> <li>以右脚趾为中心,逆时针摆动右脚,让右脚跟碰到油门。</li> <li>右脚跟踩油门,感觉车子动了就迅速把右脚滑到油门,继续踩油门。现在已经松开脚刹了。</li> </ol> <p>因为不同人的脚有差异,不同车的脚刹和油门也有大小、距离和高度的差异,所以并没有放之四海皆准的跟趾动作。我自己脚踩右半边脚刹,这样脚跟才容易踩到油门。有些人脚跟踩脚刹,脚尖踩油门。要多多练习才能发现适合自己的跟趾动作。</p> <p>跟趾动作最帅最方便,适合上坡堵车走走停停的情况。</p> <h2 class="heading" id="反向上坡起步"> 反向上坡起步<span class="heading__anchor"> <a href="#%e5%8f%8d%e5%90%91%e4%b8%8a%e5%9d%a1%e8%b5%b7%e6%ad%a5">#</a></span> </h2><p>如果需要在坡道上倒车(车头朝向下坡),就使用前面的手刹法、左脚刹车法、右脚刹车法,只需要将挡位从 L 挡换成 R 挡。</p> <p>反向上坡起步的使用场景有:</p> <ul> <li>自己停好车了,后来前面停的车离自己的车非常近。如果松开刹车去踩油门倒车,可能车子前溜就撞到前车了。此时需要稍微倒车给自己腾出空间转向。如果自己的车被前后夹击,可以去交管 12123 应用一键挪车。</li> <li>坡底有障碍物,自己的车离障碍物太近,需要倒车给自己的车腾出空间转向。</li> </ul> <p>有次女朋友开车下坡,坡底左前方有辆车,她右转,还是空间不够。她下车换我开,我给她展示了反向上坡起步,然后右转开出去了。<del>她投来崇拜的目光,说我太帅啦</del>。</p> <h2 class="heading" id="手刹法和脚刹法结合"> 手刹法和脚刹法结合<span class="heading__anchor"> <a href="#%e6%89%8b%e5%88%b9%e6%b3%95%e5%92%8c%e8%84%9a%e5%88%b9%e6%b3%95%e7%bb%93%e5%90%88">#</a></span> </h2><p>手刹法是三个半坡起步方法中最稳妥的,但是拉了手刹松开脚刹的一瞬间车还是会溜一点。自己的车离溜车方向的障碍物太近时,同时用手刹法和脚刹法就更稳妥,也就是踩刹车、拉手刹、踩油门、松刹车、松手刹。</p> <h2 class="heading" id="电子辅助"> 电子辅助<span class="heading__anchor"> <a href="#%e7%94%b5%e5%ad%90%e8%be%85%e5%8a%a9">#</a></span> </h2><p>目前有三种半坡起步的电子辅助技术:</p> <ol> <li>上坡辅助:车子在斜坡时,司机松开脚刹,车子会自动刹车两三秒,此时司机可以踩油门起步。</li> <li>自动驻车:自动驻车开启时,司机刹停车子再松开刹车,车子会继续刹车,踩油门就会解除刹车。</li> <li>电子手刹:踩油门时会自动解除电子手刹,我们可以利用此特点来上坡起步。</li> </ol> <div class="footnotes" role="doc-endnotes"> <hr> <ol> <li id="fn:1"> <p>如果车子有手动模式(M 档),使用手动模式的 1 挡。&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p> </li> </ol> </div>

2025/5/20
阅读更多

C2 自动挡汽车驾照考试经验

<p><strong>2026 年 5 月 28 日更新</strong>:我最近开始考手动挡驾照,用 ColorOS 的录音机录下教练讲的操作步骤,再用转文字和摘要功能,很快就可以根据原文和摘要整理好操作流程。极力推荐用这个办法记录操作流程,其他手机系统应该也有一样的功能。现在的人工智能工具真是太厉害了。之前我没发现这些功能,让教练讲一段,自己记一段,很费时间。</p> <hr> <p>过完年拿到证了,非常开心!和大家分享一下备考的经验。</p> <h2 class="heading" id="考试科目"> 考试科目<span class="heading__anchor"> <a href="#%e8%80%83%e8%af%95%e7%a7%91%e7%9b%ae">#</a></span> </h2><p>考试共四个科目,一般按顺序考试,科目一和科目四是笔试,科目二和科目三的实操。考完科目三可以当天考科目四,想快点拿证就在考科目三之前做好科目四的习题。</p> <h2 class="heading" id="科目一"> 科目一<span class="heading__anchor"> <a href="#%e7%a7%91%e7%9b%ae%e4%b8%80">#</a></span> </h2><p>做完驾考宝典的精简 500 题(需要开通 VIP),然后一直做模拟考试,连续两次过了 90 分就可以考虑报名考试,报名后继续做模拟考试。</p> <h2 class="heading" id="科目二"> 科目二<span class="heading__anchor"> <a href="#%e7%a7%91%e7%9b%ae%e4%ba%8c">#</a></span> </h2><p>科目二我把教练说的步骤逐字记到笔记应用,自己看着步骤练习,练多了就记住了。</p> <p>把步骤记下来之后就可以自己独立练习。倒车入库和侧方停车都可以自己中途暂停下来看对不对(记得拉手刹),直角转弯和曲线还是有人帮忙看比较好。</p> <p>考试前在考场模拟练习熟悉场地。</p> <p>考试开车不要太慢,我第一把倒车入库超时就不合格。不合格之后就继续走完全程,当练习。</p> <h2 class="heading" id="科目三"> 科目三<span class="heading__anchor"> <a href="#%e7%a7%91%e7%9b%ae%e4%b8%89">#</a></span> </h2><p>将路线图和步骤打印出来看,用 Anki 背,但是我感觉步骤太多了,我只记了转弯、掉头和变道,考试的时候也够用。如果转弯、掉头和变道也记不住的话,就只记超车前要在哪个车道(超车时在左道会考试失败,因为在左道无法超车),其他听语音。</p> <p>学校路段、人行横道、公交车站前要点刹(轻踩刹车踏板)。这没有语音提示,要自己记住。</p> <p>变道和转弯要打转向灯,中途方向盘大多了会灭灯,这时赶紧再次打灯。</p> <p>学会用雨刮器,不然下雨你就慌了。</p> <p>有危险自己赶紧刹车,安全员刹车就导致考试不合格。</p> <p>考试前在考场模拟练习熟悉场地。</p> <h2 class="heading" id="科目四"> 科目四<span class="heading__anchor"> <a href="#%e7%a7%91%e7%9b%ae%e5%9b%9b">#</a></span> </h2><p>科目四应该和科目一方法一样,就是做题。我考完科目三去没做题就去考科目四也通过了。</p> <h2 class="heading" id="上车起步下车"> 上车、起步、下车<span class="heading__anchor"> <a href="#%e4%b8%8a%e8%bd%a6%e8%b5%b7%e6%ad%a5%e4%b8%8b%e8%bd%a6">#</a></span> </h2><p>上车:</p> <ol> <li>上车调整座椅</li> <li>戴安全带</li> <li>调后视镜</li> </ol> <p>起步:</p> <ol> <li>踩住刹车</li> <li>调到前进档</li> <li>放下手刹</li> <li>松开刹车踏板</li> </ol> <p>下车:</p> <ol> <li>踩住刹车</li> <li>拉起手刹</li> <li>调到空档或者停车档</li> <li>松开刹车</li> </ol> <hr> <p>起步要先调档在放手刹。如果先放手刹,再调档,不小心调到倒车档就考试失败。下车先拉手刹也是一样的道理。</p> <h2 class="heading" id="心态"> 心态<span class="heading__anchor"> <a href="#%e5%bf%83%e6%80%81">#</a></span> </h2><p>考科目二在封闭场地,不会撞车或者撞人,最差的结果就磕碰到车。</p> <p>考科目三在自己的道上好好开,你不会撞到别人,正常人开车也不会撞你的。开得慢时安全员可能在一边唉声叹气,忽视他,继续开车。</p> <p>如果你还是很紧张,那就不管了,考试走完全程就好。</p> <h2 class="heading" id="拿证之后"> 拿证之后<span class="heading__anchor"> <a href="#%e6%8b%bf%e8%af%81%e4%b9%8b%e5%90%8e">#</a></span> </h2><p>前面都是一些应试经验,拿证和真的会开车还有段距离,最好请人带你开车,多练习。</p> <h2 class="heading" id="我的考试分数"> 我的考试分数<span class="heading__anchor"> <a href="#%e6%88%91%e7%9a%84%e8%80%83%e8%af%95%e5%88%86%e6%95%b0">#</a></span> </h2><ol> <li>科目一第一轮 100 分</li> <li>科目二第一轮倒车入库超时,第二轮 100 分</li> <li>科目三第一轮 90 分(靠边停车扣了 10 分)</li> <li>科目四第一轮不合格,第二轮 90 分</li> </ol>

2025/5/13
阅读更多

再次用手动剃须刀

<p>我第一次剃须用的是手动剃须刀,剃须的时候容易出血,就改用电动剃须刀了。目前用的电动剃须刀是米家 S301,价格为 116.49 元人民币。虽然用电动剃须刀不会刮出血,但是用了半年左右刀头就磨损过度,剃须时总把胡须扯起来,疼死了。</p> <p>上次买刀头花了 63.6 元,现在看要 79 元,还要 10 元运费,这价格和买新剃须刀差不多了。电动剃须刀还有一个我非常讨厌缺点:胡须残渣在刀头里会发臭,开始发臭后洗不掉臭味。如果我每次剃完胡子都洗刀头又要等它晾干,非常不方便。</p> <p>综合以上原因,我决定再试试手动剃须刀。在京东买了 36.9 元的吉列威锋 3(1 刀架、3 刀头)、16.9 元的吉列剃须泡沫(50g),共 53.8 元,优惠后是 45.93 元。第 1 次用下巴刮出 4 个伤口,第 2 次用下巴刮出 1 个伤口,第 3 次开始基本没刮出伤口了,谢天谢地。我之前刮下巴是从上往下刮,容易刮伤,后面改成横向刮就没事了。侧面和嘴唇上下都是从上往下刮,稍微倾斜。脖子从下往上刮,有点阻力,要小心点。</p> <p>刮完胡须洗脸,一照镜子,非常惊喜,刮得比电动剃须刀干净多了,剃须过程也更有乐趣。没想到三十多元的手动剃须刀有如此效果。这样刮一遍就很干净了,反方向刮一遍会更干净,但是反着拿剃须刀好难,算了。</p> <p>用了 2 个星期手动剃须刀,感觉它比电动剃须刀好多了:刀架刀头更便宜、容易清洗(用在酒店拿的一次性牙刷刷几下,用水冲洗)、洗了很快干(每天剃须 3 次,用的时候剃须刀都是干的)、每次用了都洗就不会臭、剃须干净很多。手动剃须刀也是有缺点的:需要学习使用技巧、更费时。</p> <p>手动剃须刀刀片裸露在外,所以带走的时候要防止它刮到行李,于是我就花 35.91 元买了个吉列致顺剃须刀旅行盒(威锋 3 也能放进去)。其实旅行盒的钱也是可以省的。带走剃须刀的时候可以把刀头取下来放进刀头盒,再把刀头盒用塑料袋包着防止刀头掉落,这样应该就安全了。</p>

2025/5/12
阅读更多

给一加 Ace 3 升级固件

<p>我的一加 Ace 3 用的是 PixelOS 系统,此系统不包含固件,所以要自己升级固件。</p> <p>固件通过 fastboot 和 fastbootd 安装,所以先测试 fastboot 和 fastbootd:</p> <ol> <li>将手机通过数据线连接到电脑</li> <li>按住音量下键和电源键开机进入 fastboot</li> <li>运行 <code>fastboot devices</code>,确定手机处于 fastboot</li> <li>运行 <code>fastboot reboot fastboot</code>,进入 fastbootd</li> <li>运行 <code>fastboot devices</code>,确定手机处于 fastbootd</li> </ol> <p>我的手机目前系统版本是 <code>PixelOS_aston-15.0-20250424</code>,固件是 <code>PJE110_15.0.0.500</code>,固件要升级到 <code>PJE110_15.0.0.701</code>。</p> <p>安装过程:</p> <ol> <li>按住音量下键和电源键开机进入 fastboot</li> <li>在<a href="https://github.com/inferno0230/op12r-fw-repo/releases">这里</a>下载固件,这次下载 <a href="https://github.com/inferno0230/op12r-fw-repo/releases/tag/PJE110_15.0.0.701%28CN01%29"><code>PJE110_15.0.0.701</code></a>,下载固件后解压</li> <li>电脑是 Linux/macOS 系统就运行固件文件夹里面的 <code>install_images.sh</code>,Windows 就运行 <code>install_images.bat</code></li> </ol> <hr> <p>安装记录(写给自己看的):</p> <ul> <li><code>PJE110_15.0.0.500</code> -&gt; <code>PJE110_15.0.0.701</code>(系统版本:<code>PixelOS_aston-15.0-20250424</code>)</li> <li><code>PJE110_15.0.0.701</code> -&gt; <code>PJE110_15.0.0.801</code>(系统版本:<code>PixelOS_aston-15.0-20250506</code>)</li> <li><code>PJE110_15.0.0.801</code> -&gt; <code>PJE110_15.0.0.820</code>(系统版本:<code>PixelOS_aston-15.0-20250621</code>)</li> <li><code>PJE110_15.0.0.820</code> -&gt; <code>PJE110_15.0.0.840</code>(系统版本:<code>LineageOS 23.0-20251012-NIGHTLY-aston</code>)</li> <li><code>PJE110_15.0.0.840</code> -&gt; <code>PJE110_15.0.0.870</code>(系统版本:<code>LineageOS 23.0-20251107-NIGHTLY-aston</code>)</li> </ul>

2025/5/5
阅读更多

解锁 Redmi K40S(HyperOS 1.0)的 bootloader

<!-- 写英文版? --> <p>从 HyperOS 开始,<a href="https://cyrusyip.org/zh-cn/posts/2024/12/08/xiaomi-no-longer-for-fans/">解锁 bootloader(引导程序)的难度大大增加</a>,不过还是有办法绕过限制。建议想解锁的读者先暂停系统更新和应用更新,以免升级后无法绕过限制。</p> <p>这台 Redmi K40S 的系统版本是 HyperOS 1.0.8.0.ULMCNXM。以下是解锁方法:</p> <ol> <li>插入手机卡。</li> <li>下载<a href="https://github.com/MlgmXyysd/Xiaomi-HyperOS-BootLoader-Bypass/releases/download/1.0-fix/Settings_Redmi_marble_V816.0.5.0.UMRINXM.zip">设置应用</a>,解压后传到手机安装,成功。</li> <li>根据电脑系统下载 <a href="https://github.com/TheAirBlow/HyperSploit/releases">HyperSploit</a> 并运行,根据提示操作。</li> <li>这台手机显示验证失败,电脑显示 <code>Error 401: Xiaomi account credentials expired, login again</code>。</li> <li>退出账号,登录账号。再次运行 HyperSploit,这次电脑显示绑定成功了。运行<a href="https://en.miui.com/unlock/download_en.html">小米官方解锁工具</a>(<a href="https://miuirom.xiaomi.com/rom/u1106245679/7.6.727.43/miflash_unlock_en_7.6.727.43.zip">备用版</a>),提示等待 168 小时。</li> <li>手机卡就留在这里了<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>。</li> <li>打开应用商店,关闭自动升级。打开系统更新,关闭自动下载和夜间安装。让手机一直开机。</li> <li>等够 7 天后再次运行小米官方解锁工具,成功啦!</li> </ol> <hr> <p>重启完居然显示有账号锁,需要联网后验证小米账号密码。我的手机卡设置了密码,系统它又不让我输入手机卡密码(这太傻了吧!),这样无法用手机卡的网络。只好连接 WIFI 了,输入密码后进入系统,再退出小米账号。最后装上了我最喜欢的 <a href="https://wiki.lineageos.org/devices/munch/">LineageOS 系统</a>。</p> <!-- ## 安装固件记录 安装完后装 LineageOS 没问题,后续还更新了两次。 ``` ❯ fastboot flash abl_ab abl.img fastboot flash aop_ab aop.img fastboot flash bluetooth_ab bluetooth.img fastboot flash cmnlib_ab cmnlib.img fastboot flash cmnlib64_ab cmnlib64.img fastboot flash devcfg_ab devcfg.img fastboot flash dsp_ab dsp.img fastboot flash featenabler_ab featenabler.img fastboot flash hyp_ab hyp.img fastboot flash imagefv_ab imagefv.img fastboot flash keymaster_ab keymaster.img fastboot flash modem_ab modem.img fastboot flash qupfw_ab qupfw.img fastboot flash tz_ab tz.img fastboot flash uefisecapp_ab uefisecapp.img fastboot flash xbl_ab xbl.img fastboot flash xbl_config_ab xbl_config.img Warning: skip copying abl_ab image avb footer (abl_ab partition size: 0, abl_ab image size: 208896). Sending 'abl_ab' (204 KB) OKAY [ 0.016s] Writing 'abl_ab' (bootloader) Partition abl_a flashed successfully (bootloader) Partition abl_b flashed successfully OKAY [ 0.003s] Finished. Total time: 0.044s Warning: skip copying aop_ab image avb footer (aop_ab partition size: 0, aop_ab image size: 204800). Sending 'aop_ab' (200 KB) OKAY [ 0.006s] Writing 'aop_ab' (bootloader) Partition aop_a flashed successfully (bootloader) Partition aop_b flashed successfully OKAY [ 0.003s] Finished. Total time: 0.034s Warning: skip copying bluetooth_ab image avb footer (bluetooth_ab partition size: 0, bluetooth_ab image size: 438272). Sending 'bluetooth_ab' (428 KB) OKAY [ 0.014s] Writing 'bluetooth_ab' (bootloader) Partition bluetooth_a flashed successfully (bootloader) Partition bluetooth_b flashed successfully OKAY [ 0.003s] Finished. Total time: 0.044s Warning: skip copying cmnlib_ab image avb footer (cmnlib_ab partition size: 0, cmnlib_ab image size: 401408). Sending 'cmnlib_ab' (392 KB) OKAY [ 0.013s] Writing 'cmnlib_ab' (bootloader) Partition cmnlib_a flashed successfully (bootloader) Partition cmnlib_b flashed successfully OKAY [ 0.003s] Finished. Total time: 0.042s Warning: skip copying cmnlib64_ab image avb footer (cmnlib64_ab partition size: 0, cmnlib64_ab image size: 520192). Sending 'cmnlib64_ab' (508 KB) OKAY [ 0.021s] Writing 'cmnlib64_ab' (bootloader) Partition cmnlib64_a flashed successfully (bootloader) Partition cmnlib64_b flashed successfully OKAY [ 0.003s] Finished. Total time: 0.051s Warning: skip copying devcfg_ab image avb footer (devcfg_ab partition size: 0, devcfg_ab image size: 57344). Sending 'devcfg_ab' (56 KB) OKAY [ 0.004s] Writing 'devcfg_ab' (bootloader) Partition devcfg_a flashed successfully (bootloader) Partition devcfg_b flashed successfully OKAY [ 0.002s] Finished. Total time: 0.032s Warning: skip copying dsp_ab image avb footer (dsp_ab partition size: 0, dsp_ab image size: 67108864). Sending 'dsp_ab' (65536 KB) OKAY [ 1.586s] Writing 'dsp_ab' (bootloader) Partition dsp_a flashed successfully (bootloader) Partition dsp_b flashed successfully OKAY [ 0.181s] Finished. Total time: 1.792s Warning: skip copying featenabler_ab image avb footer (featenabler_ab partition size: 0, featenabler_ab image size: 90112). Sending 'featenabler_ab' (88 KB) OKAY [ 0.005s] Writing 'featenabler_ab' (bootloader) Partition featenabler_a flashed successfully (bootloader) Partition featenabler_b flashed successfully OKAY [ 0.003s] Finished. Total time: 0.035s Warning: skip copying hyp_ab image avb footer (hyp_ab partition size: 0, hyp_ab image size: 450560). Sending 'hyp_ab' (440 KB) OKAY [ 0.015s] Writing 'hyp_ab' (bootloader) Partition hyp_a flashed successfully (bootloader) Partition hyp_b flashed successfully OKAY [ 0.005s] Finished. Total time: 0.045s Warning: skip copying imagefv_ab image avb footer (imagefv_ab partition size: 0, imagefv_ab image size: 2097152). Sending 'imagefv_ab' (2048 KB) OKAY [ 0.068s] Writing 'imagefv_ab' (bootloader) Partition imagefv_a flashed successfully (bootloader) Partition imagefv_b flashed successfully OKAY [ 0.010s] Finished. Total time: 0.104s Warning: skip copying keymaster_ab image avb footer (keymaster_ab partition size: 0, keymaster_ab image size: 282624). Sending 'keymaster_ab' (276 KB) OKAY [ 0.016s] Writing 'keymaster_ab' (bootloader) Partition keymaster_a flashed successfully (bootloader) Partition keymaster_b flashed successfully OKAY [ 0.004s] Finished. Total time: 0.047s Warning: skip copying modem_ab image avb footer (modem_ab partition size: 0, modem_ab image size: 282521600). Sending 'modem_ab' (275900 KB) OKAY [ 6.749s] Writing 'modem_ab' (bootloader) Partition modem_a flashed successfully (bootloader) Partition modem_b flashed successfully OKAY [ 0.757s] Finished. Total time: 7.531s Warning: skip copying qupfw_ab image avb footer (qupfw_ab partition size: 0, qupfw_ab image size: 57344). Sending 'qupfw_ab' (56 KB) OKAY [ 0.010s] Writing 'qupfw_ab' (bootloader) Partition qupfw_a flashed successfully (bootloader) Partition qupfw_b flashed successfully OKAY [ 0.003s] Finished. Total time: 0.038s Warning: skip copying tz_ab image avb footer (tz_ab partition size: 0, tz_ab image size: 3194880). Sending 'tz_ab' (3120 KB) OKAY [ 0.087s] Writing 'tz_ab' (bootloader) Partition tz_a flashed successfully (bootloader) Partition tz_b flashed successfully OKAY [ 0.012s] Finished. Total time: 0.123s Warning: skip copying uefisecapp_ab image avb footer (uefisecapp_ab partition size: 0, uefisecapp_ab image size: 126976). Sending 'uefisecapp_ab' (124 KB) OKAY [ 0.014s] Writing 'uefisecapp_ab' (bootloader) Partition uefisecapp_a flashed successfully (bootloader) Partition uefisecapp_b flashed successfully OKAY [ 0.003s] Finished. Total time: 0.045s Warning: skip copying xbl_ab image avb footer (xbl_ab partition size: 0, xbl_ab image size: 3563520). Sending 'xbl_ab' (3480 KB) OKAY [ 0.091s] Writing 'xbl_ab' (bootloader) Partition xbl_a flashed successfully (bootloader) Partition xbl_b flashed successfully OKAY [ 0.021s] Finished. Total time: 0.138s Warning: skip copying xbl_config_ab image avb footer (xbl_config_ab partition size: 0, xbl_config_ab image size: 86016). Sending 'xbl_config_ab' (84 KB) OKAY [ 0.004s] Writing 'xbl_config_ab' (bootloader) Partition xbl_config_a flashed successfully (bootloader) Partition xbl_config_b flashed successfully OKAY [ 0.003s] Finished. Total time: 0.034s ``` --><div class="footnotes" role="doc-endnotes"> <hr> <ol> <li id="fn:1"> <p>我不确定是否要一直插卡,只是感觉这样比较稳妥。&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p> </li> </ol> </div>

2025/3/12
阅读更多

英式英语音标

<p>本文采用 DJ 音标。英式英语中,元音有 20 个,辅音有 24 个,常用辅音连缀有 4 个。</p> <p>元音:/iː/, /ɪ/, /e/, /æ/, /ɑː/, /ɔː/, /ɒ/, /uː/, /ʊ/, /ə/, /ʌ/, /ɜː/, /eɪ/, /aɪ/, /ɔɪ/, /əʊ/, /aʊ/, /ɪə/, /eə/, /ʊə/</p> <p>辅音:/p/, /b/, /t/, /d/, /k/, /ɡ/, /f/, /v/, /θ/, /ð/, /s/, /z/, /ʃ/, /ʒ/, /h/, /tʃ/, /dʒ/, /m/, /n/, /ŋ/, /r/, /j/, /w/, /l/<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></p> <p>辅音连缀:/ts/, /dz/, /tr/, /dr/</p> <h2 class="heading" id="元音"> 元音<span class="heading__anchor"> <a href="#%e5%85%83%e9%9f%b3">#</a></span> </h2><p>元音包括单元音和双元音。</p> <h3 class="heading" id="单元音monophthongs"> 单元音(Monophthongs)<span class="heading__anchor"> <a href="#%e5%8d%95%e5%85%83%e9%9f%b3monophthongs">#</a></span> </h3><ol> <li>/iː/ see /siː/</li> <li>/ɪ/ bit /bɪt/</li> <li>/e/ bet /bet/</li> <li>/æ/ cat /kæt/</li> <li>/ɑː/ car /kɑː/</li> <li>/ɔː/ law /lɔː/</li> <li>/ɒ/ lot /lɒt/</li> <li>/uː/ blue /bluː/</li> <li>/ʊ/ put /pʊt/</li> <li>/ə/ sofa /ˈsəʊ.fə/</li> <li>/ʌ/ cup /kʌp/</li> <li>/ɜː/ bird /bɜːd/</li> </ol> <h3 class="heading" id="双元音diphthongs"> 双元音(Diphthongs)<span class="heading__anchor"> <a href="#%e5%8f%8c%e5%85%83%e9%9f%b3diphthongs">#</a></span> </h3><ol> <li>/eɪ/ day /deɪ/</li> <li>/aɪ/ my /maɪ/</li> <li>/ɔɪ/ boy /bɔɪ/</li> <li>/əʊ/ go /ɡəʊ/</li> <li>/aʊ/ now /naʊ/</li> <li>/ɪə/ here /hɪə/</li> <li>/eə/ care /keə/</li> <li>/ʊə/ tour /tʊə/</li> </ol> <h2 class="heading" id="辅音consonants"> 辅音(Consonants)<span class="heading__anchor"> <a href="#%e8%be%85%e9%9f%b3consonants">#</a></span> </h2><p>辅音包括爆破音、摩擦音、破擦音、鼻音、近音、边音。</p> <h3 class="heading" id="爆破音plosives"> 爆破音(Plosives)<span class="heading__anchor"> <a href="#%e7%88%86%e7%a0%b4%e9%9f%b3plosives">#</a></span> </h3><ol> <li>/p/ pen /pen/</li> <li>/b/ bat /bæt/</li> <li>/t/ top /tɒp/</li> <li>/d/ dog /dɒɡ/</li> <li>/k/ cat /kæt/</li> <li>/ɡ/ go /ɡəʊ/</li> </ol> <h3 class="heading" id="摩擦音fricatives"> 摩擦音(Fricatives)<span class="heading__anchor"> <a href="#%e6%91%a9%e6%93%a6%e9%9f%b3fricatives">#</a></span> </h3><ol> <li>/f/ fish /fɪʃ/</li> <li>/v/ van /væn/</li> <li>/s/ see /siː/</li> <li>/z/ zoo /zuː/</li> <li>/ʃ/ she /ʃiː/</li> <li>/h/ hat /hæt/</li> <li>/ʒ/ measure /ˈmeʒə/</li> <li>/θ/ think /θɪŋk/</li> <li>/ð/ this /ðɪs/</li> </ol> <h3 class="heading" id="破擦音affricates"> 破擦音(Affricates)<span class="heading__anchor"> <a href="#%e7%a0%b4%e6%93%a6%e9%9f%b3affricates">#</a></span> </h3><ol> <li>/tʃ/ chip /tʃɪp/</li> <li>/dʒ/ jam /dʒæm/</li> </ol> <h3 class="heading" id="鼻音nasals"> 鼻音(Nasals)<span class="heading__anchor"> <a href="#%e9%bc%bb%e9%9f%b3nasals">#</a></span> </h3><ol> <li>/m/ man /mæn/</li> <li>/n/ not /nɒt/</li> <li>/ŋ/ sing /sɪŋ/</li> </ol> <h3 class="heading" id="近音approximants"> 近音(Approximants)<span class="heading__anchor"> <a href="#%e8%bf%91%e9%9f%b3approximants">#</a></span> </h3><ol> <li>/r/ red /red/</li> <li>/j/ yes /jes/</li> <li>/w/ wet /wet/</li> </ol> <h3 class="heading" id="边音lateral-approximant"> 边音(Lateral Approximant)<span class="heading__anchor"> <a href="#%e8%be%b9%e9%9f%b3lateral-approximant">#</a></span> </h3><ol> <li>/l/ light /laɪt/ cool /kuːl/</li> </ol> <h3 class="heading" id="辅音连缀consonant-cluster"> 辅音连缀(Consonant Cluster)<span class="heading__anchor"> <a href="#%e8%be%85%e9%9f%b3%e8%bf%9e%e7%bc%80consonant-cluster">#</a></span> </h3><ol> <li>/ts/ cats /kæts/</li> <li>/dz/ beds /bedz/</li> <li>/tr/ tree /triː/</li> <li>/dr/ dream /driːm/</li> </ol> <div class="footnotes" role="doc-endnotes"> <hr> <ol> <li id="fn:1"> <p>/l/ 有 2 个发音:clear l(示例:<strong>l</strong>ike)、dark l(示例:schoo<strong>l</strong>)&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p> </li> </ol> </div>

2025/2/25
阅读更多

KK 音标、DJ 音标、IPA 音标对照表

<p>本文内容摘录自<a href="https://zh.wikipedia.org/zh-cn/KK%E9%9F%B3%E6%A8%99">KK音标 - 维基百科,自由的百科全书</a>。</p> <h2 class="heading" id="单元音"> 单元音<span class="heading__anchor"> <a href="#%e5%8d%95%e5%85%83%e9%9f%b3">#</a></span> </h2><table> <thead> <tr> <th style="text-align: center">KK</th> <th style="text-align: center">DJ</th> <th style="text-align: center">IPA</th> <th style="text-align: center">单字示例</th> </tr> </thead> <tbody> <tr> <td style="text-align: center">[i]</td> <td style="text-align: center">[iː]</td> <td style="text-align: center">[iː]</td> <td style="text-align: center">s<strong>ea</strong>t</td> </tr> <tr> <td style="text-align: center">[ɪ]</td> <td style="text-align: center">[ɪ]</td> <td style="text-align: center">[ɪ]</td> <td style="text-align: center">s<strong>i</strong>t</td> </tr> <tr> <td style="text-align: center">[e]</td> <td style="text-align: center">[eɪ]</td> <td style="text-align: center">[eɪ]</td> <td style="text-align: center">p<strong>ai</strong>n</td> </tr> <tr> <td style="text-align: center">[ɛ]</td> <td style="text-align: center">[e]</td> <td style="text-align: center">[e]</td> <td style="text-align: center">h<strong>ea</strong>d</td> </tr> <tr> <td style="text-align: center">[æ]</td> <td style="text-align: center">[æ]</td> <td style="text-align: center">[æ]</td> <td style="text-align: center">f<strong>a</strong>t</td> </tr> <tr> <td style="text-align: center">[ɑ]</td> <td style="text-align: center">[ɑː]</td> <td style="text-align: center">[ɑ]</td> <td style="text-align: center">h<strong>o</strong>t</td> </tr> <tr> <td style="text-align: center">[o]</td> <td style="text-align: center">[əʊ]</td> <td style="text-align: center">[əʊ]</td> <td style="text-align: center">n<strong>o</strong>se</td> </tr> <tr> <td style="text-align: center">[ɔ]</td> <td style="text-align: center">[ɔː]</td> <td style="text-align: center">[ɔː]</td> <td style="text-align: center">f<strong>ou</strong>r</td> </tr> <tr> <td style="text-align: center">[ɔ]</td> <td style="text-align: center">[ɔ]</td> <td style="text-align: center">[ɒ]</td> <td style="text-align: center">d<strong>o</strong>g</td> </tr> <tr> <td style="text-align: center">[u]</td> <td style="text-align: center">[uː]</td> <td style="text-align: center">[uː]</td> <td style="text-align: center">t<strong>oo</strong></td> </tr> <tr> <td style="text-align: center">[ᴜ]</td> <td style="text-align: center">[ʊ]</td> <td style="text-align: center">[ʊ]</td> <td style="text-align: center">p<strong>u</strong>t</td> </tr> <tr> <td style="text-align: center">[ʌ]</td> <td style="text-align: center">[ʌ]</td> <td style="text-align: center">[ʌ]</td> <td style="text-align: center">s<strong>u</strong>n</td> </tr> <tr> <td style="text-align: center">[ə]</td> <td style="text-align: center">[ə]</td> <td style="text-align: center">[ə]</td> <td style="text-align: center"><strong>a</strong>gain</td> </tr> <tr> <td style="text-align: center">[ɪr]</td> <td style="text-align: center">[ɪə]</td> <td style="text-align: center">[ɪə]</td> <td style="text-align: center">r<strong>ear</strong></td> </tr> <tr> <td style="text-align: center">[ɚ]</td> <td style="text-align: center">[ə]</td> <td style="text-align: center">[ə˞]</td> <td style="text-align: center">broth<strong>er</strong></td> </tr> <tr> <td style="text-align: center">[ɝ]</td> <td style="text-align: center">[ɜ]</td> <td style="text-align: center">[ɜ˞]</td> <td style="text-align: center">b<strong>ir</strong>d</td> </tr> </tbody> </table> <h2 class="heading" id="双元音"> 双元音<span class="heading__anchor"> <a href="#%e5%8f%8c%e5%85%83%e9%9f%b3">#</a></span> </h2><table> <thead> <tr> <th style="text-align: center">KK</th> <th style="text-align: center">DJ</th> <th style="text-align: center">IPA</th> <th style="text-align: center">单字示例</th> </tr> </thead> <tbody> <tr> <td style="text-align: center">[aɪ]</td> <td style="text-align: center">[aɪ]</td> <td style="text-align: center">[aɪ]</td> <td style="text-align: center">p<strong>ie</strong></td> </tr> <tr> <td style="text-align: center">[aᴜ]</td> <td style="text-align: center">[aʊ]</td> <td style="text-align: center">[aʊ]</td> <td style="text-align: center">h<strong>ou</strong>se</td> </tr> <tr> <td style="text-align: center">[ɔɪ]</td> <td style="text-align: center">[ɔɪ]</td> <td style="text-align: center">[ɔɪ]</td> <td style="text-align: center">c<strong>oi</strong>n</td> </tr> </tbody> </table> <h2 class="heading" id="清辅音"> 清辅音<span class="heading__anchor"> <a href="#%e6%b8%85%e8%be%85%e9%9f%b3">#</a></span> </h2><table> <thead> <tr> <th style="text-align: center">KK</th> <th style="text-align: center">DJ</th> <th style="text-align: center">IPA</th> <th style="text-align: center">单字示例</th> </tr> </thead> <tbody> <tr> <td style="text-align: center">[p]</td> <td style="text-align: center">[p]</td> <td style="text-align: center">[p]</td> <td style="text-align: center"><strong>p</strong>et</td> </tr> <tr> <td style="text-align: center">[t]</td> <td style="text-align: center">[t]</td> <td style="text-align: center">[t]</td> <td style="text-align: center"><strong>t</strong>en</td> </tr> <tr> <td style="text-align: center">[k]</td> <td style="text-align: center">[k]</td> <td style="text-align: center">[k]</td> <td style="text-align: center"><strong>k</strong>ey</td> </tr> <tr> <td style="text-align: center">[f]</td> <td style="text-align: center">[f]</td> <td style="text-align: center">[f]</td> <td style="text-align: center"><strong>f</strong>at</td> </tr> <tr> <td style="text-align: center">[s]</td> <td style="text-align: center">[s]</td> <td style="text-align: center">[s]</td> <td style="text-align: center"><strong>s</strong>ing</td> </tr> <tr> <td style="text-align: center">[θ]</td> <td style="text-align: center">[θ]</td> <td style="text-align: center">[θ]</td> <td style="text-align: center"><strong>th</strong>ank</td> </tr> <tr> <td style="text-align: center">[ʃ]</td> <td style="text-align: center">[ʃ]</td> <td style="text-align: center">[ʃ]</td> <td style="text-align: center"><strong>sh</strong>ort</td> </tr> <tr> <td style="text-align: center">[tʃ]</td> <td style="text-align: center">[tʃ]</td> <td style="text-align: center">[tʃ]</td> <td style="text-align: center"><strong>ch</strong>air</td> </tr> <tr> <td style="text-align: center">[h]</td> <td style="text-align: center">[h]</td> <td style="text-align: center">[h]</td> <td style="text-align: center"><strong>h</strong>a</td> </tr> </tbody> </table> <h2 class="heading" id="浊辅音"> 浊辅音<span class="heading__anchor"> <a href="#%e6%b5%8a%e8%be%85%e9%9f%b3">#</a></span> </h2><table> <thead> <tr> <th style="text-align: center">KK</th> <th style="text-align: center">DJ</th> <th style="text-align: center">IPA</th> <th style="text-align: center">单字示例</th> </tr> </thead> <tbody> <tr> <td style="text-align: center">[b]</td> <td style="text-align: center">[b]</td> <td style="text-align: center">[b]</td> <td style="text-align: center"><strong>b</strong>ook</td> </tr> <tr> <td style="text-align: center">[d]</td> <td style="text-align: center">[d]</td> <td style="text-align: center">[d]</td> <td style="text-align: center"><strong>d</strong>esk</td> </tr> <tr> <td style="text-align: center">[g]</td> <td style="text-align: center">[g]</td> <td style="text-align: center">[ɡ]</td> <td style="text-align: center"><strong>g</strong>et</td> </tr> <tr> <td style="text-align: center">[v]</td> <td style="text-align: center">[v]</td> <td style="text-align: center">[v]</td> <td style="text-align: center"><strong>v</strong>est</td> </tr> <tr> <td style="text-align: center">[z]</td> <td style="text-align: center">[z]</td> <td style="text-align: center">[z]</td> <td style="text-align: center"><strong>z</strong>oo</td> </tr> <tr> <td style="text-align: center">[ð]</td> <td style="text-align: center">[ð]</td> <td style="text-align: center">[ð]</td> <td style="text-align: center"><strong>th</strong>is</td> </tr> <tr> <td style="text-align: center">[ʒ]</td> <td style="text-align: center">[ʒ]</td> <td style="text-align: center">[ʒ]</td> <td style="text-align: center">mea<strong>s</strong>ure</td> </tr> <tr> <td style="text-align: center">[dʒ]</td> <td style="text-align: center">[dʒ]</td> <td style="text-align: center">[dʒ]</td> <td style="text-align: center"><strong>j</strong>ohn</td> </tr> <tr> <td style="text-align: center">[m]</td> <td style="text-align: center">[m]</td> <td style="text-align: center">[m]</td> <td style="text-align: center"><strong>m</strong>om</td> </tr> <tr> <td style="text-align: center">[n]</td> <td style="text-align: center">[n]</td> <td style="text-align: center">[n]</td> <td style="text-align: center"><strong>n</strong>ose</td> </tr> <tr> <td style="text-align: center">[ŋ]</td> <td style="text-align: center">[ŋ]</td> <td style="text-align: center">[ŋ]</td> <td style="text-align: center">si<strong>ng</strong></td> </tr> <tr> <td style="text-align: center">[l]</td> <td style="text-align: center">[l]</td> <td style="text-align: center">[l]</td> <td style="text-align: center"><strong>l</strong>ong</td> </tr> <tr> <td style="text-align: center">[r]</td> <td style="text-align: center">[r]</td> <td style="text-align: center">[r]</td> <td style="text-align: center"><strong>r</strong>ed</td> </tr> <tr> <td style="text-align: center">[j]</td> <td style="text-align: center">[j]</td> <td style="text-align: center">[j]</td> <td style="text-align: center"><strong>y</strong>es</td> </tr> <tr> <td style="text-align: center">[w]</td> <td style="text-align: center">[w]</td> <td style="text-align: center">[w]</td> <td style="text-align: center"><strong>w</strong>e</td> </tr> </tbody> </table>

2025/2/22
阅读更多

排查手机卡顿

<p>最近听朋友说小米 13 卡顿,我感觉不应该啊,这手机处理器是骁龙 8 第二代(2022年末的旗舰处理器)。</p> <p>用安兔兔 v10.4.4 测试性能,才 134 万分,排行榜上面小米 13 的分数是 155 万,相差 21 万。嗯,这个结果不对劲。</p> <p>看了内存使用,内存是 12G + 4G,可用只有 3.1G。但是手机也就运行了两个微信。剩余内存太少了吧。</p> <p>看了下开机时间,居然开了 142 天,震惊!居然有人开手机那么久不重启。</p> <p>把手机升级到最新的系统,再测一遍性能。原来 134 万,这次 160 万,比参考值多 5 万。这次正常了。操作也不觉得卡。</p> <p>我猜是卡顿是因为手机开太久了,系统出现内存泄漏,性能下降。嘱咐朋友至少每周重启手机,要安装更新(这也是重启的机会)。</p> <p>朋友有时候手机快用完电才去充,这样容易损耗电池。我嘱咐他多充电,让手机保持高电量。充电时尽量不要用手机,因为充电手机会发热,这时用手机就更热了,发热会降低电池寿命。</p> <p>总结一下我的建议:</p> <ul> <li>更新系统</li> <li>每周重启,或者卡顿就重启,也可以设置每天定时开关机</li> <li>多充电,不要到 20% 这样低电量才充</li> <li>以后买新手机先用安兔兔测试性能,和参考值相差几万应该是正常的</li> </ul> <hr> <p>手机过了一个星期都没卡,问题算是解决了。期间朋友每天重启手机,一开始手动重启,后来设置了每天自动关开机。</p>

2025/2/20
阅读更多

痛失小米 9 SE

<p>小米 9 SE 是我的上上台手机,我换手机之后就没用过了。最近拿出来,发现居然能安装最新的 LineageOS 22.1(Android 15)。我一直感觉在 Android 用 root 权限是比较危险的,所以没用过。刚好这台空闲的手机可以让我测试,测试好一些应用或者模块,我就在一加 Ace 3 上面用。我还很喜欢小米 9 SE 小巧的尺寸,现在已经很少可以单手使用的小尺寸手机了。</p> <p>这台小米 9 SE 有两个比较严重的问题:烧屏(屏幕泛黄、有残影)、电池损耗严重(出门必须带移动电源)。感觉换屏幕太麻烦,就算了。电池倒是可以换个新的。花 69 元人民币买了块诺希牌电池,自己安装。</p> <p>客服发的<a href="https://www.bilibili.com/video/BV15N411o7p4/">安装视频</a>里的工具和实际的工具略有不同。视频里用胶带贴后盖,我拿到的是胶水。视频看了一遍,感觉自己能搞定。</p> <p>第一步是打开后盖。关机,用吹风机加热后盖,用吸盘贴住后盖底部,用三角拆机片抠开边缘。工具要放远点或者装起来,不然吹风机会吹走工具。</p> <p>第二步是拆螺丝。按顺序拆下 10 颗螺丝,在纸上画图,用 1~10 的数字标记位置,把螺丝放在纸上。挑起电池排线。</p> <p>第三步是取电池。加热电池,很不幸把螺丝吹开了,发现有 2 颗螺丝是短的,不知道装的时候该装哪个位置。拉出电池底下延伸出来的胶条,很难拔,还拔断了,胶条还残留在电池底部。接下来用工具用力撬起电池(错误操作),中途还太大力刺伤手指了,疼!</p> <p>差不多撬起来的时候,电池有点变形了,再撬电池就破了。电池冒烟,我脑子还没反应过来,手就把手机丢到地上了。电池接着就着火和冒烟,燃烧完后电池很胀,屏幕被加热到出现一个白色的实心圆圈,烟的气味很臭很刺鼻,过了一晚才闻不到。幸好人和房子都没事。最后把电池和主板装到袋子,贴上「锂电池」的纸,放在有害垃圾垃圾桶旁边了。附近的人似乎不分类丢垃圾,所以我就把电池直接放垃圾桶旁边,希望回收垃圾的人能看到。</p> <p>换电池失误的后果好严重,主板都烫坏了,以后还是去售后中心换电池吧。真怀念以前的手机,关机打开后盖就直接换电池了。</p>

2025/2/19
阅读更多

将一加 Ace 3 从 PixelOS 14 升级到 PixelOS 15

<p>现在 PixelOS 15 发布了,我就打算从 PixelOS 14 升级上去,但是事情没那么简单。因为 PixelOS 15 要用到 ColorOS 15 的固件,所以不能直接升级。要安装 ColorOS 14,升级到 ColorOS 15(15.0.0.200 或者以上的版本),在 ColorOS 的更新器再次安装 ColorOS 15 以确保两个系统槽位(slot)都是 ColorOS 15。安装 ColorOS 14 的时候会清空用户数据,所以要先备份应用和文件,最后再恢复。</p> <p>操作有风险,推荐在有条件去售后中心的时候操作,失败了就去售后直接安装 ColorOS 15 吧。</p> <h2 class="heading" id="需要用到的文件"> 需要用到的文件<span class="heading__anchor"> <a href="#%e9%9c%80%e8%a6%81%e7%94%a8%e5%88%b0%e7%9a%84%e6%96%87%e4%bb%b6">#</a></span> </h2><ul> <li><a href="https://drive.google.com/drive/folders/1QRd-wHLVtQFrlYuAJNaxD9t7KOru7Oxy">PJE110domestic_11_14.0.0.317CN01_2024012904340000.zip</a>(如果无法下载就先登录谷歌账号)</li> <li><a href="https://yun.daxiaamu.com/OnePlus_Roms/%E4%B8%80%E5%8A%A0OnePlus%20ACE%203/ColorOS%20PJE110_15.0.0.500%28CN01%29%20C.32/">ColorOS PJE110_15.0.0.500(CN01) C.32 全量包</a>(里面的链接用浏览器打开失败,可以用 aria2 或者 Aria2App 下载)</li> <li>1.3.zip 和 prog_firehose_ddr.zip(在这里下载:<a href="https://xdaforums.com/t/12r-ace-3-edl-downloadtool-to-restore-your-device-to-oxygenos-coloros.4654245/">How To Guide - [12R/Ace 3] EDL DownloadTool to restore your device to OxygenOS/ColorOS | XDA Forums</a>)</li> <li><del><a href="https://yun.daxiaamu.com/OnePlus_Roms/%E4%B8%80%E5%8A%A0OnePlus%20Ace%203/ColorOS%20PJE110_14.0.0.800%28CN01%29%20A.67/">ColorOS PJE110_14.0.0.800(CN01) A.67 全量包</a>(里面的链接用浏览器打开失败,可以用 aria2 或者 Aria2App 下载)</del></li> <li><del><a href="https://t.me/gt3neo5hub/521/232181">Fastboot Firmware Flasher</a>(需要 Windows 10 / 11)</del></li> </ul> <h2 class="heading" id="备份"> 备份<span class="heading__anchor"> <a href="#%e5%a4%87%e4%bb%bd">#</a></span> </h2><p>我用 <a href="https://github.com/XayahSuSuSu/Android-DataBackup">DataBackup</a> 来备份应用与它们的数据、文件。</p> <ul> <li><input checked="" disabled="" type="checkbox"> 应用</li> <li><input checked="" disabled="" type="checkbox"> DCIM</li> <li><input checked="" disabled="" type="checkbox"> Pictures</li> <li><input checked="" disabled="" type="checkbox"> Documents</li> </ul> <p>DataBackup 需要 root 权限,我用<a href="https://nightly.link/bmax121/APatch/workflows/build/main/APatch">最新构建的 APatch</a>(<a href="https://apatch.dev/">使用文档</a>,注意最新构建版是个 <code>.zip</code> 文件,需要解压之后安装里面的 <code>.apk</code>),你也可以用其他 root 方案。</p> <p>备份完删掉一些应用再恢复,看看能不能行。没问题就把数据复制到电脑。</p> <p>我对微信没有信心,所以将微信聊天记录额外备份到电脑。</p> <p>有些东西 DataBackup 无法备份,只能自己截图或者用文字记下来。无法备份的东西有:</p> <ul> <li>系统设置(WIFI 密码、星标联系人、闹钟、谷歌账户等)</li> <li>APatch 设置和模块(应该也能备份吧,但总感觉不太对劲)</li> </ul> <h2 class="heading" id="清除密码"> 清除密码<span class="heading__anchor"> <a href="#%e6%b8%85%e9%99%a4%e5%af%86%e7%a0%81">#</a></span> </h2><p>退出谷歌账号,删除锁屏密码。</p> <h2 class="heading" id="用-9008edl-安装-coloros-14"> 用 9008/EDL 安装 ColorOS 14<span class="heading__anchor"> <a href="#%e7%94%a8-9008edl-%e5%ae%89%e8%a3%85-coloros-14">#</a></span> </h2><p>参考 <a href="https://xdaforums.com/t/12r-ace-3-edl-downloadtool-to-restore-your-device-to-oxygenos-coloros.4654245/">How To Guide - [12R/Ace 3] EDL DownloadTool to restore your device to OxygenOS/ColorOS | XDA Forums</a>,用 9008/EDL 模式安装 ColorOS 14。</p> <p>在 <a href="https://droidwin.com/download-oneplus-12r-ace-3-edl-unbrick-firmware-rom/">Download OnePlus 12R/Ace 3 EDL Unbrick Firmware/ROM - DroidWin</a> 下载 EDL 刷机包(<code>PJE110domestic_11_14.0.0.317CN01_2024012904340000.zip</code>),登录谷歌账户才行,不然提示下载人数太多。</p> <ol> <li>解压 zip 包。</li> <li>将 xda 帖子的 <code>prog_firehose_ddr.elf</code> 放到 <code>系统包/IMAGES/</code>,覆盖掉里面的 <code>prog_firehose_ddr.elf</code>。</li> <li>打开 9008驱动.exe,安装。</li> <li>打开报错安装我,提示已安装这个产品的另一个版本。</li> <li>打开刷机工具1.3。</li> <li>区域选择非欧洲,用户名、密码、验证码都输入 1,登录。</li> <li>将系统包的文件夹拖拽进去。</li> <li>保持默认选项,点击ok,点击开始。</li> <li>手机按住两个音量键和电源键,刷机工具显示连接就松手。</li> <li>显示 firehose 协议执行失败,好像是因为我前面还没关闭 fastboot firmware flasher,关闭它之后再来用刷机工具1.3就好了。</li> <li>6 分钟后完成刷机,再等一段时间,ColorOS 14 开机成功。</li> </ol> <h2 class="heading" id="第-1-次安装-coloros-15"> 第 1 次安装 ColorOS 15<span class="heading__anchor"> <a href="#%e7%ac%ac-1-%e6%ac%a1%e5%ae%89%e8%a3%85-coloros-15">#</a></span> </h2><p>ColorOS 14 开机成功,进入设置引导界面,增强服务这里关闭「自动下载」和「夜间自动更新」,后面的能跳过就点跳过。</p> <p>目前版本信息是 <code>PJE110_14.0.0.317(CN01)</code>。</p> <ol> <li>将手机插到电脑,复制 ColorOS PJE110_15.0.0.500 刷机包到手机的 Download 文件夹。</li> <li>开启开发者模式:打开设置-关于本机-版本信息-快速多次点击版本号。</li> <li>开启飞行模式(关闭数据和 WIFI)。</li> <li>打开设置-应用-应用管理-右上角的三个点-显示系统应用-搜索软件更新-储存占用-清除数据。</li> <li>打开设置-关于本机-ColorOS-右上角的三个点-本地安装-选择前面从电脑放进去的 ColorOS 15 刷机包-立即解压-立刻安装。</li> </ol> <p>安装完后重启到 ColorOS 15。</p> <p>友情提示:升级到 ColorOS 15 之后,原来的免授权 EDL 刷机工具会失效,用 EDL 工具的新方法:<a href="https://droidwin.com/fix-sahara-communication-failed-error-in-oppo-flash-tool/">Fix Sahara Communication/Protocol Failed Error in Oppo Flash Tool - DroidWin</a>。</p> <h2 class="heading" id="第-2-次安装-coloros-15"> 第 2 次安装 ColorOS 15<span class="heading__anchor"> <a href="#%e7%ac%ac-2-%e6%ac%a1%e5%ae%89%e8%a3%85-coloros-15">#</a></span> </h2><p>现在进入了设置引导界面,关闭「自动下载」和「夜间自动更新」。现在版本信息是 <code>PJE110_15.0.0.500(CN01)</code>。</p> <p>像前面一样,在设置里面使用本地安装,现在是第 2 次安装 ColorOS 15,安装完选立即重启。</p> <h2 class="heading" id="安装-pixelos-15"> 安装 PixelOS 15<span class="heading__anchor"> <a href="#%e5%ae%89%e8%a3%85-pixelos-15">#</a></span> </h2><p>现在准备工作都做好了,按照 <a href="https://pixelos.net/download/aston">PixelOS 官方教程</a> 做就行了。</p> <p>手机关机,按住音量下键和电源键开机进入 fastboot,连接电脑。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span><span class="lnt">4 </span><span class="lnt">5 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">fastboot flash boot boot-aston_20250121_1747.img </span></span><span class="line"><span class="cl">fastboot flash init_boot init_boot-aston_20250121_1747.img </span></span><span class="line"><span class="cl">fastboot flash vendor_boot vendor_boot-aston_20250121_1747.img </span></span><span class="line"><span class="cl">fastboot flash dtbo dtbo-aston_20250121_1747.img </span></span><span class="line"><span class="cl">fastboot flash recovery recovery-aston_20250121_1747.img </span></span></code></pre></td></tr></table> </div> </div><p>按手机音量下键,直到显示 Recovery mode,按下电源键确认。现在进入 PixelOS 的 recovery 了。</p> <p>在手机选择 Apply update - Apply from ADB。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-gdscript3" data-lang="gdscript3"><span class="line"><span class="cl"><span class="n">adb</span> <span class="n">sideload</span> <span class="n">PixelOS_aston</span><span class="o">-</span><span class="mf">15.0</span><span class="o">-</span><span class="mi">20250121</span><span class="o">-</span><span class="mf">1747.</span><span class="n">zip</span> </span></span></code></pre></td></tr></table> </div> </div><p>手机询问「Do you want to reboot to recovery now?」(是否重启到 recovery),选择 No。</p> <p>选择 Factory reset - Format data/factory reset - Format data。</p> <p>点左上角的左箭头返回,选择 Reboot system now。</p> <p>简单设置一下:</p> <ul> <li>Refresh rate 120 Hz (Adaptive)</li> <li>Tap to wake</li> <li>Tap to sleep</li> <li>Display size and text - Display size(调大 1 档)</li> <li>Network traffic indicator</li> </ul> <h2 class="heading" id="恢复"> 恢复<span class="heading__anchor"> <a href="#%e6%81%a2%e5%a4%8d">#</a></span> </h2><p>安装 APatch,修补 boot.img,刷入后手机开机后卡死,触屏和按键没反应。头疼!按住音量上键和电源键强制重启,屏幕熄灭时马上松手并按住音量下键,进入 fastboot。刷入 PixelOS 的 boot.img。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">fastboot flash boot boot-aston_20250121_1747.img </span></span><span class="line"><span class="cl">fastboot reboot </span></span></code></pre></td></tr></table> </div> </div><p>KernelSU 也试了下,刷入修补的 <code>init_boot.img</code> 后并不能获取 root 权限。最后只能用 Magisk 了。</p> <p>把前面备份的数据从电脑复制到手机(里面有 DataBackup),安装 DataBackup 后恢复应用和数据。</p> <p>有些应用要重新登录或者设置:</p> <ul> <li>Bitwarden</li> <li>Outlook</li> <li>支付宝</li> <li>欧路词典</li> </ul> <p>不需要重新登录或者设置的应用:</p> <ul> <li>微信</li> <li>KDE Connect</li> </ul> <p>闪退的应用:</p> <ul> <li>Hail</li> <li>GKD</li> </ul> <p>其他设置自己手动处理。</p> <ul> <li><input checked="" disabled="" type="checkbox"> 连接 WIFI,登录谷歌账号。</li> <li><input checked="" disabled="" type="checkbox"> 同步 outlook 联系人</li> <li><input checked="" disabled="" type="checkbox"> 设置星标联系人</li> <li><input checked="" disabled="" type="checkbox"> 设置闹钟</li> <li><input checked="" disabled="" type="checkbox"> 克隆应用的功能没了,只好装个 Insular</li> <li><input checked="" disabled="" type="checkbox"> 安装 root 模块</li> </ul> <h2 class="heading" id="magisk-的问题"> Magisk 的问题<span class="heading__anchor"> <a href="#magisk-%e7%9a%84%e9%97%ae%e9%a2%98">#</a></span> </h2><p>Magisk 真的太容易被检测到了,云闪付、支付宝、微信里面都没有人脸支付、指纹支付的选项,云闪付直接提示处于 root 环境。之前用 APatch,支付宝是可以人脸支付的。真是头疼,只能先不用 root 了,支付宝又能用人脸支付了。</p> <h2 class="heading" id="改用-kernelsu"> 改用 KernelSU<span class="heading__anchor"> <a href="#%e6%94%b9%e7%94%a8-kernelsu">#</a></span> </h2><p>PixelOS 的维护者 <a href="https://xdaforums.com/m/inferno0230.12118995/">inferno0230</a> 提供了<a href="https://github.com/inferno0230/kernel_oneplus_sm8550-CI/releases">支持 KernelSU 的内核</a>。我试了 <code>OP12R-v5.15.175-20250119-0950.zip</code>,在 PixelOS Recovery 里选 Apply update - Apply from ADB,在电脑执行 <code>adb sideload OP12R-v5.15.175-20250119-0950.zip</code> 就安装成功了。我把 KernelSU 管理器安装到 <a href="https://source.android.com/docs/security/features/private-space">private space</a>,用支付宝人脸识别正常,云闪付也没有提示 root 环境。</p> <h2 class="heading" id="更新-pixelos-时保留-root"> 更新 PixelOS 时保留 root<span class="heading__anchor"> <a href="#%e6%9b%b4%e6%96%b0-pixelos-%e6%97%b6%e4%bf%9d%e7%95%99-root">#</a></span> </h2><p>推荐方法:</p> <ol> <li>下载最新的 <a href="https://github.com/inferno0230/kernel_oneplus_sm8550-CI/releases">KernelSU 内核</a>。</li> <li>在设置更新系统,安装完按住电源下键,重启。</li> <li>按音量键选择 recovery,按电源键确认,进入 recovery。</li> <li>Apply update - Apply from ADB / Choose from disk<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> - Yes - Reboot system now。</li> </ol> <p>不太推荐的方法(手误跨版本升级 PixelOS 可能会出问题,比如 PixelOS 15 升级到 PixelOS 16):</p> <ol> <li>下载 <a href="https://github.com/inferno0230/kernel_oneplus_sm8550-CI/releases">KernelSU 内核</a>和 <a href="https://pixelos.net/download/aston">PixelOS 系统</a></li> <li>重启到 recovery</li> <li>安装 PixelOS,重启到 recovery,此时系统槽位(slot)变化</li> <li>安装 KernelSU 内核</li> <li>重启</li> </ol> <h2 class="heading" id="清理"> 清理<span class="heading__anchor"> <a href="#%e6%b8%85%e7%90%86">#</a></span> </h2><p>删除电脑的备份文件、刷机包、刷机工具、微信记录。</p> <hr> <p>文章到这里就结束了,下面是安装 ColosOS 14 的失败尝试,不知道是我操作不当还是工具有问题。</p> <p><strong>2025-02-20 更新</strong>:今天看到用 fastboot 安装原厂系统的教程(<a href="https://xdaforums.com/t/flashing-stock-firmware-on-12r-ace-3-from-fastboot.4719377/">How To Guide - Flashing stock firmware on 12r/Ace 3 from fastboot. | XDA Forums</a>),可能我下面失败的原因是没装好驱动,手机在 fastbootd 模式时未被电脑检测到。</p> <blockquote> <p>Download the usb drivers, extract them and install &ldquo;android_winusb.inf&rdquo; by right clicking on it then click install. <strong>Install them even if your device is detected in fastboot mode because further in the guide the phone will go in fastbootD mode and your computer might not detect the phone in that mode</strong>.</p> </blockquote> <h2 class="heading" id="用-fastboot-安装-coloros-14失败"> 用 fastboot 安装 ColorOS 14(失败)<span class="heading__anchor"> <a href="#%e7%94%a8-fastboot-%e5%ae%89%e8%a3%85-coloros-14%e5%a4%b1%e8%b4%a5">#</a></span> </h2><ol> <li>手机关机,按住电源键和音量下键开机,手机震动后松手,进入 fastboot 模式。将手机插到电脑 USB 口。</li> <li>打开 Fastboot Firmware Flasher。</li> <li>选择 <code>[7] FIRMWARE UNPACKER</code>,解开 ColorOS 14。</li> <li>返回主菜单,选择 <code>[3] FLASH ROM</code>。</li> <li>电脑显示 Rebooting into fastboot,但是手机进了 fastbootd,电脑显示「waiting for any device」。手机可以选择清除数据、重启、关机,我选了选择关机,结果就反复启动了。</li> </ol> <div class="footnotes" role="doc-endnotes"> <hr> <ol> <li id="fn:1"> <p>可以把内核放到 U 盘,从 U 盘安装,这样就不需要用电脑。注意:PixelOS recovery 无法读取多分区的 U 盘。&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p> </li> </ol> </div>

2025/2/12
阅读更多

用文本文件制作 Anki 牌组

<p>Anki 是开源的记忆软件。我们可以用文本文件制作牌组(一组需要记忆的内容),文本文件更易于修改。</p> <p>将下面文本保存为 <code>deck.txt</code>,然后用文本编辑器编辑。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span><span class="lnt">4 </span><span class="lnt">5 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">#separator:Pipe </span></span><span class="line"><span class="cl">#html:true </span></span><span class="line"><span class="cl">hi|你好 </span></span><span class="line"><span class="cl">why|为何 </span></span><span class="line"><span class="cl">two lines|第 1 行&lt;br&gt;第 2 行 </span></span></code></pre></td></tr></table> </div> </div><p>此文本对应的导出格式是「Cards in Plain Text(.txt)」。</p> <p>第 1 行的 separator(分隔符)用于区分正面和反面,可以用 Comma(<code>,</code>)、Semicolon(<code>;</code>)、Tab(<code> </code>)、Space(<code> </code>)、Pipe(<code>|</code>)、Colon(<code>:</code>),用名称(例如:<code>Pipe</code>)和符号(例如:<code>|</code>)都可以。我推荐用 <code>|</code>,它很少在卡片里用到,而且可以用键盘直接输入。</p> <p>第 2 行表示可以使用 HTML 代码。比如:<code>&lt;br&gt;</code> 表示换行。</p> <p>第 3 行开始就是卡片,一行就是一张卡,分隔符左边是卡片正面,分隔符右边是卡片反面。</p> <p>在 Anki 创建牌组,将 <code>deck.txt</code> 导入到这个牌组。如果你想制作翻转卡片(反面-&gt;正面),导入时 Note Type 选择「Basic and (reversed) card」,这样牌组会同时存在基础卡片(正面-&gt;反面)和翻转卡片。</p> <hr> <p>相关资料:<a href="https://docs.ankiweb.net/importing/text-files.html">Text Files - Anki Manual</a></p>

2025/1/29
阅读更多

在闲鱼遭遇到手后砍价,最后拿回货款

<p>为保护隐私,本故事略有改编。</p> <h2 class="heading" id="卖前"> 卖前<span class="heading__anchor"> <a href="#%e5%8d%96%e5%89%8d">#</a></span> </h2><p>我在闲鱼卖一台五六年前发售的手机,定价 200 元人民币,原价 2999 元。这台手机可以正常使用,屏幕有一处明显划痕,边框掉漆。</p> <p>放了几天,有个人猛砍价<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>到 120 元,我说 180 元他就不回了。</p> <p>后来又有个人问了,这个人一开始就让我感觉不爽。她的名字类似于「闭嘴吧你」,一副不好沟通的模样,芝麻信用还未授权。</p> <p>买家说话吞吞吐吐,沟通起来很浪费时间。</p> <blockquote> <p>买家:你好</p> <p>我:你好,想了解一下这台手机吗?</p> <p>买家:是的</p> <p>我内心:喂,你有话快说,非要我说一句你就说一句吗!</p> </blockquote> <p>买家开始问有没有换过屏幕和电池,是不是自用。我说原装自用。买家叫我拍边框,拍了她就挑剔有磕碰,又说几年前手机电池不行,换电池都要几十块,以这些为由要求降价。这时我就开始感觉恶心,二手手机本来就有耗损,还按照新机那种标准挑剔,新机至于卖 200 吗?</p> <p>买家问钢化膜、手机壳、充电器。我都在商品页面写清楚只有手机跟手机壳了。买家还嫌手机壳变色。几年前的手机壳你想要多好,有送都不错了。买家问有没有划痕,我都在商品页面说了在哪个位置有一处明显划痕,她又要我拍照。</p> <p>充电器我说用 USB Type-C 就行了,其他品牌的充电器也可以的。买家以只有 iPhone 为由(iPhone 15 之前的 iPhone 不使用 Type-C 接口),让我送数据线。为了促成交易,我也送了一条本来在用的,重新买又得十多块,气死。</p> <p>买家问有没有账号、会不会重启,最后她砍价到 160 元,并且收到马上确认收货(买家确认收货,卖家才会收到货款)。我内心的最低价格是 180 元,她砍那么多我是很不爽的,看她说马上确认收货就算了吧。</p> <p>下单后她说地址错了。我不知道这是什么套路。让她取消订单,重新上架让她买。</p> <h2 class="heading" id="到货"> 到货<span class="heading__anchor"> <a href="#%e5%88%b0%e8%b4%a7">#</a></span> </h2><p>发货后买家这个贱人又开始挑剔了,想看购买凭证。我连包装盒都没了,哪来的购买凭证。一般人也不会问这个,这台手机没什么造假价值,又不是奢侈品。</p> <p>到货后买家并没有爽快得确认收货,从这时开始她越来越恶心了。她说手机缝隙不一致,怀疑拆过机,一边缝隙大,似乎夹了纸片。我也不确定,但之前用手机的时候是没问题的,我就说不用就放着了。于是买家又换另一个理由,说摄像头进灰了影响拍照,又装可怜说贴膜、手机壳、充电头也要钱,希望我优惠点(到手后砍价)。这些配件要钱关我屁事,而且她那么吝啬肯定不会买配件。啊,气死我了!我说摄像头进灰是二手机正常损耗。我手头上刚好有台摄像头进灰的手机,前置摄像头和后置摄像头都进灰了,但是拍照没有明显问题。</p> <p>过了一天,买家说去手机店清灰要 20 元,问我给她 20 元还是退货<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>。我说已经最优惠了。她接下来一直以进灰为由缠着我,我就一直说已经最优惠了,后面不想回复了等到货后 3 天自动确认收货。结果这个家伙在最后一天申请了退货,理由是质量问题/功能异常,附上前摄像头的照片,确实有灰尘。最后没收货真是气死我了。</p> <p>我无法接受退货,因为:</p> <ul> <li>不能容忍她讹人这样错误的行为。</li> <li>质量问题退货要卖家(我)给运费。</li> <li>我前面的交流让我觉得她品德低下,怕她弄坏手机再寄回来,真的有人得不到就毁掉。</li> <li>我不想留下质量问题退货的记录。</li> </ul> <h2 class="heading" id="闲鱼小法庭"> 闲鱼小法庭<span class="heading__anchor"> <a href="#%e9%97%b2%e9%b1%bc%e5%b0%8f%e6%b3%95%e5%ba%ad">#</a></span> </h2><p>我拒绝了退货申请,理由是:问题不存在,补充的文字和截图表示买家有到手刀(到手后砍价)行为。我点击维权之后就进到闲鱼小法庭了。闲鱼小法庭就是解决买家卖家纠纷的方式,由 17 位陪审员(闲鱼用户)投票,17 票 9 胜制,票差小于 4 票时可以申诉。陪审员可以查看双方聊天记录。小法庭有两个环节:前 24 小时是双方举证,发起维权者先发言 1 次,然后开始计时,双方可以发言 5 次;后 24 小时是评审员投票。在我这个例子,如果我赢了就马上到账,如果买家赢了我就必须接受退货。</p> <p>老实说,第一次上小法庭还是蛮紧张的,要是输了就很难过。发言太多了,我就简单总结一下。</p> <p>买家的发言:</p> <ul> <li>摄像头进灰影响拍照(附上前摄像头照片,水印表面是用 Android 手机拍的)。</li> <li>卖家不说明摄像头有灰尘、敷衍了事、不回信息。</li> <li>急起来说气话,说卖家强买强卖和土匪(拜托,是你自己买又不是我逼你买的)、说用多台手机不行吗。</li> <li>卖家未标明售出不退。</li> </ul> <p>卖家(我)的发言:</p> <ul> <li>摄像头进灰是手机使用的正常损耗,我之前自拍和打视频电话都没问题,我已经提供了最优惠的价格。</li> <li>买家买前过度挑剔,也没有表面很在意摄像头灰尘。</li> <li>买家到手后用模糊的语言砍价(说缝隙大又不提供图片,说摄像头进灰在聊天时也未提供图片),心虚才不会提供照片证明观点。</li> <li>买家承诺直接确认收货,买后到手刀,这是不诚信。</li> <li>买家说自己用 iPhone 没 Type-C 数据线,但被我发现他拍照用了 Android 手机,所以他有 Type-C 数据线。买家骗了我一条数据线,这是不诚信。</li> </ul> <p>差不多晚上 12 点的时候开始投票,第二天买家已经取消了退货申请,大概是自知理亏。买家拖 20 小时后自动确认收货,我收到钱了,太好了!</p> <h2 class="heading" id="回顾"> 回顾<span class="heading__anchor"> <a href="#%e5%9b%9e%e9%a1%be">#</a></span> </h2><p>现在回想起来,买家的手段不算很高明,只是我没经验而且想快点卖出手机就中招了。</p> <p>下面总结一下甄别坏买家和避免纠纷的技巧。</p> <h3 class="heading" id="甄别坏买家"> 甄别坏买家<span class="heading__anchor"> <a href="#%e7%94%84%e5%88%ab%e5%9d%8f%e4%b9%b0%e5%ae%b6">#</a></span> </h3><p>有以下特征的买家可能是坏买家:</p> <ul> <li>吞吞吐吐(可能没有恶意,但和这样的人聊天很浪费时间)</li> <li>挑剔,尤其是不合理的挑剔(电池损耗)</li> <li>用模糊的表达而不是提供证据</li> <li>表现得很在意问题但只要求砍价(一般人会选择退货)</li> <li>没有芝麻信用或者买家芝麻信用优秀以下</li> <li>差评多</li> <li>新用户</li> </ul> <h3 class="heading" id="避免纠纷"> 避免纠纷<span class="heading__anchor"> <a href="#%e9%81%bf%e5%85%8d%e7%ba%a0%e7%ba%b7">#</a></span> </h3><ul> <li>拍 360 度视频/图片</li> <li>拍装箱视频</li> <li>用验货宝(闲鱼的验货服务)</li> <li>声明售出后非质量问题不退</li> </ul> <div class="footnotes" role="doc-endnotes"> <hr> <ol> <li id="fn:1"> <p>像 200 元砍到 120 元这种大比例砍价叫做屠龙刀。&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p> </li> <li id="fn:2"> <p>如果不想和买家纠缠,一定要让其确认收货后才发钱给他。&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p> </li> </ol> </div>

2024/12/31
阅读更多

了解与使用 Android 的 root 权限

<!-- 代写:英文版 --> <h2 class="heading" id="root-权限"> root 权限<span class="heading__anchor"> <a href="#root-%e6%9d%83%e9%99%90">#</a></span> </h2><p>root 是 Android 系统的最高权限。Android 系统就像房子。没有 root 的时候用户就是租客,只有使用权,不能随便改动房子。有 root 权限的时候,用户就是房东,有所有权,可以随便改动房子(修改系统)、丢掉原有的家具(卸载系统应用)。</p> <p>总之,有了 root 权限之后我们就可以完全掌控 Android 系统了。</p> <h2 class="heading" id="基本流程"> 基本流程<span class="heading__anchor"> <a href="#%e5%9f%ba%e6%9c%ac%e6%b5%81%e7%a8%8b">#</a></span> </h2><p>获取 root 的前提条件是解锁引导程序(bootloader),解锁了引导程序才能安装 <code>init_boot.img</code> 和 <code>boot.img</code>。</p> <p><code>init_boot.img</code> 和 <code>boot.img</code> 是启动系统需要用到的文件,推荐先备份好它们。修补其中一个并安装后就能获取 root 权限。最后使用 root 管理器来管理 root 权限。</p> <h2 class="heading" id="方案"> 方案<span class="heading__anchor"> <a href="#%e6%96%b9%e6%a1%88">#</a></span> </h2><p>目前有三个开源的 root 方案:</p> <ul> <li>Magisk(<a href="https://topjohnwu.github.io/Magisk/">使用文档</a>、<a href="https://github.com/topjohnwu/Magisk">源代码</a>)</li> <li>KernelSU(<a href="https://kernelsu.org/">使用文档</a>、<a href="https://github.com/tiann/KernelSU">源代码</a>)</li> <li>APatch(<a href="https://apatch.dev/">使用文档</a>、<a href="https://github.com/bmax121/APatch">源代码</a>)</li> </ul> <p>Magisk 是最经典的 root 方案,教程和资源最多。缺点是容易被应用检测到,比如:中国农业银行应用检测到 root 会退出。用额外的模块才能隐藏 root。</p> <p>KernelSU 是内核级 root 方案,不需要刻意隐藏 root,被授权的应用才能感知到 root。App Profile 功能可以授予应用部分权限,比如:只允许应用使用 adb 权限。</p> <p>APatch 也是内核级 root 方案,KernelSU 是内核级 root 方案,不需要刻意隐藏 root,被授权的应用才能感知到 root。需要设置密码。</p> <p>我的推荐:KernelSU &gt; APatch &gt; Magisk(&gt; 表示优于)。KernelSU 排第一是因为它不易被检测,而且可以授予应用部分权限。Magisk 排最后是因为容易被检测。</p> <h2 class="heading" id="用法"> 用法<span class="heading__anchor"> <a href="#%e7%94%a8%e6%b3%95">#</a></span> </h2><p>root 有两种使用方法。一是管理器授权给应用,二是在管理器安装 root 模块(module)。比如:授权给 Neo Backup 就可以备份应用。安装 <a href="https://github.com/chenxiaolong/BCR">BCR</a> 模块之后可以自动录制通话。</p> <p>root 权限可以很危险,比如用来清除手机数据或者弄坏系统。请勿授权给来源不明的应用,也不要安装来源不明的模块。尽量选择开源、知名的应用和模块。</p> <h2 class="heading" id="模块zygiskxposed"> 模块、Zygisk、Xposed<span class="heading__anchor"> <a href="#%e6%a8%a1%e5%9d%97zygiskxposed">#</a></span> </h2><p>模块是使用 root 管理器安装的应用。</p> <p>Zygisk 是修改系统和应用行为的模块,供其他模块使用。Magisk 内置 Zygisk。KernelSU 和 APatch 没有内置 Zygisk,但是可以安装独立版 Zygisk。</p> <p>以下是独立版 Zygisk:</p> <ul> <li><a href="https://github.com/PerformanC/ReZygisk">ReZygisk</a>(开源)</li> <li><a href="https://github.com/Dr-TSNG/ZygiskNext">ZygiskNext</a>(最新版本闭源)</li> </ul> <p>Xposed 是修改系统和应用行为的模块,供其他模块使用。<a href="https://github.com/rovo89/Xposed">Xposed</a> 已经停止更新,其继任者 <a href="https://github.com/LSPosed/LSPosed">LSPosed</a> 也停止更新。目前还在更新的 LSPosed 修改版为 <a href="https://github.com/JingMatrix/LSPosed">JingMatrix/LSPosed</a>。注意 LSPosed 依赖于 Zygisk,要先安装 Zygisk 才能用 LSPosed。</p> <p>安装 Zygisk 和 LSPosed 后,root 特征更明显,root 更容易被检测到。</p> <h2 class="heading" id="隐藏-root"> 隐藏 root<span class="heading__anchor"> <a href="#%e9%9a%90%e8%97%8f-root">#</a></span> </h2><p>银行应用和游戏检测到 root 后可能会拒绝运行,此时要隐藏 root。</p> <p>隐藏 root 的模块:</p> <ul> <li><a href="https://github.com/snake-4/Zygisk-Assistant">Zygisk-Assistant</a>(开源)</li> <li><a href="https://github.com/LSPosed/LSPosed.github.io/releases">Shamiko</a>(闭源。APatch 不支持 Shamiko。)</li> <li>Cherish Peekaboo(闭源,APatch 专用,在<a href="https://xdaforums.com/t/dev-apatch-an-alternative-root-solution-to-kernelsu-and-magisk.4655727/">这个帖子的 Attachments 可以下载</a>。)</li> </ul> <p>Android 系统允许应用获取所有应用的名字。有些应用发现系统有 root 管理器或者使用 root 的应用,就认为系统有 root 权限而拒绝运行。我们可以使用 <a href="https://github.com/Dr-TSNG/Hide-My-Applist">Hide My Applist</a> 或者 <a href="https://github.com/pumPCin/HMAL">HMAL</a> 来隐藏应用名称,从而躲过检测。</p> <p>隐藏完 root 后可以使用<a href="https://github.com/rushiranpise/detection">root 检测应用</a>查看效果。如果你用的应用没检测出 root,就不要纠结 root 检测应用的结果。</p> <h2 class="heading" id="银行应用与-play-integrity"> 银行应用与 Play Integrity<span class="heading__anchor"> <a href="#%e9%93%b6%e8%a1%8c%e5%ba%94%e7%94%a8%e4%b8%8e-play-integrity">#</a></span> </h2><p>一些银行应用会检测 Play Integrity(设备完整性,等级包适 BASIC、DEVICE、STRONG),手机解锁引导程序后 Play Integrity 等级下降,导致银行应用拒绝运行或者隐藏部分功能(比如指纹支付)。可以使用 <a href="https://github.com/chiteroman/PlayIntegrityFix">Play Integrity Fix</a> 和 <a href="https://github.com/5ec1cff/TrickyStore">TrickyStore</a> 来修复 Play Integrity。</p> <h2 class="heading" id="我的用法"> 我的用法<span class="heading__anchor"> <a href="#%e6%88%91%e7%9a%84%e7%94%a8%e6%b3%95">#</a></span> </h2><p>我一般用 KernelSU 或者 APatch。</p> <p>用到 root 的应用有:</p> <ul> <li><a href="https://github.com/MuntashirAkon/AppManager">App Manager</a></li> <li><a href="https://github.com/XayahSuSuSu/Android-DataBackup">DataBackup</a></li> <li>Material Files</li> <li><a href="https://github.com/DerGoogler/MMRL">MMRL</a></li> <li>Shizuku <ul> <li><a href="https://appops.rikka.app/">App Ops</a></li> <li>Droid-ify</li> <li><a href="https://github.com/gkd-kit/gkd">GKD</a></li> <li>Hail</li> <li>Obtainium</li> <li>aShell You</li> </ul> </li> </ul> <p>模块有:</p> <ul> <li>BCR</li> </ul> <p>root 的功能远不止这些,推荐你看 <a href="https://github.com/fynks/awesome-android-root">GitHub - fynks/awesome-android-root: A comprehensive and up-to-date list of latest Android root apps that require or utilize root privileges, rooting guides, tips, tricks and tools</a>。</p>

2024/12/22
阅读更多

推荐可以刷机的一加 Ace 3

<p>上个月买了可以刷机<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>的一加 Ace 3<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>。一加 Ace 3 的性能不错,处理器是骁龙 8 二代(2022 年末的旗舰处理器),目前在骁龙处理器中仅次于骁龙 8 三代和骁龙 8 至尊版。喜欢刷机的读者可以考虑这台手机。</p> <p>相关链接:</p> <ul> <li><a href="https://www.oneplus.com/cn/ace-3/specs">一加 Ace 3 参数规格</a></li> <li><a href="https://www.gsmarena.com/oneplus_ace_3-12775.php">OnePlus Ace 3 - Full phone specifications</a></li> <li><a href="https://xdaforums.com/f/oneplus-12r-oneplus-ace-3.12829/">OnePlus 12R / OnePlus Ace 3 | XDA Forums</a></li> </ul> <div class="footnotes" role="doc-endnotes"> <hr> <ol> <li id="fn:1"> <p>刷机指安装操作系统。&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p> </li> <li id="fn:2"> <p>一加 Ace 3 的国际版为 OnePlus 12R。&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p> </li> </ol> </div>

2024/12/14
阅读更多

小米已退烧

<p>小米一开始的口号是为发烧(友)而生,现在新的解锁 bootloader 政策让我感觉小米退烧了。</p> <p>原本小米解锁 bootloader 的条件是等待 168 小时(7 天)。小米推出 HyperOS 后中国大陆的型号解锁 bootloader 非常难,需要小米社区 5 级,还要考试<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>。</p> <p>这个解锁政策真是让我大跌眼镜,根本是刁难用户。真搞不明白小米公司怎么想的。如果嫌用户解锁后弄坏手机要去售后,那可以在用户解锁 bootloader 后取消售后。</p> <p>新解锁政策还有一个恶心的点:只针对中国大陆的设备。凭什么陆版手机解锁就那么难,国际版手机解锁就和以前一样<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>。</p> <p>新解锁政策大大影响了第三方 ROM 的开发。本小米老用户感到伤心、失望、生气。买陆版小米手机刷机的日子可能一去不复返了。</p> <div class="footnotes" role="doc-endnotes"> <hr> <ol> <li id="fn:1"> <p><a href="https://github.com/TheAirBlow/HyperSploit/">HyperSploit</a> 和 <a href="https://github.com/MlgmXyysd/Xiaomi-HyperOS-BootLoader-Bypass">Xiaomi-HyperOS-BootLoader-Bypass</a> 可以绕过 HyperOS 的解锁限制,推荐使用前者。&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p> </li> <li id="fn:2"> <p>国际版手机解锁也没那么容易了,我在 PixelOS Chat 看到有人申请解锁时提示额度已满(<a href="https://t.me/pixeloschat/466581">https://t.me/pixeloschat/466581</a>)。&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p> </li> </ol> </div>

2024/12/7
阅读更多

一加 Ace 3 刷机前的准备与安装 PixelOS 的过程

<p>PixelOS 升级流程:<a href="https://cyrusyip.org/zh-cn/posts/2025/02/13/oneplus-ace3-from-pixelos14-to-pixelos15/">将一加 Ace 3 从 PixelOS 14 升级到 PixelOS 15</a>。</p> <h2 class="heading" id="注意事项"> 注意事项<span class="heading__anchor"> <a href="#%e6%b3%a8%e6%84%8f%e4%ba%8b%e9%a1%b9">#</a></span> </h2><ul> <li>本文的操作可能会过时,建议参考文末的文章。</li> <li>拿到手机要马上关闭自动更新,避免更新到不合适刷机的版本。</li> <li>解锁 bootloader 重启后马上关掉自动更新。</li> <li>解锁 bootloader 时会清除数据。如果确定要刷机,建议买到手机马上解锁,后面拿到 root 权限可以用 Neo Backup 备份应用数据。</li> </ul> <h2 class="heading" id="名词解释"> 名词解释<span class="heading__anchor"> <a href="#%e5%90%8d%e8%af%8d%e8%a7%a3%e9%87%8a">#</a></span> </h2><ul> <li>刷机:安装操作系统</li> <li>ROM:操作系统。ROM 本义是可读存储器(read-only memory),在刷机的语境下是(安装于 ROM 的)操作系统的意思。</li> <li>bootloader:引导程序,需要先解锁它才能安装其他操作系统</li> <li>root:最高权限</li> <li>ocdt.img:每台一加手机特有的分区</li> <li>persist.img:每台手机特有的分区</li> </ul> <h2 class="heading" id="恢复系统教程"> 恢复系统教程<span class="heading__anchor"> <a href="#%e6%81%a2%e5%a4%8d%e7%b3%bb%e7%bb%9f%e6%95%99%e7%a8%8b">#</a></span> </h2><p>先看这篇恢复系统的教程:<a href="https://xdaforums.com/t/12r-ace-3-edl-downloadtool-to-restore-your-device-to-oxygenos-coloros.4654245/">How To Guide - [12R/Ace 3] EDL DownloadTool to restore your device to OxygenOS/ColorOS | XDA Forums</a>,最好用不上啦。</p> <h2 class="heading" id="测试硬件功能"> 测试硬件功能<span class="heading__anchor"> <a href="#%e6%b5%8b%e8%af%95%e7%a1%ac%e4%bb%b6%e5%8a%9f%e8%83%bd">#</a></span> </h2><p>测试硬件功能,参考 <a href="https://github.com/LineageOS/charter/blob/main/device-support-requirements.md">charter/device-support-requirements.md at main · LineageOS/charter</a>。</p> <p>确定硬件没问题后,如果刷机后有问题就是 ROM 有问题。</p> <ul> <li><input checked="" disabled="" type="checkbox"> 扬声器、听筒</li> <li><input checked="" disabled="" type="checkbox"> WIFI</li> <li><input checked="" disabled="" type="checkbox"> 通话</li> <li><input checked="" disabled="" type="checkbox"> USB</li> <li><input checked="" disabled="" type="checkbox"> 蓝牙</li> <li><input checked="" disabled="" type="checkbox"> 前置摄像头(拍照、录像)</li> <li><input checked="" disabled="" type="checkbox"> 后置摄像头(0.6/1/2/5 倍数,拍照、录像)</li> <li><input checked="" disabled="" type="checkbox"> 指纹</li> <li><input checked="" disabled="" type="checkbox"> NFC</li> <li><input checked="" disabled="" type="checkbox"> 红外线(遥控)</li> <li><input checked="" disabled="" type="checkbox"> 定位</li> <li><input checked="" disabled="" type="checkbox"> 陀螺仪(指南针)</li> <li><input checked="" disabled="" type="checkbox"> 距离传感器(通话时会熄屏)</li> <li><input checked="" disabled="" type="checkbox"> 光传感器(自动亮度)</li> <li><input checked="" disabled="" type="checkbox"> 网络(只测了 5G)</li> </ul> <h2 class="heading" id="记录版本信息"> 记录版本信息<span class="heading__anchor"> <a href="#%e8%ae%b0%e5%bd%95%e7%89%88%e6%9c%ac%e4%bf%a1%e6%81%af">#</a></span> </h2><p>记录版本信息,可能以后有用。打开设置-&gt;关于手机-&gt;版本信息。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span><span class="lnt">4 </span><span class="lnt">5 </span><span class="lnt">6 </span><span class="lnt">7 </span><span class="lnt">8 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">版本号 </span></span><span class="line"><span class="cl">PJE110_14.0.0.813(CN01U140P02) </span></span><span class="line"><span class="cl">基带版本 </span></span><span class="line"><span class="cl">Q_V1_P14,Q_V1_P14 </span></span><span class="line"><span class="cl">内核版本 </span></span><span class="line"><span class="cl">5.15.123-android-13-8-00766-gf04dea8b48fa </span></span><span class="line"><span class="cl">SOTA 版本号 </span></span><span class="line"><span class="cl">U140P02(BRB1CN01) </span></span></code></pre></td></tr></table> </div> </div><h2 class="heading" id="解锁-bootloader"> 解锁 bootloader<span class="heading__anchor"> <a href="#%e8%a7%a3%e9%94%81-bootloader">#</a></span> </h2><p>在电脑安装 adb 和 fastboot,参看 <a href="https://wiki.lineageos.org/adb_fastboot_guide">Using ADB and fastboot | LineageOS Wiki</a>。</p> <p>解锁时会清除数据。如果确定要刷机,建议买到手机马上解锁,后面拿到 root 权限可以用 Neo Backup 备份应用数据。</p> <p>打开设置-&gt;关于手机-&gt;版本信息,快速多次点击版本号,开启开发者模式。</p> <p>返回设置,打开系统与更新-&gt;开发者选项,开启 OEM 解锁和 USB 调试。</p> <p>手机通过数据线插到电脑 USB 口。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span><span class="lnt">4 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">adb devices <span class="c1"># 手机按允许调试</span> </span></span><span class="line"><span class="cl">adb reboot bootloader <span class="c1"># 进入 fastboot 模式</span> </span></span><span class="line"><span class="cl">fastboot devices <span class="c1"># 应该会看到编号</span> </span></span><span class="line"><span class="cl">fastboot flashing unlock <span class="c1"># 解锁 bootloader,用音量键选择 UNLOCK THE BOOTLOADER,按电源键确认</span> </span></span></code></pre></td></tr></table> </div> </div><p>现在手机重置了,开机后跳过可以跳过的设置,进入桌面。打开设置,搜索「更新」,打开「自动更新设置」,关闭自动下载和夜间自动更新。</p> <h2 class="heading" id="获取-root-权限"> 获取 root 权限<span class="heading__anchor"> <a href="#%e8%8e%b7%e5%8f%96-root-%e6%9d%83%e9%99%90">#</a></span> </h2><p>Oxygen Updater 不能下载一加 Ace 3 的 ROM,所以从大侠阿木的网站下载当前版本的 ROM,也就是 <a href="https://yun.daxiaamu.com/OnePlus_Roms/%E4%B8%80%E5%8A%A0OnePlus%20ACE%203/ColorOS%20PJE110_14.0.0.813%28CN01%29%20A.74/">PJE110_14.0.0.813</a>。</p> <p>解压文件,获得 <code>payload.bin</code>。</p> <p>安装 <a href="https://github.com/ssut/payload-dumper-go">payload-dumper-go</a>。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="c1"># Arch Linux 的安装方法</span> </span></span><span class="line"><span class="cl">paru -S payload-dumper-go-bin </span></span></code></pre></td></tr></table> </div> </div><p>解压 <code>payload.bin</code>。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">payload-dumper-go payload.bin </span></span></code></pre></td></tr></table> </div> </div><p>进入解压目录,将 <code>init_boot.img</code> 传到手机。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">adb push init_boot.img /sdcard/Download/ </span></span></code></pre></td></tr></table> </div> </div><p>在电脑下载 <a href="https://github.com/topjohnwu/Magisk/releases">Magisk</a>,通过 adb 安装到手机。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">adb install app-release.apk <span class="c1"># 在手机同意安装</span> </span></span></code></pre></td></tr></table> </div> </div><p>在手机打开 Magisk,点击「Magisk 安装-&gt;选择并修复一个文件」,选择 <code>init_boot.img</code>,点击「开始」。在文件管理将修补好的文件重命名为 <code>magisk_patched.img</code>。</p> <p>将 <code>magisk_patched.img</code> 复制到电脑。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">adb pull /sdcard/Download/magisk_patched.img </span></span></code></pre></td></tr></table> </div> </div><p>获取 root 权限。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">adb reboot bootloader </span></span><span class="line"><span class="cl">fastboot flash init_boot magisk_patched.img </span></span><span class="line"><span class="cl">fastboot reboot </span></span></code></pre></td></tr></table> </div> </div><h2 class="heading" id="备份-ocdtimg-和-persistimg"> 备份 ocdt.img 和 persist.img<span class="heading__anchor"> <a href="#%e5%a4%87%e4%bb%bd-ocdtimg-%e5%92%8c-persistimg">#</a></span> </h2><p>每台一加手机的 ocdt.img 和 persist.img 都是独一无二的,所以先要备份下来。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span><span class="lnt">4 </span><span class="lnt">5 </span><span class="lnt">6 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">adb shell </span></span><span class="line"><span class="cl">su <span class="c1"># 在手机授权</span> </span></span><span class="line"><span class="cl">dd <span class="k">if</span><span class="o">=</span>/dev/block/bootdevice/by-name/ocdt <span class="nv">of</span><span class="o">=</span>/sdcard/Download/ocdt.img </span></span><span class="line"><span class="cl">dd <span class="k">if</span><span class="o">=</span>/dev/block/bootdevice/by-name/persist <span class="nv">of</span><span class="o">=</span>/sdcard/Download/persist.img </span></span><span class="line"><span class="cl"><span class="nb">exit</span> </span></span><span class="line"><span class="cl"><span class="nb">exit</span> </span></span></code></pre></td></tr></table> </div> </div><p>现在 ocdt.img 和 persist.img 都在手机的 <code>Download</code> 文件夹,将它们复制到电脑。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">adb pull /sdcard/Download/ocdt.img </span></span><span class="line"><span class="cl">adb pull /sdcard/Download/persist.img </span></span></code></pre></td></tr></table> </div> </div><p>把前面记录的版本信息保存成文本文件,和这两个 <code>.img</code> 文件一起备份到网盘。</p> <h2 class="heading" id="安装-pixel-os"> 安装 Pixel OS<span class="heading__anchor"> <a href="#%e5%ae%89%e8%a3%85-pixel-os">#</a></span> </h2><p>参考以下资料安装 Pixel OS。</p> <ul> <li><a href="https://pixelos.net/download/aston">PixelOS - aston</a>(点击页面的 Download 可以下载需要的文件)</li> <li><a href="https://xdaforums.com/t/12r-ace3-rom-14-official-pixelos-aosp-19-10-24.4662225/">Development - [12R/ACE3][ROM][14][OFFICIAL] PixelOS [AOSP][19/10/24] | XDA Forums</a></li> </ul> <p>我的安装过程有错误操作,为了避免误导读者,就删掉了。如果你真的想看,请点击<a href="https://github.com/CyrusYip/blog-comments/discussions/83#discussioncomment-11663008">这里</a>。</p> <!-- ```shell adb reboot bootloader fastboot flash boot boot-aston-20241019.img fastboot flash vendor_boot vendor_boot-aston-20241019.img fastboot flash dtbo dtbo-aston-20241019.img fastboot flash recovery recovery-aston-20241019.img ``` 按音量键切换到 Recovery mode,按电源键确认。选择 Apply update -> Apply from ADB。 ``` adb sideload PixelOS_aston-14.0-20241018-1605.zip ``` 现在屏幕显示 `Active slot: b` 和 `Do you want to reboot to recovery now?`,选择 `Yes`。 现在屏幕显示 `Active slot: a`,选择 Apply update -> Apply from ADB,再次安装 PixelOS(文档写要安装两次,这里是错误操作,应该是进入系统后再次安装)。 ```shell adb sideload PixelOS_aston-14.0-20241018-1605.zip ``` 这次报错了,先不管。 选择 Factory reset -> Format data/factory reset -> Format data,返回,选择 Reboot system now。可以开机。 开机连接 WIFI 后等了有两三分钟,显示 Slow connection,选择左边的 Set up offline。字体有点小,在设置里调大 Display size。 原系统在 https://resolution-viewer.cyrusyip.org/ 看到的缩放值好像是 350% 下拉通知栏,点击「Charging this device via USB」,选择 File Transfer。在电脑把 `PixelOS_aston-14.0-20241018-1605.zip` 复制到 Download 文件夹。 在手机打开 Settings -> System -> System updates -> Local update,选择刚刚的 `.zip`文件,点击 INSTALL,完成后点 Reboot,重启成功。 再重启一次,没事,应该算成功安装 PixelOS 了。 --> <p>系统自带谷歌服务,用 YASNAC 测试 SafetyNet,Basic integrity 显示 pass。</p> <h2 class="heading" id="再次测试硬件功能"> 再次测试硬件功能<span class="heading__anchor"> <a href="#%e5%86%8d%e6%ac%a1%e6%b5%8b%e8%af%95%e7%a1%ac%e4%bb%b6%e5%8a%9f%e8%83%bd">#</a></span> </h2><p>参考前面的章节。既然在原装系统没事,我这次就懒得测了。</p> <!-- ## 刷入固件 似乎不需要此步骤。 --> <h2 class="heading" id="参考资料"> 参考资料<span class="heading__anchor"> <a href="#%e5%8f%82%e8%80%83%e8%b5%84%e6%96%99">#</a></span> </h2><ul> <li><a href="https://xdaforums.com/t/how-to-root-oneplus-12r-a-complete-guide.4663162/">How To Guide - How to root OnePlus 12R, a complete guide | XDA Forums</a></li> <li><a href="https://topjohnwu.github.io/Magisk/install.html">Installation | Magisk</a></li> <li><a href="https://droidwin.com/how-to-backup-ocdt-and-persist-partition-on-oneplus-12-12r/">How to Backup and Flash ocdt and persist partition on OnePlus - DroidWin</a></li> <li><a href="https://www.youtube.com/watch?v=EL3yTxpDIjk">Backup ocdt.img or You Might Lose Fastboot Mode [OnePlus] - YouTube</a></li> <li><a href="https://xdaforums.com/t/12r-ace3-rom-14-official-pixelos-aosp-19-10-24.4662225/">Development - [12R/ACE3][ROM][14][OFFICIAL] PixelOS [AOSP][19/10/24] | XDA Forums</a></li> <li><a href="https://pixelos.net/download/aston">PixelOS - aston</a></li> <li><a href="https://xdaforums.com/t/12r-ace-3-edl-downloadtool-to-restore-your-device-to-oxygenos-coloros.4654245/">How To Guide - [12R/Ace 3] EDL DownloadTool to restore your device to OxygenOS/ColorOS | XDA Forums</a></li> </ul>

2024/12/4
阅读更多

OPPO / 一加 / ColorOS 的 Google Play 安装教程

<ol> <li>开启谷歌服务:打开设置,搜索「google」,点击「Google 设置」,开启「Google 移动服务」。</li> <li>安装 Google Play:打开应用商店,搜索「google play」,升级「谷歌应用市场」。升级完后桌面会出现「Play 商店」。</li> </ol> <hr> <p>测试机型:一加 OnePlus Ace 3(ColorOS 14)、OPPO Reno12(ColorOS 14)。</p> <!-- OPPO Reno12 是在线下店测试的。 -->

2024/11/14
阅读更多

概念解析:物理像素、逻辑像素、CSS 像素、物理分辨率、逻辑分辨率

<p>物理(physical)表示实际的值,逻辑(logical)表示经过缩放的值。</p> <h2 class="heading" id="物理像素"> 物理像素<span class="heading__anchor"> <a href="#%e7%89%a9%e7%90%86%e5%83%8f%e7%b4%a0">#</a></span> </h2><p>像素(pixel)是显示器的基本单位,一个像素显示一种颜色。为了和逻辑像素(logical pixel)区分,像素(pixel)又称物理像素(physical pixel)。</p> <h2 class="heading" id="逻辑像素--css-像素"> 逻辑像素 / CSS 像素<span class="heading__anchor"> <a href="#%e9%80%bb%e8%be%91%e5%83%8f%e7%b4%a0--css-%e5%83%8f%e7%b4%a0">#</a></span> </h2><p>逻辑像素(logical pixel),亦称 CSS 像素(CSS pixel),是经过操作系统缩放的像素。CSS 的 <code>px</code> 就是 CSS 像素。</p> <h2 class="heading" id="物理分辨率"> 物理分辨率<span class="heading__anchor"> <a href="#%e7%89%a9%e7%90%86%e5%88%86%e8%be%a8%e7%8e%87">#</a></span> </h2><p>物理分辨率(physical resolution)表示像素的数量。1920×1080 分辨率就表示显示器水平方向有 1920 个像素,垂直方向有 1080 个像素,共 2073600 个像素。尺寸相同时,显示器分辨率越高,显示效果就越精细。</p> <h2 class="heading" id="逻辑分辨率"> 逻辑分辨率<span class="heading__anchor"> <a href="#%e9%80%bb%e8%be%91%e5%88%86%e8%be%a8%e7%8e%87">#</a></span> </h2><p>逻辑分辨率(logical resolution)是经过系统缩放的分辨率。</p> <p>我用 1920×1080 分辨率,27 英寸的显示器,文字看得清楚。假如我换成同尺寸 3840×2160 的显示器,此时显示器像素数是前者的 4 倍,可以容纳更多的文字,文字会变得小得看不清。在浏览器按几下 <code>Ctrl -</code> 调节缩放也可以看到过小的文字。</p> <p>在系统设置 200% 缩放后,分辨率就变成了 (3840/2)×(2160/2),也就是 1920×1080,此时文字大小又正常了。3840×2160 是物理分辨率,1920×1080是逻辑分辨率。</p> <h2 class="heading" id="相关的-web-api"> 相关的 Web API<span class="heading__anchor"> <a href="#%e7%9b%b8%e5%85%b3%e7%9a%84-web-api">#</a></span> </h2><p>以 2560×1440 物理分辨率,200% 缩放的显示器为例,展示相关 Web API 的用法。</p> <!-- 显示器尺寸为 15.6 英寸 --> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="c1">// 逻辑宽度 </span></span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nb">window</span><span class="p">.</span><span class="nx">screen</span><span class="p">.</span><span class="nx">width</span><span class="p">)</span> <span class="c1">// 1280 </span></span></span><span class="line"><span class="cl"><span class="c1">// 逻辑高度 </span></span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nb">window</span><span class="p">.</span><span class="nx">screen</span><span class="p">.</span><span class="nx">height</span><span class="p">)</span> <span class="c1">// 720 </span></span></span><span class="line"><span class="cl"><span class="c1">// 缩放(物理高度/逻辑高度) </span></span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nb">window</span><span class="p">.</span><span class="nx">devicePixelRatio</span><span class="p">)</span> <span class="c1">// 2 </span></span></span><span class="line"><span class="cl"><span class="c1">// 物理宽度,需要借助 devicePixelRatio 来计算 </span></span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nb">window</span><span class="p">.</span><span class="nx">screen</span><span class="p">.</span><span class="nx">width</span><span class="o">*</span><span class="nb">window</span><span class="p">.</span><span class="nx">devicePixelRatio</span><span class="p">)</span> <span class="c1">// 2560 </span></span></span><span class="line"><span class="cl"><span class="c1">// 物理高度,需要借助 devicePixelRatio 来计算 </span></span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nb">window</span><span class="p">.</span><span class="nx">screen</span><span class="p">.</span><span class="nx">height</span><span class="o">*</span><span class="nb">window</span><span class="p">.</span><span class="nx">devicePixelRatio</span><span class="p">)</span> <span class="c1">// 1440 </span></span></span></code></pre></td></tr></table> </div> </div><h2 class="heading" id="在线查看分辨率"> 在线查看分辨率<span class="heading__anchor"> <a href="#%e5%9c%a8%e7%ba%bf%e6%9f%a5%e7%9c%8b%e5%88%86%e8%be%a8%e7%8e%87">#</a></span> </h2><p>我写了个查看物理分辨率、逻辑分辨率和视口大小的网站,欢迎使用。</p> <p>网站链接:<a href="https://resolution-viewer.cyrusyip.org/">https://resolution-viewer.cyrusyip.org/</a></p> <p>源代码:<a href="https://github.com/CyrusYip/resolution-viewer">https://github.com/CyrusYip/resolution-viewer</a></p>

2024/11/1
阅读更多

jQuery 使用笔记

<p><a href="https://github.com/jquery/jquery">jQuery</a> 是一个经典的 JavaScript 库,其功能为修改 HTML 元素、处理事件、制作动画、发送请求(Ajax)。jQuery 首次发布于 2006 年 8 月 26 日,现在(2024 年)已经 18 岁了。截止于 2024 年 10 月 23 日,有 75.8% 的网站使用了 jQuery<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>。</p> <p>虽然 jQuery 的使用率高,但新项目没必要用 jQuery,原生 JavaScript 已经可以实现 jQuery 的操作,参看 <a href="https://youmightnotneedjquery.com/">You Might Not Need jQuery</a> 和 <a href="https://github.com/camsong/You-Dont-Need-jQuery">You-Dont-Need-jQuery</a>。维护老项目时可能会用到 jQuery。</p> <p>jQuery 的<a href="https://jquery.com/download/">引入方法</a>很多,我在本文采用 CDN 引入。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">script</span> <span class="na">src</span><span class="o">=</span><span class="s">&#34;https://cdn.jsdelivr.net/npm/jquery@3.7.1/dist/jquery.min.js&#34;</span> <span class="na">integrity</span><span class="o">=</span><span class="s">&#34;sha256-/JqT3SQfawRcv/BIHPThkBvs0OEvtFFmqPF/lYI/Cxo=&#34;</span> <span class="na">crossorigin</span><span class="o">=</span><span class="s">&#34;anonymous&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">script</span><span class="p">&gt;</span> </span></span></code></pre></td></tr></table> </div> </div><p>下面介绍一些常见用法。</p> <h2 class="heading" id="获取元素"> 获取元素<span class="heading__anchor"> <a href="#%e8%8e%b7%e5%8f%96%e5%85%83%e7%b4%a0">#</a></span> </h2><p>jQuery 使用 CSS 选择器获取元素。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">$</span><span class="p">(</span><span class="nb">document</span><span class="p">)</span> <span class="c1">// 获取整个文档 </span></span></span><span class="line"><span class="cl"><span class="nx">$</span><span class="p">(</span><span class="s2">&#34;#id1&#34;</span><span class="p">)</span> <span class="c1">// 获取 id 为 id1 的元素 </span></span></span><span class="line"><span class="cl"><span class="nx">$</span><span class="p">(</span><span class="s2">&#34;.class1&#34;</span><span class="p">)</span> <span class="c1">// 获取 class 为 class1 的元素 </span></span></span></code></pre></td></tr></table> </div> </div><h2 class="heading" id="插入元素"> 插入元素<span class="heading__anchor"> <a href="#%e6%8f%92%e5%85%a5%e5%85%83%e7%b4%a0">#</a></span> </h2><div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="c">&lt;!-- HTML 示例 --&gt;</span> </span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">div</span> <span class="na">id</span><span class="o">=</span><span class="s">&#34;container&#34;</span><span class="p">&gt;&lt;</span><span class="nt">p</span><span class="p">&gt;</span>Container<span class="p">&lt;/</span><span class="nt">p</span><span class="p">&gt;&lt;/</span><span class="nt">div</span><span class="p">&gt;</span> </span></span></code></pre></td></tr></table> </div> </div><div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span><span class="lnt">4 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">$</span><span class="p">(</span><span class="s2">&#34;#container&#34;</span><span class="p">).</span><span class="nx">append</span><span class="p">(</span><span class="s2">&#34;&lt;p&gt;inside-end&lt;/p&gt;&#34;</span><span class="p">);</span> <span class="c1">// 在 #container 末尾插入子元素 </span></span></span><span class="line"><span class="cl"><span class="nx">$</span><span class="p">(</span><span class="s2">&#34;#container&#34;</span><span class="p">).</span><span class="nx">prepend</span><span class="p">(</span><span class="s2">&#34;&lt;p&gt;inside-start&lt;/p&gt;&#34;</span><span class="p">);</span> <span class="c1">// 在 #container 开头插入子元素 </span></span></span><span class="line"><span class="cl"><span class="nx">$</span><span class="p">(</span><span class="s2">&#34;#container&#34;</span><span class="p">).</span><span class="nx">after</span><span class="p">(</span><span class="s2">&#34;&lt;p&gt;outside-end&lt;/p&gt;&#34;</span><span class="p">)</span> <span class="c1">// 在 #container 后面插入兄弟元素 </span></span></span><span class="line"><span class="cl"><span class="nx">$</span><span class="p">(</span><span class="s2">&#34;#container&#34;</span><span class="p">).</span><span class="nx">before</span><span class="p">(</span><span class="s2">&#34;&lt;p&gt;outside-start&lt;/p&gt;&#34;</span><span class="p">)</span> <span class="c1">// 在 #container 前面插入兄弟元素 </span></span></span></code></pre></td></tr></table> </div> </div><p>现在页面上的元素是这样的:</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span><span class="lnt">4 </span><span class="lnt">5 </span><span class="lnt">6 </span><span class="lnt">7 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">p</span><span class="p">&gt;</span>outside-start<span class="p">&lt;/</span><span class="nt">p</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">div</span> <span class="na">id</span><span class="o">=</span><span class="s">&#34;container&#34;</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">p</span><span class="p">&gt;</span>inside-start<span class="p">&lt;/</span><span class="nt">p</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">p</span><span class="p">&gt;</span>Container<span class="p">&lt;/</span><span class="nt">p</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">p</span><span class="p">&gt;</span>inside-end<span class="p">&lt;/</span><span class="nt">p</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">p</span><span class="p">&gt;</span>outside-end<span class="p">&lt;/</span><span class="nt">p</span><span class="p">&gt;</span> </span></span></code></pre></td></tr></table> </div> </div><h2 class="heading" id="取值与赋值"> 取值与赋值<span class="heading__anchor"> <a href="#%e5%8f%96%e5%80%bc%e4%b8%8e%e8%b5%8b%e5%80%bc">#</a></span> </h2><p>jQuery 使用同一个函数来取值和赋值,根据参数数量进行不同操作。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="c">&lt;!-- HTML 示例 --&gt;</span> </span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">h1</span> <span class="na">id</span><span class="o">=</span><span class="s">&#34;title&#34;</span><span class="p">&gt;</span>Title<span class="p">&lt;/</span><span class="nt">h1</span><span class="p">&gt;</span> </span></span></code></pre></td></tr></table> </div> </div><div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span><span class="lnt">4 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">$</span><span class="p">(</span><span class="s2">&#34;#title&#34;</span><span class="p">).</span><span class="nx">html</span><span class="p">()</span> <span class="c1">// 获取 #title 的值 </span></span></span><span class="line"><span class="cl"><span class="nx">$</span><span class="p">(</span><span class="s2">&#34;#title&#34;</span><span class="p">).</span><span class="nx">html</span><span class="p">(</span><span class="s2">&#34;Another title&#34;</span><span class="p">)</span> <span class="c1">// 修改 #title 的值 </span></span></span><span class="line"><span class="cl"><span class="nx">$</span><span class="p">(</span><span class="s2">&#34;#title&#34;</span><span class="p">).</span><span class="nx">width</span><span class="p">()</span> <span class="c1">// 获取 #title 的宽度 </span></span></span><span class="line"><span class="cl"><span class="nx">$</span><span class="p">(</span><span class="s2">&#34;#title&#34;</span><span class="p">).</span><span class="nx">width</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="c1">// 修改 #title 的宽度 </span></span></span></code></pre></td></tr></table> </div> </div><h2 class="heading" id="链式调用"> 链式调用<span class="heading__anchor"> <a href="#%e9%93%be%e5%bc%8f%e8%b0%83%e7%94%a8">#</a></span> </h2><p>jQuery 的每个操作都会返回 jQuery 对象,所以可以进行连续操作。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span><span class="lnt">4 </span><span class="lnt">5 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="c">&lt;!-- HTML 示例 --&gt;</span> </span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">div</span> <span class="na">id</span><span class="o">=</span><span class="s">&#34;container&#34;</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">p</span><span class="p">&gt;</span>Paragraph 1<span class="p">&lt;/</span><span class="nt">p</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">p</span><span class="p">&gt;</span>Paragraph 2<span class="p">&lt;/</span><span class="nt">p</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span> </span></span></code></pre></td></tr></table> </div> </div><div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span><span class="lnt">4 </span><span class="lnt">5 </span><span class="lnt">6 </span><span class="lnt">7 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="nx">$</span><span class="p">(</span><span class="s2">&#34;div&#34;</span><span class="p">)</span> <span class="c1">// 选择 div 元素 </span></span></span><span class="line"><span class="cl"> <span class="p">.</span><span class="nx">find</span><span class="p">(</span><span class="s2">&#34;p&#34;</span><span class="p">)</span> <span class="c1">// 查找 div 里的 p 元素 </span></span></span><span class="line"><span class="cl"> <span class="p">.</span><span class="nx">eq</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="c1">// 选择第 2 个元素 </span></span></span><span class="line"><span class="cl"> <span class="p">.</span><span class="nx">html</span><span class="p">(</span><span class="s2">&#34;end&#34;</span><span class="p">)</span> <span class="c1">// 把第 2 个元素内容修改为 end </span></span></span><span class="line"><span class="cl"> <span class="p">.</span><span class="nx">end</span><span class="p">()</span> <span class="c1">// 退回到上一个选中的元素,也就是 .find(&#34;p&#34;) </span></span></span><span class="line"><span class="cl"> <span class="p">.</span><span class="nx">eq</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span> <span class="c1">// 选择第 1 个元素 </span></span></span><span class="line"><span class="cl"> <span class="p">.</span><span class="nx">html</span><span class="p">(</span><span class="s2">&#34;start&#34;</span><span class="p">)</span> <span class="c1">// 将第 1 个元素内容修改为 start </span></span></span></code></pre></td></tr></table> </div> </div><p>现在页面是 start 在上面,end 在下面。</p> <h2 class="heading" id="资料"> 资料<span class="heading__anchor"> <a href="#%e8%b5%84%e6%96%99">#</a></span> </h2><ul> <li><a href="https://api.jquery.com/">jQuery API Documentation</a></li> <li><a href="https://youmightnotneedjquery.com/">You Might Not Need jQuery</a></li> <li><a href="https://github.com/camsong/You-Dont-Need-jQuery">You-Dont-Need-jQuery</a></li> <li><a href="https://en.wikipedia.org/wiki/JQuery">jQuery - Wikipedia</a></li> </ul> <div class="footnotes" role="doc-endnotes"> <hr> <ol> <li id="fn:1"> <p>数据出自 <a href="https://w3techs.com/technologies/overview/javascript_library">Usage Statistics and Market Share of JavaScript Libraries for Websites</a>(<a href="https://archive.is/rF9VQ">存档</a>)&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p> </li> </ol> </div>

2024/10/22
阅读更多

优化 Hugo 博客速度:Pjax、dynamic script、preload、minification

<!-- 更新的时候记得更新相关代码的链接 --> <p>本文介绍了优化博客速度的几个方式:Pjax(免刷新加载页面)、dynamic script(动态插入脚本)、<a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/rel/preload">rel=preload</a>(预加载)、minification(极简化)。</p> <p>本博客是 Hugo 生成的静态网站,感觉访问速度还不算慢。有天我看别人的博客(大概是单页应用),发现点击链接居然没刷新网页就加载了新页面,速度非常快。那时我想:要是我的 Hugo 博客也能这么流畅就好了。我感觉把博客改成单页应用要耗费不少时间,遂作罢。</p> <p>后来我发现可以用 Pjax 技术让静态网站实现免刷新加载页面。Pjax 的意思是 <strong>p</strong>ushState(修改 URL)+ A<strong>jax</strong>(asynchronous JavaScript and XML,发送请求)。通俗来说,Pjax 就是请求网页、替换内容、修改 URL,这个过程比加载整个页面更快。</p> <p>搜索 Pjax 库,找到两个好几年没更新的库(<a href="https://github.com/MoOx/pjax">MoOx/pjax</a>、<a href="https://github.com/defunkt/jquery-pjax">defunkt/jquery-pjax</a>),我不想用不维护的库。我快放弃的时候发现了一个支持 Pjax 的 Hugo 主题:<a href="https://github.com/Ice-Hazymoon/hugo-theme-luna">hugo-theme-luna</a>,从自述文件可以看出 Pjax 是用 <a href="https://swup.js.org/">swup</a> 实现的,然后我就用它了。</p> <h2 class="heading" id="pjax-免刷新加载页面"> Pjax 免刷新加载页面<span class="heading__anchor"> <a href="#pjax-%e5%85%8d%e5%88%b7%e6%96%b0%e5%8a%a0%e8%bd%bd%e9%a1%b5%e9%9d%a2">#</a></span> </h2><p>如果网站没有 JavaScript 代码,那直接加载 swup 就好了。</p> <p>建议使用这些插件:</p> <ul> <li><a href="https://swup.js.org/plugins/head-plugin/">Head Plugin</a>:刷新 <code>&lt;head&gt;</code> 元素的内容和 <code>&lt;html&gt;</code> 元素的 <code>lang</code> 属性。</li> <li><a href="https://swup.js.org/plugins/preload-plugin/">Preload Plugin</a>:光标在链接时预加载 URL,用户点击时就会内容会马上替换,还可以配置自动加载出现在可见区域的链接。</li> <li><a href="https://swup.js.org/plugins/progress-plugin/">Progress Bar Plugin</a>:加载时间较长时显示进度条。</li> </ul> <p>注意要先加载插件再加载 swup。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span><span class="lnt">14 </span><span class="lnt">15 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">script</span> <span class="na">src</span><span class="o">=</span><span class="s">&#34;https://unpkg.com/@swup/head-plugin@2&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">script</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">script</span> <span class="na">src</span><span class="o">=</span><span class="s">&#34;https://unpkg.com/@swup/preload-plugin@3&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">script</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">script</span> <span class="na">src</span><span class="o">=</span><span class="s">&#34;https://unpkg.com/@swup/progress-plugin@3&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">script</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">script</span> <span class="na">src</span><span class="o">=</span><span class="s">&#34;https://unpkg.com/swup@4&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">script</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">script</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="kr">const</span> <span class="nx">swup</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Swup</span><span class="p">({</span> </span></span><span class="line"><span class="cl"> <span class="nx">containers</span><span class="o">:</span> <span class="p">[</span><span class="s2">&#34;body&#34;</span><span class="p">],</span> <span class="c1">// 替换 &lt;body&gt; 的内容 </span></span></span><span class="line"><span class="cl"> <span class="nx">plugins</span><span class="o">:</span> <span class="p">[</span> </span></span><span class="line"><span class="cl"> <span class="k">new</span> <span class="nx">SwupHeadPlugin</span><span class="p">(),</span> </span></span><span class="line"><span class="cl"> <span class="k">new</span> <span class="nx">SwupPreloadPlugin</span><span class="p">({</span> <span class="nx">preloadVisibleLinks</span><span class="o">:</span> <span class="kc">true</span> <span class="p">}),</span> <span class="c1">// 预加载页面可见的链接 </span></span></span><span class="line"><span class="cl"> <span class="k">new</span> <span class="nx">SwupProgressPlugin</span><span class="p">(),</span> </span></span><span class="line"><span class="cl"> <span class="p">],</span> </span></span><span class="line"><span class="cl"> <span class="p">});</span> </span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">script</span><span class="p">&gt;</span> </span></span></code></pre></td></tr></table> </div> </div><p>我的博客用到了 3 个 JavaScript 程序:Google Analytics(流量统计)、Giscus(评论服务)、Disqus(评论服务),用了 swup 之后要考虑是否需要额外处理。</p> <p>读者点击链接加载新页面后的处理:</p> <ul> <li>Google Analytics:参考 <a href="https://developers.google.com/analytics/devguides/collection/ga4/single-page-applications?implementation=browser-history">Measure single-page applications | Google Analytics | Google for Developers</a>,打开 Enhanced measurement 就可以检测页面变化了。</li> <li>Giscus:加载。</li> <li>Disqus:重置(reset)或者加载。</li> </ul> <h2 class="heading" id="dynamic-script-动态插入脚本"> Dynamic Script 动态插入脚本<span class="heading__anchor"> <a href="#dynamic-script-%e5%8a%a8%e6%80%81%e6%8f%92%e5%85%a5%e8%84%9a%e6%9c%ac">#</a></span> </h2><p>我写了个动态插入脚本的函数,可以设置等待时间、加载前执行的函数、async、加载后执行的函数、attribute。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span><span class="lnt">14 </span><span class="lnt">15 </span><span class="lnt">16 </span><span class="lnt">17 </span><span class="lnt">18 </span><span class="lnt">19 </span><span class="lnt">20 </span><span class="lnt">21 </span><span class="lnt">22 </span><span class="lnt">23 </span><span class="lnt">24 </span><span class="lnt">25 </span><span class="lnt">26 </span><span class="lnt">27 </span><span class="lnt">28 </span><span class="lnt">29 </span><span class="lnt">30 </span><span class="lnt">31 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">loadScript</span><span class="p">({</span> </span></span><span class="line"><span class="cl"> <span class="nx">url</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="nx">delay</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="nx">onloadCallback</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="kr">async</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="nx">preloadCallback</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="nx">attributes</span> <span class="o">=</span> <span class="p">{},</span> </span></span><span class="line"><span class="cl"><span class="p">})</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="kd">function</span> <span class="nx">load</span><span class="p">()</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="p">(</span><span class="nx">preloadCallback</span><span class="p">)</span> <span class="nx">preloadCallback</span><span class="p">();</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="kr">const</span> <span class="nx">script</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">createElement</span><span class="p">(</span><span class="s2">&#34;script&#34;</span><span class="p">);</span> </span></span><span class="line"><span class="cl"> <span class="nx">script</span><span class="p">.</span><span class="nx">src</span> <span class="o">=</span> <span class="nx">url</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="nx">script</span><span class="p">.</span><span class="kr">async</span> <span class="o">=</span> <span class="kr">async</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="c1">// Set attributes </span></span></span><span class="line"><span class="cl"> <span class="nb">Object</span><span class="p">.</span><span class="nx">entries</span><span class="p">(</span><span class="nx">attributes</span><span class="p">).</span><span class="nx">forEach</span><span class="p">(([</span><span class="nx">key</span><span class="p">,</span> <span class="nx">value</span><span class="p">])</span> <span class="p">=&gt;</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="nx">script</span><span class="p">.</span><span class="nx">setAttribute</span><span class="p">(</span><span class="nx">key</span><span class="p">,</span> <span class="nx">value</span><span class="p">);</span> </span></span><span class="line"><span class="cl"> <span class="p">});</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="p">(</span><span class="nx">onloadCallback</span><span class="p">)</span> <span class="nx">script</span><span class="p">.</span><span class="nx">onload</span> <span class="o">=</span> <span class="nx">onloadCallback</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="nb">document</span><span class="p">.</span><span class="nx">body</span><span class="p">.</span><span class="nx">appendChild</span><span class="p">(</span><span class="nx">script</span><span class="p">);</span> </span></span><span class="line"><span class="cl"> <span class="p">}</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="p">(</span><span class="k">typeof</span> <span class="nx">delay</span> <span class="o">!==</span> <span class="s2">&#34;undefined&#34;</span><span class="p">)</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="nx">setTimeout</span><span class="p">(</span><span class="nx">load</span><span class="p">,</span> <span class="nx">delay</span><span class="p">);</span> </span></span><span class="line"><span class="cl"> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="nx">load</span><span class="p">();</span> </span></span><span class="line"><span class="cl"> <span class="p">}</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span></code></pre></td></tr></table> </div> </div><p>我给 Google Analytics、Giscus、Disqus 加了 100ms 等待时间,给 swup 添加了 200ms 等待时间。</p> <h2 class="heading" id="relpreload-预加载"> rel=preload 预加载<span class="heading__anchor"> <a href="#relpreload-%e9%a2%84%e5%8a%a0%e8%bd%bd">#</a></span> </h2><p>在 <code>&lt;link&gt;</code> 标签使用 <code>rel=&quot;preload&quot;</code> 可以让浏览器提前下载资源(字体、图片、脚本、样式等),后面动态插入脚本时浏览器就可以马上执行下载好的脚本。</p> <p>示例:</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span><span class="lnt">4 </span><span class="lnt">5 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">head</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">link</span> <span class="na">rel</span><span class="o">=</span><span class="s">&#34;preload&#34;</span> <span class="na">as</span><span class="o">=</span><span class="s">&#34;script&#34;</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;https://unpkg.com/@swup/head-plugin@2&#34;</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">link</span> <span class="na">rel</span><span class="o">=</span><span class="s">&#34;preload&#34;</span> <span class="na">as</span><span class="o">=</span><span class="s">&#34;script&#34;</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;https://unpkg.com/@swup/preload-plugin@3&#34;</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">link</span> <span class="na">rel</span><span class="o">=</span><span class="s">&#34;preload&#34;</span> <span class="na">as</span><span class="o">=</span><span class="s">&#34;script&#34;</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;https://unpkg.com/swup@4&#34;</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">head</span><span class="p">&gt;</span> </span></span></code></pre></td></tr></table> </div> </div><p>preload 应该叫 predownload,因为它并不会提前加载脚本,只是提前下载。</p> <h2 class="heading" id="minification-极简化"> Minification 极简化<span class="heading__anchor"> <a href="#minification-%e6%9e%81%e7%ae%80%e5%8c%96">#</a></span> </h2><p>这次优化博客没用到极简化,不过既然讲到优化博客了,就顺便说一下吧。极简化就是移除代码中不必要的内容(比如:空格、空行、缩进),从而减小文件大小,这样浏览器就能更快下载完网页。</p> <p>Hugo 可以极简化 HTML、CSS 和 JavaScript 文件。本博客的代码用 Hugo 极简化了。举个例子,样式文件大小原本是 13.8 kB,经过极简化后是 7.4 kB(原文件的 53.6%),传输过程中再经过 Brotli 压缩后是 2.1 kB(原文件的 15.2%)。</p> <!-- 对应的提交:dae0bf1 chore: format code in body-end.html 文件大小用 Chrome 看的 --> <h2 class="heading" id="相关代码"> 相关代码<span class="heading__anchor"> <a href="#%e7%9b%b8%e5%85%b3%e4%bb%a3%e7%a0%81">#</a></span> </h2><p>以下是这次优化用到的代码:</p> <ul> <li><a href="https://github.com/CyrusYip/cyrusyip-blog/blob/c1cce4360cc73bc2ad48bead3095633e0b6ad179/layouts/partials/head/head-start.html">preload</a></li> <li><a href="https://github.com/CyrusYip/cyrusyip-blog/blob/c1cce4360cc73bc2ad48bead3095633e0b6ad179/layouts/partials/body/body-end.html">Pjax、dynamic script</a></li> </ul> <!-- 最新版文件: https://github.com/CyrusYip/cyrusyip-blog/blob/main/layouts/partials/head/head-start.html https://github.com/CyrusYip/cyrusyip-blog/blob/main/layouts/partials/body/body-end.html --> <h2 class="heading" id="感想"> 感想<span class="heading__anchor"> <a href="#%e6%84%9f%e6%83%b3">#</a></span> </h2><p>我已经用 swup 两三天了,非常满意,真没想到静态网站可以变成单页应用。Preload 插件能让浏览器会自动提前加载页面,读者点击链接时页面会瞬间加载,这个感觉太爽啦!</p> <h2 class="heading" id="参考资料"> 参考资料<span class="heading__anchor"> <a href="#%e5%8f%82%e8%80%83%e8%b5%84%e6%96%99">#</a></span> </h2><ul> <li><a href="https://blog.skk.moe/post/how-to-make-a-fast-blog/">天下武功,唯快不破 —— 我是这样优化博客的 | Sukka&rsquo;s Blog</a></li> <li><a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/rel/preload">rel=preload - HTML: HyperText Markup Language | MDN</a></li> <li><a href="https://swup.js.org/">swup 文档</a></li> </ul>

2024/10/17
阅读更多

将 LineageOS 20 升级到 LineageOS 21

<p>我手机用的系统是开源的 LineageOS 20(Android 13),跨版本升级到 LineageOS 21(Android 14)需要用电脑手动操作。因为怕操作失误导致无法开机,所以想着先备份资料,但我懒得备份资料,于是好几个月没升级。今天就来升级了。</p> <h2 class="heading" id="备份"> 备份<span class="heading__anchor"> <a href="#%e5%a4%87%e4%bb%bd">#</a></span> </h2><p>虽然升级 LineageOS 不会清空储存空间,但为了保险起见,我按照自己的需求备份以下内容:</p> <ol> <li>微信聊天记录</li> <li>图片</li> <li>电子邮箱账户截图</li> <li>闹钟截图</li> <li>应用列表</li> </ol> <h2 class="heading" id="升级"> 升级<span class="heading__anchor"> <a href="#%e5%8d%87%e7%ba%a7">#</a></span> </h2><p>按照 <a href="https://wiki.lineageos.org/devices/lisa/upgrade/variant3/">Upgrade LineageOS on lisa | LineageOS Wiki</a> 的步骤,安装 LineageOS 21、重启到 Recovery、安装 Google Apps、重启。</p> <p>这里碰到一个奇怪的问题:手机通过数据线直接插到笔记本电脑的 USB 口,用 fastboot 可以检测到设备,但安装新系统时会报错。数据线插到 USB 集线器才行。</p> <h2 class="heading" id="感受"> 感受<span class="heading__anchor"> <a href="#%e6%84%9f%e5%8f%97">#</a></span> </h2><p>升级过程比我预想的简单。系统正常运作,所以清除了前面的备份。目前遇到两个问题:状态栏的快捷设置在亮色模式下仍然是暗色;Fcitx5 输入法底下的导航栏不见了,将「导航栏背景」设置为「跟随键盘背景色」即可解决。</p> <p>如果你也要升级 LineageOS,不要照搬我的步骤,要遵循 LineageOS Wiki 的步骤,不同设备的升级步骤可能有差异。</p>

2024/10/10
阅读更多

开放的心态

<p>在网上看到有人争论同类事物的好坏(比如:Vim 和 VS Code、Arch linux 和 Ubuntu),我认为没有必要去争。纠结哪个最好容易导致无尽的争吵。<strong>没有完美的工具,我们应该去思考工具的特点和适用场景。两个工具适用场景相似时可以先随便选一个,不要追求完美,适合就继续用,不适合就换另一个。</strong></p> <p>拿厨刀举例,主厨刀(chef&rsquo;s knife)和切片刀哪个好?这个问题没有绝对的答案。</p> <figure> <img src="https://upload.wikimedia.org/wikipedia/commons/4/4d/Chef%27s_Knife.jpg"><figcaption>主厨刀</figcaption></figure><figure> <img src="https://upload.wikimedia.org/wikipedia/commons/d/d5/Kitchen_Knife_06_Tablespoon.JPG"><figcaption>切片刀</figcaption></figure><p>主厨刀更轻更小,刀尖有弧度。刀尖有弧度就可以用摇刀切(rock chop),适合切蒜末。</p> <p>切片刀更重,用它切菜时更流畅,使用者更省力。切片刀更宽大,可以把食材拍扁,还可以把切好的食材铲起来倒入锅中。</p> <p>所以哪把刀好还是得看使用者的偏好,如果你喜欢轻巧就用主厨刀,喜欢功能多就用切片刀。</p> <p>当然其实这两把刀都能切蔬菜和肉,不是很了解的情况下任选一把即可。选其他工具也一样,没实际用过就感受不到细微的差别,与其纠结,不如先随便挑一个用着。</p> <hr> <p>图片出处:</p> <ul> <li><a href="https://commons.wikimedia.org/wiki/File:Chef%27s_Knife.jpg">File:Chef&rsquo;s Knife.jpg - Wikimedia Commons</a></li> <li><a href="https://commons.wikimedia.org/wiki/File:Kitchen_Knife_06_Tablespoon.JPG">File:Kitchen Knife 06 Tablespoon.JPG - Wikimedia Commons</a></li> </ul>

2024/9/30
阅读更多

冷泡茶教程

<p>冷泡茶是用低温水泡的茶,苦味比热泡茶淡,有清凉感。</p> <h2 class="heading" id="材料与工具"> 材料与工具<span class="heading__anchor"> <a href="#%e6%9d%90%e6%96%99%e4%b8%8e%e5%b7%a5%e5%85%b7">#</a></span> </h2><ul> <li>茶叶(红茶、绿茶等)</li> <li>水壶</li> <li>冰箱</li> </ul> <h2 class="heading" id="流程"> 流程<span class="heading__anchor"> <a href="#%e6%b5%81%e7%a8%8b">#</a></span> </h2><ol> <li>茶叶与冷水的重量比例为 1:50,将茶叶与冷水加到到水壶,关闭盖子。</li> <li>将水壶放入冰箱冷藏室,泡 4~8 小时。可以睡前泡,这样第二天早上就能喝了。</li> </ol> <!-- 菊花茶这样冷泡不行的茶叶要先用少量热水泡开再加冷水。这似乎不算冷泡茶了,故注释本段。 --> <h2 class="heading" id="补充资料"> 补充资料<span class="heading__anchor"> <a href="#%e8%a1%a5%e5%85%85%e8%b5%84%e6%96%99">#</a></span> </h2><ul> <li><a href="https://kmweb.moa.gov.tw/knowledgebase.php?id=23912">夏天到了教你泡冷泡茶 - 農業知識入口網</a></li> <li><a href="https://kmweb.moa.gov.tw/knowledgebase.php?func=2&amp;type=0&amp;id=314110">不同茶類之最佳冷泡條件 - 農業知識入口網</a></li> </ul>

2024/9/24
阅读更多

QWERTY 键盘标点符号的中英文名称

<p>AmE 表示 American English(美式英语),BrE 表示 British English(英式英语),表格的空白表示没有对应名称。</p> <table> <thead> <tr> <th>标点</th> <th>英文</th> <th>中文</th> </tr> </thead> <tbody> <tr> <td>~</td> <td>tilde</td> <td>波浪号</td> </tr> <tr> <td>!</td> <td>exclamation point (AmE) / exclamation mark (BrE)</td> <td>感叹号</td> </tr> <tr> <td>@</td> <td>at sign / at symbol</td> <td></td> </tr> <tr> <td>#</td> <td>hash / pound sign / number sign</td> <td>井号</td> </tr> <tr> <td>$</td> <td>dollar sign</td> <td>美元符号</td> </tr> <tr> <td>%</td> <td>percent sign</td> <td>百分号</td> </tr> <tr> <td>^</td> <td>caret</td> <td>脱字符</td> </tr> <tr> <td>&amp;</td> <td>ampersand / and sign</td> <td></td> </tr> <tr> <td>*</td> <td>asterisk</td> <td>星号</td> </tr> <tr> <td>( )</td> <td>parenthesis (AmE) / bracket (BrE) / round bracket (BrE)</td> <td>圆括号</td> </tr> <tr> <td>-</td> <td>hyphen / minus sign</td> <td>连字符/减号</td> </tr> <tr> <td>+</td> <td>plus sign</td> <td>加号</td> </tr> <tr> <td>`</td> <td>backtick/backquote/grave</td> <td>反引号/重音符</td> </tr> <tr> <td>_</td> <td>underscore</td> <td>下划线</td> </tr> <tr> <td>=</td> <td>equal sign (AmE) / equals sign (BrE)</td> <td>等号</td> </tr> <tr> <td>{ }</td> <td>brace / curly bracket</td> <td>花括号</td> </tr> <tr> <td>|</td> <td>verticle bar / pipe</td> <td>竖线/管道</td> </tr> <tr> <td>[ ]</td> <td>square bracket</td> <td>方括号</td> </tr> <tr> <td>\</td> <td>backslash</td> <td>反斜线/反斜杠</td> </tr> <tr> <td>:</td> <td>colon</td> <td>冒号</td> </tr> <tr> <td>&quot;</td> <td>double quote / double quotation mark</td> <td>双引号</td> </tr> <tr> <td>;</td> <td>semicolon</td> <td>分号</td> </tr> <tr> <td>'</td> <td>apostrophe / single quote / single quotation mark</td> <td>撇号/单引号</td> </tr> <tr> <td>&lt;</td> <td>less-than sign</td> <td>小于号</td> </tr> <tr> <td>&gt;</td> <td>greater-than sign</td> <td>大于号</td> </tr> <tr> <td>?</td> <td>question mark</td> <td>问号</td> </tr> <tr> <td>,</td> <td>comma</td> <td>逗号</td> </tr> <tr> <td>.</td> <td>period (AmE) / full stop (BrE)</td> <td>句号</td> </tr> <tr> <td>/</td> <td>slash / forward slash</td> <td>(正)斜线/(正)斜杠</td> </tr> </tbody> </table> <p>参考资料:<a href="https://en.wikipedia.org/wiki/Main_Page">Wikipedia, the free encyclopedia</a></p>

2024/9/19
阅读更多

少囤草稿,尽快发布

<p>笔记软件里面的草稿越来越多,但是发布的文章却越来越少了。造成这个情况的原因有:用于写博客的时间少了、对文章的要求过高。囤着草稿是不好的,写好的文章应该发出来,为了帮助自己和他人。</p> <p>刚写博客那会,我对文章内容没有太高要求,就是想着写好后几天内改几次(吐槽:这要求还不高吗),力求通俗易懂。后来写作要求提升了两次。</p> <p>第一次提升要求是因为我查 Linux 资料时经常看 <a href="https://wiki.archlinux.org/title/Main_page">ArchWiki</a>。ArchWiki 的内容又新又全面,而且注册个账号就可以贡献内容,<a href="https://wiki.archlinux.org/title/Special:Contributions/Cyrus_Yip">我自己也贡献了一些内容</a>。在这个过程中我觉得知识应该像 ArchWiki 那样,集中在一个地方,每个话题都有单独的页面,还方便大家贡献。慢慢我就不想写那些别人写过的内容,除非我能写得更好。能查到的内容就没必要写了。这就是程序员说的「<a href="https://en.wikipedia.org/wiki/Don%27t_repeat_yourself">Don&rsquo;t repeat yourself</a>」,不要重复产生信息。</p> <p>第二次提升要求是因为我写出了排在谷歌搜索首位的文章,这给网站带来了持续的访问量,会有更多人看到我的博客,我很开心。在此之前,我一直觉得推广博客很难,到处去分享感觉就像<a href="https://zh.wikipedia.org/zh-cn/%E6%BF%AB%E7%99%BC%E9%9B%BB%E5%AD%90%E8%A8%8A%E6%81%AF">滥发消息</a>(spamming)。从此之后,我会优先写别人没写过的话题,写重复的话题尽量保证质量好到能排到谷歌搜索的第一页。</p> <!-- 排在谷歌首位的文章是《小米 / 红米 / MIUI / HyperOS 的 Google Play 安装教程》 https://web.archive.org/web/20240919030037/https://www.google.com/web/20240919030037/https://www.google.com/search?q=%E5%B0%8F%E7%B1%B3%E5%AE%89%E8%A3%85+google+play 我登录账户用谷歌搜索「小米安装 google play」能看到文章在首位,不过未登录就会有 featured snippets 排到前面。 --> <p>最近我刻意改变,将文章的重心放到帮助自己,降低要求。要求就两个:自己能读懂(可以对别人来说没那么通俗)、完整(不要写一半就发,写完初稿就可以发了)。发稿速度马上就上涨了,感觉非常好。</p> <p>最近发布了四篇文章:</p> <ul> <li><a href="https://cyrusyip.org/zh-cn/posts/2024/09/16/css-grid-layout-guide/">CSS Grid 布局教程</a></li> <li><a href="https://cyrusyip.org/zh-cn/posts/2024/09/06/css-flexbox-layout-guide/">CSS Flexbox 布局教程</a></li> <li><a href="https://cyrusyip.org/zh-cn/posts/2024/09/08/css-bem-guide/">CSS BEM 命名规范入门教程</a></li> <li><a href="https://cyrusyip.org/en/posts/2024/09/08/css-bem-guide/">Introduction to CSS BEM Naming Convention</a></li> </ul> <p>Grid 教程和 Flexbox 教程都是参考 CSS-Tricks 的教程写的。之前我也看过 CSS-Tricks 那两篇教程(<a href="https://css-tricks.com/snippets/css/a-guide-to-flexbox/">CSS Flexbox Layout Guide | CSS-Tricks</a>、<a href="https://css-tricks.com/snippets/css/complete-guide-grid/">CSS Grid Layout Guide | CSS-Tricks</a>),但是自己写教程的过程中对两个 CSS 布局的理解更深入了,对我来说很有用。写好之后我哪里不懂也可以看自己写的教程,自己写的教程查起来更方便。写重复的话题可以加深理解,这也不意味着做复读机,我在写的过程中会有新的感悟,写出一些新内容。</p> <p>写博客就像做开源项目,要让自己感觉舒服,对自己有用,这样才容易坚持。</p>

2024/9/18
阅读更多

菜谱:酱油蒜香炒蛋

<h2 class="heading" id="材料"> 材料<span class="heading__anchor"> <a href="#%e6%9d%90%e6%96%99">#</a></span> </h2><ul> <li>蛋</li> <li>蒜末</li> <li>酱油</li> </ul> <h2 class="heading" id="步骤"> 步骤<span class="heading__anchor"> <a href="#%e6%ad%a5%e9%aa%a4">#</a></span> </h2><ol> <li>将蛋打入碗中,不要搅拌</li> <li>加酱油,搅拌均匀蛋黄和蛋清</li> <li>加蒜末</li> <li>下锅前搅拌</li> <li>煎蛋或者炒蛋</li> </ol> <h2 class="heading" id="备注"> 备注<span class="heading__anchor"> <a href="#%e5%a4%87%e6%b3%a8">#</a></span> </h2><ul> <li>可用鸡蛋或者鸭蛋,混蛋也行</li> <li>可用刀将蒜头切成蒜末,越碎越好</li> <li>搅拌蛋后再加酱油就看不清加了多少酱油</li> <li>蒜末会沉淀,所以下锅前搅拌</li> </ul>

2024/9/17
阅读更多

CSS Grid 布局教程

<p>CSS Grid 是二维布局方法,也就是用竖线和横线将内容划分成格子,像棋盘一样。本文只介绍常见用法,要了解全部用法请看 <a href="https://developer.mozilla.org/en-US/">MDN Web Docs</a>。推荐大家看完后做文末提到的习题。</p> <h2 class="heading" id="概念"> 概念<span class="heading__anchor"> <a href="#%e6%a6%82%e5%bf%b5">#</a></span> </h2><h3 class="heading" id="网格容器grid-container网格项grid-item"> 网格容器(Grid Container)、网格项(Grid Item)<span class="heading__anchor"> <a href="#%e7%bd%91%e6%a0%bc%e5%ae%b9%e5%99%a8grid-container%e7%bd%91%e6%a0%bc%e9%a1%b9grid-item">#</a></span> </h3><p><code>display: grid | inline-grid</code> 使元素变成网格容器,其子元素叫网格项(其他后代不算),按照网格布局排列。下面代码的 <code>.container</code> 是网格容器,<code>.item</code> 是网格项,<code>.sub-item</code> 不是网格项。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="p">.</span><span class="nc">container</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">display</span><span class="p">:</span> <span class="k">grid</span><span class="p">;</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span></code></pre></td></tr></table> </div> </div><div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span><span class="lnt">4 </span><span class="lnt">5 </span><span class="lnt">6 </span><span class="lnt">7 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;container&#34;</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;item&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">div</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;item&#34;</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">p</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;sub-item&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">p</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;item&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">div</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span> </span></span></code></pre></td></tr></table> </div> </div><h3 class="heading" id="网格线grid-line"> 网格线(Grid Line)<span class="heading__anchor"> <a href="#%e7%bd%91%e6%a0%bc%e7%ba%bfgrid-line">#</a></span> </h3><p>划分网格的竖线(vertical line)或横线(horizontal line)。横线方向和书写方向一致(英文是从左到右),竖线方向是从上到下。同一条网格线可以有多个名称。</p> <figure> <img src="https://www.w3.org/TR/css-grid-1/images/grid-lines.png"><figcaption>虚线是网格线</figcaption></figure><h3 class="heading" id="网格单元grid-cell"> 网格单元(Grid Cell)<span class="heading__anchor"> <a href="#%e7%bd%91%e6%a0%bc%e5%8d%95%e5%85%83grid-cell">#</a></span> </h3><p>网格布局的最小单位,就像电子表格的单元格和棋盘的格子,相邻的 2 个竖线之间和相邻的 2 条横线之间的区域。1 个网格项可以使用多个网格单元。</p> <h3 class="heading" id="网格轨道grid-track"> 网格轨道(Grid Track)<span class="heading__anchor"> <a href="#%e7%bd%91%e6%a0%bc%e8%bd%a8%e9%81%93grid-track">#</a></span> </h3><p>2 条相邻网格线之间的区域,也就是 1 个横排(row)或者 1 个竖排(column)。</p> <h3 class="heading" id="网格区域grid-area"> 网格区域(Grid Area)<span class="heading__anchor"> <a href="#%e7%bd%91%e6%a0%bc%e5%8c%ba%e5%9f%9fgrid-area">#</a></span> </h3><p>由 4 条网格线划分的区域,也就是长方形,比如 1 个网格单位、4 个网格单位、6 个网格单位。</p> <p>示例(A 表示网格区域):</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">A??? </span></span><span class="line"><span class="cl">???? </span></span></code></pre></td></tr></table> </div> </div><div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">AA?? </span></span><span class="line"><span class="cl">AA?? </span></span></code></pre></td></tr></table> </div> </div><div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">AAA? </span></span><span class="line"><span class="cl">AAA? </span></span></code></pre></td></tr></table> </div> </div><h3 class="heading" id="显性网格explicit-grid隐性网格implicit-grid"> 显性网格(Explicit Grid)、隐性网格(Implicit Grid)<span class="heading__anchor"> <a href="#%e6%98%be%e6%80%a7%e7%bd%91%e6%a0%bcexplicit-grid%e9%9a%90%e6%80%a7%e7%bd%91%e6%a0%bcimplicit-grid">#</a></span> </h3><p>显性网格有固定数量的网格轨道,比如 3×3。如果此时加入额外的网格项,网格将自动添加 auto 尺寸的隐性网格轨道,原来的显性网格轨道加上自动添加的隐性网格轨道就是隐性轨道。只定义竖网格线也可以产生隐性网格。</p> <h3 class="heading" id="frfraction1-份可用空间"> fr(fraction)1 份可用空间<span class="heading__anchor"> <a href="#frfraction1-%e4%bb%bd%e5%8f%af%e7%94%a8%e7%a9%ba%e9%97%b4">#</a></span> </h3><p><code>fr</code> 表示网格容器的 1 份可用空间。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span><span class="lnt">4 </span><span class="lnt">5 </span><span class="lnt">6 </span><span class="lnt">7 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="p">.</span><span class="nc">container</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">display</span><span class="p">:</span> <span class="k">grid</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="c">/* 3 个竖排,比例为 1:2:1 */</span> </span></span><span class="line"><span class="cl"> <span class="k">grid-template-columns</span><span class="p">:</span> <span class="mi">1</span><span class="n">fr</span> <span class="mi">2</span><span class="n">fr</span> <span class="mi">1</span><span class="n">fr</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="c">/* 3 个横排,第 1 横排为 30px,剩余横排比例为 1:1 */</span> </span></span><span class="line"><span class="cl"> <span class="k">grid-template-rows</span><span class="p">:</span> <span class="mi">30</span><span class="kt">px</span> <span class="mi">1</span><span class="n">fr</span> <span class="mi">1</span><span class="n">fr</span><span class="p">;</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span></code></pre></td></tr></table> </div> </div><h3 class="heading" id="minmax-最大最小值"> minmax() 最大最小值<span class="heading__anchor"> <a href="#minmax-%e6%9c%80%e5%a4%a7%e6%9c%80%e5%b0%8f%e5%80%bc">#</a></span> </h3><p>参考资料:<a href="https://developer.mozilla.org/en-US/docs/Web/CSS/minmax">minmax() - CSS: Cascading Style Sheets | MDN</a></p> <p><code>minmax()</code> 函数设置最小值和最大值。下面代码表示第 1 横排的尺寸最小 50px,最大 <code>auto</code>(根据内容自动扩大)。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="p">.</span><span class="nc">container</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">grid-template-rows</span><span class="p">:</span> <span class="nf">minmax</span><span class="p">(</span><span class="mi">50</span><span class="kt">px</span><span class="p">,</span> <span class="kc">auto</span><span class="p">)</span> <span class="mi">1</span><span class="n">fr</span> <span class="mi">1</span><span class="n">fr</span><span class="p">;</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span></code></pre></td></tr></table> </div> </div><h3 class="heading" id="repeat-函数"> repeat() 函数<span class="heading__anchor"> <a href="#repeat-%e5%87%bd%e6%95%b0">#</a></span> </h3><p>参考资料:<a href="https://developer.mozilla.org/en-US/docs/Web/CSS/repeat">repeat() - CSS: Cascading Style Sheets | MDN</a></p> <p><code>repeat()</code> 函数用于表示重复的网格轨道片段。</p> <p><a href="https://jsbin.com/kudapojoci/1/edit?html,css,output">在线示例</a></p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="p">.</span><span class="nc">container</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">grid-template-rows</span><span class="p">:</span> <span class="nf">repeat</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="n">fr</span><span class="p">);</span> <span class="c">/* 1fr 1fr 1fr */</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span></code></pre></td></tr></table> </div> </div><p><a href="https://jsbin.com/jovuxukibo/1/edit?html,css,output">在线示例</a></p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="p">.</span><span class="nc">container</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">grid-template-rows</span><span class="p">:</span> <span class="mi">2</span><span class="n">fr</span> <span class="nf">repeat</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="n">fr</span><span class="p">);</span> <span class="c">/* 2fr 1fr 1fr */</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span></code></pre></td></tr></table> </div> </div><p>除了使用固定的数字,还可用 <code>auto-fit</code> 和 <code>auto-fill</code>。</p> <h2 class="heading" id="网格容器的属性"> 网格容器的属性<span class="heading__anchor"> <a href="#%e7%bd%91%e6%a0%bc%e5%ae%b9%e5%99%a8%e7%9a%84%e5%b1%9e%e6%80%a7">#</a></span> </h2><p>网格容器可以使用以下属性。</p> <ul> <li>display</li> <li>grid-template-columns</li> <li>grid-template-rows</li> <li>grid-template-areas</li> <li>grid-template</li> <li>grid-column-gap</li> <li>grid-row-gap</li> <li>grid-gap</li> <li>justify-items</li> <li>align-items</li> <li>place-items</li> <li>justify-content</li> <li>align-content</li> <li>place-content</li> <li>grid-auto-columns</li> <li>grid-auto-rows</li> <li>grid-auto-flow</li> <li>grid</li> </ul> <h3 class="heading" id="display-设置容器"> display 设置容器<span class="heading__anchor"> <a href="#display-%e8%ae%be%e7%bd%ae%e5%ae%b9%e5%99%a8">#</a></span> </h3><p>对元素使用,使其变成网格容器。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="p">.</span><span class="nc">container</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">display</span><span class="p">:</span> <span class="k">grid</span> <span class="o">|</span> <span class="kc">inline</span><span class="o">-</span><span class="k">grid</span><span class="p">;</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span></code></pre></td></tr></table> </div> </div><p>值:</p> <ul> <li>grid:生成 block 级网格容器</li> <li>inline-grid:生成 inline 级网格容器</li> </ul> <h3 class="heading" id="grid-template-columnsgrid-template-rows网格线名称与网格轨道"> grid-template-columns、grid-template-rows,网格线名称与网格轨道<span class="heading__anchor"> <a href="#grid-template-columnsgrid-template-rows%e7%bd%91%e6%a0%bc%e7%ba%bf%e5%90%8d%e7%a7%b0%e4%b8%8e%e7%bd%91%e6%a0%bc%e8%bd%a8%e9%81%93">#</a></span> </h3><p>参考资料:</p> <ul> <li><a href="https://css-tricks.com/snippets/css/complete-guide-grid/#aa-grid-template-columnsgrid-template-rows">CSS Grid Layout Guide | CSS-Tricks#aa-grid-template-columnsgrid-template-rows</a></li> <li><a href="https://developer.mozilla.org/en-US/docs/Web/CSS/grid-template-columns">grid-template-columns - CSS: Cascading Style Sheets | MDN</a></li> <li><a href="https://developer.mozilla.org/en-US/docs/Web/CSS/grid-template-rows">grid-template-rows - CSS: Cascading Style Sheets | MDN</a></li> </ul> <p>示例(<a href="https://jsbin.com/kihehuxiso/6/edit?html,css,output">在线版</a>):</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;container&#34;</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;item item1&#34;</span><span class="p">&gt;</span>1<span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;item item2&#34;</span><span class="p">&gt;</span>2<span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;item item3&#34;</span><span class="p">&gt;</span>3<span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;item item4&#34;</span><span class="p">&gt;</span>4<span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;item item5&#34;</span><span class="p">&gt;</span>5<span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;item item6&#34;</span><span class="p">&gt;</span>6<span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;item item7&#34;</span><span class="p">&gt;</span>7<span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;item item8&#34;</span><span class="p">&gt;</span>8<span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;item item9&#34;</span><span class="p">&gt;</span>9<span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span> </span></span></code></pre></td></tr></table> </div> </div><div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span><span class="lnt">4 </span><span class="lnt">5 </span><span class="lnt">6 </span><span class="lnt">7 </span><span class="lnt">8 </span><span class="lnt">9 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="p">.</span><span class="nc">container</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">border</span><span class="p">:</span> <span class="mi">1</span><span class="kt">px</span> <span class="kc">solid</span> <span class="kc">red</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="k">height</span><span class="p">:</span> <span class="mi">400</span><span class="kt">px</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="k">display</span><span class="p">:</span> <span class="k">grid</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="c">/* 3 个竖排,比例为 1:2:1 */</span> </span></span><span class="line"><span class="cl"> <span class="k">grid-template-columns</span><span class="p">:</span> <span class="mi">1</span><span class="n">fr</span> <span class="mi">2</span><span class="n">fr</span> <span class="mi">1</span><span class="n">fr</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="c">/* 3 个横排,第 1 横排为 30px,剩余横排比例为 1:1 */</span> </span></span><span class="line"><span class="cl"> <span class="k">grid-template-rows</span><span class="p">:</span> <span class="mi">30</span><span class="kt">px</span> <span class="mi">1</span><span class="n">fr</span> <span class="mi">1</span><span class="n">fr</span><span class="p">;</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span></code></pre></td></tr></table> </div> </div><p>现在网格项排列成这样:</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">1 2 3 </span></span><span class="line"><span class="cl">4 5 6 </span></span><span class="line"><span class="cl">7 8 9 </span></span></code></pre></td></tr></table> </div> </div><p>可以用 <code>[]</code> 定义网格线名称,用空格分隔多个名称。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="p">.</span><span class="nc">container</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">grid-template-columns</span><span class="p">:</span> <span class="p">[</span><span class="n">column1-start</span><span class="p">]</span> <span class="mi">1</span><span class="n">fr</span> <span class="p">[</span><span class="n">column2-start</span><span class="p">]</span> <span class="mi">2</span><span class="n">fr</span> <span class="p">[</span><span class="n">column3-start</span><span class="p">]</span> <span class="mi">1</span><span class="n">fr</span> <span class="p">[</span><span class="kc">column</span><span class="o">-</span><span class="kc">end</span> <span class="n">another-name</span><span class="p">];</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span></code></pre></td></tr></table> </div> </div><p><code>grid-column-start</code> 和 <code>grid-row-start</code> 可以改变网格项的位置,<a href="https://jsbin.com/kexizufuwi/4/edit?html,css,output">在线示例</a>。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="p">.</span><span class="nc">container</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">display</span><span class="p">:</span> <span class="k">grid</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="k">grid-template-columns</span><span class="p">:</span> <span class="p">[</span><span class="n">column1-start</span><span class="p">]</span> <span class="mi">1</span><span class="n">fr</span> <span class="p">[</span><span class="n">column2-start</span><span class="p">]</span> <span class="mi">2</span><span class="n">fr</span> <span class="p">[</span><span class="n">column3-start</span><span class="p">]</span> <span class="mi">1</span><span class="n">fr</span> <span class="p">[</span><span class="kc">column</span><span class="o">-</span><span class="kc">end</span><span class="p">];</span> </span></span><span class="line"><span class="cl"> <span class="k">grid-template-rows</span><span class="p">:</span> <span class="mi">30</span><span class="kt">px</span> <span class="mi">1</span><span class="n">fr</span> <span class="mi">1</span><span class="n">fr</span><span class="p">;</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">item9</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">grid-column-start</span><span class="p">:</span> <span class="n">column2-start</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="k">grid-row-start</span><span class="p">:</span> <span class="mi">2</span><span class="p">;</span> <span class="c">/* 第 2 条横线 */</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span></code></pre></td></tr></table> </div> </div><p>现在 <code>.item9</code> 占据了 <code>.item5</code> 的位置。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">1 2 3 </span></span><span class="line"><span class="cl">4 9 5 </span></span><span class="line"><span class="cl">6 7 8 </span></span></code></pre></td></tr></table> </div> </div><h3 class="heading" id="grid-template-areas-网格区域名称"> grid-template-areas 网格区域名称<span class="heading__anchor"> <a href="#grid-template-areas-%e7%bd%91%e6%a0%bc%e5%8c%ba%e5%9f%9f%e5%90%8d%e7%a7%b0">#</a></span> </h3><p>参考资料:<a href="https://developer.mozilla.org/en-US/docs/Web/CSS/grid-template-areas">grid-template-areas - CSS: Cascading Style Sheets | MDN</a></p> <p><code>grid-template-areas</code> 以网格区域名称表示网格的结构。<code>grid-template-areas</code> 的优点是放置网格项时不需要用网格线(数网格线或者命名真的太痛苦了)。相同名称可以用多次,表示占用多个网格单元。英文句号 <code>.</code> 表示不使用此网格单元。<code>grid-area</code> 定义元素对应的网格区域名称。</p> <p><code>grid-template-areas</code> 会自动使用 <code>-start</code> 和 <code>-end</code> 命名网格线。<code>header</code> 网格区域的起始网格线(横线与竖线)都是 <code>header-start</code>,终止网格线(横线与竖线)都是 <code>header-end</code>。同一条网格线可以有多个名称。</p> <p>示例(<a href="https://jsbin.com/xegagaviru/1/edit?html,css,output">在线版</a>):</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span><span class="lnt">4 </span><span class="lnt">5 </span><span class="lnt">6 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;container&#34;</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">header</span><span class="p">&gt;</span>header<span class="p">&lt;/</span><span class="nt">header</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">aside</span><span class="p">&gt;</span>sidebar<span class="p">&lt;/</span><span class="nt">aside</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">main</span><span class="p">&gt;</span>main<span class="p">&lt;/</span><span class="nt">main</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">footer</span><span class="p">&gt;</span>footer<span class="p">&lt;/</span><span class="nt">footer</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span> </span></span></code></pre></td></tr></table> </div> </div><div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span><span class="lnt">14 </span><span class="lnt">15 </span><span class="lnt">16 </span><span class="lnt">17 </span><span class="lnt">18 </span><span class="lnt">19 </span><span class="lnt">20 </span><span class="lnt">21 </span><span class="lnt">22 </span><span class="lnt">23 </span><span class="lnt">24 </span><span class="lnt">25 </span><span class="lnt">26 </span><span class="lnt">27 </span><span class="lnt">28 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="nt">header</span><span class="o">,</span><span class="nt">aside</span><span class="o">,</span><span class="nt">main</span><span class="o">,</span><span class="nt">footer</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">border</span><span class="p">:</span> <span class="mi">1</span><span class="kt">px</span> <span class="kc">solid</span> <span class="kc">green</span><span class="p">;</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">container</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">border</span><span class="p">:</span> <span class="mi">1</span><span class="kt">px</span> <span class="kc">solid</span> <span class="kc">red</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="k">height</span><span class="p">:</span> <span class="mi">400</span><span class="kt">px</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="k">display</span><span class="p">:</span> <span class="k">grid</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="k">grid-template-areas</span><span class="p">:</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;header header header header&#34;</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;main main . aside&#34;</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;footer footer footer footer&#34;</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="k">grid-template-columns</span><span class="p">:</span> <span class="mi">1</span><span class="n">fr</span> <span class="mi">1</span><span class="n">fr</span> <span class="mi">1</span><span class="n">fr</span> <span class="mi">50</span><span class="kt">px</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="k">grid-template-rows</span><span class="p">:</span> <span class="kc">auto</span><span class="p">;</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nt">header</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">grid-area</span><span class="p">:</span> <span class="n">header</span><span class="p">;</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span><span class="line"><span class="cl"><span class="nt">aside</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">grid-area</span><span class="p">:</span> <span class="n">aside</span><span class="p">;</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span><span class="line"><span class="cl"><span class="nt">main</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">grid-area</span><span class="p">:</span> <span class="n">main</span><span class="p">;</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span><span class="line"><span class="cl"><span class="nt">footer</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">grid-area</span><span class="p">:</span> <span class="n">footer</span><span class="p">;</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span></code></pre></td></tr></table> </div> </div><h3 class="heading" id="grid-templategrid-template-rowsgrid-template-columnsgrid-template-areas-的缩写"> grid-template(grid-template-rows、grid-template-columns、grid-template-areas 的缩写)<span class="heading__anchor"> <a href="#grid-templategrid-template-rowsgrid-template-columnsgrid-template-areas-%e7%9a%84%e7%bc%a9%e5%86%99">#</a></span> </h3><p>参考资料:</p> <ul> <li><a href="https://css-tricks.com/snippets/css/complete-guide-grid/#aa-grid-template">CSS Grid Layout Guide | CSS-Tricks#aa-grid-template</a></li> <li><a href="https://developer.mozilla.org/en-US/docs/Web/CSS/grid-template">grid-template - CSS: Cascading Style Sheets | MDN</a></li> </ul> <p><code>grid-template</code> 是 <code>grid-template-rows</code>、<code>grid-template-columns</code>、<code>grid-template-areas</code> 的缩写。<code>grid-template</code> 不会重置隐性网格属性。</p> <p>只设置 <code>grid-template-rows</code> 和 <code>grid-template-columns</code> 的用法是用 <code>/</code> 隔开两者。</p> <p>示例(<a href="https://jsbin.com/goxaroyela/1/edit?html,css,output">在线版</a>):</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span><span class="lnt">4 </span><span class="lnt">5 </span><span class="lnt">6 </span><span class="lnt">7 </span><span class="lnt">8 </span><span class="lnt">9 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="p">.</span><span class="nc">container</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">display</span><span class="p">:</span> <span class="k">grid</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="c">/* 横排比例 1:1:1,竖排比例 1:3:1 */</span> </span></span><span class="line"><span class="cl"> <span class="k">grid-template</span><span class="p">:</span> <span class="mi">1</span><span class="n">fr</span> <span class="mi">1</span><span class="n">fr</span> <span class="mi">1</span><span class="n">fr</span> <span class="o">/</span> <span class="mi">1</span><span class="n">fr</span> <span class="mi">3</span><span class="n">fr</span> <span class="mi">1</span><span class="n">fr</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="c">/* 等价于 </span></span></span><span class="line"><span class="cl"><span class="c"> grid-template-rows: 1fr 1fr 1fr; </span></span></span><span class="line"><span class="cl"><span class="c"> grid-template-columns: 1fr 3fr 1fr; </span></span></span><span class="line"><span class="cl"><span class="c"> */</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span></code></pre></td></tr></table> </div> </div><p>同时设置 <code>grid-template-rows</code>、<code>grid-template-columns</code>、<code>grid-template-areas</code> 的用法:</p> <ol> <li>先写 <code>grid-template-areas</code></li> <li>在每横排右边写上尺寸</li> <li>在最后的横排加上 <code>/</code> 和竖排的尺寸(<code>/</code> 从下一行开始写也行)</li> </ol> <p>示例(<a href="https://jsbin.com/biwemurohi/1/edit?html,css,output">在线版</a>):</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span><span class="lnt">14 </span><span class="lnt">15 </span><span class="lnt">16 </span><span class="lnt">17 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="p">.</span><span class="nc">container</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">border</span><span class="p">:</span> <span class="mi">1</span><span class="kt">px</span> <span class="kc">solid</span> <span class="kc">red</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="k">height</span><span class="p">:</span> <span class="mi">400</span><span class="kt">px</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="k">display</span><span class="p">:</span> <span class="k">grid</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="k">grid-template</span><span class="p">:</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;header header header&#34;</span> <span class="kc">auto</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;main main aside &#34;</span> <span class="mi">1</span><span class="n">fr</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;footer footer footer&#34;</span> <span class="kc">auto</span> <span class="o">/</span> <span class="kc">auto</span> <span class="kc">auto</span> <span class="mi">50</span><span class="kt">px</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="c">/* 等价于 </span></span></span><span class="line"><span class="cl"><span class="c"> grid-template-areas: </span></span></span><span class="line"><span class="cl"><span class="c"> &#34;header header header&#34; </span></span></span><span class="line"><span class="cl"><span class="c"> &#34;main main aside&#34; </span></span></span><span class="line"><span class="cl"><span class="c"> &#34;footer footer footer&#34;; </span></span></span><span class="line"><span class="cl"><span class="c"> grid-template-columns: auto auto 50px; </span></span></span><span class="line"><span class="cl"><span class="c"> grid-template-rows: auto 1fr auto; </span></span></span><span class="line"><span class="cl"><span class="c"> */</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span></code></pre></td></tr></table> </div> </div><h3 class="heading" id="row-gapcolumn-gapgap-间隔"> row-gap、column-gap、gap 间隔<span class="heading__anchor"> <a href="#row-gapcolumn-gapgap-%e9%97%b4%e9%9a%94">#</a></span> </h3><p>参考资料:</p> <ul> <li><a href="https://css-tricks.com/snippets/css/complete-guide-grid/#aa-column-gaprow-gapgrid-column-gapgrid-row-gap">CSS Grid Layout Guide | CSS-Tricks#aa-column-gaprow-gapgrid-column-gapgrid-row-gap</a></li> <li><a href="https://developer.mozilla.org/en-US/docs/Web/CSS/gap">gap - CSS: Cascading Style Sheets | MDN</a></li> </ul> <p><code>row-gap</code> 表示横排之间的间隔,<code>column-gap</code> 表示竖排之间的间隔。<code>gap</code> 是前面两者的缩写,使用 1 个值表示横排间隔和竖排间隔一样,使用 2 个值分别表示横排间隔是竖排间隔。</p> <p>示例:</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span><span class="lnt">4 </span><span class="lnt">5 </span><span class="lnt">6 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="p">.</span><span class="nc">container</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">row-gap</span><span class="p">:</span> <span class="mi">30</span><span class="kt">px</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="k">column-gap</span><span class="p">:</span> <span class="mi">10</span><span class="kt">px</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="k">gap</span><span class="p">:</span> <span class="mi">10</span><span class="kt">px</span><span class="p">;</span> <span class="c">/* 竖排间隔和横排间隔都是 10px */</span> </span></span><span class="line"><span class="cl"> <span class="k">gap</span><span class="p">:</span> <span class="mi">30</span><span class="kt">px</span> <span class="mi">10</span><span class="kt">px</span><span class="p">;</span> <span class="c">/* 横排间隔 30px,竖排间隔 10px */</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span></code></pre></td></tr></table> </div> </div><p>以前这 3 个属性前面要加上 <code>grid-</code>,比如 <code>grid-row-gap</code>。带 <code>grid-</code> 前缀的属性已被弃用,浏览器为了保持兼容,仍然支持这些属性。</p> <h3 class="heading" id="justify-items网格项的-inline-轴横轴对齐"> justify-items,网格项的 inline 轴(横轴)对齐<span class="heading__anchor"> <a href="#justify-items%e7%bd%91%e6%a0%bc%e9%a1%b9%e7%9a%84-inline-%e8%bd%b4%e6%a8%aa%e8%bd%b4%e5%af%b9%e9%bd%90">#</a></span> </h3><p>参考资料:</p> <ul> <li><a href="https://css-tricks.com/snippets/css/complete-guide-grid/#aa-justify-items">CSS Grid Layout Guide | CSS-Tricks#aa-justify-items</a></li> <li><a href="https://developer.mozilla.org/en-US/docs/Web/CSS/justify-items">justify-items - CSS: Cascading Style Sheets | MDN</a></li> </ul> <p><code>justify-items</code> 设置网格项 inline 轴(横轴)对齐方式,默认值为 <code>stretch</code>(占满网格单元宽度)。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="p">.</span><span class="nc">container</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">justify-items</span><span class="p">:</span> <span class="kc">start</span> <span class="o">|</span> <span class="kc">end</span> <span class="o">|</span> <span class="kc">center</span> <span class="o">|</span> <span class="kc">stretch</span><span class="p">;</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span></code></pre></td></tr></table> </div> </div><h3 class="heading" id="align-items网格项的-block-轴竖轴对齐"> align-items,网格项的 block 轴(竖轴)对齐<span class="heading__anchor"> <a href="#align-items%e7%bd%91%e6%a0%bc%e9%a1%b9%e7%9a%84-block-%e8%bd%b4%e7%ab%96%e8%bd%b4%e5%af%b9%e9%bd%90">#</a></span> </h3><p>参考资料:</p> <ul> <li><a href="https://css-tricks.com/snippets/css/complete-guide-grid/#aa-align-items">CSS Grid Layout Guide | CSS-Tricks#aa-align-items</a></li> <li><a href="https://developer.mozilla.org/en-US/docs/Web/CSS/align-items">align-items - CSS: Cascading Style Sheets | MDN</a></li> </ul> <p><code>align-items</code> 设置网格项 block 轴(竖轴)的对齐方式,默认值为 <code>stretch</code>(占满网格单元高度)。<code>baseline</code> 表示按<a href="https://zh.wikipedia.org/zh-cn/%E5%9F%BA%E7%B7%9A">基线</a>对齐。内容有多行时,<code>first baseline</code> 表示按照首行的基线对齐,<code>last baseline</code> 表示按照尾行的基线对齐。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="p">.</span><span class="nc">container</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">align-items</span><span class="p">:</span> <span class="kc">start</span> <span class="o">|</span> <span class="kc">end</span> <span class="o">|</span> <span class="kc">center</span> <span class="o">|</span> <span class="kc">stretch</span> <span class="o">|</span> <span class="kc">baseline</span> <span class="o">|</span> <span class="kc">first</span> <span class="kc">baseline</span> <span class="o">|</span> <span class="kc">last</span> <span class="kc">baseline</span><span class="p">;</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span></code></pre></td></tr></table> </div> </div><h3 class="heading" id="place-itemsalign-itemsjustify-items-的缩写"> place-items(align-items、justify-items 的缩写)<span class="heading__anchor"> <a href="#place-itemsalign-itemsjustify-items-%e7%9a%84%e7%bc%a9%e5%86%99">#</a></span> </h3><p>参考资料:</p> <ul> <li><a href="https://css-tricks.com/snippets/css/complete-guide-grid/#aa-place-items">CSS Grid Layout Guide | CSS-Tricks#aa-place-items</a></li> <li><a href="https://developer.mozilla.org/en-US/docs/Web/CSS/place-items">place-items - CSS: Cascading Style Sheets | MDN</a></li> </ul> <p><code>place-items</code> 是 <code>align-items</code>、<code>justify-items</code> 的缩写。使用 1 个值同时设置 2 个属性,使用 2 个值分别设置两个属性。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span><span class="lnt">4 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="p">.</span><span class="nc">container</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">place-items</span><span class="p">:</span> <span class="kc">center</span><span class="p">;</span> <span class="c">/* 正中间 */</span> </span></span><span class="line"><span class="cl"> <span class="k">place-items</span><span class="p">:</span> <span class="kc">start</span> <span class="kc">end</span><span class="p">;</span> <span class="c">/* 右上角 */</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span></code></pre></td></tr></table> </div> </div><h3 class="heading" id="justify-content网格项整体-inline-轴横轴对齐"> justify-content,网格项整体 inline 轴(横轴)对齐<span class="heading__anchor"> <a href="#justify-content%e7%bd%91%e6%a0%bc%e9%a1%b9%e6%95%b4%e4%bd%93-inline-%e8%bd%b4%e6%a8%aa%e8%bd%b4%e5%af%b9%e9%bd%90">#</a></span> </h3><p>参考资料:</p> <ul> <li><a href="https://css-tricks.com/snippets/css/complete-guide-grid/#aa-justify-content">CSS Grid Layout Guide | CSS-Tricks#aa-justify-content</a></li> <li><a href="https://developer.mozilla.org/en-US/docs/Web/CSS/justify-content">justify-content - CSS: Cascading Style Sheets | MDN</a></li> </ul> <p>如果网格项的总尺寸小于网格容器的尺寸,网格容器会有多于的空白,此时网格项被放置于左上角(使用<a href="https://developer.mozilla.org/en-US/docs/Glossary/LTR">从左向右的语言</a>)。<code>justify-content</code> 设置 inline 轴(横轴)的对齐方式。Flex 布局也有 <code>justify-content</code>,用法类似,参看 <a href="https://cyrusyip.org/zh-cn/posts/2024/09/06/css-flexbox-layout-guide/#justify-content-%E4%B8%BB%E8%BD%B4%E5%AF%B9%E9%BD%90">CSS Flexbox 布局教程#justify-content-主轴对齐</a>(发布前看看这个链接对不对)。</p> <p><a href="https://jsbin.com/qideyedofa/1/edit?html,css,output">在线示例</a></p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="p">.</span><span class="nc">container</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">justify-content</span><span class="p">:</span> <span class="kc">start</span> <span class="o">|</span> <span class="kc">end</span> <span class="o">|</span> <span class="kc">center</span> <span class="o">|</span> <span class="kc">stretch</span> <span class="o">|</span> <span class="kc">space-around</span> <span class="o">|</span> <span class="kc">space-between</span> <span class="o">|</span> <span class="kc">space</span><span class="o">-</span><span class="n">evenly</span><span class="p">;</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span></code></pre></td></tr></table> </div> </div><h3 class="heading" id="align-content网格项整体的-block-轴竖轴对齐"> align-content,网格项整体的 block 轴(竖轴)对齐<span class="heading__anchor"> <a href="#align-content%e7%bd%91%e6%a0%bc%e9%a1%b9%e6%95%b4%e4%bd%93%e7%9a%84-block-%e8%bd%b4%e7%ab%96%e8%bd%b4%e5%af%b9%e9%bd%90">#</a></span> </h3><p>参考资料:</p> <ul> <li><a href="https://css-tricks.com/snippets/css/complete-guide-grid/#aa-align-content">CSS Grid Layout Guide | CSS-Tricks#aa-align-content</a></li> <li><a href="https://developer.mozilla.org/en-US/docs/Web/CSS/align-content">align-content - CSS: Cascading Style Sheets | MDN</a></li> </ul> <p>如果网格项的总尺寸小于网格容器的尺寸,网格容器会有多于的空白,此时网格项被放置于左上角(使用<a href="https://developer.mozilla.org/en-US/docs/Glossary/LTR">从左向右的语言</a>)。<code>align-content</code> 设置 block 轴(竖轴)的对齐方式。Flex 布局也有 <code>align-content</code>,用法类似。</p> <p><a href="https://jsbin.com/qecuwusabi/1/edit?html,css,output">在线示例</a></p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="p">.</span><span class="nc">container</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">align-content</span><span class="p">:</span> <span class="kc">start</span> <span class="o">|</span> <span class="kc">end</span> <span class="o">|</span> <span class="kc">center</span> <span class="o">|</span> <span class="kc">stretch</span> <span class="o">|</span> <span class="kc">space-around</span> <span class="o">|</span> <span class="kc">space-between</span> <span class="o">|</span> <span class="kc">space</span><span class="o">-</span><span class="n">evenly</span><span class="p">;</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span></code></pre></td></tr></table> </div> </div><h3 class="heading" id="place-contentalign-contentjustify-content-的缩写"> place-content(align-content、justify-content 的缩写)<span class="heading__anchor"> <a href="#place-contentalign-contentjustify-content-%e7%9a%84%e7%bc%a9%e5%86%99">#</a></span> </h3><p>参考资料:<a href="https://developer.mozilla.org/en-US/docs/Web/CSS/place-content">place-content - CSS: Cascading Style Sheets | MDN</a></p> <p><code>place-content</code> 是 <code>align-content</code> 和 <code>justify-content</code> 的缩写。用 1 个值同时设置两者,用 2 个值分别设置两者。</p> <p>示例(<a href="https://jsbin.com/numarihela/1/edit?html,css,output">在线示例</a>):</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="p">.</span><span class="nc">container</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">place-content</span><span class="p">:</span> <span class="kc">start</span> <span class="kc">end</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="c">/* </span></span></span><span class="line"><span class="cl"><span class="c"> align-content: start; </span></span></span><span class="line"><span class="cl"><span class="c"> justify-content: end; </span></span></span><span class="line"><span class="cl"><span class="c"> */</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="k">place-content</span><span class="p">:</span> <span class="kc">center</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="c">/* </span></span></span><span class="line"><span class="cl"><span class="c"> align-content: center; </span></span></span><span class="line"><span class="cl"><span class="c"> justify-content: center; </span></span></span><span class="line"><span class="cl"><span class="c"> */</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span></code></pre></td></tr></table> </div> </div><h3 class="heading" id="grid-auto-columnsgrid-auto-rows-隐性网格轨道大小"> grid-auto-columns、grid-auto-rows 隐性网格轨道大小<span class="heading__anchor"> <a href="#grid-auto-columnsgrid-auto-rows-%e9%9a%90%e6%80%a7%e7%bd%91%e6%a0%bc%e8%bd%a8%e9%81%93%e5%a4%a7%e5%b0%8f">#</a></span> </h3><p>参考资料:</p> <ul> <li><a href="https://css-tricks.com/snippets/css/complete-guide-grid/#aa-grid-auto-columnsgrid-auto-rows">CSS Grid Layout Guide | CSS-Tricks#aa-grid-auto-columnsgrid-auto-rows</a></li> <li><a href="https://developer.mozilla.org/en-US/docs/Web/CSS/grid-auto-columns">grid-auto-columns - CSS: Cascading Style Sheets | MDN</a></li> <li><a href="https://developer.mozilla.org/en-US/docs/Web/CSS/grid-auto-rows">grid-auto-rows - CSS: Cascading Style Sheets | MDN</a></li> </ul> <p>如果网格项数量多于已定义的网格项数量,那么多出了网格项就位于隐性网格轨道。<code>grid-auto-columns</code> 设置竖向隐性网格轨道大小,<code>grid-auto-rows</code> 设置横向隐性网格轨道大小,两者默认值都是 <code>auto</code>。</p> <p><a href="https://jsbin.com/sivaqodiyo/1/edit?html,css,output">在线示例</a></p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="p">.</span><span class="nc">container</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">grid-auto-rows</span><span class="p">:</span> <span class="mi">100</span><span class="kt">px</span><span class="p">;</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span></code></pre></td></tr></table> </div> </div><h3 class="heading" id="grid-auto-flow-自动放置算法"> grid-auto-flow 自动放置算法<span class="heading__anchor"> <a href="#grid-auto-flow-%e8%87%aa%e5%8a%a8%e6%94%be%e7%bd%ae%e7%ae%97%e6%b3%95">#</a></span> </h3><p>参考资料:</p> <ul> <li><a href="https://css-tricks.com/snippets/css/complete-guide-grid/#aa-grid-auto-flow">CSS Grid Layout Guide | CSS-Tricks#aa-grid-auto-flow</a></li> <li><a href="https://developer.mozilla.org/en-US/docs/Web/CSS/grid-auto-flow">grid-auto-flow - CSS: Cascading Style Sheets | MDN</a></li> </ul> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="p">.</span><span class="nc">container</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">grid-auto-flow</span><span class="p">:</span> <span class="kc">row</span> <span class="o">|</span> <span class="kc">column</span> <span class="o">|</span> <span class="kc">row</span> <span class="n">dense</span> <span class="o">|</span> <span class="kc">column</span> <span class="n">dense</span><span class="p">;</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span></code></pre></td></tr></table> </div> </div><p><code>grid-auto-flow</code> 设置网格项的放置算法。</p> <p><code>row</code>(默认值):横向放置网格项,必要时添加新的横排。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="nt">1</span> <span class="nt">2</span> <span class="nt">3</span> </span></span><span class="line"><span class="cl"><span class="nt">4</span> <span class="nt">5</span> <span class="nt">6</span> </span></span><span class="line"><span class="cl"><span class="nt">7</span> <span class="nt">8</span> <span class="nt">9</span> </span></span></code></pre></td></tr></table> </div> </div><p><code>column</code>:竖向放置网格项,必要时添加新的竖排,<a href="https://jsbin.com/gevalocuna/1/edit?html,css,output">在线示例</a>。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">1 4 7 </span></span><span class="line"><span class="cl">2 5 8 </span></span><span class="line"><span class="cl">3 6 9 </span></span></code></pre></td></tr></table> </div> </div><p><code>dense</code> 关键词表示后面的元素可以移动到前面的空位,示例(<a href="https://jsbin.com/tixesiyema/4/edit?html,css,output">在线示例</a>):</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span><span class="lnt">4 </span><span class="lnt">5 </span><span class="lnt">6 </span><span class="lnt">7 </span><span class="lnt">8 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;container&#34;</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;item item1&#34;</span><span class="p">&gt;</span>1<span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;item item2&#34;</span><span class="p">&gt;</span>2<span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;item item3&#34;</span><span class="p">&gt;</span>3<span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;item item4&#34;</span><span class="p">&gt;</span>4<span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;item item5&#34;</span><span class="p">&gt;</span>5<span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;item item6&#34;</span><span class="p">&gt;</span>6<span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span> </span></span></code></pre></td></tr></table> </div> </div><div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span><span class="lnt">14 </span><span class="lnt">15 </span><span class="lnt">16 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="p">.</span><span class="nc">item</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">border</span><span class="p">:</span> <span class="mi">1</span><span class="kt">px</span> <span class="kc">solid</span> <span class="kc">green</span><span class="p">;</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">container</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">border</span><span class="p">:</span> <span class="mi">1</span><span class="kt">px</span> <span class="kc">solid</span> <span class="kc">red</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="k">height</span><span class="p">:</span> <span class="mi">200</span><span class="kt">px</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="k">width</span><span class="p">:</span> <span class="mi">200</span><span class="kt">px</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="k">display</span><span class="p">:</span> <span class="k">grid</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="k">grid-template-columns</span><span class="p">:</span> <span class="mi">1</span><span class="n">fr</span> <span class="mi">1</span><span class="n">fr</span> <span class="mi">1</span><span class="n">fr</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="k">grid-auto-flow</span><span class="p">:</span> <span class="kc">row</span> <span class="n">dense</span><span class="p">;</span> <span class="c">/* .item3 提前放置于 .item1 右边 */</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">item1</span><span class="o">,</span> <span class="p">.</span><span class="nc">item2</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">grid-column</span><span class="p">:</span> <span class="n">span</span> <span class="mi">2</span><span class="p">;</span> <span class="c">/* 2fr */</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span></code></pre></td></tr></table> </div> </div><h3 class="heading" id="grid-grid-template-rowsgrid-template-columnsgrid-template-areasgrid-auto-rowsgrid-auto-columnsgrid-auto-flow-的缩写"> grid( grid-template-rows、grid-template-columns、grid-template-areas、grid-auto-rows、grid-auto-columns、grid-auto-flow 的缩写)<span class="heading__anchor"> <a href="#grid-grid-template-rowsgrid-template-columnsgrid-template-areasgrid-auto-rowsgrid-auto-columnsgrid-auto-flow-%e7%9a%84%e7%bc%a9%e5%86%99">#</a></span> </h3><p>参考资料:</p> <ul> <li><a href="https://css-tricks.com/snippets/css/complete-guide-grid/#aa-grid">CSS Grid Layout Guide | CSS-Tricks#aa-grid</a></li> <li><a href="https://developer.mozilla.org/en-US/docs/Web/CSS/grid">grid - CSS: Cascading Style Sheets | MDN</a></li> </ul> <p><code>grid</code> 是 <code>grid-template-rows</code>、<code>grid-template-columns</code>、<code>grid-template-areas</code>、<code>grid-auto-rows</code>、<code>grid-auto-columns</code>、<code>grid-auto-flow</code> 的缩写。</p> <p>创建显性网格时用法与 <code>grid-template</code> 一样。</p> <p>创建隐性网格时有 2 种用法(左边设置横排,右边设置竖排,中间以 <code>/</code> 分隔):</p> <ol> <li>显性横排,隐性竖排,<code>grid-auto-flow</code> 为 <code>column</code>:<code>&lt;grid-template-rows&gt; / [ auto-flow &amp;&amp; dense? ] &lt;grid-auto-columns&gt;?</code></li> <li>隐性横排,显性竖排,<code>grid-auto-flow</code> 为 <code>row</code>:<code>[ auto-flow &amp;&amp; dense? ] &lt;grid-auto-rows&gt;? / &lt;grid-template-columns&gt;</code></li> </ol> <p>显性横排隐性竖排示例(<a href="https://jsbin.com/cizeyuquju/1/edit?html,css,output">在线版</a>):</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span><span class="lnt">4 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="p">.</span><span class="nc">container</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="c">/* 横排比例 1:2:1,按照竖排方向放置网格项,竖排尺寸 50px */</span> </span></span><span class="line"><span class="cl"> <span class="k">grid</span><span class="p">:</span> <span class="mi">1</span><span class="n">fr</span> <span class="mi">2</span><span class="n">fr</span> <span class="mi">1</span><span class="n">fr</span> <span class="o">/</span> <span class="kc">auto</span><span class="o">-</span><span class="k">flow</span> <span class="mi">50</span><span class="kt">px</span><span class="p">;</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span></code></pre></td></tr></table> </div> </div><p>隐性横排显性竖排示例(<a href="https://jsbin.com/kudedigoki/1/edit?html,css,output">在线版</a>):</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span><span class="lnt">4 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="p">.</span><span class="nc">container</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="c">/* 隐性横排,按照横排方向放置网格项,竖排比例 1:2:1 */</span> </span></span><span class="line"><span class="cl"> <span class="k">grid</span><span class="p">:</span> <span class="kc">auto</span><span class="o">-</span><span class="k">flow</span> <span class="o">/</span> <span class="mi">1</span><span class="n">fr</span> <span class="mi">2</span><span class="n">fr</span> <span class="mi">1</span><span class="n">fr</span><span class="p">;</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span></code></pre></td></tr></table> </div> </div><h2 class="heading" id="网格项的属性"> 网格项的属性<span class="heading__anchor"> <a href="#%e7%bd%91%e6%a0%bc%e9%a1%b9%e7%9a%84%e5%b1%9e%e6%80%a7">#</a></span> </h2><p>网格项可以使用以下属性:</p> <ul> <li>grid-column-start</li> <li>grid-column-end</li> <li>grid-row-start</li> <li>grid-row-end</li> <li>grid-column</li> <li>grid-row</li> <li>grid-area</li> <li>justify-self</li> <li>align-self</li> <li>place-self</li> <li>subgrid</li> <li>order</li> </ul> <h3 class="heading" id="grid-column-startgrid-column-endgrid-row-startgrid-row-end-网格项位置"> grid-column-start、grid-column-end、grid-row-start、grid-row-end 网格项位置<span class="heading__anchor"> <a href="#grid-column-startgrid-column-endgrid-row-startgrid-row-end-%e7%bd%91%e6%a0%bc%e9%a1%b9%e4%bd%8d%e7%bd%ae">#</a></span> </h3><p>参考资料:</p> <ul> <li><a href="https://css-tricks.com/snippets/css/complete-guide-grid/#aa-grid-column-startgrid-column-endgrid-row-startgrid-row-end">CSS Grid Layout Guide | CSS-Tricks#aa-grid-column-startgrid-column-endgrid-row-startgrid-row-end</a></li> <li><a href="https://developer.mozilla.org/en-US/docs/Web/CSS/grid-column-start">grid-column-start - CSS: Cascading Style Sheets | MDN</a></li> <li><a href="https://developer.mozilla.org/en-US/docs/Web/CSS/grid-column-end">grid-column-end - CSS: Cascading Style Sheets | MDN</a></li> <li><a href="https://developer.mozilla.org/en-US/docs/Web/CSS/grid-row-start">grid-row-start - CSS: Cascading Style Sheets | MDN</a></li> <li><a href="https://developer.mozilla.org/en-US/docs/Web/CSS/grid-row-end">grid-row-end - CSS: Cascading Style Sheets | MDN</a></li> </ul> <p>这几个属性通过网格线的起点与终点规定 1 个网格项的位置,默认值为 <code>auto</code>(自动放置)。<code>span 数字</code> 表示占用多少个网格轨道,不加数字时为 1。</p> <p>示例(<a href="https://jsbin.com/deluduhupo/1/edit?html,css,output">在线版</a>):</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span><span class="lnt">4 </span><span class="lnt">5 </span><span class="lnt">6 </span><span class="lnt">7 </span><span class="lnt">8 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;container&#34;</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;item item1&#34;</span><span class="p">&gt;</span>1<span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;item item2&#34;</span><span class="p">&gt;</span>2<span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;item item3&#34;</span><span class="p">&gt;</span>3<span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;item item4&#34;</span><span class="p">&gt;</span>4<span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;item item5&#34;</span><span class="p">&gt;</span>5<span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;item item-x&#34;</span><span class="p">&gt;</span>x<span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span> </span></span></code></pre></td></tr></table> </div> </div><div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span><span class="lnt">14 </span><span class="lnt">15 </span><span class="lnt">16 </span><span class="lnt">17 </span><span class="lnt">18 </span><span class="lnt">19 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="p">.</span><span class="nc">container</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">border</span><span class="p">:</span> <span class="mi">1</span><span class="kt">px</span> <span class="kc">solid</span> <span class="kc">red</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="k">height</span><span class="p">:</span> <span class="mi">400</span><span class="kt">px</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="k">display</span><span class="p">:</span> <span class="k">grid</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="k">grid-template</span><span class="p">:</span> <span class="mi">1</span><span class="n">fr</span> <span class="mi">1</span><span class="n">fr</span> <span class="mi">1</span><span class="n">fr</span> <span class="o">/</span> <span class="mi">1</span><span class="n">fr</span> <span class="p">[</span><span class="n">col2-start</span><span class="p">]</span> <span class="mi">1</span><span class="n">fr</span> <span class="mi">1</span><span class="n">fr</span><span class="p">;</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">item</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">border</span><span class="p">:</span> <span class="mi">1</span><span class="kt">px</span> <span class="kc">solid</span> <span class="kc">green</span><span class="p">;</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">item-x</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="c">/* 从 col2-start 竖网格线到倒数第 1 条竖网格线 */</span> </span></span><span class="line"><span class="cl"> <span class="k">grid-column-start</span><span class="p">:</span> <span class="n">col2-start</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="k">grid-column-end</span><span class="p">:</span> <span class="mi">-1</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="c">/* 从第 2 条横网格线开始,占用 2 个横向网格轨道 */</span> </span></span><span class="line"><span class="cl"> <span class="k">grid-row-start</span><span class="p">:</span> <span class="mi">2</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="k">grid-row-end</span><span class="p">:</span> <span class="n">span</span> <span class="mi">2</span><span class="p">;</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span></code></pre></td></tr></table> </div> </div><h3 class="heading" id="grid-columngrid-column-startgrid-column-end-的缩写grid-rowgrid-row-startgrid-row-end-的缩写"> grid-column(grid-column-start、grid-column-end 的缩写)、grid-row(grid-row-start、grid-row-end 的缩写)<span class="heading__anchor"> <a href="#grid-columngrid-column-startgrid-column-end-%e7%9a%84%e7%bc%a9%e5%86%99grid-rowgrid-row-startgrid-row-end-%e7%9a%84%e7%bc%a9%e5%86%99">#</a></span> </h3><p>参考资料:</p> <ul> <li><a href="https://css-tricks.com/snippets/css/complete-guide-grid/#aa-grid-columngrid-row">CSS Grid Layout Guide | CSS-Tricks#aa-grid-columngrid-row</a></li> <li><a href="https://developer.mozilla.org/en-US/docs/Web/CSS/grid-column">grid-column - CSS: Cascading Style Sheets | MDN</a></li> <li><a href="https://developer.mozilla.org/en-US/docs/Web/CSS/grid-row">grid-row - CSS: Cascading Style Sheets | MDN</a></li> </ul> <p><code>grid-column</code> 是 <code>grid-column-start / grid-column-end</code> 的缩写,使用 1 个值时只设置 <code>grid-column-start</code>。</p> <p><code>grid-row</code> 是 <code>grid-row-start / grid-row-end</code> 的缩写,使用 1 个值时值设置 <code>grid-row-start</code>。</p> <p>示例(<a href="https://jsbin.com/lokebuyibo/1/edit?html,css,output">在线版</a>):</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="p">.</span><span class="nc">item-x</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">grid-column</span><span class="p">:</span> <span class="n">col2-start</span> <span class="o">/</span> <span class="mi">-1</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="k">grid-row</span><span class="p">:</span> <span class="mi">2</span> <span class="o">/</span> <span class="n">span</span> <span class="mi">2</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="c">/* </span></span></span><span class="line"><span class="cl"><span class="c"> grid-column-start: col2-start; </span></span></span><span class="line"><span class="cl"><span class="c"> grid-column-end: -1; </span></span></span><span class="line"><span class="cl"><span class="c"> grid-row-start: 2; </span></span></span><span class="line"><span class="cl"><span class="c"> grid-row-end: span 2; </span></span></span><span class="line"><span class="cl"><span class="c"> */</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span></code></pre></td></tr></table> </div> </div><h3 class="heading" id="grid-areagrid-row-startgrid-column-startgrid-row-endgrid-column-end-的缩写"> grid-area(grid-row-start、grid-column-start、grid-row-end、grid-column-end 的缩写)<span class="heading__anchor"> <a href="#grid-areagrid-row-startgrid-column-startgrid-row-endgrid-column-end-%e7%9a%84%e7%bc%a9%e5%86%99">#</a></span> </h3><p><code>grid-area</code> 有两个用法。一是 <code>grid-row-start / grid-column-start / grid-row-end / grid-column-end</code> 的缩写(吐槽:这个顺序不好读,<code>-start</code> 后面应该跟 <code>-end</code>);二是搭配 <code>grid-template-area</code>,使用名称指定位置。</p> <p>示例(<a href="https://jsbin.com/mekakujome/1/edit?html,css,output">在线版</a>):</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="p">.</span><span class="nc">item-x</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">grid-area</span><span class="p">:</span> <span class="mi">2</span> <span class="o">/</span> <span class="n">col2-start</span> <span class="o">/</span> <span class="n">span</span> <span class="mi">2</span> <span class="o">/</span> <span class="mi">-1</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="c">/* </span></span></span><span class="line"><span class="cl"><span class="c"> grid-column: col2-start / -1; </span></span></span><span class="line"><span class="cl"><span class="c"> grid-row: 2 / span 2; </span></span></span><span class="line"><span class="cl"><span class="c"> </span></span></span><span class="line"><span class="cl"><span class="c"> grid-column-start: col2-start; </span></span></span><span class="line"><span class="cl"><span class="c"> grid-column-end: -1; </span></span></span><span class="line"><span class="cl"><span class="c"> grid-row-start: 2; </span></span></span><span class="line"><span class="cl"><span class="c"> grid-row-end: span 2; </span></span></span><span class="line"><span class="cl"><span class="c"> */</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span></code></pre></td></tr></table> </div> </div><h3 class="heading" id="justify-selfinline-轴横轴对齐"> justify-self,inline 轴(横轴)对齐<span class="heading__anchor"> <a href="#justify-selfinline-%e8%bd%b4%e6%a8%aa%e8%bd%b4%e5%af%b9%e9%bd%90">#</a></span> </h3><p><code>justify-self</code> 设置 1 个网格项的 inline 轴(横轴)对齐方式,默认值是 <code>stretch</code>。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="p">.</span><span class="nc">item</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">justify-self</span><span class="p">:</span> <span class="kc">start</span> <span class="o">|</span> <span class="kc">end</span> <span class="o">|</span> <span class="kc">center</span> <span class="o">|</span> <span class="kc">stretch</span><span class="p">;</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span></code></pre></td></tr></table> </div> </div><p><a href="https://jsbin.com/fuwimofede/1/edit?html,css,output">在线示例</a></p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="p">.</span><span class="nc">item4</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">justify-self</span><span class="p">:</span> <span class="kc">center</span><span class="p">;</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span></code></pre></td></tr></table> </div> </div><h3 class="heading" id="align-selfblock-轴竖轴对齐"> align-self,block 轴(竖轴)对齐<span class="heading__anchor"> <a href="#align-selfblock-%e8%bd%b4%e7%ab%96%e8%bd%b4%e5%af%b9%e9%bd%90">#</a></span> </h3><p><code>align-self</code> 设置 1 个网格项的 block 轴(竖轴)对齐方式,默认是 <code>stretch</code>。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="p">.</span><span class="nc">item</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">align-self</span><span class="p">:</span> <span class="kc">start</span> <span class="o">|</span> <span class="kc">end</span> <span class="o">|</span> <span class="kc">center</span> <span class="o">|</span> <span class="kc">stretch</span><span class="p">;</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span></code></pre></td></tr></table> </div> </div><p><a href="https://jsbin.com/dapecabuja/1/edit?html,css,output">在线示例</a></p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="p">.</span><span class="nc">item4</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">align-self</span><span class="p">:</span> <span class="kc">end</span><span class="p">;</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span></code></pre></td></tr></table> </div> </div><h3 class="heading" id="place-selfalign-selfjustify-self-的缩写"> place-self(align-self、justify-self 的缩写)<span class="heading__anchor"> <a href="#place-selfalign-selfjustify-self-%e7%9a%84%e7%bc%a9%e5%86%99">#</a></span> </h3><p>参考资料:</p> <ul> <li><a href="https://css-tricks.com/snippets/css/complete-guide-grid/#aa-place-self">CSS Grid Layout Guide | CSS-Tricks#aa-place-self</a></li> <li><a href="https://developer.mozilla.org/en-US/docs/Web/CSS/place-self">place-self - CSS: Cascading Style Sheets | MDN</a></li> </ul> <p><code>place-self</code> 是 <code>align-self justify-self</code> 的缩写,只使用 1 个值时同时设置两者。</p> <p>示例:</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span><span class="lnt">4 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="p">.</span><span class="nc">item4</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">place-self</span><span class="p">:</span> <span class="kc">center</span><span class="p">;</span> <span class="c">/* 正中间 */</span> </span></span><span class="line"><span class="cl"> <span class="k">place-self</span><span class="p">:</span> <span class="kc">end</span> <span class="kc">start</span><span class="p">;</span> <span class="c">/* 左下角 */</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span></code></pre></td></tr></table> </div> </div><h3 class="heading" id="subgrid-继承网格容器属性"> subgrid 继承网格容器属性<span class="heading__anchor"> <a href="#subgrid-%e7%bb%a7%e6%89%bf%e7%bd%91%e6%a0%bc%e5%ae%b9%e5%99%a8%e5%b1%9e%e6%80%a7">#</a></span> </h3><p>参考资料:<a href="https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_grid_layout/Subgrid">Subgrid - CSS: Cascading Style Sheets | MDN</a></p> <p>虽然 <code>subgrid</code> 不是属性,但用于网格项,所以列举于此。</p> <p>示例(<a href="https://jsbin.com/keqogeweki/1/edit?html,css,output">在线版</a>):</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;container&#34;</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;item item1&#34;</span><span class="p">&gt;</span>Item1<span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;item item2&#34;</span><span class="p">&gt;</span>Item2<span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;item item3&#34;</span><span class="p">&gt;</span>Item3<span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;item item4&#34;</span><span class="p">&gt;</span>Item4<span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;item item5&#34;</span><span class="p">&gt;</span>Item5<span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;item item6&#34;</span><span class="p">&gt;</span>Item6, 4×4 </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;item6-1&#34;</span><span class="p">&gt;</span>Item6.1, 1×1<span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;item6-2&#34;</span><span class="p">&gt;</span>Item6.2, 1×1<span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span> </span></span></code></pre></td></tr></table> </div> </div><div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span><span class="lnt">14 </span><span class="lnt">15 </span><span class="lnt">16 </span><span class="lnt">17 </span><span class="lnt">18 </span><span class="lnt">19 </span><span class="lnt">20 </span><span class="lnt">21 </span><span class="lnt">22 </span><span class="lnt">23 </span><span class="lnt">24 </span><span class="lnt">25 </span><span class="lnt">26 </span><span class="lnt">27 </span><span class="lnt">28 </span><span class="lnt">29 </span><span class="lnt">30 </span><span class="lnt">31 </span><span class="lnt">32 </span><span class="lnt">33 </span><span class="lnt">34 </span><span class="lnt">35 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="p">.</span><span class="nc">container</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">border</span><span class="p">:</span> <span class="mi">1</span><span class="kt">px</span> <span class="kc">solid</span> <span class="kc">red</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="k">height</span><span class="p">:</span> <span class="mi">400</span><span class="kt">px</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="k">display</span><span class="p">:</span> <span class="k">grid</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="k">grid-template</span><span class="p">:</span> <span class="mi">1</span><span class="n">fr</span> <span class="mi">1</span><span class="n">fr</span> <span class="mi">1</span><span class="n">fr</span> <span class="o">/</span> <span class="mi">1</span><span class="n">fr</span> <span class="mi">1</span><span class="n">fr</span> <span class="mi">1</span><span class="n">fr</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="k">gap</span><span class="p">:</span> <span class="mi">10</span><span class="kt">px</span><span class="p">;</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">item</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">border</span><span class="p">:</span> <span class="mi">1</span><span class="kt">px</span> <span class="kc">solid</span> <span class="kc">green</span><span class="p">;</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">item6</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">border</span><span class="p">:</span> <span class="mi">1</span><span class="kt">px</span> <span class="kc">solid</span> <span class="kc">yellow</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="k">grid-area</span><span class="p">:</span> <span class="mi">2</span> <span class="o">/</span> <span class="mi">2</span> <span class="o">/</span> <span class="n">span</span> <span class="mi">2</span> <span class="o">/</span> <span class="n">span</span> <span class="mi">2</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="k">display</span><span class="p">:</span> <span class="k">grid</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="c">/* </span></span></span><span class="line"><span class="cl"><span class="c"> 用 subgrid 才能继承容器的 gap 属性, </span></span></span><span class="line"><span class="cl"><span class="c"> 可以删掉下面两行代码看看差异 */</span> </span></span><span class="line"><span class="cl"> <span class="k">grid-template-columns</span><span class="p">:</span> <span class="n">subgrid</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="k">grid-template-rows</span><span class="p">:</span> <span class="n">subgrid</span><span class="p">;</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">item6-1</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">border</span><span class="p">:</span> <span class="mi">1</span><span class="kt">px</span> <span class="kc">solid</span> <span class="kc">blue</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="c">/* 使用 .item6 的网格线编号,不要用 .container 的网格线编号 */</span> </span></span><span class="line"><span class="cl"> <span class="k">grid-column-start</span><span class="p">:</span> <span class="mi">2</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="k">grid-row-start</span><span class="p">:</span> <span class="mi">2</span><span class="p">;</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">item6-2</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">border</span><span class="p">:</span> <span class="mi">1</span><span class="kt">px</span> <span class="kc">solid</span> <span class="kc">blue</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="k">grid-column-start</span><span class="p">:</span> <span class="mi">2</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="k">grid-row-start</span><span class="p">:</span> <span class="mi">1</span><span class="p">;</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span></code></pre></td></tr></table> </div> </div><h3 class="heading" id="order-顺序"> order 顺序<span class="heading__anchor"> <a href="#order-%e9%a1%ba%e5%ba%8f">#</a></span> </h3><p>参考资料:<a href="https://developer.mozilla.org/en-US/docs/Web/CSS/order">order - CSS: Cascading Style Sheets | MDN</a></p> <p>网格项默认按照源代码顺序出现。<code>order</code> 设置网格项的出现顺序,默认值为 <code>0</code>,可使用正数和负数。</p> <p>示例(<a href="https://jsbin.com/kihehuxiso/6/edit?html,css,output">在线版</a>):</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span><span class="lnt">4 </span><span class="lnt">5 </span><span class="lnt">6 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="p">.</span><span class="nc">item1</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">order</span><span class="p">:</span> <span class="mi">1</span><span class="p">;</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">item9</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">order</span><span class="p">:</span> <span class="mi">-1</span><span class="p">;</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span></code></pre></td></tr></table> </div> </div><h2 class="heading" id="待写内容"> 待写内容<span class="heading__anchor"> <a href="#%e5%be%85%e5%86%99%e5%86%85%e5%ae%b9">#</a></span> </h2><!-- 还没搞懂的知识 --> <ul> <li>auto-fill/auto-fit(<a href="https://css-tricks.com/auto-sizing-columns-css-grid-auto-fill-vs-auto-fit/">Auto-Sizing Columns In CSS Grid: <code>auto-fill</code> Vs <code>auto-fit</code> | CSS-Tricks</a>)</li> <li>min-content/max-content(<a href="https://developer.mozilla.org/en-US/docs/Glossary/Intrinsic_Size">Intrinsic size - MDN Web Docs Glossary: Definitions of Web-related terms | MDN</a>)</li> <li>masonry(<a href="https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_grid_layout/Masonry_layout">Masonry layout - CSS: Cascading Style Sheets | MDN</a>)</li> </ul> <h2 class="heading" id="参考资料"> 参考资料<span class="heading__anchor"> <a href="#%e5%8f%82%e8%80%83%e8%b5%84%e6%96%99">#</a></span> </h2><ul> <li><a href="https://css-tricks.com/snippets/css/complete-guide-grid/">CSS Grid Layout Guide | CSS-Tricks</a></li> <li><a href="https://developer.mozilla.org/en-US/docs/Learn/CSS/CSS_layout/Grids">Grids - Learn web development | MDN</a></li> <li><a href="https://www.joshwcomeau.com/css/interactive-guide-to-grid/">An Interactive Guide to CSS Grid • Josh W. Comeau</a></li> <li><a href="https://www.w3.org/TR/css-grid-1/">CSS Grid Layout Module Level 1</a></li> <li><a href="https://www.w3.org/TR/css-grid-2/">CSS Grid Layout Module Level 2</a></li> <li><a href="https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_grid_layout/Subgrid">Subgrid - CSS: Cascading Style Sheets | MDN</a></li> <li><a href="https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_grid_layout/Basic_concepts_of_grid_layout">Basic concepts of grid layout - CSS: Cascading Style Sheets | MDN</a></li> <li><a href="https://css-tricks.com/auto-sizing-columns-css-grid-auto-fill-vs-auto-fit/">Auto-Sizing Columns In CSS Grid: <code>auto-fill</code> Vs <code>auto-fit</code> | CSS-Tricks</a></li> </ul> <h2 class="heading" id="图片出处"> 图片出处<span class="heading__anchor"> <a href="#%e5%9b%be%e7%89%87%e5%87%ba%e5%a4%84">#</a></span> </h2><p>本文使用的图片出自 <a href="https://www.w3.org/TR/css-grid-1/#grid-concepts">CSS Grid Layout Module Level 1#grid-concepts</a>。</p> <h2 class="heading" id="练习"> 练习<span class="heading__anchor"> <a href="#%e7%bb%83%e4%b9%a0">#</a></span> </h2><ul> <li><a href="https://developer.mozilla.org/en-US/docs/Learn/CSS/CSS_layout/Grid_skills">Test your skills: Grid - Learn web development | MDN</a></li> <li><a href="https://cssgridgarden.com/">Grid Garden - A game for learning CSS grid</a></li> </ul>

2024/9/15
阅读更多

CSS BEM 命名规范入门教程

<p>BEM(Block, Element, Modifier)是 HTML/CSS 类的命名方法,它可以让 HTML 和 CSS 代码更有条理。</p> <h2 class="heading" id="概念与用法"> 概念与用法<span class="heading__anchor"> <a href="#%e6%a6%82%e5%bf%b5%e4%b8%8e%e7%94%a8%e6%b3%95">#</a></span> </h2><p>一开始看不懂没关系,后面有示例。</p> <ul> <li>block(块):可以独立使用的 HTML 元素(比如:<code>&lt;nav&gt;</code>),可以不包含 element。</li> <li>element(元素):依附于 block 的 HTML 元素,无法独立存在(比如:<code>&lt;li&gt;</code>),前面要加上双下划线 <code>__</code>。</li> <li>modifier(修饰符):表示 block 或者 element 的状态和外观,前面要加上双连字符 <code>--</code>。</li> <li>用单连字符 <code>-</code> 连接单词,比如:<code>search-form</code>。</li> <li>element 只属于 block,而不是另一个 element。错误写法:<code>block__element1__element2</code>,正确写法:<code>block__element2</code>。</li> <li>使用 modifier 时,同时保留不含 modifier 的类名,比如:<code>&lt;a class=&quot;menu__link menu__link--active&quot; href=&quot;/zh-cn/&quot;&gt;主页&lt;/a&gt;</code>。</li> </ul> <h2 class="heading" id="html-示例"> HTML 示例<span class="heading__anchor"> <a href="#html-%e7%a4%ba%e4%be%8b">#</a></span> </h2><p><code>&lt;nav&gt;</code> 元素是 block,它包含的 element 有 <code>&lt;ul&gt;</code>、<code>&lt;li&gt;</code>、<code>&lt;a&gt;</code>。<code>--active</code> 是修饰符。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">nav</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;menu&#34;</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">ul</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;menu__list&#34;</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">li</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;menu__item&#34;</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">a</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;menu__link menu__link--active&#34;</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;/zh-cn/&#34;</span><span class="p">&gt;</span>主页<span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;/</span><span class="nt">li</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">li</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;menu__item&#34;</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">a</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;menu__link&#34;</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;/zh-cn/posts/&#34;</span><span class="p">&gt;</span>文章<span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;/</span><span class="nt">li</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">li</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;menu__item&#34;</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">a</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;menu__link&#34;</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;/zh-cn/about/&#34;</span><span class="p">&gt;</span>关于<span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;/</span><span class="nt">li</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;/</span><span class="nt">ul</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">nav</span><span class="p">&gt;</span> </span></span></code></pre></td></tr></table> </div> </div><h2 class="heading" id="css-示例"> CSS 示例<span class="heading__anchor"> <a href="#css-%e7%a4%ba%e4%be%8b">#</a></span> </h2><p><a href="https://jsbin.com/kijewimudi/2/edit?html,css,output">在线示例</a></p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span><span class="lnt">14 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="c">/* 横向列表 */</span> </span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">menu__list</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">display</span><span class="p">:</span> <span class="kc">flex</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="k">flex-direction</span><span class="p">:</span> <span class="kc">row</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="k">flex-wrap</span><span class="p">:</span> <span class="kc">wrap</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="k">justify-content</span><span class="p">:</span> <span class="kc">space-between</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="k">list-style-type</span><span class="p">:</span> <span class="kc">none</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="k">padding-inline-start</span><span class="p">:</span> <span class="mi">0</span><span class="p">;</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c">/* 加粗和当前页面匹配的链接 */</span> </span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">menu__link--active</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">font-weight</span><span class="p">:</span> <span class="kc">bolder</span><span class="p">;</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span></code></pre></td></tr></table> </div> </div><h2 class="heading" id="scss-示例"> SCSS 示例<span class="heading__anchor"> <a href="#scss-%e7%a4%ba%e4%be%8b">#</a></span> </h2><p>我更推荐用 SCSS,用父选择器 <code>&amp;</code> 可以把 block 和 element 的样式都放在一起,这种结构可以清晰地展现它们的层级关系。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span><span class="lnt">14 </span><span class="lnt">15 </span><span class="lnt">16 </span><span class="lnt">17 </span><span class="lnt">18 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-scss" data-lang="scss"><span class="line"><span class="cl"><span class="nc">.menu</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="c1">// 横向列表 </span></span></span><span class="line"><span class="cl"> <span class="k">&amp;</span><span class="nt">__list</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="na">display</span><span class="o">:</span> <span class="ni">flex</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="na">flex-direction</span><span class="o">:</span> <span class="ni">row</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="na">flex-wrap</span><span class="o">:</span> <span class="ni">wrap</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="na">justify-content</span><span class="o">:</span> <span class="ni">space-between</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="na">list-style-type</span><span class="o">:</span> <span class="ni">none</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="na">padding-inline-start</span><span class="o">:</span> <span class="mi">0</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="p">}</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="c1">// 加粗和当前页面匹配的链接 </span></span></span><span class="line"><span class="cl"> <span class="k">&amp;</span><span class="nt">__link</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">&amp;</span><span class="o">--</span><span class="nt">active</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="na">font-weight</span><span class="o">:</span> <span class="ni">bolder</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="p">}</span> </span></span><span class="line"><span class="cl"> <span class="p">}</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span></code></pre></td></tr></table> </div> </div><h2 class="heading" id="替代方案原子式-css"> 替代方案:原子式 CSS<span class="heading__anchor"> <a href="#%e6%9b%bf%e4%bb%a3%e6%96%b9%e6%a1%88%e5%8e%9f%e5%ad%90%e5%bc%8f-css">#</a></span> </h2><p>如果你觉得 BEM 太冗长或者难以维护,那你可以试试原子式<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> CSS 框架(atomic CSS framework),比如:<a href="https://tailwindcss.com/">Tailwind CSS</a> 和 <a href="https://unocss.dev/">UnoCSS</a>。这些框架会提供 utility(预定义的类)。开发者只需要写预定义的类名,不需要写 CSS 代码。以下是一些 Tailwind CSS 的 utility:</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span><span class="lnt">4 </span><span class="lnt">5 </span><span class="lnt">6 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="p">.</span><span class="nc">flex</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">display</span><span class="p">:</span> <span class="kc">flex</span><span class="p">;</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">flex-row</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">flex-direction</span><span class="p">:</span> <span class="kc">row</span><span class="p">;</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span></code></pre></td></tr></table> </div> </div><p>用 Tailwind CSS 重写之前的 CSS 代码(<a href="https://jsbin.com/vevezoneqo/1/edit?html,css,output">在线示例</a>):</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span><span class="lnt">13 </span><span class="lnt">14 </span><span class="lnt">15 </span><span class="lnt">16 </span><span class="lnt">17 </span><span class="lnt">18 </span><span class="lnt">19 </span><span class="lnt">20 </span><span class="lnt">21 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">script</span> <span class="na">src</span><span class="o">=</span><span class="s">&#34;https://cdn.tailwindcss.com&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">script</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">script</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="nx">tailwind</span><span class="p">.</span><span class="nx">config</span> <span class="o">=</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="nx">corePlugins</span><span class="o">:</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="nx">preflight</span><span class="o">:</span> <span class="kc">false</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="p">}</span> </span></span><span class="line"><span class="cl"> <span class="p">}</span> </span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">script</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">nav</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">ul</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;flex flex-row flex-wrap justify-between list-none ps-0&#34;</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">li</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">a</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;font-bold&#34;</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;/zh-cn/&#34;</span><span class="p">&gt;</span>主页<span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;/</span><span class="nt">li</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">li</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;/zh-cn/posts/&#34;</span><span class="p">&gt;</span>文章<span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;/</span><span class="nt">li</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">li</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;/zh-cn/about/&#34;</span><span class="p">&gt;</span>关于<span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;/</span><span class="nt">li</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;/</span><span class="nt">ul</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">nav</span><span class="p">&gt;</span> </span></span></code></pre></td></tr></table> </div> </div><h2 class="heading" id="补充资料"> 补充资料<span class="heading__anchor"> <a href="#%e8%a1%a5%e5%85%85%e8%b5%84%e6%96%99">#</a></span> </h2><ul> <li><a href="https://en.bem.info/">https://en.bem.info/</a>(官方教程)</li> <li><a href="https://getbem.com/">https://getbem.com/</a>(非官方教程)</li> <li><a href="https://en.bem.info/methodology/naming-convention/">Naming convention / Methodology / BEM</a></li> <li><a href="https://github.com/troxler/awesome-css-frameworks">troxler/awesome-css-frameworks: List of awesome CSS frameworks</a></li> </ul> <div class="footnotes" role="doc-endnotes"> <hr> <ol> <li id="fn:1"> <p>atomic CSS 一般译为「原子化 CSS」,我认为这个翻译是错的。「化」表示状态变化,对应英文的「-ize」和「-ify」词缀,比如:净化(purify)、标准化(standardize)。atomic 可以拆分成 atom(原子)和 -ic(形容词后缀),所以我把 atomic 翻译成原子式,「式」表示形式、样式。atomic 也可以翻译成原子型,「型」表示类型、样式。&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p> </li> </ol> </div>

2024/9/7
阅读更多

CSS Flexbox 布局教程

<p>Flexbox(弹性盒子)是一维的布局方法,也就是在一条横线(row)或者竖线(column)上排列元素。推荐大家看完本文后做<a href="https://cyrusyip.org/zh-cn/posts/2024/09/06/css-flexbox-layout-guide/#%e4%b9%a0%e9%a2%98">文末提到的习题</a>。</p> <h2 class="heading" id="flex-容器的属性"> flex 容器的属性<span class="heading__anchor"> <a href="#flex-%e5%ae%b9%e5%99%a8%e7%9a%84%e5%b1%9e%e6%80%a7">#</a></span> </h2><p>flex 容器(flex container)的属性有 <code>display</code>、<code>flex-direction</code>、<code>flex-wrap</code>、<code>flex-flow</code>、<code>justify-content</code>、<code>align-items</code>、<code>align-content</code>、<code>row-gap</code>、<code>column-gap</code>、<code>gap</code>。</p> <h3 class="heading" id="flex-容器与-flex-项"> flex 容器与 flex 项<span class="heading__anchor"> <a href="#flex-%e5%ae%b9%e5%99%a8%e4%b8%8e-flex-%e9%a1%b9">#</a></span> </h3><p>以下的 <code>section</code> 元素包含了 3 个 <code>article</code> 元素。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span><span class="lnt">4 </span><span class="lnt">5 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">section</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">article</span><span class="p">&gt;</span>Article 1<span class="p">&lt;/</span><span class="nt">article</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">article</span><span class="p">&gt;</span>Article 2<span class="p">&lt;/</span><span class="nt">article</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">article</span><span class="p">&gt;</span>Article 3<span class="p">&lt;/</span><span class="nt">article</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">section</span><span class="p">&gt;</span> </span></span></code></pre></td></tr></table> </div> </div><p>要排列 <code>article</code> 元素,将它们的父元素设置为 flex 容器。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="nt">section</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">display</span><span class="p">:</span> <span class="kc">flex</span> <span class="o">|</span> <span class="kc">inline-flex</span><span class="p">;</span> <span class="c">/* inline-flex 表示容器是 inline 元素 */</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span></code></pre></td></tr></table> </div> </div><p>在上述例子中,<code>section</code> 元素是 flex 容器(flex container),<code>article</code> 元素是 flex 项(flex item)。</p> <h3 class="heading" id="flex-direction-方向主轴交叉轴"> flex-direction 方向、主轴、交叉轴<span class="heading__anchor"> <a href="#flex-direction-%e6%96%b9%e5%90%91%e4%b8%bb%e8%bd%b4%e4%ba%a4%e5%8f%89%e8%bd%b4">#</a></span> </h3><p><code>flex-direction</code> 定义排列方向和主轴。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="p">.</span><span class="nc">container</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">flex-direction</span><span class="p">:</span> <span class="kc">row</span> <span class="o">|</span> <span class="kc">row-reverse</span> <span class="o">|</span> <span class="kc">column</span> <span class="o">|</span> <span class="kc">column-reverse</span><span class="p">;</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span></code></pre></td></tr></table> </div> </div><ul> <li><code>row</code>(默认值):横向,和文字方向(<a href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/dir">dir</a>)一致,如果方向是从左往右,那么就是从左往右排列子元素</li> <li><code>row-reverse</code>:和前者相反,从右往左</li> <li><code>column</code>:纵向,从上到下</li> <li><code>column-reverse</code>:和前者相反,从下到上</li> </ul> <p>主轴(main axis)就是和 flex 项排列方向一致的轴,交叉轴(cross axis)则是与主轴垂直的轴。一定要分清楚方向和两条轴,在对齐 flex 项时会用到。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span><span class="lnt">4 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="p">.</span><span class="nc">container</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">display</span><span class="p">:</span> <span class="kc">flex</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="k">flex-direction</span><span class="p">:</span> <span class="kc">row</span><span class="p">;</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span></code></pre></td></tr></table> </div> </div><p>上述代码表示从左到右排列 flex 项,主轴是从左到右,交叉轴是从上到下。</p> <figure> <img src="https://www.w3.org/TR/css-flexbox-1/images/flex-direction-terms.svg"><figcaption>轴的图示</figcaption></figure><h3 class="heading" id="flex-wrap-换行"> flex-wrap 换行<span class="heading__anchor"> <a href="#flex-wrap-%e6%8d%a2%e8%a1%8c">#</a></span> </h3><p><code>flex-wrap</code> 控制是否换行,默认不换行。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="p">.</span><span class="nc">container</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">flex-wrap</span><span class="p">:</span> <span class="kc">nowrap</span> <span class="o">|</span> <span class="kc">wrap</span> <span class="o">|</span> <span class="kc">wrap-reverse</span><span class="p">;</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span></code></pre></td></tr></table> </div> </div><ul> <li><code>nowrap</code>(默认值):全部 flex 项排列成一条线</li> <li><code>wrap</code>:溢出时换行</li> <li><code>wrap-reverse</code>:溢出时换行,但后面的元素会排到前面</li> </ul> <p>示例代码(<a href="https://jsbin.com/yatubohoqe/7/edit?html,css,output">在线示例</a>):</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">section</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">article</span><span class="p">&gt;</span>Article 1<span class="p">&lt;/</span><span class="nt">article</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">article</span><span class="p">&gt;</span>Article 2<span class="p">&lt;/</span><span class="nt">article</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">article</span><span class="p">&gt;</span>Article 3<span class="p">&lt;/</span><span class="nt">article</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">article</span><span class="p">&gt;</span>Article 4<span class="p">&lt;/</span><span class="nt">article</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">article</span><span class="p">&gt;</span>Article 5<span class="p">&lt;/</span><span class="nt">article</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">article</span><span class="p">&gt;</span>Article 6<span class="p">&lt;/</span><span class="nt">article</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">article</span><span class="p">&gt;</span>Article 7<span class="p">&lt;/</span><span class="nt">article</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">article</span><span class="p">&gt;</span>Article 8<span class="p">&lt;/</span><span class="nt">article</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"> <span class="p">&lt;</span><span class="nt">article</span><span class="p">&gt;</span>Article 9<span class="p">&lt;/</span><span class="nt">article</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">section</span><span class="p">&gt;</span> </span></span></code></pre></td></tr></table> </div> </div><div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="nt">section</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">display</span><span class="p">:</span> <span class="kc">flex</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="k">flex-direction</span><span class="p">:</span> <span class="kc">row</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="k">flex-wrap</span><span class="p">:</span> <span class="kc">wrap-reverse</span><span class="p">;</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nt">article</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">width</span><span class="p">:</span> <span class="mi">100</span><span class="kt">%</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="k">outline</span><span class="p">:</span> <span class="mi">1</span><span class="kt">px</span> <span class="kc">solid</span> <span class="kc">green</span><span class="p">;</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span></code></pre></td></tr></table> </div> </div><h3 class="heading" id="flex-flowflex-direction-和-flex-wrap-的缩写"> flex-flow(flex-direction 和 flex-wrap 的缩写)<span class="heading__anchor"> <a href="#flex-flowflex-direction-%e5%92%8c-flex-wrap-%e7%9a%84%e7%bc%a9%e5%86%99">#</a></span> </h3><p><code>flex-flow</code> 是 <code>flex-direction</code> 和 <code>flex-wrap</code> 的缩写,默认值为 <code>row nowrap</code>。</p> <p>下面两份代码效果一样:</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span><span class="lnt">4 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="nt">section</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">flex-direction</span><span class="p">:</span> <span class="kc">row</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="k">flex-wrap</span><span class="p">:</span> <span class="kc">wrap</span><span class="p">;</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span></code></pre></td></tr></table> </div> </div><div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="nt">section</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">flex-flow</span><span class="p">:</span> <span class="kc">row</span> <span class="kc">wrap</span><span class="p">;</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span></code></pre></td></tr></table> </div> </div><h3 class="heading" id="justify-content-主轴对齐"> justify-content 主轴对齐<span class="heading__anchor"> <a href="#justify-content-%e4%b8%bb%e8%bd%b4%e5%af%b9%e9%bd%90">#</a></span> </h3><p><code>justify-content</code> 设置主轴的对齐方式。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="p">.</span><span class="nc">container</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">justify-content</span><span class="p">:</span> <span class="kc">flex-start</span> <span class="o">|</span> <span class="kc">flex-end</span> <span class="o">|</span> <span class="kc">center</span> <span class="o">|</span> <span class="kc">space-between</span> <span class="o">|</span> <span class="kc">space-around</span> <span class="o">|</span> <span class="kc">space</span><span class="o">-</span><span class="n">evenly</span> <span class="o">|</span> <span class="kc">start</span> <span class="o">|</span> <span class="kc">end</span> <span class="o">|</span> <span class="kc">left</span> <span class="o">|</span> <span class="kc">right</span> <span class="o">...</span> <span class="o">+</span> <span class="n">safe</span> <span class="o">|</span> <span class="n">unsafe</span><span class="p">;</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span></code></pre></td></tr></table> </div> </div><p>下面只介绍常用的值。</p> <ul> <li><code>flex-start</code>(默认):将所有 flex 项放到主轴的起点。如果主轴是 row(从左到右),那么所有 flex 项贴近左边。例子(<code>.</code> 表示空间):<code>Item1Item2Item3......</code>。</li> <li><code>flex-end</code>:将所有 flex 项放到主轴的终点。例子:<code>......Item1Item2Item3</code>。</li> <li><code>center</code>:将所有 flex 项放在主轴的中间。例子:<code>....Item1Item2Item3....。</code></li> <li><code>space-between</code>:均匀分配 flex 项,每个 flex 项之间的距离一样,头部 flex 项贴近主轴开头,尾部 flex 项贴近主轴末尾,例子:<code>Item1..Item2..Item3</code>。</li> <li><code>space-around</code>:均匀分配 flex 项,每个 flex 项的前后间隔一样,例子:<code>.Item1..Item2..Item3.</code>。</li> <li><code>space-evenly</code>:均匀分配 flex 项,每个 flex 项之间的距离一样,头部 flex 项和主轴开头有一样的距离,尾部 flex 项和主轴末尾有一样的距离。例子:<code>..Item1..Item2..Item3..</code>。</li> </ul> <h3 class="heading" id="align-items-交叉轴对齐"> align-items 交叉轴对齐<span class="heading__anchor"> <a href="#align-items-%e4%ba%a4%e5%8f%89%e8%bd%b4%e5%af%b9%e9%bd%90">#</a></span> </h3><p>交叉轴垂直于主轴。<code>align-items</code> 设置交叉轴的对齐方式。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="p">.</span><span class="nc">container</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">align-items</span><span class="p">:</span> <span class="kc">stretch</span> <span class="o">|</span> <span class="kc">flex-start</span> <span class="o">|</span> <span class="kc">flex-end</span> <span class="o">|</span> <span class="kc">center</span> <span class="o">|</span> <span class="kc">baseline</span> <span class="o">|</span> <span class="kc">first</span> <span class="kc">baseline</span> <span class="o">|</span> <span class="kc">last</span> <span class="kc">baseline</span> <span class="o">|</span> <span class="kc">start</span> <span class="o">|</span> <span class="kc">end</span> <span class="o">|</span> <span class="n">self-start</span> <span class="o">|</span> <span class="n">self-end</span> <span class="o">+</span> <span class="o">...</span> <span class="n">safe</span> <span class="o">|</span> <span class="n">unsafe</span><span class="p">;</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span></code></pre></td></tr></table> </div> </div><p><code>align-items</code> 用法和 <code>justify-content</code> 类似,这里介绍一些不一样的值。</p> <ul> <li><code>stretch</code>(默认值):使 flex 项填满容器。</li> <li><code>baseline</code>:根据基线对齐,用于字体大小不同的 flex 项,<a href="https://stackoverflow.com/questions/34606879/whats-the-difference-between-flex-start-and-baseline/34611670#34611670">图示</a>。</li> </ul> <h3 class="heading" id="align-content-交叉轴对齐仅用于多行-flex-项"> align-content 交叉轴对齐(仅用于多行 flex 项)<span class="heading__anchor"> <a href="#align-content-%e4%ba%a4%e5%8f%89%e8%bd%b4%e5%af%b9%e9%bd%90%e4%bb%85%e7%94%a8%e4%ba%8e%e5%a4%9a%e8%a1%8c-flex-%e9%a1%b9">#</a></span> </h3><p><code>align-content</code> 设置多行 flex 项的交叉轴对齐方式,flex 项只有一行时(<code>flex-wrap: nowrap;</code>)无效,<a href="https://stackoverflow.com/questions/27539262/whats-the-difference-between-align-content-and-align-items/34944673#34944673">图示</a>。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="p">.</span><span class="nc">container</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">align-content</span><span class="p">:</span> <span class="kc">flex-start</span> <span class="o">|</span> <span class="kc">flex-end</span> <span class="o">|</span> <span class="kc">center</span> <span class="o">|</span> <span class="kc">space-between</span> <span class="o">|</span> <span class="kc">space-around</span> <span class="o">|</span> <span class="kc">space</span><span class="o">-</span><span class="n">evenly</span> <span class="o">|</span> <span class="kc">stretch</span> <span class="o">|</span> <span class="kc">start</span> <span class="o">|</span> <span class="kc">end</span> <span class="o">|</span> <span class="kc">baseline</span> <span class="o">|</span> <span class="kc">first</span> <span class="kc">baseline</span> <span class="o">|</span> <span class="kc">last</span> <span class="kc">baseline</span> <span class="o">+</span> <span class="o">...</span> <span class="n">safe</span> <span class="o">|</span> <span class="n">unsafe</span><span class="p">;</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span></code></pre></td></tr></table> </div> </div><p><code>align-content</code> 用法和 <code>align-items</code> 类似。</p> <h3 class="heading" id="row-gapcolumn-gapgap-间隔"> row-gap、column-gap、gap 间隔<span class="heading__anchor"> <a href="#row-gapcolumn-gapgap-%e9%97%b4%e9%9a%94">#</a></span> </h3><p>如果在 flex 项上画横线和竖线,<code>row-gap</code> 表示横线的间隔大小,<code>column-gap</code> 表示竖线的间隔大小,<code>gap</code> 是前面两者的缩写,<a href="https://jsbin.com/maliponaje/7/edit?html,css,output">在线示例</a>。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span><span class="lnt">4 </span><span class="lnt">5 </span><span class="lnt">6 </span><span class="lnt">7 </span><span class="lnt">8 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="p">.</span><span class="nc">container</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">display</span><span class="p">:</span> <span class="kc">flex</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="k">flex-wrap</span><span class="p">:</span> <span class="kc">wrap</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="k">row-gap</span><span class="p">:</span> <span class="mi">20</span><span class="kt">px</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="k">column-gap</span><span class="p">:</span> <span class="mi">5</span><span class="kt">px</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> <span class="k">gap</span><span class="p">:</span> <span class="mi">20</span><span class="kt">px</span> <span class="mi">5</span><span class="kt">px</span><span class="p">;</span> <span class="c">/* row-gap, column-gap */</span> </span></span><span class="line"><span class="cl"> <span class="k">gap</span><span class="p">:</span> <span class="mi">20</span><span class="kt">px</span><span class="p">;</span> <span class="c">/* row-gap 和 column-gap 都是 20px */</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span></code></pre></td></tr></table> </div> </div><p><code>gap</code> 只是设置最小间隔,使用 <code>space-between</code> 可以加大间隔。</p> <h2 class="heading" id="flex-项的属性"> flex 项的属性<span class="heading__anchor"> <a href="#flex-%e9%a1%b9%e7%9a%84%e5%b1%9e%e6%80%a7">#</a></span> </h2><p>flex 项(flex item)的属性有 <code>order</code>、<code>flex-grow</code>、<code>flex-shrink</code>、<code>flex-basis</code>、<code>flex</code>、<code>align-self</code>。</p> <p>flexbox 没有 <code>justify-self</code>,参看 <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_box_alignment/Box_alignment_in_flexbox#there_is_no_justify-self_in_flexbox">Box alignment in flexbox - CSS: Cascading Style Sheets | MDN#there_is_no_justify-self_in_flexbox</a>。</p> <h3 class="heading" id="order-顺序"> order 顺序<span class="heading__anchor"> <a href="#order-%e9%a1%ba%e5%ba%8f">#</a></span> </h3><p>默认情况下,flex 项按照源代码出现的顺序排列。使用 <code>order</code> 属性可以改变顺序,默认值为 0,数字越大位置越后,可以使用负值(比如:-1)。如果多个 flex 项的 <code>order</code> 值一样,它们还是按原始顺序排列。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span><span class="lnt">4 </span><span class="lnt">5 </span><span class="lnt">6 </span><span class="lnt">7 </span><span class="lnt">8 </span><span class="lnt">9 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="p">#</span><span class="nn">item1</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">order</span><span class="p">:</span> <span class="mi">2</span><span class="p">;</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span><span class="line"><span class="cl"><span class="p">#</span><span class="nn">item2</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">order</span><span class="p">:</span> <span class="mi">1</span><span class="p">;</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span><span class="line"><span class="cl"><span class="p">#</span><span class="nn">item3</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="k">order</span><span class="p">:</span> <span class="mi">-1</span><span class="p">;</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span></code></pre></td></tr></table> </div> </div><p>图示:</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">item3 | item2 | item1 </span></span></code></pre></td></tr></table> </div> </div><h3 class="heading" id="flex-basis-大小"> flex-basis 大小<span class="heading__anchor"> <a href="#flex-basis-%e5%a4%a7%e5%b0%8f">#</a></span> </h3><p><code>flex-basis</code> 设置 flex 项的大小,默认为 <code>auto</code>。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="p">.</span><span class="nc">item</span> <span class="p">{</span> </span></span><span class="