动态生成的HTML标签样式问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态生成的HTML标签样式问题相关的知识,希望对你有一定的参考价值。

我有三个文件,.html、.js和.css。我的HTML标签是在js文件中用createElement动态生成的。我的问题是,怎么给动态生成的这些标签匹配css样式,我所有样式都写在.css文件中。

动态生成的HTML标签样式一般可以使用2中方式确定

1、在生成HTML时将样式直接以style=""写在标签上;也就是使用行内样式

例如:

//动态生成html时,给html赋值行内样式
$("body").append("<div style='width:100px;height:100px;background:red;'>动态生成的div</div>");

2、预先定义好css样式,动态生成html时,将css类赋值给html

例:

/*定义css样式*/
.content
    width:100px;
    height:100px;
    background:red;

//在动态生成html时,将css样式赋值class
$("body").append("<div class='content'>动态生成html赋值class样式</div>");

总结:在动态生成html标签时,直接使用行内样式快捷,但不容易修改;使用预先定义好的css样式赋值html标签的class属性,容易修改;建议使用后者。

参考技术A 给你个例子自己看看吧,给生成的标签添加class属性,然后就和不是动态生成的一样了

<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<title>Temp Web Page</title>
<style type="text/css">
.li_classcolor:#f00;
</style>
</head>
<body>
<div id="div1"></div>

</body>

<script text="text/javascript">
var div1=document.getElementById("div1");
var e_li = document.createElement("li");
var e_text=document.createTextNode("这里是text");
e_li.setAttribute("class","li_class");
e_li.appendChild(e_text);
div1.appendChild(e_li);
</script>
</html>追问

我的意思是,
.li_classcolor:#f00;

是写在.css文件中 ,不和HTML文件写在一起,而是通过标签引用进来的

追答

把这个style加到引用的文件里不就可以了吗

参考技术B js:document.createElement("<input type='text' name='txtName' class='text-class'>");

css: .text-classborder:0;

样式化组件动态标签名称

【中文标题】样式化组件动态标签名称【英文标题】:Styled Component dynamic tag name 【发布时间】:2019-02-05 04:30:59 【问题描述】:

我想做一个动态组件。 (动态 TAG 将是一个样式化组件 -> 情感)

const Dynamic = ( tag: Tag, children, ...rest ) =>
   <Tag ...rest>
       children 
   </Tag>

该组件将是一个样式化的组件,例如:

const Column = styled(div)( color: 'red' )
const Row = styled(span)( color: 'yellow' )

这看起来很不错,而且工作正常,BUUUUUT:

当我尝试在另一个 DynamicComponent 中使用 DynamicComponent 时:

<DynamicComponent tag=Row>
   
      mapOver.map(item=>
         <DynamicComponent tag=Column/>
      )
   
</DynamicComponent>

那么出于某种原因,动态子代将使用动态父代的样式。

有什么我遗漏的吗?

附注:

如果不使用动态样式,我会这样做:

<Row>
   <Column/>
</Row>

那么样式、classNames、styled 标签就会被正确应用。

为了更清楚一点:

如您所见,DynamicComponent 将使用父级的样式、类名、样式标签...(不是我期望的行为)

【问题讨论】:

【参考方案1】:

以下示例为 styled-component 创建动态标签名称:

// All headings use the same styled-component "Heading" function
const StyledHeading = styled.div`
    font-size: $(level) => 4/level em; // <- dynamic font size
    font-weight: 300;
    margin: 0;
`

// the trick here is the "as=..." to create dynamic tag name
const Heading = (level = 1, children) => 
    <StyledHeading as=`h$level` level=level>
        children
    </StyledHeading>


ReactDOM.render([
    <Heading>Hello, world!</Heading>,
    <Heading level=2>Title 2</Heading>,
    <Heading level=3>Title 3</Heading>
  ] ,document.body
)
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<script src="https://unpkg.com/styled-components@4.4.1/dist/styled-components.min.js"></script>

参考:

"as" prop documentation

【讨论】:

【参考方案2】:

在使用 styled-components 时存在误解,因为标签旨在用作 HTML 标签(输入、div 等)。最好的方法是分别定义 StyledRow 和 StyledColumn 并以适当的名称使用它们。这也将有助于使您的代码更具可读性。

【讨论】:

有道理,我只是想看看别人是怎么看这种东西的。谢了哥们! :)

以上是关于动态生成的HTML标签样式问题的主要内容,如果未能解决你的问题,请参考以下文章

iOS - 动态类型和界面生成器

js动态生成数据列表

js动态生成数据列表

HTML5 视频:动态生成的视频标签仅第一次播放

Jquery 怎么获取动态生成的html元素,然后给其中的元素添加样式

利用js动态生成一个简单的商品详情页