首页 > 解决方案 > 有选择地添加和删除相同 CSS 属性的值

问题描述

我正在使用 jquery 创建一个开放类型功能测试器,并希望让用户有可能同时看到几个应用的开放类型功能。

第一个下拉菜单将属性设置为font-feature-settings: ‘frac’ 1;,第二个下拉菜单将属性设置为font-feature-settings: ‘smcp’ 1;

目前,如果两个下拉菜单都处于活动状态,则一个会覆盖另一个的指令。我需要的是,如果它们同时处于活动状态,则属性设置为font-feature-settings: ‘frac’ 1, ‘smcp’ 1;,因此如果只有其中一个被停用,则仅从属性中删除相应的值。

注意:我知道当我从 Google 字体网站链接字体时,Open Type 功能不起作用,所以我一直在安装它进行测试。

提前致谢。

.font-tester{
      color: #000;
      line-height: normal;
      width: 100%;
      word-wrap: break-word;
      padding-top: 30px;
  }
<style> @import url('https://fonts.googleapis.com/css2?family=EB+Garamond&display=swap'); </style>

<div class="tester-container">
    
  <select id="tester-figures">
          <option value="none" selected>Default</option>
          <option value="'frac' 1">Fractions</option>
  </select>

  <select id="tester-smcp">
    <option value="none" selected>Default</option>
    <option value="'smcp' 1">Small caps</option>
  </select>
    
    <div class="font-tester" contenteditable="true" spellcheck="false" style="font-family: 'EB Garamond', serif; font-size:65pt;">
abc 123
    </div>
  
</div>
  
  <script>      
    $("#tester-figures").change(function() {
        $('.font-tester').css("font-feature-settings", $(this).val());
    });
    
    $("#tester-smcp").change(function() {
        $('.font-tester').css("font-feature-settings", $(this).val());
    });
    
  </script>

标签: javascripthtmljquerycss

解决方案


有很多方法可以解决一个任务。这里还有一个替代解决方案,它的代码越来越简单。

它仅适用于将更改事件添加到两个选择的一个功能。在更改时,它会从两个选择中读出实际值,并根据两个选择的实际值构建一个简单的 css 字符串。

$('#tester-figures').add('#tester-smcp').each( function(){
    const $this = $(this);
    $this.change(function(){

        let actualVals = {};
        actualVals.TesterFigures = $('#tester-figures').val();
        actualVals.TesterSmcp = $('#tester-smcp').val();                    
        
        let myVal = '';

        if('none' == actualVals.TesterFigures){
            myVal = 'none' == actualVals.TesterSmcp  ?  '' : actualVals.TesterSmcp;
        }else {
            myVal = 'none' == actualVals.TesterSmcp  ?  actualVals.TesterFigures : actualVals.TesterFigures + ', ' + actualVals.TesterSmcp;
        }

        $('.font-tester').css("font-feature-settings", myVal);

    });

});

注意:我还没有使用 css 属性font-feature-settings。所以我对这个特殊项目没有任何经验。我注意到的是,选择(即'frac' 1)中的字符串发生了变化。将 css 添加到 html 元素时,内部引号和数字会丢失。但是没有它们,这种风格仍然有效。如果你只在你的选择中使用frac和,也许你想检查它是否有效。smcp在实际的FF中它有效;-)


推荐阅读