移动端动态设置字体大小的实例详解
rem由来:font size of the root element,那么rem是个单位,单位大小由它第一代老祖宗的font-size的大小决定。现在前端码农们为了能在各个屏幕上看到一个健康的网页在默默的牺牲着自己的健康,因为不仅要知道rem是个单位,更重要的是要知道怎么能在不同分辨率下呈现的页面都很NB。
事故造成原因:
1.px单位在PC上很流行,在手机屏幕上一看,MLGB的,同样的12px却小的跟蚂蚁似的。
2.好不容易在iPhone4上调的正常了,换个菊花牌手机,MBD不堪入目了。
3.知道了rem的用法,但是html的font-size到底是多少才合适啊啊啊,妈蛋~。
好了,那么现在来解决这些问题。
在解决之前,麻烦各位大婶要了解一些你可能不想了解的东东(警告:不了解这些就不能知道真相哟~):
1.物理像素(physical pixel)
我们看到的每个屏幕都是由一颗颗我们肉眼难以看到的小颗粒(物理像素)组成的。
2.逻辑像素
是计算机坐标系统中的一个点,这个点代表一个可以由程序使用的虚拟像素(比如说CSS像素)。
3.设备的像素比(device pixel ratio)简称DPR
它的数值体现了物理像素和逻辑像素之间的关系,用公式可以计算出该设备的DPR的大小:
DPR = 物理像素 / 逻辑像素
那么了解了上面这些概念,就可以知道,为什么css在pc上写着font-size=12px;
但是换到手机上却变小了?因为DPR啊啊啊,大哥~。
没错,我们在电脑屏幕上的DPR是1,但是手机却不同,可能是它可能是2,也可能是3。获取设备DPR的方法还是有的:
1.在JavaScript中,通过window.devicePixelRatio
来获取
2.在css中,可以通过-webkit-device-pixel-ratio
,-webkit-min-device-pixel-ratio
和 -webkit-max-device-pixel-ratio
进行媒体查询,对不同DPR的设备,做一些样式适配(这里只针对webkit内核的浏览器和webview)。
本人也在网上看了不少动态设置rem的文章,下面把几个常用的列举出来:
一,用媒体查询来设置html的font-size:
@media screen and (min-width: 320px) {html {font-size: 14px;} } @media screen and (min-width: 360px) {html {font-size: 16px;} } @media screen and (min-width: 400px) {html {font-size: 18px;} } @media screen and (min-width: 440px) {html {font-size: 20px;} } @media screen and (min-width: 480px) {html {font-size: 22px;} } @media screen and (min-width: 640px) {html {font-size: 28px;} }
二、利用js来动态设置
!(function(doc, win) {var docEle = doc.documentElement, evt = "onorientationchange" in window ? "orientationchange" : "resize", fn = function() {var width = docEle.clientWidth; width && (docEle.style.fontSize = 20 * (width / 320) + "px"); }; win.addEventListener(evt, fn, false); doc.addEventListener("DOMContentLoaded", fn, false); }(document, window));
我要说的是最后一种,也是我认为目前比较好的实现方法:
利用js计算当前设备的DPR,动态设置在html标签上,并动态设置html的font-size
,利用css的选择器根据DPR来设置不同DPR下的字体大小(这个方法很不错哦~)
<span style="font-size: 18px"><code>!<span class="hljs-function"><span class="hljs-keyword">function(<span class="hljs-params">win, lib) {<span class="hljs-keyword">var timer, doc = win.document, docElem = doc.documentElement, vpMeta = doc.querySelector(<span class="hljs-string">'meta[name="viewport"]'), flexMeta = doc.querySelector(<span class="hljs-string">'meta[name="flexible"]'), dpr = <span class="hljs-number">0, scale = <span class="hljs-number">0, flexible = lib.flexible || (lib.flexible = {}); <span class="hljs-comment">// 设置了 viewport meta<span class="hljs-keyword">if (vpMeta) { <span class="hljs-built_in">console.warn(<span class="hljs-string">"将根据已有的meta标签来设置缩放比例");<span class="hljs-keyword">var initial = vpMeta.getAttribute(<span class="hljs-string">"content").match(<span class="hljs-regexp">/initial\-scale=([\d\.]+)/); <span class="hljs-keyword">if (initial) { scale = <span class="hljs-built_in">parseFloat(initial[<span class="hljs-number">1]); <span class="hljs-comment">// 已设置的 initialScale dpr = <span class="hljs-built_in">parseInt(<span class="hljs-number">1 / scale); <span class="hljs-comment">// 设备像素比 devicePixelRatio } }<span class="hljs-comment">// 设置了 flexible Meta<span class="hljs-keyword">else <span class="hljs-keyword">if (flexMeta) {<span class="hljs-keyword">var flexMetaContent = flexMeta.getAttribute(<span class="hljs-string">"content");<span class="hljs-keyword">if (flexMetaContent) { <span class="hljs-keyword">var initial = flexMetaContent.match(<span class="hljs-regexp">/initial\-dpr=([\d\.]+)/), maximum = flexMetaContent.match(<span class="hljs-regexp">/maximum\-dpr=([\d\.]+)/); <span class="hljs-keyword">if (initial) { dpr = <span class="hljs-built_in">parseFloat(initial[<span class="hljs-number">1]); scale = <span class="hljs-built_in">parseFloat((<span class="hljs-number">1 / dpr).toFixed(<span class="hljs-number">2)); } <span class="hljs-keyword">if (maximum) { dpr = <span class="hljs-built_in">parseFloat(maximum[<span class="hljs-number">1]); scale = <span class="hljs-built_in">parseFloat((<span class="hljs-number">1 / dpr).toFixed(<span class="hljs-number">2)); } } } <span class="hljs-comment">// viewport 或 flexible<span class="hljs-comment">// meta 均未设置<span class="hljs-keyword">if (!dpr && !scale) {<span class="hljs-comment">// QST<span class="hljs-comment">// 这里的 第一句有什么用 ?<span class="hljs-comment">// 和 Android 有毛关系 ?<span class="hljs-keyword">var u = (win.navigator.appVersion.match(<span class="hljs-regexp">/android/gi), win.navigator.appVersion.match(<span class="hljs-regexp">/iphone/gi)), _dpr = win.devicePixelRatio; <span class="hljs-comment">// 所以这里似乎是将所有 Android 设备都设置为 1 了 dpr = u ? ( (_dpr >= <span class="hljs-number">3 && (!dpr || dpr >= <span class="hljs-number">3)) ? <span class="hljs-number">3 : (_dpr >= <span class="hljs-number">2 && (!dpr || dpr >= <span class="hljs-number">2)) ? <span class="hljs-number">2 : <span class="hljs-number">1 ) : <span class="hljs-number">1; scale = <span class="hljs-number">1 / dpr; } docElem.setAttribute(<span class="hljs-string">"data-dpr", dpr); <span class="hljs-comment">// 插入 viewport meta<span class="hljs-keyword">if (!vpMeta) { vpMeta = doc.createElement(<span class="hljs-string">"meta"); vpMeta.setAttribute(<span class="hljs-string">"name", <span class="hljs-string">"viewport"); vpMeta.setAttribute(<span class="hljs-string">"content",<span class="hljs-string">"initial-scale=" + scale + <span class="hljs-string">", maximum-scale=" + scale + <span class="hljs-string">", minimum-scale=" + scale + <span class="hljs-string">", user-scalable=no"); <span class="hljs-keyword">if (docElem.firstElementChild) { docElem.firstElementChild.appendChild(vpMeta) } <span class="hljs-keyword">else {<span class="hljs-keyword">var div = doc.createElement(<span class="hljs-string">"div"); div.appendChild(vpMeta); doc.write(div.innerHTML); } } <span class="hljs-function"><span class="hljs-keyword">function <span class="hljs-title">setFontSize(<span class="hljs-params">) {<span class="hljs-keyword">var winWidth = docElem.getBoundingClientRect().width; <span class="hljs-keyword">if (winWidth / dpr > <span class="hljs-number">540) { (winWidth = <span class="hljs-number">540 * dpr); } <span class="hljs-comment">// 根节点 fontSize 根据宽度决定<span class="hljs-keyword">var baseSize = winWidth / <span class="hljs-number">10; docElem.style.fontSize = baseSize + <span class="hljs-string">"px"; flexible.rem = win.rem = baseSize; } <span class="hljs-comment">// 调整窗口时重置 win.addEventListener(<span class="hljs-string">"resize", <span class="hljs-function"><span class="hljs-keyword">function(<span class="hljs-params">) { clearTimeout(timer); timer = setTimeout(setFontSize, <span class="hljs-number">300); }, <span class="hljs-literal">false); <span class="hljs-comment">// 这一段是我自己加的<span class="hljs-comment">// orientationchange 时也需要重算下吧 win.addEventListener(<span class="hljs-string">"orientationchange", <span class="hljs-function"><span class="hljs-keyword">function(<span class="hljs-params">) { clearTimeout(timer); timer = setTimeout(setFontSize, <span class="hljs-number">300); }, <span class="hljs-literal">false); <span class="hljs-comment">// pageshow<span class="hljs-comment">// keyword: 倒退 缓存相关 win.addEventListener(<span class="hljs-string">"pageshow", <span class="hljs-function"><span class="hljs-keyword">function(<span class="hljs-params">e) {<span class="hljs-keyword">if (e.persisted) { clearTimeout(timer); timer = setTimeout(setFontSize, <span class="hljs-number">300); } }, <span class="hljs-literal">false); <span class="hljs-comment">// 设置基准字体<span class="hljs-keyword">if (<span class="hljs-string">"complete" === doc.readyState) { doc.body.style.fontSize = <span class="hljs-number">12 * dpr + <span class="hljs-string">"px"; } <span class="hljs-keyword">else { doc.addEventListener(<span class="hljs-string">"DOMContentLoaded", <span class="hljs-function"><span class="hljs-keyword">function(<span class="hljs-params">) { doc.body.style.fontSize = <span class="hljs-number">12 * dpr + <span class="hljs-string">"px"; }, <span class="hljs-literal">false); } setFontSize(); flexible.dpr = win.dpr = dpr; flexible.refreshRem = setFontSize; flexible.rem2px = <span class="hljs-function"><span class="hljs-keyword">function(<span class="hljs-params">d) {<span class="hljs-keyword">var c = <span class="hljs-built_in">parseFloat(d) * <span class="hljs-keyword">this.rem;<span class="hljs-keyword">if (<span class="hljs-string">"string" == <span class="hljs-keyword">typeof d && d.match(<span class="hljs-regexp">/rem$/)) { c += <span class="hljs-string">"px"; }<span class="hljs-keyword">return c; }; flexible.px2rem = <span class="hljs-function"><span class="hljs-keyword">function(<span class="hljs-params">d) {<span class="hljs-keyword">var c = <span class="hljs-built_in">parseFloat(d) / <span class="hljs-keyword">this.rem; <span class="hljs-keyword">if (<span class="hljs-string">"string" == <span class="hljs-keyword">typeof d && d.match(<span class="hljs-regexp">/px$/)) { c += <span class="hljs-string">"rem"; }<span class="hljs-keyword">return c; } }(<span class="hljs-built_in">window, <span class="hljs-built_in">window.lib || (<span class="hljs-built_in">window.lib = {}));<br/><br/></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code>手机淘宝很多页面用的就是这种方法来适配终端的。<br/><br/><br/><br/></span>
Atas ialah kandungan terperinci 移动端动态设置字体大小的实例详解. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Menerbitkan karya di Douyin boleh menarik lebih banyak perhatian dan suka, tetapi kadangkala sukar bagi kami untuk menerbitkan karya dalam masa nyata Dalam kes ini, kami boleh menggunakan fungsi keluaran berjadual Douyin. Fungsi penerbitan berjadual Douyin membolehkan pengguna menerbitkan karya secara automatik pada masa yang dijadualkan, yang boleh merancang pelan keluaran dengan lebih baik dan meningkatkan pendedahan serta pengaruh karya tersebut. 1. Bagaimana untuk menetapkan masa yang dijadualkan untuk penerbitan karya di Douyin? Untuk menetapkan masa keluaran yang dijadualkan, mula-mula pergi ke halaman utama peribadi Douyin, cari butang "+" di penjuru kanan sebelah atas dan klik untuk memasuki halaman keluaran. Terdapat ikon jam di penjuru kanan sebelah bawah halaman penerbitan Klik untuk memasuki antara muka penerbitan yang dijadualkan. Dalam antara muka, anda boleh memilih jenis kerja yang ingin anda terbitkan, termasuk video pendek, video panjang dan siaran langsung. Seterusnya, anda perlu menetapkan masa untuk karya anda diterbitkan. TikTok menyediakan

Persediaan VSCode dalam Bahasa Cina: Panduan Lengkap Dalam pembangunan perisian, Visual Studio Code (VSCode ringkasnya) ialah persekitaran pembangunan bersepadu yang biasa digunakan. Bagi pembangun yang menggunakan bahasa Cina, menetapkan VSCode kepada antara muka Cina boleh meningkatkan kecekapan kerja. Artikel ini akan memberi anda panduan lengkap, memperincikan cara menetapkan VSCode kepada antara muka Cina dan menyediakan contoh kod khusus. Langkah 1: Muat turun dan pasang pek bahasa Selepas membuka VSCode, klik di sebelah kiri

Sebagai salah satu platform video pendek paling popular di dunia, Douyin membenarkan semua orang menjadi pencipta dan berkongsi setiap detik kehidupan. Bagi pengguna Douyin, tag adalah fungsi yang sangat penting Ia boleh membantu pengguna mengklasifikasikan dan mendapatkan semula kandungan dengan lebih baik, dan juga membolehkan platform untuk menolak kandungan yang sesuai kepada pengguna dengan lebih tepat. Jadi, di manakah tag Douyin ditetapkan? Artikel ini akan menerangkan secara terperinci cara menyediakan dan menggunakan teg pada Douyin. 1. Di manakah set tag Douyin? Menggunakan teg pada Douyin boleh membantu pengguna mengklasifikasikan dan melabelkan karya mereka dengan lebih baik, menjadikannya lebih mudah untuk pengguna lain mencari dan mengikutinya. Kaedah untuk menetapkan label adalah seperti berikut: 1. Buka APP Douyin dan log masuk ke akaun anda. 2. Klik tanda "+" di bahagian bawah skrin dan pilih butang "Terbitkan". 3.

1. Buka klien Weibo, klik tiga titik kecil pada halaman penyuntingan, dan kemudian klik Siaran Berjadual. 2. Selepas mengklik pada penerbitan berjadual, akan ada pilihan masa di sebelah kanan masa penerbitan Tetapkan masa, edit artikel dan klik perkataan kuning di sudut kanan bawah untuk menerbitkan secara kerap. 3. Versi mudah alih Weibo pada masa ini tidak menyokong penerbitan berjadual Fungsi ini hanya boleh digunakan pada klien PC!

Malah menjawab panggilan dalam mod Jangan Ganggu boleh menjadi pengalaman yang sangat menjengkelkan. Seperti namanya, mod Jangan Ganggu mematikan semua pemberitahuan panggilan masuk dan makluman daripada e-mel, mesej, dsb. Anda boleh mengikuti set penyelesaian ini untuk membetulkannya. Betulkan 1 – Dayakan Mod Fokus Dayakan mod fokus pada telefon anda. Langkah 1 – Leret ke bawah dari atas untuk mengakses Pusat Kawalan. Langkah 2 – Seterusnya, dayakan “Mod Fokus” pada telefon anda. Mod Fokus mendayakan mod Jangan Ganggu pada telefon anda. Ia tidak akan menyebabkan sebarang makluman panggilan masuk muncul pada telefon anda. Betulkan 2 – Tukar Tetapan Mod Fokus Jika terdapat beberapa isu dalam tetapan mod fokus, anda harus membetulkannya. Langkah 1 – Buka tetingkap tetapan iPhone anda. Langkah 2 – Seterusnya, hidupkan tetapan mod Fokus

Di manakah cadangan dan pilihan pada Douyin? Dalam video pendek Douyin, terdapat dua kategori: pemilihan dan pengesyoran Kebanyakan pengguna tidak tahu cara menyediakan cadangan dan pilihan Seterusnya ialah video pendek Douyin yang dibawa oleh editor kepada pengguna. Cadangan audio dan tutorial kaedah tetapan terpilih, pengguna yang berminat datang dan lihat! Tutorial penggunaan Douyin Tempat untuk menyediakan cadangan dan pilihan Douyin 1. Mula-mula buka APP video pendek Douyin dan masukkan halaman utama, klik pada kawasan [Saya] di sudut kanan bawah dan pilih [tiga garisan mendatar] di sudut kanan atas ; 2. Kemudian di sebelah kanan Bar fungsi akan berkembang, luncurkan halaman untuk memilih [Tetapan] di bahagian bawah 3. Kemudian pada halaman fungsi tetapan, cari perkhidmatan [Pengurusan Maklumat Peribadi] 4. Akhirnya lompat ke peribadi halaman pengurusan maklumat, slaid [Syor Kandungan Diperibadikan] 】Butang di bahagian belakang boleh ditetapkan.

Apabila membeli tiket di Damai.com, untuk memastikan masa pembelian tiket dapat difahami dengan tepat, pengguna boleh menetapkan jam terapung untuk merebut tiket Kaedah tetapan terperinci di bawah, mari kita belajar bersama. Cara mengikat jam terapung ke Damai 1. Klik untuk membuka aplikasi jam terapung pada telefon anda untuk memasuki antara muka, dan klik pada lokasi di mana cek jualan kilat ditetapkan, seperti yang ditunjukkan dalam rajah di bawah: 2. Selepas datang ke halaman menambah rekod baru, klik pada Damai.com Salin halaman pautan pembelian tiket yang disalin. 3. Seterusnya, tetapkan masa jualan kilat dan masa pemberitahuan di bawah, hidupkan butang suis di belakang [Simpan ke Kalendar] dan klik [Simpan] di bawah. 4. Klik untuk menghidupkan [Countdown], seperti yang ditunjukkan dalam rajah di bawah: 5. Apabila masa peringatan tiba, klik butang [Start Picture-in-Picture] di bawah. 6. Apabila tiba masa pembelian tiket

1. Mula-mula masukkan Weibo, kemudian klik pada saya di sudut kanan bawah dan pilih [Khidmat Pelanggan]. 2. Kemudian masukkan [Watermark] dalam kotak carian dan pilih [Set Weibo Image Watermark]. 3. Kemudian klik [Pautan] dalam antara muka. 4. Kemudian klik [Tetapan Tera Air Imej] dalam tetingkap yang baru dibuka. 5. Akhir sekali, semak [Pusat Gambar] dan klik [Simpan].
