ชดเชยภาพพื้นหลังจากด้านขวาโดยใช้ CSS


443

มีวิธีวางตำแหน่งภาพพื้นหลังในจำนวนพิกเซลจากด้านขวาขององค์ประกอบหรือไม่?

ตัวอย่างเช่นหากต้องการวางตำแหน่งบางสิ่งบางอย่างจำนวนพิกเซล (พูด, 10) จากด้านซ้ายนี่คือวิธีที่ฉันทำ:

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

คุณไม่ได้หมายความอย่างนั้นbackground-position: -10px 0;เหรอ? เพียงแค่ตรวจสอบ :)
30

1
ฉันรู้ว่านี่มีหลายรายการซ้ำกัน แต่ฉันไม่พบรายการใด ๆ เลย
Pekka

1
@thirtydot ที่เลื่อนไปทางซ้าย 10 พิกเซลจากขอบซ้าย
nickf

มันโง่ว่ามันไม่ได้เป็นใช้ได้ ...

@nickf คุณรู้หรือไม่ว่ามันไม่สามารถใช้ได้ในอุปกรณ์ส่วนใหญ่ภายในสิ้นปี 2013 ใช่ไหม?
Juan

คำตอบ:


786

ฉันพบคุณสมบัติ CSS3 นี้มีประโยชน์:

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

เท่าที่ฉันรู้ว่าสิ่งนี้ไม่ได้รับการสนับสนุนใน IE8 ใน Chrome / Firefox ล่าสุดทำงานได้ดี

ดูฉันสามารถใช้รายละเอียดเกี่ยวกับเบราว์เซอร์ที่รองรับได้หรือไม่

แหล่งที่ใช้แล้ว: http://tanalin.com/en/blog/2011/09/css3-background-position/

อัปเดต :

ขณะนี้ฟีเจอร์นี้รองรับเบราว์เซอร์หลักทั้งหมดรวมถึงเบราว์เซอร์มือถือ


23
นี้เป็นที่ดี แต่โชคร้ายที่มันไม่ทำงานบน Safari 5.1.7 (ซึ่งเป็นสิ่งสำคัญมากถ้าดูจากโทรศัพท์มือถือ)
MosheElisha

5
ใช้งานได้บนอุปกรณ์มือถือ (ตรวจสอบบน Android, iOS และ WindowsPhone) ยัง Safari 5.1.7 ไม่รองรับตำแหน่งพื้นหลังที่กำหนดเช่นที่นี่
Szorstki

8
ฉันใช้ตัวเลือกนี้ แต่มีเปอร์เซ็นต์ทางเลือกสำหรับเบราว์เซอร์รุ่นเก่าเช่น พื้นหลังตำแหน่ง: ศูนย์ 95%; พื้นหลังตำแหน่ง: ขวา 13px กลาง;
gregdev

1
ไม่แน่ใจว่ามีกี่คนที่ยังใช้เบราว์เซอร์ที่เก่าพอที่จะไม่สนับสนุน ผู้ใช้ Safari ควรเป็นเวอร์ชั่นที่ใหม่กว่าในตอนนี้แม้ว่าอุปกรณ์ Android รุ่นเก่าจะยังคงเปิดตัวอยู่ caniuse.com/#feat=css-background-offsetsง่ายพอที่จะใช้เปอร์เซ็นต์ทางเลือกสำหรับสิ่งเหล่านี้ (แม้ว่ามันจะไม่เหมือนกันก็ตาม)
ทำเครื่องหมาย

29
right left top bottomโปรดทราบว่านี้จะทำงานเฉพาะถ้าคุณระบุตำแหน่งพระคาร์ดินัลสำหรับทั้งแนวตั้งและแนวนอนเช่น ตัวอย่างเช่นสิ่งต่อไปนี้จะไม่แสดงผล: background-position: right 10px 10pxแต่ควรเขียนเป็นbackground-position: right 10px top 10px
chadiusvt

110

!! คำตอบที่ล้าสมัยเนื่องจากCSS3 นำคุณลักษณะนี้มา

มีวิธีวางตำแหน่งภาพพื้นหลังในจำนวนพิกเซลจากด้านขวาขององค์ประกอบหรือไม่?

Nope

วิธีแก้ปัญหายอดนิยม ได้แก่

  • การตั้งค่าmargin-rightบนองค์ประกอบแทน
  • เพิ่มพิกเซลโปร่งใสให้กับภาพและวางตำแหน่ง top right
  • หรือคำนวณตำแหน่งโดยใช้ jQuery หลังจากทราบความกว้างขององค์ประกอบ

6
การสนับสนุนที่ครอบคลุมมากขึ้นสำหรับ 'พื้นหลังตำแหน่ง' CSS3 แบบขยายอยู่ใกล้แค่เอื้อม
Vlad Magdalin

92

ทางออกที่ง่ายที่สุดคือใช้เปอร์เซ็นต์ นี่ไม่ใช่คำตอบที่คุณต้องการอย่างแน่นอนเพราะคุณถามถึงความแม่นยำของพิกเซล แต่ถ้าคุณต้องการบางสิ่งบางอย่างเพื่อให้เกิดช่องว่างระหว่างขอบด้านขวาและภาพ

รหัส:

/* 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 "เราจะผ่านการจัดแนวพิกเซลในสัปดาห์หน้า" - ใช้งานได้เสมอ
moonwave99

2
วิธีนี้ดูเหมือนว่าจะทำงานได้อย่างสม่ำเสมอบนเบราว์เซอร์
Evan Haas

49

คำตอบที่ล้าสมัย: ขณะนี้มีการใช้งานในเบราว์เซอร์หลักดูคำตอบอื่น ๆ สำหรับคำถามนี้

CSS3 ได้แก้ไขสเปคของbackground-positionมันเพื่อที่จะทำงานกับจุดกำเนิดที่แตกต่างกัน น่าเสียดายที่ฉันไม่พบหลักฐานใด ๆ ที่นำไปใช้กับเบราว์เซอร์หลัก ๆ

http://www.w3.org/TR/css3-background/#the-background-position ดูตัวอย่างที่ 12

background-position: right 3em bottom 10px;

ขอบคุณ Tami! น่าเสียดายที่นี่ไม่ได้ผลกับฉันใน Firefox 4 หรือ Chrome 11
nickf

สิ่งนี้ถูกนำไปใช้ใน Opera คิดว่ามันดีเกินไปที่จะเป็นจริงจากนั้นฉันทดสอบในเบราว์เซอร์อื่นและฉันพูดถูก
Vian Esterhuizen

1
ยังไม่สามารถใช้งานได้ใน Chrome เวอร์ชันปัจจุบัน Version 21.0.1180.89
andlrc

3
Chrome Canary (v26) รองรับสิ่งนี้แล้ว เมื่อนั่นไหลลงสู่ช่องทางที่วางจำหน่ายและ Safari อัปเดตเครื่องมือของพวกเขาเพียง IE6-8 เท่านั้นที่จะขาดการสนับสนุน (IE9 / 10 รองรับรูปแบบใหม่แล้ว)
Vlad Magdalin

1
เพิ่งทดสอบและตอนนี้มันทำงานใน Firefox (v.18.0.2), IE (v.9.0.8) และ Chrome (v.25.0.1364.97) แต่มันยังไม่ทำงานใน Safari (v.5.1.2) . จะรักที่จะรู้ว่าถ้าใครรู้ว่าเมื่อไหร่จะเปิดตัว ;-)
Chaya Cooper

40

ตามที่เสนอไว้ที่นี่นี่เป็นโซลูชันเบราว์เซอร์ข้ามที่ใช้งานได้อย่างสมบูรณ์แบบ:

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

ฉันใช้มันตั้งแต่คุณสมบัติ CSS3 ในการระบุการชดเชยที่เสนอในคำตอบที่ทำเครื่องหมายว่าแก้ปัญหายังไม่ได้รับการสนับสนุนในเบราว์เซอร์ เช่น


1
แล้วเมื่อฉันต้องการให้เส้นขอบนั้นมีสีอะไร
machineaddict

1
นี่เป็นคำตอบที่ยอดเยี่ยมเพราะคุณสามารถมีความแม่นยำของพิกเซลในขณะที่สามารถใช้งานข้ามเบราว์เซอร์ได้ ขอบคุณ! (และถ้าคุณต้องการเส้นขอบที่มีสีบางให้ใช้กระดาษห่อบางประเภทที่จะตัดการป้อนข้อมูลและเพิ่มชายแดนไปยังองค์ประกอบที่.)
กาวิน

23

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

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

เคล็ดลับที่เรียบง่าย แต่สกปรกคือการเพิ่มออฟเซ็ตที่คุณต้องการให้กับรูปภาพที่คุณใช้เป็นพื้นหลัง มันไม่สามารถบำรุงรักษาได้ แต่ทำให้งานเสร็จ


8

นี้จะทำงานบนมากที่สุดเบราว์เซอร์ที่ทันสมัย ... นอกเหนือจาก IE (สนับสนุนเบราว์เซอร์) แม้ว่าหน้านั้นจะแสดงรายการ> = IE9 ตามที่รองรับการทดสอบของฉันไม่เห็นด้วย

คุณสามารถใช้คุณสมบัติ calc () css3 ได้

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

สำหรับฉันนี่เป็นวิธีที่สะอาดและสมเหตุสมผลที่สุดเพื่อให้ได้มาร์จิ้นไปทางขวา ฉันยังใช้ทางเลือกในการใช้border-right: 10px solid transparent;งาน IE


1
นี้เป็นที่ดี แต่โชคร้ายที่มันไม่ทำงานบน Safari 5.1.7 (ซึ่งเป็นสิ่งสำคัญมากถ้าดูจากโทรศัพท์มือถือ)
MosheElisha

จากนั้นคุณควรใช้ตำแหน่งพื้นหลังที่ทำงานใน Safari และเบราว์เซอร์ที่สามารถใช้แทนที่ได้ ตัวอย่างเช่น: background-position: 92% 8px; background-position: calc(100% - 12px) 8px;
Laki Politis

ไม่ทำงานบนเบราว์เซอร์ทั้งหมดครับ right 10px centerไวยากรณ์มีการสนับสนุนการขยายเพิ่มเติมในเบราว์เซอร์
Farzad YZ

โปรดอ่านบรรทัดแรกที่ฉันระบุว่าใช้งานได้กับ "เบราว์เซอร์ที่ทันสมัยที่สุด" ฉันไม่เคยพูดว่ามันใช้ได้กับพวกเขาทั้งหมด
Novocaine

ตาม caniuse, การใช้ calc จะผิดพลาด IE9 ... เมื่อคุณแทนที่_ด้วย-
Ruskin

4

ตกลงถ้าฉันเข้าใจสิ่งที่คุณถามคุณจะทำเช่นนี้;

คุณมีคอนเทนเนอร์ DIV ของคุณถูกเรียก#main-containerและ.my-elementอยู่ในนั้น ใช้สิ่งนี้เพื่อให้คุณเริ่มต้น;

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

โดยวิธีการที่ดีกว่าการใช้คลาสถ้าคุณอ้างถึงองค์ประกอบระดับต่ำกว่าในหน้า (ฉันคิดว่าคุณจึงเปลี่ยนชื่อของฉันข้างต้น


3

ข้อมูลจำเพาะ CSS3 ที่อนุญาตให้ต้นกำเนิดที่แตกต่างกันสำหรับตำแหน่งพื้นหลังได้รับการสนับสนุนใน Firefox 14 แต่ยังไม่ได้อยู่ใน Chrome 21 (เห็นได้ชัดว่า IE9 สนับสนุนบางส่วน แต่ฉันไม่ได้ทดสอบด้วยตนเอง)

นอกเหนือจากปัญหาของ Chrome ที่ @MattyF อ้างถึงแล้วยังมีบทสรุปที่กระชับมากขึ้นที่นี่: http://code.google.com/p/chromium/issues/detail?id=95085


ฉันเพิ่งทดสอบมันและตอนนี้มันทำงานได้ใน Firefox (v.18.0.2), IE (v.9.0.8) และ Chrome (v.25.0.1364.97) แต่ไม่ใช่ใน Safari (v.5.1.2)
Chaya Cooper

3

หากคุณมีองค์ประกอบตามสัดส่วนคุณสามารถใช้:

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

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

ในตัวอย่างนี้.validจะเป็นคลาสที่มีรูปภาพและ.halfจะเป็นแถวที่มีขนาดครึ่งหนึ่งของขนาดมาตรฐาน

สกปรก แต่ทำงานเป็นเสน่ห์และจัดการได้อย่างสมเหตุสมผล


1
ในกรณีของฉัน (ใช้รูปแบบความกว้างคงที่) สิ่งนี้ทำตามที่ฉันต้องการ ขอบคุณ
กาวิน

3

หากคุณต้องการใช้สิ่งนี้เพื่อเพิ่มลูกศร / ไอคอนอื่น ๆ ลงในปุ่มคุณสามารถใช้องค์ประกอบหลอกหลอก CSS ได้หรือไม่?

หากเป็นภาพพื้นหลังจริง ๆ สำหรับปุ่มทั้งปุ่มฉันมักจะรวมระยะห่างลงในภาพและเพียงแค่ใช้

background-position: right 0;

แต่ถ้าฉันต้องเพิ่มตัวอย่างเช่นลูกศรที่ออกแบบให้กับปุ่มฉันมักจะมี html นี้:

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

และมักจะทำสิ่งต่อไปนี้ด้วย 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;
}

โดยใช้: หลังจากตัวเลือกฉันเพิ่มองค์ประกอบโดยใช้ CSS เพียงเพื่อให้มีไอคอนขนาดเล็กนี้ คุณสามารถทำเช่นเดียวกันได้โดยเพิ่มการขยายหรือ<i>องค์ประกอบภายในองค์ประกอบ แต่ฉันคิดว่านี่เป็นวิธีที่สะอาดกว่าในการเพิ่มไอคอนให้กับปุ่มต่างๆและรองรับข้ามเบราว์เซอร์

คุณสามารถตรวจสอบซอที่นี่: http://codepen.io/anon/pen/PNzYzZ


ควรจะcontent: ''; ดีกว่าcontent:0;แต่นี่เป็นวิธีแก้ปัญหาที่มีประโยชน์สำหรับฉัน
Nat


2

ใช้กึ่งกลางขวาเป็นตำแหน่งจากนั้นเพิ่มเส้นขอบโปร่งใสเพื่อชดเชยหรือไม่


1
ไม่เลวเลย แต่เนื้อหาก็จะถูกย้ายจากด้านขวา สิ่งนี้อาจเป็นหรือไม่เป็นผู้แจกไพ่ก็ได้ นี่คือตัวอย่างของลักษณะที่ปรากฏ: jsbin.com/ijewoq/1
nickf

คิดว่าเป็นกรณีของการสร้างความสมดุลด้วยการลองผิดลองถูกเล็กน้อย :) หวังว่าจะได้ผล!
André Figueira

2

หากคุณมีองค์ประกอบความกว้างคงที่และทราบความกว้างของภาพพื้นหลังของคุณคุณสามารถกำหนดตำแหน่งพื้นหลังเป็น: ความกว้างขององค์ประกอบ - ความกว้างของภาพ - ช่องว่างที่คุณต้องการทางด้านขวา

ตัวอย่างเช่น: ด้วยองค์ประกอบกว้าง 100px และรูปภาพกว้าง 300px เพื่อให้มีช่องว่าง 10px ทางด้านขวาคุณตั้งค่าเป็น 100-300-10 = -210px:

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

และคุณได้ภาพที่ถูกต้องที่สุด 80 พิกเซลทางด้านซ้ายขององค์ประกอบและช่องว่าง 20px ทางด้านขวา

ฉันรู้ว่ามันฟังดูงี่เง่า แต่บางครั้งก็ประหยัดเวลา ... ฉันใช้มันในแนวตั้ง (ช่องว่างที่ด้านล่าง) สำหรับลิงก์การนำทางพร้อมข้อความด้านล่างภาพ

ไม่แน่ใจว่ามันใช้กับกรณีของคุณ


2

ปัญหาของฉันคือฉันต้องการภาพพื้นหลังเพื่อให้อยู่ในระยะห่างจากขอบด้านขวาเมื่อปรับขนาดหน้าต่างเช่นแท็บเล็ต / มือถือ ฯลฯ การแก้ไขของฉันคือการใช้ percenatge ดังนี้:

background-position: 98% 6px;

และมันติดอยู่ในสถานที่


สิ่งนี้อาจใช้งานได้ในสถานการณ์ที่คุณทราบขนาดของหน้าต่างอย่างแน่นอน แต่สำหรับเวลาส่วนใหญ่บนเว็บคุณไม่สามารถแน่ใจได้ ดูคำตอบที่ยอมรับซึ่งจะใช้ได้ในทุกสถานการณ์ (บนเบราว์เซอร์ที่รองรับ)
nickf

2

ใช่! ดีที่จะวางตำแหน่งภาพพื้นหลังราวกับว่า 0px จากด้านขวามือของเบราว์เซอร์แทนซ้าย - ฉันใช้:

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