เป็นไปได้ไหมที่จะจัดกึ่งกลางข้อความในกล่องที่เลือก?


199

ฉันลองทำสิ่งนี้: 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; }

อย่างที่คุณเห็นมันไม่ทำงาน มีวิธี CSS-only ในการจัดกึ่งกลางข้อความในกล่องเลือกหรือไม่?


5
ใน Firefox ของฉันมันทำงานที่ถูกต้อง :)
Mateusz Rogulski

10
ไม่สามารถใช้งานกับ Chrome ได้
Emmanuel

4
@ Blazemonger ฉันสามารถจินตนาการถึงสถานการณ์ที่มีการออกแบบที่มีความสมมาตรมีความสำคัญมากกว่าทางเลือกที่จัดชิดซ้ายเพื่อลดการสแกนพจนานุกรมด้วยมนุษย์ เช่นถ้าฉันต้องการมีตัวเลือกการเลือกเพศที่เติมหน้าจอ 100% ในแนวนอนบนอุปกรณ์มือถือมันดูแปลกมากที่ข้อความ 'Male' และ 'Female' ถูกผลักไปจนสุด
Kent Munthe Caspersen

ลองจัดเรียงข้อความ: กลาง;
Ari

คำตอบ:


30

ฉันเกรงว่าสิ่งนี้จะไม่สามารถทำได้ด้วย CSS ธรรมดาและจะไม่สามารถเข้ากันได้กับเบราว์เซอร์อย่างสมบูรณ์

อย่างไรก็ตามการใช้ปลั๊กอิน jQuery คุณสามารถจัดรูปแบบแบบเลื่อนลง:

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

ปลั๊กอินนี้ซ่อนselectองค์ประกอบและสร้างspanองค์ประกอบอื่น ๆ ได้ทันทีเพื่อแสดงสไตล์รายการแบบหล่นลงที่กำหนดเอง ฉันค่อนข้างมั่นใจว่าคุณจะสามารถเปลี่ยนสไตล์ในช่วงอื่น ๆ เพื่อจัดแนวรายการ


web.archive.org/web/20160328192510/http://filamentgroup.com/lab/… นี่คือเวอร์ชั่นที่ได้รับการปรับปรุงในขณะนี้ซึ่งกลุ่มของเส้นใยจะไม่ได้รับการบำรุงรักษาอีกต่อไป github.com/fnagel/jquery-ui
cdignam

390

มีวิธีแก้ปัญหาบางส่วนสำหรับChrome :

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

มันอยู่ตรงกลางตัวเลือกที่เลือก แต่ไม่ใช่ตัวเลือกภายในแบบเลื่อนลง


18
ไม่รองรับ Safari
Buts

1
ไม่รองรับ Edge เช่นกัน
mortenpi

13
ไม่ทำงานใน Firefox แต่สิ่งที่ทำงานใน Firefox text-align: centerคือ
Noitidart

3
widthไม่จำเป็น.
Vahid Amiri

3
ประณามมันสมบูรณ์แบบสามารถใช้กับ Firefox ล่าสุด ... + rep
w411 3

81

สำหรับการจัดตำแหน่งที่ถูกต้อง ลองมัน:

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

การสนับสนุนเบราว์เซอร์สำหรับtext-align-lastคุณสมบัติสามารถพบได้ที่นี่: https://www.w3schools.com/cssref/css3_pr_text-align-last.asp ดูเหมือนว่า Safari เท่านั้นที่ยังไม่สนับสนุน


7
นี่ควรเป็นคำตอบยอดนิยมโซลูชัน CSS ที่เรียบง่ายและบริสุทธิ์ที่ทำงานได้อย่างสมบูรณ์แบบสำหรับฉัน (แม้ว่าฉันจะเปลี่ยนtext-align-last: right;ไปcenterเพราะฉันต้องการป้ายกำกับที่อยู่ตรงกลาง)
JVG

คำตอบนี้หิน! ไม่มีที่ไหนเลยที่ฉันได้พบทางออกที่ง่ายเช่นนี้
udog

ขอบคุณมากคำตอบนี้ควรถูกเลือกเพราะมันใช้ได้ดีจริง ๆ !
Nick

1
text-align สุดท้าย: ศูนย์; ใช้งานได้กับฉันใน Chrome และ Firefox เท่านั้น ไม่ได้อยู่ในขอบและฉันจะเดิมพันในซาฟารีทั้ง
Dennis Heiden

1
สิ่งนี้ไม่สามารถใช้ได้กับเบราว์เซอร์มือถือใด ๆ ฉันต้องการให้มันทำงานที่ไหน
วิวัฒนาการเมื่อ

58

คุณต้องใส่กฎ CSS ลงในคลาสที่เลือก

ใช้ CSS เยื้องข้อความ

ตัวอย่าง

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

รหัส CSS

select { text-indent: 5px; }

2
ทั้งที่ผมไม่ได้รับมันหรือมันก็ไม่ได้ผลสำหรับการจัดตำแหน่งข้อความ
matanster

เยื้องข้อความ ... น่าสนใจฉันไม่รู้เกี่ยวกับอสังหาริมทรัพย์นั้น ขอบคุณมาก!
Froxx

9
สิ่งนี้จะใช้ได้กับตัวเลือกหนึ่งตัวเท่านั้นการเยื้องข้อความขึ้นอยู่กับว่าช่องว่างแนวนอนใช้ข้อความของตัวเลือกที่เกี่ยวข้องกับความกว้างของ selectbox มากเพียงใดดังนั้นนี่คือคำตอบที่ไม่สมบูรณ์ การใช้การเยื้องข้อความจัดทำโดย Mr Smee ด้านบน
ลูโรมัน

แนวคิดที่น่าสนใจ แต่จะไม่ได้ผลเป็นเปอร์เซ็นต์ดังนั้นคุณจะจัดตำแหน่งทุกรายการได้อย่างไร
Buts

นี่คือคำตอบที่ถูกต้อง การใช้การเยื้องข้อความ: 50% จะจัดกึ่งกลางตัวเลือกให้กับคุณภายในส่วนที่เลือก
John Smith

51

ใช่มันเป็นไปได้ คุณสามารถใช้การจัดแนวข้อความล่าสุด

text-align-last: center;

1
ดูเหมือนว่าจะอยู่ตรงกลางค่าที่แสดงในตัวเลือกเมื่อปิด ตัวเลือกในการเลื่อนลงจะยังคงจัดชิดไปทางซ้าย (อย่างน้อยใน Chrome ตั้งแต่เดือนกันยายน 2019)
bjg222

1
ใช่ฉันต้องการที่จะแสดงในศูนย์และมันก็ถูกต้อง
35411

26

2563, ฉันใช้:

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

1
น่าเสียดายที่นี่ใช้งานไม่ได้ในซาฟารี ... และเมื่อเดือนพฤษภาคม 2020 แอปเปิ้ลยังคงบังคับให้เบราว์เซอร์อื่น ๆ ทั้งหมดบน iOS ใช้เครื่องมือสร้างการแสดงผลของ Safari ...
Doomd

22

เพียงแค่ใช้สิ่งนี้:

select {

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

}

3
คุณไม่จำเป็นต้องรวม "ช่องว่างภายใน: 29px;" หากคุณใช้ "ศูนย์" ฉันสงสัยว่าคุณมีเพราะคุณคัดลอกคำตอบของ Aly-Elgarhy ตั้งแต่วันที่ 25 ต.ค. 59
Jayden Lawson

เมื่อคุณคัดลอกจากคำตอบของใครบางคนคุณควรพูดถึงชื่อของพวกเขา
Munim Munna

ไม่ฉันคัดลอกโดยตรงจากรหัสของฉันเพราะนั่นคือเหตุผลที่ฉันใส่ช่องว่างภายในขวาฉันอาจคัดลอกโซลูชันจากที่อื่นลงในรหัสของฉันแล้วฉันคัดลอกโซลูชันจากรหัสของฉันลงใน 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
นี่เป็นทางออกเดียวที่ช่วยฉัน +1

พฤษภาคม 2020 - สิ่งนี้ใช้ไม่ได้กับ Safari (หรือเบราว์เซอร์บนอุปกรณ์ iOS ทั้งหมด)
Doomd

16

ฟังก์ชัน JS นี้ควรใช้งานได้สำหรับคุณ

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 ทั้งหมดที่นี่: http://codepen.io/anon/pen/NxyovL


9

ฉันใช้แฮ็คต่อไปนี้เพื่อให้มันทำงานกับ css เท่านั้น

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

การขยายจะทำให้ข้อความอยู่กึ่งกลางและสามารถปรับขนาดของข้อความได้ :)

เห็นได้ชัดว่าไม่ถูกต้อง 100% จากมุมมองการตรวจสอบที่ถูกต้องฉันเดา แต่ทำงานได้ :)


7

ทางเลือกโซลูชัน "ปลอม" หากคุณมีรายการที่มีตัวเลือกคล้ายกันในความยาวข้อความ (เลือกหน้าตัวอย่าง):

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

สามารถใช้งานได้ใน Chrome, Firefox และ Edge เคล็ดลับอยู่ที่นี่เพื่อดันข้อความจากด้านซ้ายไปยังกึ่งกลางจากนั้นย่อส่วนครึ่งความยาวเป็น px, em หรือข้อความตัวเลือก

ป้อนคำอธิบายรูปภาพที่นี่

ทางออกที่ดีที่สุด IMO (ในปี 2560) ยังคงแทนที่ตัวเลือกผ่าน JS และสร้างกล่องตัวเลือกปลอมของคุณเองด้วย divs หรืออะไรก็ตามและผูกเหตุการณ์การคลิกบนเพื่อรองรับข้ามเบราว์เซอร์


1
ใช้งานได้ใน Chrome แต่ใน IE มันดูค่อนข้างออกไปทางขวากว่าตรงกลาง
user3366706

5

ไม่อยู่กึ่งกลาง แต่ใช้ตัวอย่างด้านบนคุณสามารถสร้างระยะขอบซ้ายในกล่องที่เลือก

<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>

ทำไมไม่เพียงแค่เพิ่มtext-indentการ<select>แท็กเช่น Carreras @marc กล่าวว่า?
Munim Munna



2

คุณไม่สามารถกำหนดเองได้จริง<select>หรือ<option>มากนัก วิธีเดียว (ข้ามเบราว์เซอร์) จะเป็นการสร้างรายการแบบหล่นลงด้วยตนเองด้วย divs และ css / js เพื่อสร้างสิ่งที่คล้ายกัน


2

หากคุณไม่พบวิธีการแก้ปัญหาใด ๆ คุณสามารถใช้เคล็ดลับนี้กับ angularjs หรือใช้ js เพื่อจับคู่ค่าที่เลือกกับข้อความบน div วิธีการแก้ปัญหานี้สอดคล้องกับ 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


มันไม่ใช่ตรงกลาง!
Qui-Gon Jinn

1

ในขณะที่คุณไม่สามารถจัดกึ่งกลางข้อความของตัวเลือกไว้ในตัวเลือกคุณสามารถวาง div ที่อยู่ในตำแหน่งด้านบนของตัวเลือกให้อยู่ในลักษณะเดียวกัน:

#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>

ตรวจสอบให้แน่ใจว่าทั้ง div และ select มีตำแหน่งคงที่ในเอกสาร


0

ยังไม่ได้ 100% แต่คุณสามารถใช้ตัวอย่างนี้!

จัดเรียงข้อความล่าสุด: กึ่งกลาง; // สำหรับ Chrome text-align: center; // สำหรับ Firefox

ไม่ทำงานบน Safari หรือ Edge ในตอนนี้!


-3

หากตัวเลือกเป็นแบบคงที่คุณสามารถฟังเหตุการณ์การเปลี่ยนแปลงในกล่องที่คุณเลือกและเพิ่มการเติมสำหรับแต่ละไอเท็ม

$('#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;
    }
});

มันไม่ได้เป็นความคิดที่ดีที่จะใส่ padding-left สำหรับแต่ละคำ คำนี้มาจากฐานข้อมูล de และเป็นแบบไดนามิก?
user3645907

-5

เพิ่ม & nbsp เช่นนี้ ...

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

จนกว่าคุณจะได้รับผลกระทบของข้อความชิดกลาง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.