【问题标题】:<base> tag for CSS url() [duplicate]CSS url() 的 <base> 标记 [重复]
【发布时间】:2013-06-27 21:15:44
【问题描述】:

我正在寻找一种方法来引用 / 一个“自定义”网址。我使用的是本地浏览器之类的东西,/ 路径引用 / unix 路径(是的,操作系统根路径!),这绝对不是我放置文件的地方。

虽然我可以在 html 中使用 &lt;base&gt; 解决这个问题,但我不明白这是否也适用于 CSS url(),或者是否有类似的东西可以让我指定完整的 url。

此时我对任何解决方案持开放态度,即使使用带有一些自定义函数的 SASS,该函数将重写任何 url,将其替换为完整路径。

为了更清楚地说明我的问题,以下是我的问题的示例以及我希望如何解决它:

/mnt/projects/web/myproject/index.html

...
<base href="/mnt/projects/web/myproject/" />
...

/mnt/projects/web/myproject/style.scss

$base_url: "/path_to_root_folder_dinamically_fetched_on_client_pc/";
body
{
  background-image: url("#{$base_url}mydir/myimage.png");
}

最好的选择显然是url(/mydir/myimage.png) 有效,但通过网络阅读我知道它不起作用。

感谢您的任何建议。

更新 1:

对不起,答案都很好,但没有上下文,很难回答这个问题。 让我再解释一下:我正在使用一个软件 (node-webkit) 在本地运行一个“网站”(嗯,它是一个应用程序)。这或多或少是一个带有一些附加功能的自定义 Chromium 实例。

最大的问题是 node-webkit 使用 file:/// 协议,所以是的,文件协议的根路径实际上是你的操作系统的根目录,在 windows 上是 C:/,在 unix 系统上是 / 而不是直接是一个问题,因为这是一个本地应用程序(用户必须以某种方式安装它,我已经可以访问这个系统)。

第二个问题是,当你将应用程序打包成单个文件时,当用户运行它时,它会被解压到一个临时目录中,以便通过 file:/// 协议实际运行网站,例如 /tmp/随机数/index.html

因此,使用 / 这不是一个有效的选项,但是因为我的样式表足够分散(它是一个复杂的应用程序,我有类似 layouts/something.css main.css 和类似的东西),这是一个很大的必须始终为每个 url 重写 ../ 的问题。

我有什么选择?在这种情况下,javascript 选项并不像您想象的那么糟糕。另一个想法是运行一个非常小的网络服务器,它应该只提供静态的东西,但这需要是可移植的、跨平台的并且不需要安装。

我认为可以使用基本的 html 和 CSS 来解决这个问题,但看起来不是这样,虽然我可以通过 javascript 动态添加“base”标签,但 CSS 没有类似的东西。

【问题讨论】:

  • @GajusKuizinas 绝对是,虽然可能存在 时间 问题,我的意思是,CSS3 已经过时了,我想知道是否有某种解决方案(可能是 css 变量)

标签: html css node-webkit


【解决方案1】:

这是一个javascript解决方案

var absolute_path = "/abs_path/"

document.body.style.background = "url(" +  absolute_path + "mydir/myimage.png)"

您可以在每个需要url() 属性的元素上手动执行此操作。拥有一个遍历预定义selectors 列表并通过添加absolute_path 来修改其背景路径的函数应该相当简单。

【讨论】:

  • 这是一个绝对糟糕的答案——JavaScript 是最后需要的东西。维护也是一场噩梦
  • @Bojangles 我自己不会使用它,但从问题来看,听起来 OP 有他在 css 中不使用相对路径的原因(这是规范)。我已经给出了一个解决方案,可以根据给出的信息回答所提出的问题。
  • 我已经意识到 window.location.href 是错误的,只有当 href 是基本 url 时才有效.. 已更正!
  • @Bojangles:“不幸的是”,这是一个有效的答案,我认为就我而言,我已经写了一个巨大的更新来解释原因。无论如何,我仍然希望有一个更好的解决方案。
  • @Fire-Dragon-DoL 我从来没有使用过node.js,但process.cwd() 不会给你当前的基本目录,不管这是否是临时目录。无论您是否将应用程序打包为单个文件,您都只需要知道静态文件的位置(相对于您的基本目录)。相对路径选项仍然可行。您可以编写一个脚本来查找所有 css 文件并根据它们相对于基本目录的位置为它们生成相对路径。您可以在更改目录结构以更正任何损坏的链接时运行此脚本。
【解决方案2】:

只需将你的 CSS 放到你的基本路径中。

在这个结构中你必须使用路径:background-image: url(images/img1.png);

/index.html (loads styles.css)
/styles.css
/images/img1.png

在此结构中,您可以省略路径:background-image: url(img1.png);

/index.html (loads images/styles.css)
/images/styles.css
/images/img1.png

如果您使用更多路径,您可以拆分 CSS 并将每个部分放置到您需要的路径中。从 unix root 引用是一个严重的安全问题:

<link src="/etc/passwd"/>

您可以创建指向所需文件夹的符号链接。

【讨论】:

  • 在根文件夹中移动 css 不是一种选择,因为我的样式表很多而且很分散。但是,符号链接是一个有效的选项,但我想在不安装的情况下运行我的应用程序(我仍然可以将符号链接写入 tmp,这可能是一个有效的想法!),无论如何我写了一个大更新来解释这个问题,抱歉以前如此“通用”。
  • @Fire-Dragon-DoL 如果 lot 你的意思是少于 100,我会在这里使用蛮力:如果你在本地运行它,CSS 文件请求的数量不麻烦你。优点是可维护性:如果添加/重命名某些图像,您只需更改该文件夹中的 CSS。
  • 我不确定,如果您在 css 中有 10 个 url 并将其移动到不同的文件夹,则必须更改 10 ../ 路径,为了可维护性,这是一场噩梦,至少对我来说......我可能会考虑在使用 sass 或类似的东西时将所有内容合并到一个 css 文件中,这可能是一个不错的选择。
  • 如果您不使用路径,您可以将所有带有 css 文件的图像移动到另一个文件夹,您唯一需要更改的是 index.html 中的新 css 路径。如果还不够,您应该四处寻找适合您要求的 html/css 预处理器。
【解决方案3】:

我在我的 NodeWebkit 应用程序中使用 ../ 相对路径解决了同样的问题。您可能知道 CSS 相对于 HTML 的位置,因此您可以根据需要在树上上下移动。

例如:../../css/my.css

【讨论】:

  • 对不起,但我不喜欢这个解决方案,例如,如果我移动包含 10 个 css 文件的整个目录,我必须为所有这些文件重写 url。这是维护的噩梦。
  • 你不应该有 10 个单独的 CSS 文件。 (?!)
  • @Alisso 为什么不呢,这是完全合法的。这也比拥有一个文件和其中的所有 css 更好。
  • @hilnius 访问服务器 10 次以获取所有信息?! (不包括库的 CDN 链接......)。不,谢谢,一个文件,因此一个下载,来统治他们,除非我错过了一些新的东西:)
  • @Alisso 这就是我们现在连接 (/build) CSS 文件并在 HTML 中添加单个 的原因。拥有许多小而专注的 CSS 文件对于开发来说要干净得多。单个文件很容易进入 20k+ 行,这是维护的噩梦。
猜你喜欢
  • 1970-01-01
  • 2021-11-07
  • 2014-01-13
  • 2018-09-07
  • 2018-09-03
  • 2013-06-17
  • 2011-04-26
  • 2014-02-22
  • 1970-01-01
相关资源
最近更新 更多