Có thể để trung tâm văn bản trong hộp chọn?


198

Tôi đã thử điều này: http://jsfiddle.net/ilyaD/KGcC3/

HTML:

<select name="state" class="ddList">
    <option value="">(please select a state)</option>
    <option class="lt" value="--">none</option>
    <option class="lt" value="AL">Alabama</option>
    <option class="lt" value="AK">Alaska</option>
    <option class="lt" value="AZ">Arizona</option>
    <option class="lt" value="AR">Arkansas</option>
    <option class="lt" value="CA">California</option>
    <option class="lt" value="CO">Colorado</option>
</select>

CSS:

select { width: 400px; text-align: center; }
select .lt { text-align: center; }

Như bạn thấy, nó không hoạt động. Có cách nào chỉ CSS để căn giữa văn bản trong hộp chọn không?


5
Trong Firefox của tôi, nó hoạt động chính xác :)
Mateusz Rogulski

10
Không hoạt động trên chrome.
Emmanuel

4
@Blazemonger Tôi có thể tưởng tượng nhiều tình huống trong đó có một thiết kế trông đối xứng quan trọng hơn các tùy chọn căn trái để giảm bớt việc quét từ điển của con người. Ví dụ: nếu tôi muốn có tùy chọn chọn giới tính lấp đầy màn hình theo chiều ngang 100% trên thiết bị di động, có vẻ rất kỳ lạ khi các văn bản 'Nam' và 'Nữ' bị đẩy sang trái.
Kent Munthe Caspersen

thử văn bản-align-last: centre;
Ari

Câu trả lời:


29

Tôi e rằng điều này là không thể với CSS đơn giản và sẽ không thể làm cho trình duyệt hoàn toàn tương thích.

Tuy nhiên, bằng cách sử dụng plugin jQuery, bạn có thể tạo kiểu thả xuống:

https://www.filamentgroup.com/lab/jquery-ui-selectmenu-an-aria-accessible-plugin-for-stomme-a-html-select.html

Plugin này ẩn selectphần tử và tạo spancác phần tử, v.v ... để hiển thị kiểu danh sách thả xuống tùy chỉnh. Tôi khá tự tin rằng bạn có thể thay đổi kiểu dáng trên các nhịp vv để căn giữa các mục.


web.archive.org/web/20160328192510/http://filamentgroup.com/lab/ nam Đây là phiên bản cải tiến hiện tại mà filamentgroup không còn được duy trì. github.com/fnagel/jquery-ui
cdignam

386

Có một giải pháp cho Chrome :

select { width: 400px; text-align-last:center; }

Nó tập trung vào tùy chọn đã chọn, nhưng không phải là các tùy chọn bên trong danh sách thả xuống.


18
Không được hỗ trợ trên Safari
Buts

1
Không được hỗ trợ trên Edge.
mortenpi

13
Không hoạt động trong Firefox, nhưng những gì hoạt động trong Firefox là text-align: center.
Noitidart

3
widthkhông cần thiết.
Vahid Amiri

3
Chết tiệt, cái này thật hoàn hảo, cũng hoạt động trên Firefox mới nhất ... + rep
w411 3

81

Đó là cho đúng. Thử nó:

select{
    text-align-last:right;
    padding-right: 29px;
    direction: rtl;
}

hỗ trợ trình duyệt cho text-align-lastthuộc tính có thể được tìm thấy ở đây: https://www.w3schools.com/cssref/css3_prigin-align-last.asp Có vẻ như chỉ Safari vẫn không hỗ trợ nó.


7
Đây phải là câu trả lời hàng đầu, một giải pháp CSS đơn giản và thuần túy hoạt động hoàn hảo với tôi (mặc dù tôi đã thay đổi text-align-last: right;thành centernhư tôi muốn các nhãn ở giữa).
JVG

Câu trả lời này đá! Không nơi nào khác tôi tìm thấy một giải pháp đơn giản như vậy.
udog

Cảm ơn rất nhiều, câu trả lời này nên được lựa chọn vì điều này hoàn toàn hoạt động!
Nick

1
text-align-last: centre; một mình làm việc cho tôi trong chrome và firefox. không có lợi thế và tôi cũng sẽ đặt cược vào safari.
Dennis Heiden

1
Điều này không hoạt động trong bất kỳ trình duyệt di động. Đó là nơi chủ yếu tôi muốn nó làm việc.
triển vào

58

Bạn phải đặt quy tắc CSS vào lớp chọn.

Sử dụng văn bản CSS thụt lề

Thí dụ

<select class="day"> /* option 1 option 2 option 3 option 4 option 5 here */ </select>

Mã CSS

select { text-indent: 5px; }

2
Hoặc là tôi đã không nhận được nó, hoặc đơn giản là nó không hoạt động để căn chỉnh văn bản
matanster

văn bản thụt lề ... Thú vị, tôi không biết về tài sản đó. Cảm ơn rất nhiều!
Froxx

9
Điều này sẽ chỉ hoạt động cho một tùy chọn cụ thể, thụt lề văn bản phụ thuộc vào không gian ngang chiếm bao nhiêu văn bản của tùy chọn liên quan đến chiều rộng của hộp chọn, vì vậy đây là một câu trả lời không đầy đủ, tôi ngạc nhiên khi nó có 43 câu trả lời, câu trả lời thích hợp sử dụng văn bản thụt lề được cung cấp bởi ông Smee ở trên.
Lu Roman

Một ý tưởng thú vị, nhưng nó sẽ không hoạt động với tỷ lệ phần trăm vì vậy làm thế nào bạn có thể tập trung vào từng mục?
Buts

Đây là câu trả lời chính xác. Sử dụng văn bản thụt lề: 50% sẽ căn giữa tùy chọn cho bạn bên trong phần chọn.
John Smith

49

Vâng, nó là có thể. Bạn có thể sử dụng văn bản căn chỉnh cuối cùng

text-align-last: center;

1
Điều này dường như tập trung vào giá trị được hiển thị trong phần chọn khi đóng. Các tùy chọn trong danh sách thả xuống vẫn được căn chỉnh sang trái (ít nhất là trong Chrome kể từ tháng 9 năm 2019)
bjg222

1
Có, tôi muốn hiển thị ở trung tâm và nó chính xác
Pritesh

24

2020, tôi đang sử dụng:

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

Thật không may, điều này không hoạt động trong safari ... và kể từ tháng 5 năm 2020, Apple vẫn buộc tất cả các trình duyệt khác trên iOS sử dụng công cụ kết xuất của Safari ...
Doomd

22

chỉ sử dụng cái này:

select {

text-align-last: center;
padding-right: 29px;

}

3
Bạn không cần bao gồm "padding-right: 29px;" nếu bạn đang sử dụng "trung tâm". Tôi nghi ngờ bạn có vì bạn đã sao chép câu trả lời của Aly-Elgarhy từ ngày 25/10/2016.
Jayden Lawson

Khi bạn sao chép từ câu trả lời của ai đó, bạn nên đề cập đến tên của họ.
Munim Munna

Không, tôi đã sao chép trực tiếp từ Mã của mình, đó là lý do tại sao tôi đặt quyền đệm, có thể tôi đã sao chép giải pháp từ mã khác vào mã của mình và sau đó tôi sao chép giải pháp từ mã của mình vào stackoverflow.
Amine_Dev

21

select {
  text-align: center;
  text-align-last: center;
}
option {
  text-align: left;
}
<select>
   <option value="">(please select a state)</option>
   <option class="lt" value="--">none</option>
   <option class="lt" value="AL">Alabama</option>
   <option class="lt" value="AK">Alaska</option>
   <option class="lt" value="AZ">Arizona</option>
   <option class="lt" value="AR">Arkansas</option>
   <option class="lt" value="CA">California</option>
   <option class="lt" value="CO">Colorado</option>
</select>


1
Đây là giải pháp duy nhất giúp tôi +1

Tháng 5 năm 2020 - Điều này không hoạt động trên Safari (hoặc bất kỳ trình duyệt nào trên tất cả các thiết bị iOS)
Doomd

16

Hàm JS này sẽ phù hợp với bạn

function getTextWidth(txt) {
  var $elm = $('<span class="tempforSize">'+txt+'</span>').prependTo("body");
  var elmWidth = $elm.width();
  $elm.remove();
  return elmWidth;
}
function centerSelect($elm) {
    var optionWidth = getTextWidth($elm.children(":selected").html())
    var emptySpace =   $elm.width()- optionWidth;
    $elm.css("text-indent", (emptySpace/2) - 10);// -10 for some browers to remove the right toggle control width
}
// on start 
$('.centerSelect').each(function(){
  centerSelect($(this));
});
// on change
$('.centerSelect').on('change', function(){
  centerSelect($(this));
});

Codepen đầy đủ ở đây: http://codepen.io/anon/pen/NxyovL


9

Tôi đã luôn luôn nhận được các bản hack sau để làm cho nó hoạt động với css mà thôi.

padding-left: 45%;
font-size: 50px;

phần đệm sẽ căn giữa văn bản và có thể được điều chỉnh cho kích thước văn bản :)

Điều này rõ ràng là không chính xác 100% theo quan điểm xác nhận tôi đoán nhưng nó thực hiện công việc :)


7

Giải pháp "giả mạo" thay thế nếu bạn có một danh sách với các tùy chọn tương tự về độ dài văn bản (ví dụ chọn trang):

padding-left: calc(50% - 1em);

Điều này hoạt động trong Chrome, Firefox và Edge. Thủ thuật ở đây là đẩy văn bản từ bên trái sang trung tâm, sau đó trừ một nửa chiều dài bằng px, em hoặc bất kỳ văn bản tùy chọn nào.

nhập mô tả hình ảnh ở đây

Giải pháp tốt nhất IMO (năm 2017) vẫn đang thay thế lựa chọn thông qua JS và xây dựng hộp chọn giả của riêng bạn bằng div hoặc bất cứ điều gì và liên kết các sự kiện nhấp chuột trên đó để hỗ trợ nhiều trình duyệt.


1
Hoạt động trong Chrome, nhưng trong IE có vẻ hơi lệch sang phải so với ở trung tâm.
user3366706

5

Không hoàn toàn Định tâm nhưng sử dụng ví dụ ở trên, bạn có thể tạo lề trái trong hộp chọn.

<style>.UName { text-indent: 5px; }</style><br>

<select  name="UserName" id="UserName" size="1">
    <option class="UName" selected value="select">Select User</option>
    <option class="UName" value="User1">User 1 Name</option>
    <option class="UName" value="User2">User 2 Name </option>
    <option class="UName" value="User3">User 3 Name</option>
</select>

Tại sao không chỉ thêm text-indentvào <select>thẻ như @marc carreras đã nói?
Munim Munna


3

thử cái này :

select {
    padding-left: 50% !important;
    width: 100%;
}

2

Bạn không thể thực sự tùy chỉnh <select>hoặc <option>nhiều. Cách duy nhất (trình duyệt chéo) sẽ là tự tạo một trình đơn thả xuống với div và css / js để tạo một cái gì đó tương tự.


2

Nếu bạn không tìm thấy bất kỳ giải pháp nào, bạn có thể sử dụng thủ thuật này trên angularjs hoặc sử dụng js để ánh xạ giá trị đã chọn với một văn bản trên div, giải pháp này hoàn toàn tuân thủ css trên góc nhưng cần ánh xạ giữa select và 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>

Hy vọng điều này có thể hữu ích cho ai đó vì tôi phải mất một ngày để tìm giải pháp này trên phonegap.


nó không ở giữa!
Qui-Gon Jinn

1

Mặc dù bạn không thể căn giữa văn bản tùy chọn trong một lựa chọn, bạn có thể đặt một div được định vị tuyệt đối trên đầu của lựa chọn cho cùng một hiệu ứng:

#centered
{
  position: absolute;
  top: 10px;
  left: 10px;
  width: 818px;
  height: 37px;
  text-align: center;
  font: bold 24pt calibri;
  background-color: white;
  z-index: 100;
}

#selectToCenter
{
  position: absolute;
  top: 10px;
  left: 10px;
  width: 840px;
  height: 40px;
  font: bold 24pt calibri;
}

$('#selectToCenter').on('change', function () {
    $('#centered').text($(this).find('option:selected').text());
});

<select id="selectToCenter"></select>
<div id="centered"></div>

Đảm bảo cả div và select đều có vị trí cố định trong tài liệu.


0

Chưa có 100%, nhưng bạn có thể sử dụng đoạn trích này!

text-align-last: centre; // Đối với Chrome text-align: centre; // Dành cho Firefox

Hiện tại không hoạt động trên Safari hoặc Edge!


-3

nếu các tùy chọn là tĩnh, bạn có thể lắng nghe sự kiện thay đổi trên hộp chọn của mình và thêm phần đệm cho từng mục riêng lẻ

$('#id').change(function() {
    var select = $('#id');
    var val = $(this).val();

    switch(val) {
        case 'ValOne':
            select.css('padding-left', '30px');
            break;
        case 'ValTwoLonger':
            select.css('padding-left', '20px');
             break;
        default:
            return;
    }
});

Nó không phải là một ý tưởng tốt để đặt đệm-trái cho mỗi từ. Làm thế nào về những từ này đến từ cơ sở dữ liệu de và là động?
dùng3645907

-5

thêm & nbsp như thế này ...

    <option value="0"> &nbsp&nbsp&nbsp&nbsp&nbsp--Select Name--</option>

cho đến khi bạn nhận được một hiệu ứng của văn bản liên kết trung tâm

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.