วางตำแหน่งรูปภาพพื้นหลัง CSS x พิกเซลจากด้านขวาหรือไม่


321

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

ถ้าฉันตั้งbackground-positionค่าของ x และ y ดูเหมือนว่าเหล่านั้นจะให้การปรับพิกเซลคงที่จากด้านซ้ายและด้านบนตามลำดับเท่านั้น



อาจเป็นประโยชน์: stackoverflow.com/questions/1736922/…
jedierikb

คุณสามารถทำได้ด้วย CSS3 - ดูด้านล่าง
Druvision

เป็นไปได้ซ้ำกับstackoverflow.com/questions/5142405/…
Volker E.

@JoostS การแก้ไขนี้บังคับจริงหรือ
โทมัส Ayoub

คำตอบ:


473
background-position: right 30px center;

มันทำงานได้ในเบราว์เซอร์ส่วนใหญ่ ดู: http://caniuse.com/#feat=css-background-offsetsสำหรับรายการทั้งหมด

ข้อมูลเพิ่มเติม: http://www.w3.org/TR/css3-background/#the-background-position


"ฉันไม่รู้ว่ามันถูกต้องหรือไม่" ... ไม่ใช่ สถานที่ให้บริการที่มีปัญหามีคำสั่งมาตรฐานสำหรับค่า
Andrew Barber

14
ใช้ได้กับพื้นหลังและขอบเขต CSS 3 ซึ่งเป็นคำแนะนำของผู้สมัครแล้ว (มาตรฐานพร้อมสำหรับการใช้งาน): w3.org/TR/css3-background/#the-background-position
Ilya Streltsyn

19
สิ่งนี้ควรถูกเลือกเป็น "คำตอบที่ถูกต้อง" ตาม MDN นั้นรองรับ IE9 + และเบราว์เซอร์อื่น ๆ ทั้งหมดซึ่งยอดเยี่ยมมาก! developer.mozilla.org/en-US/docs/Web/CSS/...
fregante

5
ไม่แน่ใจว่าทำไมถึงไม่เลือกคำตอบนี้ สิ่งนี้ทำในสิ่งที่ต้องการอย่างแน่นอน
ChrisC

ลองใช้เครื่องมือ dev ของ Chrome และดูเหมือนว่าจะไม่ทำงาน (ยังไม่ได้ตรวจสอบอย่างละเอียด ... )
1nfiniti

93

เป็นไปได้ที่จะใช้คุณลักษณะborderเป็นความยาวจากด้านขวา

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

2
โซลูชันนี้ใช้งานได้ดีใน Safari แต่ไม่สามารถใช้งานได้กับ Chrome, Firefox หรือ IE
Andy Cook

4
ทำงานใน FF สำหรับฉัน และ Chrome และ IE 8 และ 9 ไม่ใช่ 7 แม้ว่า แฮ็คที่มีประโยชน์!
ndtreviv

3
ไม่เหมาะเมื่อกล่องที่คุณเลือกเป็นขอบมิฉะนั้นจะต้องมี div อื่นล้อมกรอบไว้ด้วย
Miguel

พื้นหลัง: url ('/ img.png') ศูนย์ 10px ซ้ำไม่ถูกต้อง สิ่งนี้จะใช้ได้ฉันเช็คอิน firefox
Asad kamran

66

มีวิธีเดียว แต่ไม่รองรับทุกเบราว์เซอร์ (ดูความคุ้มครองที่นี่ )

element {
  background-position : calc(100% - 10px) 0;
}

มันทำงานได้ในทุกที่ทันสมัยเบราว์เซอร์, แต่มันก็เป็นไปได้ว่า IE9 เป็น crashing ยังไม่มีการครอบคลุมสำหรับ = <IE8


5
นี่เป็นทางออกที่ทรงพลังมากสำหรับปัญหาการออกแบบจำนวนมาก จงระวัง!
deweydb

3
ดังนั้นนี่จึงดูเหมือนจะใช้งานไม่ได้แม้ใน Chrome ล่าสุด เมื่อฉันตรวจสอบองค์ประกอบมันบอกว่าจริงbackground-position-x: calc(90%);- คือมันเพิ่งลบ 10% จาก 100%
Simon_Weaver

@VententinE ที่เหมาะกับฉันด้วย :-) ฉันเห็นว่านี่แปลงเป็น 90% ได้แน่นอน - และฉันได้ตัดและวางสิ่งนี้โดยตรงจากโครเมี่ยม เว้นแต่จะมีข้อผิดพลาดแปลก ๆ ในการสร้างโครเมี่ยมฉันไม่แน่ใจว่าทำไม
Simon_Weaver

3
@ValentinE duh! ฉันคิดออก ฉันใช้ LESS สำหรับ css และมีฟังก์ชัน 'calc' ของตัวเองซึ่งมีความสำคัญกว่า สำหรับคนอื่นที่มีปัญหานี้โปรดดู: stackoverflow.com/questions/17904088/…
Simon_Weaver

ฉันเห็นที่นี่caniuse.com/#feat=calcว่าสิ่งนี้อาจทำให้ IE9 ผิดพลาดได้ - ดังนั้นถ้าคุณเชื่อใจคุณจะต้องจำการทดสอบใน IE9 แน่นอน
Simon_Weaver

33

เท่าที่ฉันรู้CSS สเปคไม่ได้ให้สิ่งที่คุณขอแน่นอนนอก CSS นิพจน์แน่นอน จากข้อสมมติฐานที่ว่าคุณไม่ต้องการใช้นิพจน์หรือ Javascript ฉันเห็นโซลูชันแฮ็กสามตัว:

  • ตรวจสอบให้แน่ใจว่าภาพพื้นหลังของคุณตรงกับขนาดของคอนเทนเนอร์ (อย่างน้อยก็ในความกว้าง) และตั้งค่าbackground-repeat: repeatหรือrepeat-xถ้าความกว้างเท่ากันเท่านั้น จากนั้นการมีบางสิ่งที่ปรากฏxพิกเซลจากด้านขวานั้นง่ายเหมือนbackground-position: -5px 0pxพิกเซลจากด้านขวาเป็นง่ายๆเป็น
  • การใช้เปอร์เซ็นต์สำหรับการbackground-positionจัดแสดงพฤติกรรมพิเศษที่เห็นได้ดีกว่าที่อธิบายไว้ที่นี่ ลองยิงดู โดยพื้นฐานแล้วbackground-position: 90% 50%จะทำให้ขอบด้านขวาของภาพพื้นหลังเรียงกัน 10% จากขอบด้านขวาของคอนเทนเนอร์
  • สร้าง div ที่มีภาพ กำหนดตำแหน่งขององค์ประกอบที่มีอย่างชัดเจนposition: relativeหากยังไม่ได้ตั้งค่า ตั้งค่าคอนเทนเนอร์รูปภาพเป็นposition: absolute; right: 10px; top: 10px;ปรับสองขั้นสุดท้ายตามที่เห็นสมควร วางคอนเทนเนอร์ div ของรูปภาพไว้ในองค์ประกอบที่มี

1
ขอบคุณสำหรับเคล็ดลับ! ใช่ฉันมีตอนนี้ตั้งค่า w /% แต่มันไม่ทำงานได้ดีในกรณีของฉัน สถานที่ที่ภาพ bg นี้ควรปรากฏอยู่ในองค์ประกอบที่มีขนาดแตกต่างกันมากดังนั้นแน่นอนว่าจำนวนออฟเซ็ตทางด้านขวาจะแตกต่างกันมากซึ่งจะฆ่าความสอดคล้อง ต่อไปฉันจะไปกับวิธีแก้ปัญหาแฮ็คบางฉันแน่ใจ แต่มันแปลกสำหรับฉันนี้ไม่ได้เป็นส่วนหนึ่งของข้อมูลจำเพาะ ดูเรียบง่ายพอคุณสามารถทำได้จากด้านบนหรือซ้ายทำไมไม่เริ่มด้านล่างหรือขวา ต่อไปอาจจะอยู่ใน css4 ซึ่งจะรองรับเบราว์เซอร์หลัก ๆ ได้อย่างเหมาะสมในช่วงเวลาที่ฉันตายไปแล้ว)
Doug

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

23

ลองสิ่งนี้:

#myelement {
  background-position: 100% 50%;
  margin-right: 5px;
}

โปรดทราบว่ารหัสด้านบนจะย้ายองค์ประกอบทั้งหมด (ไม่ใช่ภาพพื้นหลังเท่านั้น) 5px จากด้านขวา นี่อาจจะโอเคสำหรับกรณีของคุณ



8

การแก้ปัญหาภาพด้วยพิกเซลโปร่งใสทางด้านขวาเพื่อใช้เป็นระยะขอบขวา

วิธีแก้ปัญหาสำหรับรูปภาพแบบเดียวกันคือการสร้างภาพ PNG หรือ GIF (รูปแบบไฟล์ภาพที่สนับสนุนความโปร่งใส) ซึ่งมีส่วนที่โปร่งใสทางด้านขวาของภาพเท่ากับจำนวนพิกเซลที่คุณต้องการให้ระยะขอบด้านขวาของ ( เช่น: 5px, 10px เป็นต้น)

วิธีนี้ใช้ได้ดีกับความกว้างคงที่ตลอดจนความกว้างเป็นเปอร์เซ็นต์ เป็นวิธีแก้ปัญหาที่ดีสำหรับส่วนหัวของหีบเพลงที่มีรูปลูกศรบวก / ลบหรือลูกศรขึ้น / ลงทางด้านขวาของส่วนหัว!

ข้อเสีย: น่าเสียดายที่คุณไม่สามารถใช้ JPG ได้เว้นแต่ว่าส่วนพื้นหลังของคอนเทนเนอร์และสีพื้นหลังของภาพพื้นหลัง CSS มีสีเดียว (โดยไม่มีการไล่ระดับสี / บทความสั้น) ส่วนใหญ่เป็นสีขาว / ดำเป็นต้น


สำหรับฉันนี่เป็นทางออกเดียวที่ทำงานบนเบราว์เซอร์ทั้งหมด
Matthieu Napoli

7

หากคุณบังเอิญพบหัวข้อนี้ในเบราว์เซอร์สมัยใหม่คุณสามารถใช้ pseudo-class: หลังจากทำสิ่งที่เป็นประโยชน์กับพื้นหลัง

.container:after{
    content:"";
    position:absolute;
    right:20px;
    background:url(http://lorempixel.com/400/200) no-repeat right bottom;
}

css นี้จะใส่พื้นหลังไปที่มุมล่างขวาขององค์ประกอบ ".container" พร้อมช่องว่าง 20px ทางด้านขวา

ดูซอนี้เช่นhttp://jsfiddle.net/h6K9z/226/


ฉันชอบที่คุณจะไป แต่มัน: หลังจากนั้นเป็นองค์ประกอบที่ psuedo มากกว่าชั้นเรียน เพียงเพื่อความกระจ่าง
vmex151

ถูกต้อง แต่ไม่ทำงานกับเบราว์เซอร์รุ่นเก่าเช่น <IE 8
Miguel

1
@Miguel ไม่จำเป็นต้องทำงานที่นั่นอีกแล้ว ;-) ให้การออกแบบดูน่าเกลียดที่สุดสำหรับผู้ที่ยังใช้เวอร์ชั่นเก่ากว่า IE 8! (.. ตราบเท่าที่เว็บไซต์ยังคงสามารถเข้าถึงได้ .. )
James Cazzetta

5

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

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+ */

-webkit-calc ขัดข้อง Safari ของฉันโดยไม่มีการสำนึกผิด OSX 10.8.5 / Safari 6.0.5
SquareCat

4

เพียงแค่ใส่พิกเซล padding ลงในภาพ - เพิ่ม 10px หรืออะไรก็ตามที่มีขนาดผ้าใบของรูปภาพใน photohop และจัดแนวให้ถูกต้องใน CSS


4

ฉันพยายามทำสิ่งที่คล้ายกันเพื่อให้ได้ลูกศรดรอปดาวน์ที่ด้านขวาของส่วนหัวของตารางเสมอและเกิดสิ่งนี้ซึ่งดูเหมือนว่าจะทำงานใน Chrome และ Firefox แต่ซาฟารีบอกฉันว่ามันเป็นคุณสมบัติที่ไม่ถูกต้อง

background: url(http://goo.gl/P93P5Q) center right 10px no-repeat;

หลังจากทำสิ่งที่ยุ่งเหยิงในผู้ตรวจสอบฉันมากับโซลูชันข้ามเบราว์เซอร์ที่ทำงานใน IE8 +, Chrome, Firefox และ Safari รวมถึงการออกแบบที่ตอบสนอง

background: url(http://goo.gl/P93P5Q) no-repeat 95% center;

นี่คือ codepen ของลักษณะและการทำงาน Codepen เขียนด้วย SCSS - http://cdpn.io/xqGbk


ผมเตือนคุณว่าการตั้งค่า% นอกจากนี้ยังจะทำให้มันจัดขึ้นอยู่กับความยาวของภาชนะซึ่งอาจจะยุ่งถ้าคุณมีตู้คอนเทนเนอร์ขนาดใหญ่
มิเกล

4

หากคุณต้องการระบุเฉพาะแกน x คุณสามารถทำสิ่งต่อไปนี้:

background-position-x: right 100px;

สิ่งนี้ไม่ทำงานใน Chrome 81.0.4044.138 มันบอกว่ามูลค่าทรัพย์สินที่ไม่ถูกต้อง
Xandor

ฉันสามารถใช้งานได้: background-position: right -100px center;โปรดทราบว่าหากคุณไม่ใส่y-positionจะไม่ทำงานเพราะคิดว่าพิกเซลมีประโยชน์
Xandor

2

อีกวิธีที่ฉันไม่ได้กล่าวถึงคือการใช้องค์ประกอบเทียมและฉันเชื่อว่าวิธีนี้จะทำงานกับเบราว์เซอร์ที่รองรับ CSS 2.1 (เช่น IE8, ≥ Safari 2, ... ) และควรตอบสนองต่อ:

element::after
{
content:' ';
position:relative;
display:block;
width:100%;
height:100%;
bottom:0;
right:-5px; /* 10 px from the right of element inner-margin (padding) see example */
background:url() right center no-repeat;
}

ตัวอย่าง : องค์ประกอบเช่น สี่เหลี่ยมจัตุรัสขนาด 100px (โดยไม่พิจารณาเส้นขอบ) มีช่องว่างภายใน 10px และควรแสดงภาพพื้นหลังภายในช่องว่างด้านขวา ซึ่งหมายความว่าองค์ประกอบหลอกเป็นสี่เหลี่ยมจตุรัสขนาด 80px เราต้องการติดกับขอบด้านขวาขององค์ประกอบด้วยขวา: -10px; . หากเราต้องการให้ภาพพื้นหลังอยู่ห่างจากขอบด้านขวา 5px เราจำเป็นต้องติดหลอกองค์ประกอบ 5px ให้ห่างจากขอบด้านขวาขององค์ประกอบด้วยขวา: -5px; ... ทดสอบด้วยตนเองที่นี่: http://jsfiddle.net/yHucT/


1

หากคอนเทนเนอร์มีความสูงคงที่: ให้ลองหาอัตราร้อยละ (ตำแหน่งพื้นหลัง) จนกระทั่งพอดี

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

ฉันสะดุดกับคำถามนี้ในขณะที่ฉันพยายามรับพื้นหลังสำหรับกล่องที่เลือกเพื่อให้พอดีกับพูด 5 px จากด้านขวาของการเลือกของฉัน ในกรณีของฉันพื้นหลังของฉันเป็นลูกศรลงซึ่งจะแทนที่ไอคอนดรอปดาวน์พื้นฐาน ในกรณีของฉันการขยายจะยังคงเหมือนเดิม (5-10 พิกเซลจากด้านขวา) สำหรับพื้นหลังเสมอดังนั้นจึงเป็นการปรับเปลี่ยนได้ง่ายเพื่อนำไปสู่ภาพพื้นหลังจริง (ทำให้มีขนาดกว้างขึ้น 5-10 พิกเซลทางด้านขวา

หวังว่านี่จะช่วยได้!


1

คุณสามารถวางตำแหน่งภาพพื้นหลังของคุณในโปรแกรมแก้ไขให้เป็น x พิกเซลจากด้านขวา

background: url(images_url) no-repeat right top;

ภาพพื้นหลังจะอยู่ในตำแหน่งด้านบนขวา แต่จะปรากฏเป็น x พิกเซลจากด้านขวา


ทำให้มันย้อนกลับ .. แนวนอนและแนวตั้งของมัน
Ray

1

ร้อยละ Tweaking จากด้านซ้ายจะเปราะเล็กน้อยสำหรับความชอบของฉัน เมื่อฉันต้องการอะไรเช่นนี้ฉันมักจะเพิ่มสไตล์การจัดเก็บตู้คอนเทนเนอร์ของคุณไปที่องค์ประกอบของเสื้อคลุมแล้วใช้พื้นหลังกับองค์ประกอบภายในด้วยbackground-position: right bottom

<style>
    .wrapper {
        background-color: #333;
        border: solid 3px #222;
        padding: 20px;
    }
    .bg-img {
        background-image: url(path/to/img.png);
        background-position: right bottom;
        background-repeat: no-repeat;
    }
    .content-breakout {
        margin: -20px
    }
</style>

<div class="wrapper">
    <div class="bg-img">
        <div class="content-breakout"></div>
    </div>
</div>

.content-breakoutระดับเป็นตัวเลือกและจะช่วยให้เนื้อหาของคุณจะกินเข้าไปในช่องว่างภายในถ้าจำเป็น (ค่าขอบเชิงลบควรจะตรงกับค่าที่สอดคล้องกันในการขยายเสื้อคลุม) มัน verbose เล็กน้อย แต่ทำงานได้อย่างน่าเชื่อถือโดยไม่ต้องกังวลเกี่ยวกับการวางตำแหน่งสัมพัทธ์ของภาพเมื่อเทียบกับความกว้างและความสูง


1

มันค่อนข้างนานตั้งแต่มีการถามคำถามนี้ แต่ฉันเพิ่งพบปัญหานี้และฉันได้โดยทำ:

background-position:95% 50%;

อันนี้ใช้ได้สำหรับฉันค่อนข้างดีตราบใดที่คุณไม่ต้องการพิกเซลที่แน่นอนจากด้านขวา แต่เค้าโครงเลย์เอาต์ที่มากขึ้น
Jeff S.

0

คำตอบสำหรับค่าลบ ปรับ padding-right เพื่อเลื่อนภาพ

<div style='overflow:hidden;'>

    <div style='width:100% background:url(images.jpg) top right; padding-right:50px;'>

    </div>

</div>

0

สิ่งนี้ใช้ได้ใน Chrome 27 ฉันไม่รู้ว่ามันใช้งานได้จริงหรือไม่ ฉันรู้สึกประหลาดใจเกี่ยวกับเรื่องนี้

background: url(../img/icon_file_upload.png) top+3px right+10px no-repeat;

1
ไม่ถูกต้องโครเมี่ยมเป็นสิ่งที่ดีสำหรับคุณ
RozzA

0

ใช้งานได้กับเบราว์เซอร์จริงทั้งหมด (และสำหรับ IE9 +):

background-position: right 10px top 10px;

ฉันใช้ธีม RTL WordPress ดูตัวอย่าง: เว็บไซต์ชั่วคราวหรือเว็บไซต์จริงจะเปิดตัวเร็ว ๆ นี้ ดูไอคอนที่มุมขวาของ DIV ขนาดใหญ่


0

ดีกว่าสำหรับพื้นหลังทั้งหมด: url ('../ images / bg-menu-dropdown-top.png') เหลือ 20px ด้านบนไม่ทำซ้ำสำคัญ!

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