博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
字体大小自适应纯css解决方案
阅读量:6078 次
发布时间:2019-06-20

本文共 2816 字,大约阅读时间需要 9 分钟。

viewpoint

css3提供了一些与当前viewpoint相关的元素,vw,vh,vim等。

“viewpoint” = window sizevw = 1% of viewport width1vh = 1% of viewport height1vmin = 1vw or 1vh, 最小1vmax = 1vw or 1vh, 最大

兼容性:chrome 20+/ safari 6+/ IE 10+ / FF 19+ / IOS 6+

DEMO地址:  (已经用JS修正重绘bug)

          
Demo
我是靖鸣君 我是靖鸣君 我是靖鸣君

但是该方案存在一个bug,上面的代码,当浏览器窗口变化的时候,box中的文字并没有按照应有的比例变化,但是css3标准中是这么说的:

When the height or width of the viewport is changed, they are scaled accordingly.

 

插曲

像这样的问题,我之前也遇到过,比如以下代码:(小插曲,可跳过)

          
CSS3 Demo

 

DEMO地址:  

box的宽度设置为900px,wrap设置为100%;缩小浏览器窗口,当宽度小于900时会出现滚动条,向右滚动,会发现蓝色部分并不是100%,这个问题大家可以去思考下。

 

bug处理

回到上面的问题,font-size:4vw,应该会使得字体的大小变化,可是他没有,和标准说的不一样,所以可以认为是一个bug。

window.onresize = function(){    var box = document.getElementById("box");    box.style["z-index"] = 1;}

 z-index可以对应的元素被重绘(repaint)。

 

 延伸一点点关于重绘(repaint)和回流(reflow)的知识:

1. 添加、删除元素(回流+重绘)    2. 隐藏元素,display:none(回流+重绘),visibility:hidden(只重绘,不回流)    3. 移动元素,比如改变top,left(jquery的animate方法就是,改变top,left不一定会影响回流),或者移动元素到另外1个父元素中。(重绘+回流)    4. 对style的操作(对不同的属性操作,影响不一样)    5. 还有一种是用户的操作,比如改变浏览器大小,改变浏览器的字体大小等(回流+重绘)    让我们看看下面的代码是如何影响回流和重绘的:  var s = document.body.style; s.padding = "2px"; // 回流+重绘s.border = "1px solid red"; // 再一次 回流+重绘s.color = "blue"; // 再一次重绘s.backgroundColor = "#ccc"; // 再一次 重绘s.fontSize = "14px"; // 再一次 回流+重绘// 添加node,再一次 回流+重绘
关于重绘和回流

 

 其他方案

1. css expression, 这个效率比较低,不推荐使用

#box {
star:expression(onresize = function(){ var res = parseInt(this.style.width) / 20; res = res < 9 : "9px" ? res + "px"; this.style.fontSize = res; }); } //P.S:上面代码没测试,不知道写错没有

与其说用的css,还不如说是JS,而且是效率不够的JS。

 

2. media query,这东西也不是特别好用

h2{
font-size:25px}@media screen and (max-width: 850px){
/* 可视区域小于 850px, 设置更小font-size属性 */ h2{ font-size:19px; }}

用media query会使得字体的变化出现不连贯性,而且要可能设置多个@media,相当麻烦。

 

3. media query + -webkit-transition 实现平滑转变

 DEMO地址:

div{
font-size: 40px; -webkit-transition:font-size 0.2s ease-out;}@media only screen and (max-width: 1200px) {
div{ font-size: 39px; }}@media only screen and (max-width: 1100px) {
div{ font-size: 38px; }}@media only screen and (max-width: 1000px) {
div{ font-size: 37px; }}@media only screen and (max-width: 900px) {
div{ font-size: 36px; }}@media only screen and (max-width: 800px) {
div{ font-size: 35px; }}@media only screen and (max-width: 700px) {
div{ font-size: 34px; }}@media only screen and (max-width: 600px) {
div{ font-size: 33px; }}@media only screen and (max-width: 500px) {
div{ font-size: 32px; }}@media only screen and (max-width: 400px) {
div{ font-size: 31px; }}@media only screen and (max-width: 300px) {
div{ font-size: 30px; }}

 

小结

这玩意儿其实也没太大作用,用JS处理相当简单,不知道大家还有没有其他比较好的方案,可以提出来交流下~

 

参考文档

  * 

 

转载地址:http://vthgx.baihongyu.com/

你可能感兴趣的文章
需要学的东西
查看>>
Internet Message Access Protocol --- IMAP协议
查看>>
Linux 获取文件夹下的所有文件
查看>>
对 Sea.js 进行配置(一) seajs.config
查看>>
第六周
查看>>
解释一下 P/NP/NP-Complete/NP-Hard 等问题
查看>>
javafx for android or ios ?
查看>>
微软职位内部推荐-Senior Software Engineer II-Sharepoint
查看>>
sql 字符串操作
查看>>
【转】Android布局优化之ViewStub
查看>>
网络安全管理技术作业-SNMP实验报告
查看>>
根据Uri获取文件的绝对路径
查看>>
Flutter 插件开发:以微信SDK为例
查看>>
.NET[C#]中NullReferenceException(未将对象引用到实例)是什么问题?如何修复处理?...
查看>>
边缘控制平面Ambassador全解读
查看>>
Windows Phone 7 利用计时器DispatcherTimer创建时钟
查看>>
程序员最喜爱的12个Android应用开发框架二(转)
查看>>
vim学习与理解
查看>>
DIRECTSHOW在VS2005中PVOID64问题和配置问题
查看>>
MapReduce的模式,算法以及用例
查看>>