Các phần tử nội tuyến thay đổi khi được in đậm khi di chuột


204

Tôi đã tạo một menu ngang bằng cách sử dụng danh sách HTML và CSS. Mọi thứ hoạt động như bình thường trừ khi bạn di chuột qua các liên kết. Bạn thấy đấy, tôi đã tạo một trạng thái di chuột đậm cho các liên kết và bây giờ trình đơn liên kết thay đổi vì sự khác biệt kích thước đậm.

Tôi gặp vấn đề tương tự như bài viết trên trang web này . Tuy nhiên, bài viết không có giải pháp thích hợp. Tôi đã tìm kiếm mọi nơi để tìm giải pháp và không thể tìm thấy giải pháp. Chắc chắn tôi không thể là người duy nhất cố gắng làm điều này.

Có ai có ý tưởng nào?

PS: Tôi không biết chiều rộng của văn bản trong các mục menu vì vậy tôi không thể chỉ đặt chiều rộng của các mục li.

.nav { margin: 0; padding: 0; }
.nav li { 
    list-style: none; 
    display: inline; 
    border-left: #ffffff 1px solid; 
}
.nav li a:link, .nav li a:visited { 
    text-decoration: none; 
    color: #000; 
    margin-left: 8px; 
    margin-right: 5px; 
}
.nav li a:hover{ 
    text-decoration: none; 
    font-weight: bold; 
}
.nav li.first { border: none; }
<ul class="nav">
    <li class="first"><a href="#">item 0</a></li>
    <li><a href="#">item 1</a></li>
    <li><a href="#">item 2</a></li>
    <li><a href="#">item 3</a></li>
    <li><a href="#">item 4</a></li>
</ul>

Câu trả lời:


390

li {
    display: inline-block;
    font-size: 0;
}
li a {
    display:inline-block;
    text-align:center;
    font: normal 16px Arial;
    text-transform: uppercase;
}
a:hover {
    font-weight:bold;
}
a::before {
    display: block;
    content: attr(title);
    font-weight: bold;
    height: 0;
    overflow: hidden;
    visibility: hidden;
}
<ul>
    <li><a href="#" title="height">height</a></li>
    <li><a href="#" title="icon">icon</a></li>
    <li><a href="#" title="left">left</a></li>
    <li><a href="#" title="letter-spacing">letter-spacing</a></li>
    <li><a href="#" title="line-height">line-height</a></li>
</ul>

Kiểm tra ví dụ làm việc trên JSfiddle . Ý tưởng là để dành không gian cho :hovernội dung được in đậm (hoặc bất kỳ kiểu trạng thái nào ) trong :beforephần tử giả và sử dụng thẻ tiêu đề làm nguồn cho nội dung.


20
Hoàn hảo! Nó hoạt động cho <a> ngay cả khi không sử dụng ul, tôi sẽ sử dụng một thuộc tính khác như dữ liệu văn bản thay vì tiêu đề.
brittongr

6
Giải pháp này hoạt động, nhưng sẽ tốt hơn khi bạn thêm margin-top: -1pxvào :afterđể tránh tạo không gian có chiều cao 1px.
micropro.cz

4
@ mattroberts33 :vs ::"Mọi trình duyệt hỗ trợ ::cú pháp dấu hai chấm CSS3 cũng chỉ hỗ trợ :cú pháp, nhưng IE 8 chỉ hỗ trợ dấu hai chấm đơn, vì vậy, hiện tại, chúng tôi khuyên bạn chỉ nên sử dụng dấu hai chấm đơn để hỗ trợ trình duyệt tốt nhất." css-tricks.com/almanac/selector/a/after-and-b
Before

1
@HughHughTeotl Sử dụng cỡ chữ: 0 cho ULhoặc a::afternói cách khác - đặt lại tất cả phần đệm / lề / chiều cao dòng / kích thước phông chữ, v.v.
350D

1
Thật không may, bạn luôn có chú giải công cụ được hiển thị :-(
Benedikt

42

Một giải pháp bị xâm phạm là giả mạo đậm bằng bóng văn bản, ví dụ:

bóng văn bản: 0 0 0,01px màu đen;

Để so sánh tốt hơn tôi đã tạo ra các ví dụ sau:

a, li {
  color: black;
  text-decoration: none;
  font: 18px sans-serif;
  letter-spacing: 0.03em;
}
li {
  display: inline-block;
  margin-right: 20px;
  color: gray;
  font-size: 0.7em;
}
.bold-x1 a.hover:hover,
.bold-x1 a:not(.hover) {
  text-shadow: 0 0 .01px black;
}
.bold-x2 a.hover:hover,
.bold-x2 a:not(.hover){
  text-shadow: 0 0 .01px black, 0 0 .01px black;
}
.bold-x3 a.hover:hover,
.bold-x3 a:not(.hover){
  text-shadow: 0 0 .01px black, 0 0 .01px black, 0 0 .01px black;
}
.bold-native a.hover:hover,
.bold-native a:not(.hover){
  font-weight: bold;
}

.bold-native li:nth-child(4),
.bold-native li:nth-child(5){
 margin-left: -6px;
 letter-spacing: 0.01em;
}
<ul class="bold-x1">
  <li><a class="hover" href="#">Home</a></li>
  <li><a class="hover" href="#">Products</a></li>
  <li><a href="#">Contact</a></li>
  <li><a href="#">About</a></li>
  <li>Bold (text-shadow x1)</li>
</ul>
<ul class="bold-x2">
  <li><a class="hover" href="#">Home</a></li>
  <li><a class="hover" href="#">Products</a></li>
  <li><a href="#">Contact</a></li>
  <li><a href="#">About</a></li>
  <li>Extra Bold (text-shadow x2)</li>
</ul>
<ul class="bold-native">
  <li><a class="hover" href="#">Home</a></li>
  <li><a class="hover" href="#">Products</a></li>
  <li><a href="#">Contact</a></li>
  <li><a href="#">About</a></li>
  <li>Bold (native)</li>
</ul>
<ul class="bold-x3">
  <li><a class="hover" href="#">Home</a></li>
  <li><a class="hover" href="#">Products</a></li>
  <li><a href="#">Contact</a></li>
  <li><a href="#">About</a></li>
  <li>Black (text-shadow x3)</li>
</ul>

Chuyển đến text-shadowgiá trị thực sự thấp blur-radiussẽ làm cho hiệu ứng làm mờ không quá rõ ràng.

Nói chung, càng lặp lại text-shadow, văn bản của bạn sẽ càng táo bạo hơn nhưng đồng thời mất hình dạng ban đầu của các chữ cái.

Tôi nên cảnh báo bạn rằng việc đặt blur-radiusphân số sẽ không hiển thị giống nhau trong tất cả các trình duyệt! Ví dụ, Safari cần các giá trị lớn hơn để hiển thị nó giống như cách Chrome sẽ làm.


6
Điều này thậm chí còn xấu hơn các giải pháp táo bạo được tính toán trên trình duyệt khác và nên tránh
Zach Saucier

28

Nếu bạn không thể đặt chiều rộng, điều đó có nghĩa là chiều rộng sẽ thay đổi khi văn bản được in đậm. Không có cách nào để tránh điều này, ngoại trừ bằng các thỏa hiệp như sửa đổi phần đệm / lề cho mỗi trạng thái.


2
+1 như Andrew nói, văn bản in đậm rộng hơn. Sự thật của cuộc sống. Thậm chí sửa chữa độ rộng của các mục menu để tránh điều này hoặc sống với nó (tính toán lại phần đệm là không chính xác và dễ bị lỗi).
cletus

Đúng, tôi có xu hướng tránh hiệu ứng di chuột táo bạo vì lý do này.
Steve Wortham

"Không có cách nào để tránh điều này". Xem câu trả lời của 350D dưới đây.
gfullam

Cũng lưu ý rằng câu trả lời của Andrew đã được đăng 4 năm trước khi giải pháp 350D được thêm vào. Các phần tử giả với hàm attr () là giá trị nội dung hoàn toàn không thể quay lại sau đó :) thời gian trôi qua tại Stack Overflow. Tuy nhiên, cộng đồng đã vượt qua nó và đó là câu trả lời được chấp nhận và hầu hết các câu trả lời, vì vậy tôi rất vui!
Justus Romijn

25

Một ý tưởng khác đang sử dụng letter-spacing

li, a { display: inline-block; }
a {
  font-size: 14px;
  padding-left: 10px;
  padding-right: 10px;
  letter-spacing: 0.235px
}

a:hover, a:focus {
  font-weight: bold;
  letter-spacing: 0
}
<ul>
  <li><a href="#">item 1</a></li>
  <li><a href="#">item 2</a></li>
  <li><a href="#">item 3</a></li>
</ul>


Điều đó có hoạt động với tất cả các trình duyệt, đặc biệt là IE10 + và Safari không?
Umair Hafeez

người tôi thích nhất :)
Inc33

1
@UmairHafeez vâng, tất cả các trình duyệt hiện đại đều mong đợi opera mini caniuse.com/#feat=css-letter-spaces
John Magnolia

1
Làm thế nào bạn biết rằng 0,235px là số lượng hoàn hảo? Có bất kỳ công thức để tính toán khoảng cách là cần thiết?
Cold_Class

Không, tôi nghĩ rằng đó chỉ là bản dùng thử nhanh và lỗi
John Magnolia

17

Một dòng trong jquery:

$('ul.nav li a').each(function(){
    $(this).parent().width($(this).width() + 4);
});

chỉnh sửa: Mặc dù điều này có thể mang lại giải pháp, người ta nên đề cập rằng nó không hoạt động cùng với mã trong bài viết gốc. "display: inline" phải được thay thế bằng các tham số nổi để cài đặt chiều rộng có hiệu quả và menu ngang đó hoạt động như dự định.


Bạn có thể làm điều này cho tất cả các liên kết trong trang? Đó là, thay thế ul.nav li abằng acác công trình?
gnzlbg

2
Câu hỏi này không được gắn thẻ với JS, hãy để một mình jQuery. Xin vui lòng không đăng các giải pháp không cần thiết.
Zach Saucier

2
@Zach Saucier Trong một số tình huống, một số nhà phát triển có thể thích một giải pháp JS, vì chúng thường ngắn hơn. Thay vì hạ thấp tất cả những người đã đăng một cái gì đó với JS, bạn có thể thêm thẻ JS vào câu hỏi và để mỗi người quyết định giải pháp nào họ thấy hữu ích hơn.
lurkit

1
@Zach Saucier Giải pháp CSS có thể không thực tế trong một số trường hợp. Đôi khi bạn có thể cần phải có một thuộc tính tiêu đề khác hoặc đã sử dụng hết phần tử :: sau giả, hoặc cá nhân bạn có thể xem xét thực tế hơn về một tình huống nhất định để sử dụng một lớp lót trong JS cho một số dòng CSS. Tôi coi câu trả lời CSS là vượt trội trong hầu hết các trường hợp, nhưng thật hữu ích khi có câu trả lời JS làm tùy chọn bổ sung.
lurkit

Đây là giải pháp duy nhất tôi có thể tìm thấy để giải quyết vấn đề trong khi vẫn giữ được khoảng cách giữa các phần tử.
Jaiden Mispy

11

Giải pháp CSS3 - Thử nghiệm

(Giả đậm)

Suy nghĩ để chia sẻ một giải pháp khác nhau mà không ai đề nghị ở đây. Có một tài sản được gọi là text-strokesẽ có ích cho việc này.

p span:hover {
  -webkit-text-stroke: 1px black;
}
<p>Some stuff, <span>hover this,</span> it's cool</p>

Ở đây, tôi đang nhắm mục tiêu văn bản bên trong spanthẻ và chúng tôi vuốt nó bằng một pixel blacksẽ mô phỏng boldkiểu cho văn bản cụ thể đó.

Lưu ý rằng thuộc tính này không được hỗ trợ rộng rãi, kể từ bây giờ (trong khi viết câu trả lời này), chỉ Chrome và Firefox dường như hỗ trợ điều này. Để biết thêm thông tin về hỗ trợ trình duyệt text-stroke, bạn có thể tham khảo CanIUse .


Chỉ để chia sẻ một số nội dung bổ sung, bạn có thể sử dụng -webkit-text-stroke-width: 1px;nếu bạn không muốn thiết lập một cú đánh colorcho mình.


Điều này thật tuyệt vời
Alan Fitzpatrick

Mẹo tuyệt vời. Thật không may là nó vẫn không đạt tiêu chuẩn sau 4 năm.
Dávid Veszelovszki

5

Bạn có thể sử dụng một số như

<ul>
   <li><a href="#">Some text<span><br />Some text</span></a></li>
</ul>

và sau đó trong css của bạn chỉ cần đặt nội dung span in đậm và ẩn nó với khả năng hiển thị: ẩn, để nó giữ kích thước của nó. Sau đó, bạn có thể điều chỉnh lề của các yếu tố sau để làm cho nó phù hợp.

Tôi không chắc chắn nếu cách tiếp cận này là thân thiện với SEO mặc dù.


1
Đây cũng không phải là nhà phát triển / bảo trì thân thiện
Zach Saucier

5

Tôi chỉ giải quyết vấn đề với giải pháp "bóng tối". Có vẻ như đơn giản và hiệu quả nhất.

nav.mainMenu ul li > a:hover, nav.mainMenu ul li.active > a {
    text-shadow:0 0 1px white;
}

Không cần lặp lại bóng ba lần (kết quả là giống tôi).


Điều này thậm chí còn xấu hơn các giải pháp táo bạo được tính toán trên trình duyệt khác và nên tránh
Zach Saucier

4

Tôi đã có một vấn đề tương tự như của bạn. Tôi muốn các liên kết của tôi được in đậm khi bạn di chuột qua chúng nhưng không chỉ trong menu mà còn trong văn bản. Như bạn đoán, đây sẽ là một việc vặt thực sự tìm ra tất cả các chiều rộng khác nhau. Giải pháp khá đơn giản:

Tạo một hộp chứa văn bản liên kết in đậm nhưng được tô màu như nền của bạn và liên kết thực của bạn ở trên nó. Đây là một ví dụ từ trang của tôi:

CSS:

.hypo { font-weight: bold; color: #FFFFE0; position: static; z-index: 0; }
.hyper { position: absolute; z-index: 1; }

Tất nhiên bạn cần thay thế # FFFFE0 bằng màu nền của trang. Các chỉ số z dường như không cần thiết nhưng dù sao tôi cũng đặt chúng (vì phần tử "hypo" sẽ xuất hiện sau phần tử "hyper" trong Mã HTML). Bây giờ, để đặt một liên kết trên trang của bạn, bao gồm những điều sau đây:

HTML:

You can find foo <a href="http://bar.com" class="hyper">here</a><span class="hypo">here</span>

"Ở đây" thứ hai sẽ vô hình và ẩn bên dưới liên kết của bạn. Vì đây là hộp tĩnh có in đậm văn bản liên kết của bạn, phần còn lại của văn bản sẽ không dịch chuyển nữa vì nó đã được dịch chuyển trước khi bạn di chuột qua liên kết.

Hy vọng tôi đã có thể giúp đỡ :).

Lâu quá


2

Bạn có thể làm việc với thuộc tính "lề":

li a {
  margin: 0px 5px 0px 5px;
}

li a:hover {
  margin: 0;
  font-weight: bold;
}

Chỉ cần đảm bảo rằng lề trái và phải đủ lớn để không gian thừa có thể chứa văn bản in đậm. Đối với các từ dài, bạn có thể chọn các lề khác nhau. Nó chỉ là một cách giải quyết khác nhưng làm công việc cho tôi.


Tôi đã sử dụng một giải pháp tương tự, nhưng đối với tôi - chỉ cần thêm 'lề: 0 -2px' vào kiểu di chuột (và không thêm bất cứ thứ gì khác vào kiểu bình thường) - đã hoạt động rất tốt.
Yuval A.

8
Điều này không hoạt động nếu có bất kỳ sự thay đổi nào trong chiều dài chuỗi của bạn
kat

2

Tôi thích sử dụng bóng văn bản thay thế. Đặc biệt bởi vì bạn có thể sử dụng các hiệu ứng chuyển tiếp để tạo bóng cho văn bản.

Tất cả những gì bạn thực sự cần là:

a {
  transition: text-shadow 1s;
}
a:hover {
  text-shadow: 1px 0 black;
}

Để có điều hướng hoàn chỉnh, hãy xem jsfiddle này: https://jsfiddle.net/831r3yrb/

Hỗ trợ trình duyệt và biết thêm thông tin về bóng văn bản: http://www.w3schools.com/cssref/css3_prigin-shadow.asp


Điều này hoạt động tốt với việc sử dụng chuyển tiếp. Giải pháp thay thế tuyệt vời.
Yazmin

1

Tôi sẽ tư vấn chống chuyển đổi phông chữ (°) khi di chuột. Trong trường hợp này, đó chỉ là các mục menu di chuyển một chút, nhưng tôi đã thấy các trường hợp đoạn hoàn chỉnh được định dạng lại vì việc mở rộng gây ra một gói từ thêm. Bạn không muốn thấy điều này xảy ra khi điều duy nhất bạn làm là di chuyển con trỏ; nếu bạn không làm gì thì bố cục trang sẽ không thay đổi.

Sự thay đổi cũng có thể xảy ra khi chuyển đổi giữa bình thường và in nghiêng. Tôi sẽ thử thay đổi màu sắc, hoặc chuyển đổi gạch chân nếu bạn có chỗ bên dưới văn bản. (gạch chân nên giữ rõ ràng từ biên giới dưới cùng)

Tôi sẽ bị la ó nếu tôi sử dụng chuyển đổi phông chữ cho lớp Thiết kế biểu mẫu của mình :-)

(°) Phông chữ thường bị sử dụng sai. "Verdana" là một kiểu chữ , "Verdana bình thường" và "Verdana bold" là các phông chữ khác nhau của cùng một kiểu chữ.


1

ul {
  list-style-marker: none;
  padding: 0;
}

li {
  display: inline-block;
}

li + li {
  margin-left: 1em;
}

a {
  display: block;
  position: relative;
  text-align: center;
}

a:before, a:after {
  content: attr(aria-label);
  text-decoration: inherit;
}

a:before {
  font-weight: bold;
  visibility: hidden;
}

a:after {
  position: absolute;
  left: 0;
  top: 0;
  right: 0;
  bottom: 0;
}

a:hover:before {
  visibility: visible;
}

a:hover:after {
  display: none;
}
<ul>
  <li>
    <a href="" aria-label="Long-long-long"></a>
  </li><li>
    <a href="" aria-label="or"></a>
  </li><li>
    <a href="" aria-label="Short"></a>
  </li><li>
    <a href="" aria-label="Links"></a>
  </li><li>
    <a href="" aria-label="Here"></a>
  </li>
</ul>


1

Tôi sử dụng giải pháp bóng văn bản như một số người khác được đề cập ở đây:

text-shadow: 0 0 0.01px;

sự khác biệt là tôi không chỉ định màu bóng, vì vậy giải pháp này là phổ biến cho tất cả các màu phông chữ.


1

Một cách tiếp cận khác là "mô phỏng" văn bản in đậm qua bóng văn bản. Điều này có phần thưởng (/ malus, tùy theo trường hợp của bạn) để hoạt động trên các biểu tượng phông chữ.

   nav li a:hover {
      text-decoration: none;
      text-shadow: 0 0 1px; /* "bold" */
   }

Kinda hacky, mặc dù nó giúp bạn tránh khỏi việc sao chép văn bản (rất hữu ích nếu nó rất nhiều, như trong trường hợp của tôi).


0

Đây là giải pháp tôi thích. Nó đòi hỏi một chút về JS nhưng bạn không cần thuộc tính tiêu đề của mình giống hệt nhau và CSS của bạn có thể vẫn rất đơn giản.

$('ul a').each(function() {
  $(this).css({
    'padding-left': 0,
    'padding-right': 0,
    'width': $(this).outerWidth()
  });
});
li, a { display: inline-block; }
a {
  padding-left: 10px;
  padding-right: 10px;
  text-align: center; /* optional, smoother */
}
a:hover { font-weight: bold; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<ul>
  <li><a href="#">item 1</a></li>
  <li><a href="#">item 2</a></li>
  <li><a href="#">item 3</a></li>
</ul>


0

Cái này thì sao? Một giải pháp javascript - CSS3 miễn phí.

http://jsfiddle.net/u1aks77x/1/

ul{}
li{float:left; list-style-type:none; }
a{position:relative; padding-right: 10px; text-decoration:none;}
a > .l1{}
a:hover > .l1{visibility:hidden;}
a:hover > .l2{display:inline;}
a > .l2{position: absolute; left:0; font-weight:bold; display:none;}

<ul>
  <li><a href="/" title="Home"><span class="l1">Home</span><span class="l2">Home</span></a></li>
  <li><a href="/" title="Contact"><span class="l1">Contact</span><span class="l2">Contact</span></a></li>
  <li><a href="/" title="Sitemap"><span class="l1">Sitemap</span><span class="l2">Sitemap</span></a></li>
</ul>

1
Đây là khá nhiều đánh dấu bổ sung và CSS để khắc phục sự cố ... Đây không phải là nhà phát triển, SEO hoặc thân thiện trong tương lai
Zach Saucier

0

Không phải là giải pháp rất thanh lịch, nhưng "công trình":

a
{
    color: #fff;
}

a:hover
{
    text-shadow: -1px 0 #fff, 0 1px #fff, 1px 0 #fff, 0 -1px #fff;
}

0

Tôi đã kết hợp một loạt các kỹ thuật ở trên để cung cấp thứ gì đó không hoàn toàn hút với js bị tắt và thậm chí còn tốt hơn với một chút jQuery. Bây giờ các trình duyệt hỗ trợ cho khoảng cách chữ subpixel đang được cải thiện, thật tuyệt khi sử dụng nó.

jQuery(document).ready(function($) {
  $('.nav a').each(function(){
      $(this).clone().addClass('hoverclone').fadeTo(0,0).insertAfter($(this));
    var regular = $(this);
    var hoverclone = $(this).next('.hoverclone');
    regular.parent().not('.current_page_item').hover(function(){
      regular.filter(':not(:animated)').fadeTo(200,0);
      hoverclone.fadeTo(150,1);
    }, function(){
      regular.fadeTo(150,1);
      hoverclone.filter(':not(:animated)').fadeTo(250,0);
    });
  });
});
ul {
  font:normal 20px Arial;
  text-align: center;
}
li, a {
  display:inline-block;
  text-align:center;
}
a {
  padding:4px 8px;
  text-decoration:none;
  color: #555;
}

.nav a {
  letter-spacing: 0.53px; /* adjust this value per font */
}
.nav .current_page_item a,
.nav a:hover {
  font-weight: bold;
  letter-spacing: 0px;
}
.nav li {
  position: relative;
}
.nav a.hoverclone {
  position: absolute;
  top:0;
  left: 0;
  white-space: nowrap;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<ul class="nav">
  <li><a href="#">Item 1</a></li>
  <li><a href="#">Item 2</a></li>
  <li class="current_page_item"><a  href="#">Item 3</a></li>
  <li><a href="#">Item 4</a></li>
  <li><a href="#">Item 5</a></li>
</ul>


0

Tốt hơn là sử dụng a :: trước thay vì :: sau như thế này:

.breadcrumb {
  margin: 0;
  padding: 0;
  list-style: none;
  overflow: hidden;
}

.breadcrumb li, 
.breadcrumb li a {
  display: inline-block;
}

.breadcrumb li:not(:last-child)::after {
  content: '>'; /* or anything else */
  display: inline-block;
}

.breadcrumb a:hover {
  font-weight: bold;
}

.breadcrumb a::before {
  display: block;
  content: attr(data-label);
  font-weight: bold;
  height: 0;
  overflow: hidden;
  visibility: hidden;
}
<ul class="breadcrumb">
  <li><a data-label="one" href="https://www.google.fr/" target="_blank">one</a></li>
  <li><a data-label="two" href="https://duckduckgo.com/" target="_blank">two</a></li>
  <li><a data-label="three" href="#">three</a></li>
</ul>

Để biết thêm chi tiết: https://jsfiddle.net/r25fo lượn /


Bạn có thể vui lòng cung cấp một lời biện minh cho lý do tại sao a::beforesẽ tốt hơn a::after? Điều đó có vẻ như là một phần quan trọng trong câu trả lời của bạn, nhưng không rõ tại sao người này lại thích người khác hơn trong trường hợp này.
nirvdrum

0

Tôi đã sửa menu khi di chuột đậm thành công. Nó hỗ trợ responsive, đây là mã của tôi:

(function ($) {
'use strict';

$(document).ready(function () {
    customWidthMenu();
});
$(window).resize(function () {
    customWidthMenu();
});
function customWidthMenu() {
    $('ul.nav li a').each(function() {
        $(this).removeAttr('style');
        var this = $(this);
        var width = this.innerWidth();
        this.css({'width': width + 12});
    });
}})(jQuery);

-1

Nếu bạn không phản đối việc sử dụng Javascript, bạn có thể đặt độ rộng phù hợp sau khi trang được hiển thị. Đây là cách tôi đã làm (sử dụng Prototype):

$$('ul.nav li').each(this.setProperWidth);

setProperWidth: function(li)
{
  // Prototype's getWidth() includes padding, so we 
  // have to subtract that when we set the width.
  var paddingLeft = li.getStyle('padding-left'),
      paddingRight = li.getStyle('padding-right');

  // Cut out the 'px' at the end of each padding
  paddingLeft = paddingLeft.substring(0,paddingLeft.length-2);
  paddingRight = paddingRight.substring(0,paddingRight.length-2);

  // Make the li bold, set the width, then unbold it
  li.setStyle({ fontWeight: 'bold' });
  li.setStyle({ width: (li.getWidth() - paddingLeft - paddingRight) + 'px'});
  li.setStyle({ fontWeight: 'normal', textAlign: 'center' });
}

Javascript không được gắn thẻ trong câu hỏi, hãy để một mình jQuery. Hãy tiếp tục trả lời bằng các ngôn ngữ được gắn thẻ trong câu hỏi
Zach Saucier

-1

Tôi thực sự không thể chịu đựng được khi ai đó bảo bạn đừng làm điều đó theo cách đó khi có một giải pháp đơn giản cho vấn đề. Tôi không chắc chắn về các yếu tố li, nhưng tôi chỉ khắc phục vấn đề tương tự. Tôi có một menu bao gồm các thẻ div.

Chỉ cần đặt thẻ div là "display: inline-block". Nội tuyến để chúng ngồi cạnh nhau và chặn để bạn có thể đặt chiều rộng. Chỉ cần đặt chiều rộng đủ rộng để chứa văn bản in đậm và căn giữa văn bản được căn chỉnh.

. <div id="ROS_SearchSermons" class="SearchBar_Category">

HTML (Tôi có các thẻ neo bao quanh từng mục menu, nhưng tôi không thể gửi chúng dưới dạng người dùng mới)

<div id="ROS_SearchSermons" class="SearchBar_Cateogry bold">Sermons</div>|
<div id="ROS_SearchIllustrations" class="SearchBar_Cateogry">Illustrations</div>|
<div id="ROS_SearchVideos" class="SearchBar_Cateogry">Videos</div>|
<div id="ROS_SearchPowerPoints" class="SearchBar_Cateogry">PowerPoints</div>|
<div id="ROS_SearchScripture" class="SearchBar_Cateogry">Scripture</div>|

CSS:

#ROS_SearchSermons { width: 75px; }
#ROS_SearchIllustrations { width: 90px; }
#ROS_SearchVideos { width: 55px; }
#ROS_SearchPowerPoints { width: 90px; }
#ROS_SearchScripture { width: 70px; }

.SearchBar_Cateogry
{
    display: inline-block;
    text-align:center;
}

1
Đây là sử dụng chiều rộng cố định giống như OP được chỉ định KHÔNG phải là trường hợp. Như vậy, câu trả lời này không trả lời câu hỏi đang được hỏi
Zach Saucier

-1

thử cái này:

.nav {
  font-family: monospace;
}

Làm thế nào điều đó sẽ thay đổi bất cứ điều gì?
leo núi

@ MiXT4PE Với monospace, các ký tự có cùng kích thước thông thường hoặc in đậm. kích thước sẽ không thay đổi
Yukulélé

thay đổi một họ phông chữ vì đó không phải là một giải pháp
funkysoul

Thay đổi họ phông chữ để sửa lỗi UI không phải là một giải pháp, vì họ phông chữ là gốc của tất cả các kiểu chữ thương hiệu hầu hết thời gian.
Umair Hafeez

Kiểu chữ là một phần lớn của thiết kế UI và kiểu chữ được thiết kế cho một thương hiệu nên tính đến việc sử dụng chúng trong UI. PT Sans và Clear Sans là hai kiểu chữ có khoảng cách glyph giống nhau trên các trọng số. Thật không may, sự thật là rất ít kiểu chữ (không đơn cách) có thuộc tính này và có thể rẻ hơn khi thực hiện một trong những câu trả lời khác cho câu hỏi hơn là trả tiền cho việc phát triển kiểu chữ. Tuy nhiên, điều đó sẽ thay đổi khi tính khả dụng của phông chữ Biến được cải thiện. Xem v-fonts.com để biết các phông chữ có chiều rộng thay đổi + trọng lượng.
Peter W

-3

Bạn cũng có thể thử các lề âm nếu văn bản in đậm rộng hơn thông thường. (không phải luôn luôn) Vì vậy, ý tưởng là sử dụng các lớp thay vì định kiểu: trạng thái di chuột.

jQuery:

 $(".nav-main .navbar-collapse > ul > li > a").hover(function() {
    var originalWidth = $(this).outerWidth();

    $(this).parent().addClass("hover");
    $(this).css({
       "margin-left": -(($(this).outerWidth() - originalWidth) / 2),
       "margin-right": -(($(this).outerWidth() - originalWidth) / 2)
    });
 },
 function() {
    $(this).removeAttr("style");
    $(this).parent().removeClass("hover");
 });

CSS:

ul > li > a {
    font-style: normal;
}

ul > li > a.hover {
    font-style: bold;
}

Tôi hy vọng tôi có thể giúp!


1
Xin vui lòng không đăng câu trả lời bằng các ngôn ngữ khác với những người được gắn thẻ. Điều này không trả lời câu hỏi đang được hỏi
Zach Saucier
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.