Bù đắp một hình nền từ bên phải bằng CSS


443

Có cách nào để định vị hình ảnh nền một số pixel nhất định từ bên phải phần tử của nó không?

Ví dụ: để định vị thứ gì đó một số pixel nhất định (giả sử là 10) từ bên trái , đây là cách tôi thực hiện:

#myElement {
    background-position: 10px 0;
}

Bạn chắc chắn không có ý nghĩa background-position: -10px 0;? Chỉ cần kiểm tra :)
ba mươi

1
Tôi biết điều này có một số bản sao nhưng tôi không thể tìm thấy bất kỳ trong số chúng.
Pekka

1
@thentydot di chuyển nó 10 pixel trái từ cạnh trái.
nickf

thật ngu ngốc khi nó không có sẵn ...
Juan

@nickf bạn có nhận ra nó không có sẵn ở hầu hết các thiết bị vào cuối năm 2013 không?
Juan

Câu trả lời:


786

Tôi thấy tính năng CSS3 này hữu ích:

/* to position the element 10px from the right */
background-position: right 10px top;

Theo tôi biết điều này không được hỗ trợ trong IE8. Trong Chrome / Firefox mới nhất, nó hoạt động tốt.

Xem Tôi có thể sử dụng để biết chi tiết về các trình duyệt được hỗ trợ.

Nguồn được sử dụng: http://tanalin.com/en/blog/2011/09/css3-background-poseition/

Cập nhật :

Tính năng này hiện được hỗ trợ trong tất cả các trình duyệt chính, bao gồm cả trình duyệt di động.


23
Điều này thật tuyệt nhưng thật không may, nó không hoạt động trên Safari 5.1.7 (điều này cực kỳ quan trọng nếu được xem bằng điện thoại di động)
MosheElisha

5
Nó hoạt động ngay trên các thiết bị di động (được kiểm tra trên Android, iOS và WindowsPhone). Vẫn Safari 5.1.7 không hỗ trợ vị trí nền được đưa ra như ở đây.
Szorstki

8
Tôi đang sử dụng cái này nhưng với phần trăm dự phòng cho các trình duyệt cũ hơn, vd. vị trí nền: trung tâm 95%; vị trí nền: trung tâm bên phải 13px;
gregdev 13/03/2015

1
Không chắc có bao nhiêu người vẫn đang sử dụng trình duyệt đủ tuổi để không hỗ trợ điều này. Người dùng Safari nên có phiên bản mới hơn, mặc dù rất nhiều thiết bị Android cũ vẫn còn tồn tại. caniuse.com/#feat=css-background-offsets Đủ dễ dàng để sử dụng dự phòng tỷ lệ phần trăm cho những điều này (mặc dù nó không hoàn toàn giống nhau).
Đánh dấu

29
Xin lưu ý rằng điều này chỉ hoạt động nếu bạn chỉ định vị trí chính cho cả vị trí dọc và ngang như right left top bottom. Ví dụ: các mục sau sẽ không hiển thị: background-position: right 10px 10pxnhưng nên được viết làbackground-position: right 10px top 10px
chadiusvt

110

!! Câu trả lời lỗi thời, vì CSS3 mang tính năng này

Có cách nào để định vị hình ảnh nền một số pixel nhất định từ bên phải phần tử của nó không?

Không.

Cách giải quyết phổ biến bao gồm

  • thiết lập một margin-righttrên phần tử thay vì
  • thêm các pixel trong suốt vào chính hình ảnh và định vị nó top right
  • hoặc tính toán vị trí bằng jQuery sau khi biết chiều rộng của phần tử.

6
Hỗ trợ toàn diện hơn cho 'vị trí nền' CSS3 mở rộng chỉ quanh quẩn: stackoverflow.com/questions/501375/
Kẻ

92

Giải pháp đơn giản nhất là sử dụng tỷ lệ phần trăm. Đây không phải là câu trả lời chính xác mà bạn đang tìm kiếm vì bạn đã yêu cầu độ chính xác pixel, nhưng nếu bạn chỉ cần một cái gì đó để có một chút đệm giữa cạnh phải và hình ảnh, cho một vị trí 99% thường hoạt động đủ tốt.

Mã số:

/* aligns image to the vertical center and horizontal right of its container with a small amount of padding between the right edge */
div.middleleft {
  background: url("/images/source.jpg") 99% center no-repeat;
}

30
+1 "Chúng tôi sẽ thực hiện căn chỉnh pixel vào tuần tới" - luôn hoạt động.
moonwave99

2
Giải pháp này dường như hoạt động nhất quán trên các trình duyệt.
Evan Haas

49

Câu trả lời lỗi thời: Hiện đã được triển khai trong các trình duyệt chính, hãy xem các câu trả lời khác cho câu hỏi này.

CSS3 đã sửa đổi đặc tả background-positionđể nó sẽ hoạt động với điểm gốc khác nhau. Thật không may, tôi không thể tìm thấy bất kỳ bằng chứng nào cho thấy nó được triển khai trong bất kỳ trình duyệt chính nào.

http://www.w3.org/TR/css3-background/#the-background-poseition Xem ví dụ 12.

background-position: right 3em bottom 10px;

Cảm ơn Tami! Thật không may, điều này không hoạt động với tôi trong Firefox 4 hoặc Chrome 11.
nickf

Điều này được thực hiện trong Opera. Nghĩ rằng nó quá tốt để trở thành sự thật và sau đó tôi đã thử nghiệm trên các trình duyệt khác và tôi đã đúng.
Vian Esterhuizen

1
Điều này vẫn không hoạt động trong phiên bản Chrome hiện tại. Version 21.0.1180.89
andlrc

3
Chrome Canary (v26) hiện hỗ trợ điều này. Khi đã lừa xuống kênh phát hành và Safari cập nhật công cụ của họ, chỉ IE6-8 sẽ thiếu hỗ trợ (IE9 / 10 đã hỗ trợ định dạng mới).
Vlad Magdalin

1
Chỉ cần thử nghiệm điều này và hiện nó đang hoạt động trong Firefox (v.18.0.2), IE (v.9.0.8) và Chrome (v.25.0.1364.97), nhưng nó vẫn chưa hoạt động trong Safari (v.5.1.2) . Rất muốn biết nếu có ai biết khi nào điều đó có thể được triển khai ;-)
Chaya Cooper

40

Như đã đề xuất ở đây , đây là một giải pháp trình duyệt chéo khá hoạt động hoàn hảo:

background: url('/img.png') no-repeat right center;
border-right: 10px solid transparent;

Tôi đã sử dụng nó vì tính năng CSS3 trong việc chỉ định các offset được đề xuất trong câu trả lời được đánh dấu là giải quyết câu hỏi chưa được hỗ trợ trong các trình duyệt. Ví dụ


1
Thế còn khi tôi cần đường viền đó có màu nhất định thì sao?
máy móc

1
Đây là một câu trả lời tuyệt vời vì bạn có thể có độ chính xác pixel trong khi vẫn giữ cho nó tương thích với nhiều trình duyệt. Cảm ơn! (Và nếu bạn muốn một đường viền có màu nhất định, hãy sử dụng trình bao bọc của một số loại để bọc đầu vào và thêm đường viền vào thành phần đó.)
Gavin

23

Các câu trả lời thích hợp nhất là cú pháp bốn-giá trị mới cho background-position, nhưng đến khi tất cả các trình duyệt hỗ trợ nó tiếp cận tốt nhất của bạn là sự kết hợp của các phản ứng trước theo thứ tự sau:

background: url(image.png) no-repeat 97% center; /* default, Android, Sf < 6 */
background-position: -webkit-calc(100% - 10px) center; /* Sf 6 */
background-position: right 10px center; /* Cr 25+, FF 13+, IE 9+, Op 10.5+ */

15

Một mẹo đơn giản nhưng bẩn thỉu là chỉ cần thêm phần bù bạn muốn vào hình ảnh bạn đang sử dụng làm nền. nó không thể duy trì, nhưng nó hoàn thành công việc.


8

Điều này sẽ hoạt động trên hầu hết các trình duyệt hiện đại ... ngoài IE (hỗ trợ trình duyệt) . Mặc dù trang đó liệt kê> = IE9 như được hỗ trợ, các thử nghiệm của tôi không đồng ý với điều đó.

Bạn có thể sử dụng thuộc tính calc () css3 như vậy;

.class_name {
    background-position: calc(100% - 10px) 50%;
}

Đối với tôi đây là cách sạch nhất và hợp lý nhất để đạt được một lề bên phải. Tôi cũng sử dụng một dự phòng sử dụng border-right: 10px solid transparent;cho IE.


1
Điều này thật tuyệt nhưng thật không may, nó không hoạt động trên Safari 5.1.7 (điều này cực kỳ quan trọng nếu được xem bằng điện thoại di động)
MosheElisha

Sau đó, bạn nên sử dụng một vị trí nền hoạt động trong Safari và một vị trí có thể bị ghi đè bởi các trình duyệt có thể sử dụng nó. Ví dụ: background-position: 92% 8px; background-position: calc(100% - 12px) 8px;
Laki Politis

Không hoạt động trên tất cả các trình duyệt anh chàng. Các right 10px centercú pháp có hỗ trợ mở rộng hơn trong các trình duyệt.
Farzad YZ

Vui lòng đọc dòng đầu tiên nơi tôi nêu điều này hoạt động trên "trình duyệt hiện đại nhất". Tôi không bao giờ nói nó hoạt động trên tất cả chúng.
Novocaine

Theo caniuse, việc sử dụng calc sẽ làm sập IE9 ... một khi bạn thay thế _bằng một-
Ruskin

4

Ok Nếu tôi hiểu những gì bạn yêu cầu bạn sẽ làm điều này;

Bạn có container DIV của bạn được gọi #main-container.my-elementđó là trong đó. Sử dụng điều này để giúp bạn bắt đầu;

#main-container { 
  position:relative;
}
/*To make the element absolute - floats above all else within the parent container do this.*/
.my-element {
  position:absolute;
  top:0;
  right:10px;
}

/*To make the element apart of elements, something tangible that affects the position of other elements on the same level within the parent then do this;*/
.my-element {
  float:right;
  margin-right:10px;
}

Nhân tiện, tốt hơn hết là sử dụng các lớp nếu bạn tham chiếu một yếu tố cấp thấp hơn trong một trang (Tôi giả sử bạn là do đó tên của tôi thay đổi ở trên.


3

Đặc tả CSS3 cho phép các nguồn gốc khác nhau cho vị trí nền hiện được hỗ trợ trong Firefox 14 nhưng vẫn không có trong Chrome 21 (rõ ràng IE9 hỗ trợ một phần cho chúng, nhưng tôi đã không tự mình kiểm tra)

Ngoài vấn đề về Chrome mà @MattyF đã tham khảo còn có một bản tóm tắt ngắn gọn hơn ở đây: http://code.google.com.vn/p/chromium/issues/detail?id=95085


Tôi mới thử nghiệm điều này và hiện nó đang hoạt động trong Firefox (v.18.0.2), IE (v.9.0.8) và Chrome (v.25.0.1364.97), nhưng không hoạt động trong Safari (v.5.1.2)
Chaya Cooper

3

Nếu bạn có các yếu tố tỷ lệ, bạn có thể sử dụng:

.valid {
    background-position: 98% center;
}

.half .valid {
    background-position: 96% center;
}

Trong ví dụ này, .validsẽ là lớp có hình và .halfsẽ là một hàng có kích thước bằng một nửa so với tiêu chuẩn.

Dơ bẩn, nhưng hoạt động như một sự quyến rũ và nó có thể quản lý hợp lý.


1
Trong trường hợp của tôi (sử dụng bố cục chiều rộng cố định), điều này thực hiện chính xác những gì tôi cần. Cảm ơn.
Gavin

3

Nếu bạn muốn sử dụng cái này để thêm mũi tên / biểu tượng khác vào một nút chẳng hạn thì bạn có thể sử dụng phần tử giả css không?

Nếu đó thực sự là hình nền cho toàn bộ nút, tôi có xu hướng kết hợp khoảng cách vào hình ảnh và chỉ sử dụng

background-position: right 0;

Nhưng nếu tôi phải thêm ví dụ một mũi tên được thiết kế vào một nút, tôi có xu hướng có html này:

<a href="[url]" class="read-more">Read more</a>

Và có xu hướng làm như sau với CSS:

.read-more{
    position: relative;
    padding: 6px 15px 6px 35px;//to create space on the right
    font-size: 13px;
    font-family: Arial;
}

.read-more:after{
    content: '';
    display: block;
    width: 10px;
    height: 15px;
    background-image: url('../images/btn-white-arrow-right.png');
    position: absolute;
    right: 12px;
    top: 10px;
}

Bằng cách sử dụng: sau bộ chọn, tôi thêm một phần tử bằng CSS chỉ để chứa biểu tượng nhỏ này. Bạn có thể làm tương tự bằng cách chỉ thêm một khoảng hoặc <i>phần tử bên trong phần tử a. Nhưng tôi nghĩ rằng đây là một cách dễ dàng hơn để thêm các biểu tượng vào các nút và nó được hỗ trợ nhiều trình duyệt.

bạn có thể kiểm tra các câu đố ở đây: http://codepen.io/anon/pen/PNzYzZ


điều đó content: ''; đúng hơn là content:0;nhưng đây là một giải pháp hữu ích cho tôi
Nat


2

Sử dụng trung tâm ngay làm vị trí sau đó thêm đường viền trong suốt để bù lại?


1
Điều đó không tệ, nhưng sau đó nội dung cũng sẽ được chuyển từ bên phải. Điều này có thể hoặc không thể là một thỏa thuận. Dưới đây là một ví dụ về cách nó trông giống: jsbin.com/ijewoq/1
nickf

Hãy nghĩ rằng đó chỉ là một trường hợp cân bằng với một chút thử nghiệm và lỗi :) hy vọng nó sẽ hoạt động!
André Figueira

2

Nếu bạn có thành phần chiều rộng cố định và biết chiều rộng của hình nền, bạn có thể chỉ cần đặt vị trí nền thành: chiều rộng của thành phần - chiều rộng của hình ảnh - khoảng cách bạn muốn ở bên phải.

Ví dụ: với phần tử rộng 100px và hình ảnh rộng 300px, để có khoảng cách 10px ở bên phải, bạn đặt nó thành 100-300-10 = -210px:

#myElement {
  background:url(my_image.jpg) no-repeat -210px top;
  width:100px;
}

Và bạn nhận được 80 pixel bên phải của hình ảnh bên trái phần tử của bạn và khoảng cách 20px ở bên phải.

Tôi biết nó nghe có vẻ ngu ngốc nhưng đôi khi nó giúp tiết kiệm thời gian ... Tôi sử dụng nó theo cách dọc (khoảng cách ở dưới cùng) cho các liên kết điều hướng với văn bản bên dưới hình ảnh.

Không chắc chắn nó áp dụng cho trường hợp của bạn mặc dù.


2

vấn đề của tôi là tôi cần hình nền giữ cùng khoảng cách với đường viền bên phải khi cửa sổ được thay đổi kích thước tức là cho máy tính bảng / điện thoại di động, v.v ... Cách khắc phục của tôi là sử dụng một percenatge như vậy:

background-position: 98% 6px;

và nó dính tại chỗ.


Điều đó có thể hoạt động trong các tình huống mà bạn biết chính xác kích thước của cửa sổ, nhưng trong phần lớn thời gian trên web, bạn không thể chắc chắn về điều đó. Hãy xem câu trả lời được chấp nhận sẽ hoạt động trong mọi tình huống (trên các trình duyệt được hỗ trợ).
nickf

2

Đúng! cũng để định vị hình ảnh nền như 0px từ phía bên phải của trình duyệt thay vì bên trái - tôi sử dụng:

background-position: 100% 0px;
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.