Sử dụng URL tương đối trong tệp CSS, vị trí của nó có liên quan gì?


484

Khi xác định một cái gì đó như URL hình ảnh nền trong tệp CSS, khi sử dụng URL tương đối, nó có liên quan đến đâu? Ví dụ:

Giả sử tập tin /stylesheets/base-styles.csschứa:

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

Nếu tôi đưa biểu định kiểu này vào các tài liệu khác nhau thông qua <link ... />URL tương đối trong tệp CSS có liên quan đến tài liệu biểu định kiểu trong /stylesheets/hoặc liên quan đến tài liệu hiện tại thì nó được bao gồm không? Các đường dẫn có thể như:

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

Câu trả lời:


551

Theo W3 :

URL một phần được diễn giải liên quan đến nguồn của biểu định kiểu, không liên quan đến tài liệu

Do đó, trong câu trả lời cho câu hỏi của bạn, nó sẽ liên quan đến /stylesheets/.

Nếu bạn nghĩ về điều này, điều này có ý nghĩa, vì tệp CSS có thể được thêm vào các trang trong các thư mục khác nhau, do đó, tiêu chuẩn hóa nó thành tệp CSS có nghĩa là các URL sẽ hoạt động ở bất cứ nơi nào các bảng định kiểu được liên kết.


có vẻ như có một ngoại lệ cho quy tắc: -ms-behaviortrong IE :(
pkyeck

2
có một ngoại lệ khác: khi url là giá trị mặc định của thuộc tính tùy chỉnh. Nói rằng bạn xác định .banner { background-image: var(--bgimg, url('images/default.jpg')); }, nhưng chưa xác định một giá trị --bgimgnào. Sau đó, trên trang /index.html, một .bannersẽ tìm kiếm /images/default.jpg, nhưng trên một trang khác /about/index.htmlmột .bannersẽ xem xét /about/images/default.jpg. IMO rất hỏng.
chharvey

sửa lỗi: lỗi giá trị mặc định ở trên được sửa trong Chrome v60.
chharvey

nếu css của bạn nằm trong một gói thì đường dẫn thực sự không quan trọng. Đó không phải là nơi bạn nghĩ nó sẽ đến, không còn gì tương đối nữa.
Tod

1
Tôi gặp vấn đề khi sử dụng các thuộc tính: background: var(--primary-color-background) no-repeat center center url("maps.jpg");Điều này không hoạt động trong iOS và Safari. Chỉ đường dẫn tuyệt đối /resources/maps.jpghoạt động trong Safari kết hợp với thuộc tính css.
andy


50

Nó liên quan đến biểu định kiểu, nhưng tôi khuyên bạn nên tạo các URL liên quan đến URL của bạn:

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

Bằng cách đó, bạn có thể di chuyển các tệp của mình xung quanh mà không cần phải cấu trúc lại chúng trong tương lai.


Sự khác biệt nào "/" ở phía trước tạo ra?
Casebash

15
Giống như tên đường dẫn trên dòng lệnh, hàng đầu / ở phía trước của đường dẫn có nghĩa là nó trỏ đến một tài nguyên tuyệt đối trên máy chủ web hiện tại.
David W. Keith

4
Thực sự có một trường hợp sử dụng URI tốt hơn so với tệp CSS. Trong trường hợp của tôi, tôi có một thư mục "/ css /" nơi tôi đặt tất cả dữ liệu CSS. Bây giờ, tôi muốn thử nghiệm các tính năng mới trên trang web trong một thư mục riêng. Thật khó để kiểm tra, ví dụ, hình nền mới trong thư mục thử nghiệm. Tất cả phụ thuộc vào nhu cầu của bạn ...
Diego

12
Đường dẫn tuyệt đối làm cho khó đưa giải pháp vào thư mục con của miền. Có một số lý do tại sao bạn muốn hỗ trợ các thư mục con. Nó giúp việc kiểm tra dễ dàng hơn (như Diego đã đề cập) trong đó bạn có thể có phiên bản / bản phát hành trước nằm trên cùng một tên miền như prod. Những thay đổi trong tương lai nơi các máy chủ proxy công ty được thiết lập để hỗ trợ SSO, di chuyển tất cả các giải pháp sang một tên miền, v.v. Đặc biệt với SSL, người ta có thể muốn tránh việc sử dụng nhiều tên miền để duy trì. Đối với tôi những cân nhắc này quan trọng hơn nhiều so với "dễ dàng di chuyển tập tin .css của tôi".
Tedd Hansen

hình ảnh và những thứ như thế đi vào cdn anyways vì vậy điều này là hoàn hảo
Muhammad Umer

30

Để tạo các biểu định kiểu mô-đun không phụ thuộc vào vị trí tuyệt đối của tài nguyên, các tác giả có thể sử dụng các URI tương đối. Các URI tương đối (như được định nghĩa trong [RFC3986] ) được phân giải thành các URI đầy đủ bằng cách sử dụng URI cơ sở. RFC 3986, phần 5, định nghĩa thuật toán quy chuẩn cho quy trình này. Đối với biểu định kiểu CSS, URI cơ sở là biểu định kiểu chứ không phải của tài liệu nguồn.

Ví dụ: giả sử quy tắc sau:

body { background: url("yellow") }

được đặt trong một biểu định kiểu được chỉ định bởi URI:

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

Nền của BODY của tài liệu nguồn sẽ được lát bằng bất kỳ hình ảnh nào được mô tả bởi tài nguyên được chỉ định bởi URI

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

Tác nhân người dùng có thể khác nhau về cách họ xử lý các URI hoặc URI không hợp lệ chỉ định các tài nguyên không có sẵn hoặc không thể áp dụng.

Lấy từ thông số CSS 2.1 .



5

Một vấn đề có thể xảy ra và dường như phá vỡ điều này là khi sử dụng tự động giảm thiểu css. Đường dẫn yêu cầu cho gói được rút gọn có thể có đường dẫn khác với css ban đầu. Điều này có thể xảy ra tự động để nó có thể gây nhầm lẫn.

Đường dẫn yêu cầu được ánh xạ cho gói được rút gọn phải là "/ originalcssfolder / minifiedbundlename" chứ không chỉ là "minifiedbundlename".

Nói cách khác, đặt tên cho các gói của bạn có cùng đường dẫn (với /) là cấu trúc thư mục gốc, theo cách này, bất kỳ tài nguyên bên ngoài nào như phông chữ, hình ảnh sẽ ánh xạ để sửa URI của trình duyệt. Cách khác là sử dụng url tuyệt đối (refs trong css của bạn nhưng điều đó thường không được mong muốn.


Điều này giúp tôi tiết kiệm rất nhiều thời gian! Cảm ơn. Nó nên được ghi lại nhiều hơn
mjbates7

0

Điều này làm việc cho tôi. thêm hai dấu chấm và dấu gạch chéo.

body{
    background: url(../images/yourimage.png);
}

-4

Hãy thử sử dụng:

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

Images là thư mục giữ hình ảnh mà bạn muốn đăng.

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.