我们想将作为字符串输入的CSS样式转换为JS对象。
,例如,
var input = " border:solid 1px; color:red ";
预期的JS对象:
{
border:"solid 1px",
color:"red"
}
当然,样式条目的数量是无限的,以及样式的名称(边框,颜色,字体,z-index等...)。 THX。
答案 0 :(得分:8)
一个非常简单的一个:
var regex = /([\w-]*)\s*:\s*([^;]*)/g;
var match, properties={};
while(match=regex.exec(cssText)) properties[match[1]] = match[2].trim();
答案 1 :(得分:2)
您可以使用Javascript拆分功能:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/split
首先用;
分隔字符串作为分隔符,然后用:
分割每个结果,将项目放在对象中。
e.g。
var result = {},
attributes = input.split(';');
for (var i = 0; i < attributes.length; i++) {
var entry = attributes[i].split(':');
result[entry.splice(0,1)[0]] = entry.join(':');
}
答案 2 :(得分:2)
以功能形式:
var styleInput = " border:solid 1px; color:red ";
var result = styleInput.split(';').reduce(function (ruleMap, ruleString) {
var rulePair = ruleString.split(':');
ruleMap[rulePair[0].trim()] = rulePair[1].trim();
return ruleMap;
}, {});
在将字符串用作对象键之前修剪字符串。
答案 3 :(得分:2)
所有答案似乎需要大量分裂 - 为什么不进行比赛并一次性获得所有对?
function cssSplit(str){
var O= {},
S= str.match(/([^ :;]+)/g) || [];
while(S.length){
O[S.shift()]= S.shift() || '';
}
return O;
}
答案 4 :(得分:1)
const css2obj = css => {
const r = /(?<=^|;)\s*([^:]+)\s*:\s*([^;]+)\s*/g, o = {};
css.replace(r, (m,p,v) => o[p] = v);
return o;
}
console.log( css2obj("z-index: 4; opacity:1; transition-duration: 0.3s;") )
如果您想将dash-case
CSS属性转换为camelCase
中的JS表示,而不是p
使用p.replace(/-(.)/g, (m,p) => p.toUpperCase())
Oldschool JS:
function cssToObj(css) {
var obj = {}, s = css.toLowerCase().replace(/-(.)/g, function (m, g) {
return g.toUpperCase();
}).replace(/;\s?$/g,"").split(/:|;/g);
for (var i = 0; i < s.length; i += 2)
obj[s[i].replace(/\s/g,"")] = s[i+1].replace(/^\s+|\s+$/g,"");
return obj;
}
console.log( cssToObj("z-index: 4; opacity:1; transition-duration: 0.3s;") );
答案 5 :(得分:1)
只是为了好玩和完整......
我还没有检查过跨浏览器兼容性(仅在Chrome中尝试过),它有一些怪癖:
var input = "font-weight:bold; color: blue; margin: 0 15px";
var e = document.createElement("div");
e.setAttribute("style", input);
var output = {};
for (var i = 0; i < e.style.length; i++) {
var name = e.style[i];
var value = e.style.getPropertyValue(name);
output[name] = value;
}
奇怪的是,即使我们传入了一个margin
声明,我们也会得到一个像
{
color: "blue",
font-weight: "bold",
margin-bottom: "0px",
margin-left: "15px",
margin-right: "15px",
margin-top: "0px",
}
根据你所追求的目标,这可能是好事还是坏事。
答案 6 :(得分:0)
这样的事情会让你非常接近:
var input = " border:solid 1px; color:red ";
var output = '{' + input.replace(/([\w-.]+)\s*:([^;]+);?/g, '\n $1:"$2",') + '\n}';
...匝
" border:solid 1px; color:red "
进入
{
border:"solid 1px",
color:"red ",
}
答案 7 :(得分:0)
这是我将CSS字符串转换为对象的函数:
function cssConverter(style) {
var result = {},
attributes = style.split(';'),
firstIndexOfColon,
i,
key,
value;
for(i=0; i<attributes.length; i++) {
firstIndexOfColon = attributes[i].indexOf(":");
key = attributes[i].substring(0, firstIndexOfColon);
value = attributes[i].substring(firstIndexOfColon + 1);
key = key.replace(/ /g, "");
if(key.length < 1){
continue;
}
if(value[0] === " "){
value = value.substring(1);
}
if(value[value.length - 1] === " "){
value = value.substring(0, value.length - 1);
}
result[key] = value;
}
return result;
};
答案 8 :(得分:0)
如果您想要一个可与React一起轻松使用的标记模板文字语法,则可以
const camelCase = str => str.replace(/-(.)/g, (_,p) => p.toUpperCase())
const css2obj = (strings, ...vals) => {
const css = strings.reduce((acc, str, i) => acc + str + (vals[i] || ''), '')
const r = /(?<=^|;)\s*([^:]+)\s*:\s*([^;]+)\s*/g, o = {};
css.replace(r, (m,p,v) => o[camelCase(p)] = v);
return o;
}
const center = 'center'
const reactInlineCSS = css2obj`
align-items: ${center};
justify-content: ${center};
`
console.log(reactInlineCSS)
答案 9 :(得分:0)
现在,您可以使用第三方库,例如style-to-object。例如:
import parse from 'style-to-object';
const input = " border:solid 1px; color:red ";
parse(input); // => {border: "solid 1px", color: "red"}