การใช้ URL สัมพัทธ์ในไฟล์ CSS ตำแหน่งใดที่สัมพันธ์กับ


484

เมื่อกำหนดบางอย่างเช่น URL ภาพพื้นหลังในไฟล์ CSS เมื่อใช้ URL ที่สัมพันธ์กันมันจะสัมพันธ์กับที่ไหน? ตัวอย่างเช่น:

สมมติว่าไฟล์/stylesheets/base-styles.cssมี:

div#header { 
    background-image: url('images/header-background.jpg');
}

หากฉันรวมสไตล์ชีทนี้ไว้ในเอกสารที่แตกต่างกันผ่านทาง<link ... />URL ที่เกี่ยวข้องในไฟล์ CSS จะสัมพันธ์กับเอกสารสไตล์ชีทใน/stylesheets/หรือสัมพันธ์กับเอกสารปัจจุบันที่รวมอยู่ด้วยหรือไม่ เส้นทางที่เป็นไปได้เช่น:

/item/details.html
/about/index.html
/about/extra/other.html
/index.html

คำตอบ:


551

ตามW3 :

URL บางส่วนถูกตีความสัมพันธ์กับแหล่งที่มาของสไตล์ชีทไม่ใช่สัมพันธ์กับเอกสาร

/stylesheets/ดังนั้นในการตอบคำถามของคุณก็จะมีความสัมพันธ์กับ

หากคุณคิดเกี่ยวกับสิ่งนี้สิ่งนี้สมเหตุสมผลเนื่องจากสามารถเพิ่มไฟล์ CSS ไปยังหน้าในไดเรกทอรีที่แตกต่างกันดังนั้นการกำหนดมาตรฐานให้กับไฟล์ CSS หมายความว่า URL จะทำงานได้ทุกที่ที่สไตล์ชีทมีการเชื่อมโยง


ดูเหมือนว่ามีข้อยกเว้นสำหรับกฎ: -ms-behaviorใน IE :(
pkyeck

2
มีข้อยกเว้นอื่น: เมื่อ url เป็นค่าเริ่มต้นของคุณสมบัติที่กำหนดเอง สมมติว่าคุณกำหนด.banner { background-image: var(--bgimg, url('images/default.jpg')); }แต่ไม่ได้กำหนดค่าสำหรับ--bgimgๆ จากนั้นบนหน้าเว็บ/index.htmlที่.bannerจะมองหา/images/default.jpgแต่ในหน้าอื่นจะมีลักษณะ IMO ที่เสียมาก /about/index.html.banner/about/images/default.jpg
chharvey

การแก้ไข: ข้อผิดพลาดค่าเริ่มต้นด้านบนได้รับการแก้ไขใน Chrome v60
chharvey

หาก css ของคุณอยู่ในกลุ่มเส้นทางจริง ๆ ไม่สำคัญ ไม่ใช่ที่ที่คุณคิดว่ามันจะเป็นอะไร
ท็อด

1
ฉันมีปัญหาเมื่อใช้คุณสมบัติ: background: var(--primary-color-background) no-repeat center center url("maps.jpg");สิ่งนี้ใช้ไม่ได้กับ IOS และ Safari เส้นทางที่แน่นอนเท่านั้นที่/resources/maps.jpgทำงานใน Safari ร่วมกับคุณสมบัติ css
andy


50

มันเกี่ยวข้องกับสไตล์ชีท แต่ฉันขอแนะนำให้สร้าง URL ที่เกี่ยวข้องกับ URL ของคุณ:

div#header { 
  background-image: url(/images/header-background.jpg);
}

ด้วยวิธีนี้คุณสามารถย้ายไฟล์ไปมาได้โดยไม่จำเป็นต้องปรับโครงสร้างไฟล์เหล่านั้นอีกในอนาคต


"/" พิเศษที่ด้านหน้าแตกต่างกันอย่างไร
Casebash

15
เช่นเดียวกับชื่อพา ธ ในบรรทัดคำสั่งส่วนนำ / ที่ด้านหน้าของพา ธ หมายความว่ามันชี้ไปยังทรัพยากรที่สมบูรณ์บนเว็บเซิร์ฟเวอร์ปัจจุบัน
David W. Keith

4
มีกรณีที่ควรใช้ URIs ที่เกี่ยวข้องกับไฟล์ CSS ดีกว่า ในกรณีของฉันฉันมีไดเรกทอรี "/ css /" ที่ฉันใส่ข้อมูล CSS ทั้งหมด ตอนนี้ฉันต้องการทดสอบคุณสมบัติใหม่บนเว็บไซต์ในโฟลเดอร์แยกต่างหาก มันยากที่จะทดสอบเช่นภาพพื้นหลังใหม่ในโฟลเดอร์ทดสอบ ทุกอย่างขึ้นอยู่กับความต้องการของคุณ ...
Diego

12
เส้นทางแบบสัมบูรณ์ทำให้การใส่โซลูชันในโฟลเดอร์ย่อยของโดเมนทำได้ยาก มีสาเหตุหลายประการที่คุณต้องการสนับสนุนโฟลเดอร์ย่อย ทำให้ง่ายต่อการทดสอบ (ตามที่กล่าวไว้ใน Diego) ซึ่งคุณสามารถมีรุ่นก่อนหน้า / รุ่นก่อนวางอยู่บนโดเมนเดียวกันกับผลิตภัณฑ์ การเปลี่ยนแปลงในอนาคตที่มีการตั้งค่าพร็อกซีเซิร์ฟเวอร์ขององค์กรเพื่อรองรับ SSO การย้ายโซลูชันทั้งหมดไปยังหนึ่งโดเมนและอื่น ๆ โดยเฉพาะอย่างยิ่งกับ SSL อาจต้องการหลีกเลี่ยงค่าใช้จ่ายในการดูแลรักษาชื่อโดเมนหลายโดเมน สำหรับฉันการพิจารณาเหล่านี้มีความสำคัญมากกว่า "ง่ายต่อการย้ายไฟล์. css ของฉัน"
Tedd Hansen

ภาพและสิ่งต่าง ๆ เช่นนั้นจะไปยังไงก็ตามดังนั้นมันจึงสมบูรณ์แบบ
Muhammad Umer

30

เพื่อสร้างสไตล์ชีตแบบแยกส่วนที่ไม่ได้ขึ้นอยู่กับตำแหน่งที่แน่นอนของทรัพยากรผู้เขียนอาจใช้ URIs ที่สัมพันธ์กัน URI ที่สัมพันธ์กัน (ตามที่กำหนดไว้ใน[RFC3986] ) ได้รับการแก้ไขให้เป็น URI เต็มรูปแบบโดยใช้ URI ฐาน RFC 3986, ส่วนที่ 5, กำหนดอัลกอริทึมเชิงบรรทัดฐานสำหรับกระบวนการนี้ สำหรับ CSS สไตล์ชีท URI พื้นฐานคือของสไตล์ชีทไม่ใช่ของเอกสารต้นฉบับ

ตัวอย่างเช่นสมมติว่ากฎต่อไปนี้:

body { background: url("yellow") }

ตั้งอยู่ในสไตล์ชีตที่กำหนดโดย URI:

http://www.example.org/style/basic.css

พื้นหลังของ BODY ของเอกสารต้นฉบับจะถูกปูด้วยภาพใดก็ตามที่อธิบายโดยทรัพยากรที่กำหนดโดย URI

http://www.example.org/style/yellow

ตัวแทนผู้ใช้อาจแตกต่างกันไปตามวิธีจัดการ URIs หรือ URIs ที่ไม่ถูกต้องซึ่งกำหนดทรัพยากรที่ไม่พร้อมใช้งานหรือไม่เหมาะสม

นำมาจากCSS 2.1 สเปค



5

ปัญหาหนึ่งที่อาจเกิดขึ้นและดูเหมือนว่าจะเกิดความผิดพลาดคือเมื่อใช้การย่อขนาด css ให้เล็กสุดโดยอัตโนมัติ เส้นทางการร้องขอสำหรับชุดข้อมูลแบบย่อสามารถมีเส้นทางที่แตกต่างจากต้นฉบับ CSS ได้ สิ่งนี้อาจเกิดขึ้นโดยอัตโนมัติเพื่อให้เกิดความสับสน

พา ธ คำร้องขอที่แม็พสำหรับบันเดิลแบบย่อควรเป็น "/ originalcssfolder / minifiedbundlename" ไม่ใช่แค่ "minifiedbundlename"

กล่าวอีกนัยหนึ่งตั้งชื่อบันเดิลของคุณให้มีพา ธ เดียวกัน (ด้วย /) เป็นโครงสร้างโฟลเดอร์ดั้งเดิมด้วยวิธีนี้แหล่งข้อมูลภายนอกใด ๆ เช่นฟอนต์รูปภาพจะแมปเพื่อแก้ไข URIs โดยเบราว์เซอร์ ทางเลือกคือใช้ url แบบสัมบูรณ์ (อ้างอิงใน css ของคุณ แต่โดยทั่วไปไม่ต้องการ


สิ่งนี้ช่วยฉันประหยัดเวลา! ขอบคุณ ควรได้รับการบันทึกเพิ่มเติม
mjbates7


-4

ลองใช้:

body {
  background-attachment: fixed;
  background-image: url(./Images/bg4.jpg);
}

Images เป็นโฟลเดอร์ที่ถือรูปภาพที่คุณต้องการโพสต์

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