【问题标题】:text-align is not working on safari <select>text-align 不适用于 safari <select>
【发布时间】:2012-06-26 07:24:19
【问题描述】:

我尝试在 safari 中将 &lt;select&gt; 元素中的文本向右或居中对齐。但没有任何效果。 text-align:center; 适用于除 safari 以外的所有浏览器。 direction:rtl;dir="rtl" 没有做任何事情。该列表始​​终在 Safari 中左对齐。 -webkit-appearance: none; 也无济于事。请问我需要一个解决方案。

【问题讨论】:

  • 您是否尝试将其设置在“选项”标签上而不是选择上?
  • 是的。它给出了相同的结果
  • 我一直在玩它并环顾四周,我找不到 css 解决方案...这是 jquery 几乎可以工作的东西jsfiddle.net/nEGV4

标签: html css mobile-safari center text-alignment


【解决方案1】:

对于 Safari

text-align: -webkit-center;

然而,分析 HTML/CSS 工作的最佳方法是 Safari 中的 Web-Inspector。

More >>

【讨论】:

  • 尝试检查开发者控制台以找出样式未绑定到输入的原因。
  • safari 中没有开发者控制台
  • 如果没有您的代码示例,很难找到问题。
  • 是的,请不要在没有自己测试的情况下给我建议 =)
  • 等等...这篇文章是 2012 年的吗?直到现在才看到。不错的死灵。
【解决方案2】:

如果您没有找到任何解决方案,您可以在 angularjs 上使用此技巧或使用 js 将所选值与 div 上的文本进行映射,此解决方案在 angular 上完全符合 css 标准,但需要在 select 和 div 之间进行映射:

var myApp = angular.module('myApp', []);

myApp.controller('selectCtrl', ['$scope',
  function($scope) {
    $scope.value = ''; 
}]);
.ghostSelect {
  opacity: 0.1;
  /* Should be 0 to avoid the select visibility but not visibility:hidden*/
  display: block;
  width: 200px;
  position: absolute;
}
.select {
  border: 1px solid black;
  height: 20px;
  width: 200px;
  text-align: center;
  border-radius: 5px;
  display: block;
}
<!doctype html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <title>Example - example-guide-concepts-1-production</title>
  <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
</head>
<body ng-app="myApp">
  <div ng-app ng-controller="selectCtrl">
    <div class=select>
      <select ng-model="value" class="ghostSelect">
        <option value="Option 1">Option 1</option>
        <option value="Option 2">Option 2</option>
        <option value="Option 3">Option 3</option>
      </select>
      <div>{{value}}
      </div>
    </div>
  </div>
</body>

希望这对某人有用,因为我花了一天时间在 phonegap 上找到这个解决方案。

【讨论】:

    【解决方案3】:

    是 safari 中的一个错误。

    错误 40216 - text-align 不适用于选择标签
    https://bugs.webkit.org/show_bug.cgi?id=40216

    2010 年提交?

    【讨论】:

      【解决方案4】:

      我遇到了一个非常相似的问题。我的问题是根据text-align 样式对齐&lt;select&gt; 元素内的文本。这是正确处理基于media 的样式所必需的。

      在 Chrome 中我使用 text-align-last 样式,但在 Safari 中不支持此样式(根据 MDN)。

      这就是为什么我想出了以下 JavaScript 函数(使用 text-indent),它执行 leftright 文本对齐(不是 center 作为它的 OP 问题,但在我的辩护中,我认为这段代码可以修改为正确计算text-indent 用于居中):

      function SELECT_applyTextAlign(element) {
        let styles = document.defaultView.getComputedStyle(element, "");
        if (    styles.textAlign == 'left' 
            || (styles.direction === 'ltr' && styles.textAlign === 'start')) {
          // Left alignment doesn't require any kind of calculations.
      
          element.style.textIndent = 0;
          return;
        }
        if (    styles.textAlign == 'right' 
            || (styles.direction === 'ltr' && styles.textAlign === 'end')) {
          // Right alignment requires a proper width calculations.
      
          let option = element.querySelector('option[value=\'' + element.value + '\']');
          if (!option) {
            return;
          }
      
          // Get original element width
          let width = element.getBoundingClientRect().width;
      
          // Create temporary <select> and <option> elements
          let sz_select = document.createElement('select');
          let sz_option = document.createElement('option');
      
          // This should ensure both <select> have the same styles and <option> have the same text
          sz_select.style.cssText = styles.cssText;
          sz_select.style.width = 'auto';
      
          sz_select.value = option.value;
      
          sz_option.value = option.value;
          sz_option.text = option.text;
      
          // Append <option>
          sz_select.appendChild(sz_option);
      
          // Append <select>
          element.parentNode.insertBefore(sz_select, element.nextSibling);
      
          // Copy calculated width
          let sz_width = sz_select.getBoundingClientRect().width;
      
          element.style.textIndent = (width - sz_width) + 'px'
      
          // Remove unnecessary element
          sz_select.remove();
        }
      }
      

      然后我附加了loadresize 事件处理程序,以确保在加载页面和更改窗口大小时处理所有&lt;select&gt; 元素:

      window.addEventListener('load', function() {
        let selects = document.getElementsByTagName('select');
        Array.prototype.filter.call(selects, function(element) {
          SELECT_applyTextAlign(element);
      
          element.addEventListener('change', function () {
            SELECT_applyTextAlign(element);
          }, false);
        });
      }, false);
      
      window.addEventListener('resize', function () {
        let selects = document.getElementsByTagName('select');
        Array.prototype.filter.call(selects, function(element) {
          SELECT_applyTextAlign(element);
        });
      }, false);
      

      希望这可以帮助某人(在 chrome、iOS 和 safari 中测试)

      【讨论】:

        【解决方案5】:

        正如我在上面的评论中所说,我知道这实际上不是一个 css 解决方案,但如果它对你很重要,如果你愿意使用 jquery,这可以作为一种解决方法....它不起作用chrome 正确,但如果您检查浏览器,您可以将其加载到 safari:

        http://jsfiddle.net/nEGV4/4/

        【讨论】:

          【解决方案6】:

          对我来说,text-align: -weblit-center 不适用于移动 Safari。我找到了这个解决方案text-indent: 5px hanging;(根据您的情况更改 5px)。此属性仅适用于 safari。

          【讨论】:

            【解决方案7】:

            Vanilla js 方法是使用普通输入来显示隐藏选择框的选定文本,然后您可以将输入设置为您希望看起来像选择框的样式。

            const inputs = document.getElementsByClassName('js-fake-input');
            const selects = document.getElementsByClassName('js-select');
            
            for (let i = 0; i < inputs.length; i++) {
              getSelected(i);
              selects[i].addEventListener("change", function() {
                getSelected(i);
              });
            }
            
            function getSelected(index){
              inputs[index].value = selects[index].options[selects[index].selectedIndex].text;
            }
            .select-holder{
              position: relative;
              width:200px;
              margin-bottom: 10px;
            }
            
            .select-holder select{
              position: absolute;
              top: 0;
              left: 0;
              width: 100%;
              height: 100%;
              opacity: 0 ;
            }
            
            .select-holder input{
              text-align: center;
              width:100%
            }
            <div class="select-holder">
              <select class="js-select">
                <option>
                  Option 1
                </option>
                <option>
                  Option 2
                </option>
              </select>
              <input type="text" class="js-fake-input">
            </div>
            <div class="select-holder">
              <select class="js-select">
                <option>
                  Option 1
                </option>
                <option selected>
                  Option 2
                </option>
              </select>
              <input type="text" class="js-fake-input">
            </div>
            <div class="select-holder">
              <select class="js-select">
                <option>
                  Option 1
                </option>
                <option>
                  Option 2
                </option>
              </select>
              <input type="text" class="js-fake-input">
            </div>

            【讨论】:

              【解决方案8】:

              这对我有用。

              select {
                  text-align:-moz-center;
                  text-align:-webkit-center;
              }
              

              【讨论】:

              • 它不适用于旧版本。您可能正在使用新版本,请在回答之前查看问题日期。
              • @SunnyKhatri 他清楚地说这对他有用,所以他确实测试了它。它可能在 2013 年起作用
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2016-07-15
              • 1970-01-01
              • 1970-01-01
              • 2014-08-23
              • 2021-09-10
              • 2021-04-03
              • 1970-01-01
              相关资源
              最近更新 更多