避免额外使用span

时间:2015-06-24 00:31:57

标签: javascript

我的问题是我有一个HTML代码<p> Hello World </p>

想要使用JavaScript更改每个字母的CSS。基本上,我会改变背景颜色来制作动画。有没有办法做到这一点,而不是在每个字母周围做一个跨度或某种标记,并经历所有这些困难?

我的字符串数组有颜色,方法调用正确的颜色(数据索引属性)。

谢谢!

编辑:我通过创建一个迭代innerHTML字符串索引的函数并为字母分配数据索引,让整个单词改变颜色并思考一个想法。通过编辑 Cymen 下面提供的功能来跨越。这是一个好方法吗?

3 个答案:

答案 0 :(得分:5)

不,您需要使用支持function wrapInSpans(string) { return '<span>' + string.split('').join('</span><span>') + '</span>'; } 的标记。您可以轻松地将一串字符包裹在跨度中:

var React = require('react');
var Router = require('react-router');
var Route = Router.Route;
var RouteHandler = Router.RouteHandler;

var About = require('./About');
var Inbox = require('./Inbox');

var App = React.createClass({
    render () {
      return (
        <div>
          <h1>App</h1>
          <RouteHandler/>
        </div>
      )
    }
});

var routes = (
  <Route handler={App}>
    <Route path="about" handler={About}/>
    <Route path="inbox" handler={Inbox}/>
  </Route>
);

Router.run(routes, Router.HashLocation, (Root) => {
    React.render(<Root/>, document.getElementById('app'));
});

答案 1 :(得分:1)

这需要相当多的代码才能完全拼出来,但是,如果在你的情况下非常重要的是不实际添加某种类型的包装元素,那么我相信这可以通过动态生成背景图片。

大致的步骤是:

  1. 创建一个Range,其中包含您所关注元素的.textContent中每个字符的开头和结尾。
  2. .getBoundingClientRect()在每个范围内获取其渲染尺寸。
  3. 将所需颜色的矩形绘制为<canvas>
  4. <canvas>导出为data URI。
  5. data URI用作background-image
  6. 对您关注的每个块显示元素重复。
  7. 请注意,毫无疑问,此方法中存在各种边缘情况以及可能的浏览器支持限制。显然,只包装每个角色要简单得多。

答案 2 :(得分:1)

您必须使用JavaScript函数将每个字符包装在<span>

window.onload = function() { // when everything loads, run the function
     var elem = document.getElementById( "someId" );
     var text = elem.innerHTML; // get the <p>'s text content
     elem.innerHTML = ""; // then make the <p> empty
     for( var i=0; i<text.length; i++ ) { // for each character in the text
           elem.innerHTML += "<span>"+text[i]+"</span>";
     }
};

记得改变&#34; someId&#34;到<p>元素的ID。

您可以使用for访问text[i]循环中的每个角色。