Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 吞咽创建脚本以将css内联到头部_Javascript_Css_Gulp_Code Injection - Fatal编程技术网

Javascript 吞咽创建脚本以将css内联到头部

Javascript 吞咽创建脚本以将css内联到头部,javascript,css,gulp,code-injection,Javascript,Css,Gulp,Code Injection,我很难清楚地表达我想要什么,但我肯定以前有人问过我这个问题。我正在寻找一种方法,使用gulp将预编译的CSS注入到运行时执行的javascript函数中。基本上是这样的: build/index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, in

我很难清楚地表达我想要什么,但我肯定以前有人问过我这个问题。我正在寻找一种方法,使用gulp将预编译的CSS注入到运行时执行的javascript函数中。基本上是这样的:

build/index.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<body>

  <script src="js/script.js"></script>
</body>
</html>
内容:

<div> <!-- content here --></div>
div {
    background:red;
    }
/* more rules */
<script>(function(){
         var style=document.createElement('style');
             style.innerHTML='div{background:red;} /* all the other rules */';
             document.head.appendChild(style);
      }());</script>

<div></div>
编译为如下内容:

dist/index.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<body>

  <script src="js/script.js"></script>
</body>
</html>
内容:

<div> <!-- content here --></div>
div {
    background:red;
    }
/* more rules */
<script>(function(){
         var style=document.createElement('style');
             style.innerHTML='div{background:red;} /* all the other rules */';
             document.head.appendChild(style);
      }());</script>

<div></div>
(函数(){
var style=document.createElement('style');
style.innerHTML='div{background:red;}/*所有其他规则*/';
document.head.appendChild(样式);
}());
它不必完全像这样,但我希望我的意思是清楚的。我正在寻找一种方法来避免将css转换成一个内联字符串的工作,该字符串能够在运行时由js注入头部


清楚了吗?你知道在这个过程中有什么帮助吗?

这是我到目前为止所做的尝试

这是我的文件夹结构。使用
gulp将我的
SCSS
文件编译为
CSS

SCSS文件

body{
  background-color: black;
}
body{
  background-color: black;
}
CSS文件

body{
  background-color: black;
}
body{
  background-color: black;
}
script.js

(function(){
  var style = document.createElement("style");
  var xhttp = new XMLHttpRequest();
  xhttp.onreadystatechange = function(){
    if(this.readyState == 4 && this.status == 200){
      style.innerHTML = this.responseText;
    }
  };
  xhttp.open("GET","../css/style.css",true);
  xhttp.send();
  document.head.appendChild(style);
})();
index.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<body>

  <script src="js/script.js"></script>
</body>
</html>

文件
这就是我所做的。我已经创建了一个iLife(立即调用的函数表达式),它创建了一个
样式
元素。我正在向我的
style.css
文件发出ajax请求,并获取其内容。最后,将其附加到
标题
部分。我还没有包括
链接
标签。我正在从JS加载样式


这是你期望的吗

对于其他有类似问题的人,我就是这样解决问题的。
从插件开始,我对他的代码做了一些小的修改,完全实现了我想要的。从一开始,插件是一个没有依赖关系的单一文件。你可以在屏幕上看到他的原始代码。这就是我想到的:

'use strict';

var through = require('through2');

/**
 * Inject style tag with my minified, one-line css
 */

module.exports = function injectCSS() {
var stream = through.obj(function(file, enc, cb) {
var template = 'function injectStyles(rule) {\n' +
  'var style = document.createElement("style");\n' +
  'style.innerHTML = rule;\n' +
  'document.head.appendChild(style);\n' +
  '}\n' +
  "injectStyles('" + file.contents + "');\n";

file.contents = new Buffer(template);
    this.push(file);
    cb();
  });

  return stream;
}
唯一需要注意的是,我发现除了CSS文件的开头,我无法在任何地方包括
CSS媒体查询
@关键帧
(我确信有一个解决方案,我只是没有深入研究)。所以,我只是创建了多个css文件,脚本执行了多次,从而创建了多个样式元素。下面是一个在页面加载时附加到我的HTML的示例

<script>
(function(){

  function injectStyles(rule) {
    var style = document.createElement("style");
    style.innerHTML = rule;
    document.head.appendChild(style);
  }

  injectStyles('@media(min-width:375px){.visible-content{margin-left:auto !important}}');
}());
</script>

(功能(){
函数类型(规则){
var style=document.createElement(“样式”);
style.innerHTML=规则;
document.head.appendChild(样式);
}
injectStyles(“@media(最小宽度:375px){.visible content{margin left:auto!important}}”);
}());

希望这对其他人有用!:)

这就是我尝试签出我的答案的原因。我可以利用task runner来解决这个问题吗,因为我有一个解决方案。不幸的是,没有-它都需要内联,因为没有包含外部文件的地方。我有一个解决方案,我将在第二时间发布。事实上,我找到了一些很好的方法。你会明白我的意思。