【问题标题】:Effective Way of Increasing/Decreasing Font Size of All Elements on Page增加/减少页面上所有元素字体大小的有效方法
【发布时间】:2016-01-07 13:16:51
【问题描述】:

为了改善用户体验,我计划在我网站的所有页面(A-、A、A+)上安装一个字体大小增加/减少/重置工具

我面临的问题是页面上不同元素使用的字体大小不统一。有些是14px,有些是18px,有些是12px,有些是15px。

因此,使用body 标签来操作字体大小不会得到想要的结果。

是否有一种解决方案可以遍历每个元素(获取其当前大小)并在单击 A+ 时将其字体大小增加 1 或在单击 A- 时将大小减小 1 并重置为原始大小如果A被点击了?

PS:我也对 jQuery 解决方案持开放态度。

【问题讨论】:

  • 如果我不介意将字体大小从绝对值更改为“相对”,我会在 javascript 或 jquery 中做一些事情
  • 这就是为什么发明了emrem 单位而不是pxrem 指的是根字体大小,然后使用body{ font-size : 120% }; 可以非常轻松地增加和减少整个文档的字体大小
  • 是的,我明白了。但在这个阶段做出改变并不是一个可行的选择。因此,我希望有一种不那么累人的方法

标签: javascript jquery css


【解决方案1】:

这就是为什么发明了emrem 单位而不是pxrem 指的是根字体大小,这使得使用body{ font-size : 120% }; 增加和减少整个文档的字体大小变得超级容易

但是,由于你不能使用rem,这里有一个使用 jQuery 的肮脏解决方案:

var $affectedElements = $("p"); // Can be extended, ex. $("div, p, span.someClass")

// Storing the original size in a data attribute so size can be reset
$affectedElements.each( function(){
  var $this = $(this);
  $this.data("orig-size", $this.css("font-size") );
});

$("#btn-increase").click(function(){
  changeFontSize(1);
})

$("#btn-decrease").click(function(){
  changeFontSize(-1);
})

$("#btn-orig").click(function(){
  $affectedElements.each( function(){
        var $this = $(this);
        $this.css( "font-size" , $this.data("orig-size") );
   });
})

function changeFontSize(direction){
    $affectedElements.each( function(){
        var $this = $(this);
        $this.css( "font-size" , parseInt($this.css("font-size"))+direction );
    });
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div>
  <p style="font-size : 30px">This text is initially 30px</p>
  <div>
    <p style="font-size : 20px">This text is initially 20px</p>
    <p style="font-size : 10px">This text is initially 10px</p>
    
  </div>  
</div>

<button id="btn-decrease">A-</button>
<button id="btn-orig">A</button>
<button id="btn-increase">A+</button>

【讨论】:

  • 将其应用于pdiv 是否是正确的设计假设?值得指出的是,如果完全复制此解决方案可能无法捕获页面上的所有文本(例如,如果特定的字体大小样式已应用于 alabel),并且在 Jquery 选择器上进行了一些实验可能需要确保捕获所有文本。
  • 因为在我的简单例子中,我只放了几个&lt;p&gt;。当然,实际使用时,选择器可以扩展为&lt;span&gt;&lt;strong&gt; 或其他。甚至$("*"),如果我们很懒惰,但我不喜欢它,因为它也会选择&lt;script&gt;&lt;head&gt; 和其他所有内容,并且会更慢。这段代码只是一个开始。
  • 很公平 - 我只知道答案经常被字面理解和误解! IMO 在最后添加一个警告并没有什么坏处,说明对于现实世界的应用程序,您需要列出所有包含文本的元素类型,并且上面只是一个示例,但它可能就这样没问题。你的答案,你的选择!
  • 刚刚这样做了 :) 我已经更新了我的代码,并考虑了您的评论。
  • 我一直在努力保留原始字体大小,但您的想法非常棒。想知道为什么我没有想到将其存储为 data 属性
【解决方案2】:

您最好和最干净的选择是将rem 与 jQuery 混合使用。

我的答案与上述答案/您所要求的答案之间的区别在于,不是将 all 的字体大小增加/减少 1,这只会更改根字体-大小,这将级联并相应地使所有其他字体缩放

$('#_biggify').on('click', function() {
  var fontSize = $('html').css('font-size');
  var newFontSize = parseInt(fontSize)+1;
  
  $('html').css('font-size', newFontSize+'px')
})

$('#_smallify').on('click', function() {
  var fontSize = $('html').css('font-size');
  var newFontSize = parseInt(fontSize)-1;
  
  $('html').css('font-size', newFontSize+'px')
})

$('#_reset').on('click', function() {
  $('html').css('font-size', '32px')
})
html {
  font-size: 32px;
}

.smaller {
  font-size: 0.5rem;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div>
Here is a regular piece of text in your document
</div>

<div class="smaller">
Here is text that should be smaller than the rest
</div>

<button id="_biggify">
Make Bigger
</button>

<button id="_smallify">
Make Smaller
</button>

<button id="_reset">
Make Default
</button>

这是一个 JSFiddle:https://jsfiddle.net/Hybridx24/L3yzuvjr/

【讨论】:

  • OP 希望能够以 1 递增/递减 1,而不仅仅是“变大”和“变小”。
  • 请在答案中包含主要内容......这基本上是一个仅限链接的答案。
  • @JeremyThille 感谢您的建议
猜你喜欢
  • 1970-01-01
  • 2013-03-29
  • 1970-01-01
  • 2019-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多