1.模板渲染:

html模板

  1. <ul class="list J_list"></ul>
  2. <script type="text/html" id="J_itemTpl">
  3. <li class="list-item">
  4. <div class="inner">
  5. <div class="img">
  6. <img src="http://10.url.cn/qqcourse_logo_ng/ajNVdqHZLLAibZAsw0xhFpUeJmHcOGzXwIMu8d3tz5388Tod9zfTYzKRr3Yum8M4ibBHtXGn3iaH34/356?tp=webp" />
  7. </div>
  8. <div class="info">
  9. <h4>{{classname}}</h4>
  10. <p class="row-2">{{name}}老师</p>
  11. <p class="row-3">{{watched}}人学习</p>
  12. </div>
  13. </div>
  14. </li>
  15. </script>

精简版

var tpl = document.getElementById('J_itemTpl').innerHTML,
    oList = document.getElementsByClassName('J_list')[0];


renderList(data, tpl, oList);

function renderList(data, tpl, oList) {
    var list = '';
    data.forEach(function (elem) {
        list += tpl.replace(/{{(.*?)}}/g, function (node, key) {
            return {
                career: elem.career,
                city: elem.city,
                salary: elem.salary,
                img: elem.img
            } [key];
        });
    });
    // 需插入的模板
    oList.innerHTML = list;
}

详细版

function render() {
    //字符串数据
    var jsonData = document.getElementById('J_data').innerHTML,
        //渲染的数据模板
        tpl = document.getElementById('J_tpl').innerHTML,
        //字符串数据转json
        data = JSON.parse(jsonData),
        len = data.length,
        // 渲染后插入的列表
        oList = document.getElementsByClassName('js-list')[0],
        list = '',
        item;

    for (var i = 0; i < len; i++) {
        item = data[i];
        list += setTplToHTML(tpl, regTpl, {
            career: item.career,
            city: item.city,
            salary: item.salary,
            img: item.img
        })
    }
    // 循坏完成将数据填充进oList里列表
    oList.innerHTML = list;
}

// 需要渲染的数据项
function dataObj(data) {
    return {
        career: data.career,
        city: data.city,
        salary: data.salary,
        img: data.img
    }
}

//  tpl:渲染模板,regExp:正则替换规则,opt数组中的每一项
function setTplToHTML(tpl, regExp, opt) {
    return tpl.replace(regExp(), function (node, key) {
        console.log(node, key);
        return opt[key];
    })
}

// 正则替换规则
function regTpl() {
    return new RegExp(/{{(.*?)}}/, 'gim');
}

render();

2.案例实战

image.png

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="./css/index.css">
</head>

<body>
    <div class="cover">
        <div class="student-album">
            <div class="album-title">
                <h1>心有猛虎 细嗅蔷薇</h1>
                <p>一万年太久 只争朝夕</p>
            </div>
            <div class="album-wrap">
                <ul class="list js-list clearfix">
                </ul>
            </div>
        </div>
    </div>
    <div id="J_data" style="display: none;">
        [{"id":"1","career":"\u524d\u7aef\u5de5\u7a0b\u5e08","city":"\u5317\u4eac","salary":"15","img":"1.jpg"},{"id":"2","career":"\u524d\u7aef\u5de5\u7a0b\u5e08","city":"\u5e7f\u5dde","salary":"11","img":"2.jpg"},{"id":"3","career":"\u524d\u7aef\u5de5\u7a0b\u5e08","city":"\u4e0a\u6d77","salary":"10","img":"3.jpg"},{"id":"4","career":"\u524d\u7aef\u5de5\u7a0b\u5e08","city":"\u6210\u90fd","salary":"9","img":"4.jpg"},{"id":"5","career":"\u540e\u7aef\u5de5\u7a0b\u5e08","city":"\u5317\u4eac","salary":"11","img":"5.jpg"},{"id":"6","career":"\u524d\u7aef\u5de5\u7a0b\u5e08","city":"\u5317\u4eac","salary":"13","img":"6.jpg"},{"id":"7","career":"\u524d\u7aef\u5de5\u7a0b\u5e08","city":"\u6df1\u5733","salary":"12","img":"7.jpg"},{"id":"8","career":"\u524d\u7aef\u5de5\u7a0b\u5e08","city":"\u4e0a\u6d77","salary":"10","img":"8.jpg"},{"id":"9","career":"\u540e\u7aef\u5de5\u7a0b\u5e08","city":"\u6210\u90fd","salary":"10","img":"9.jpg"},{"id":"10","career":"\u524d\u7aef\u5de5\u7a0b\u5e08","city":"\u5317\u4eac","salary":"18","img":"10.jpg"}]
    </div>

</body>
<script type="text/html" id="J_tpl">
    <li class="list-item">
        <div class="mask">
            <h3>{{career}}{{city}}</h3>
            <p>月薪{{salary}}k</p>
        </div>
        <img src="img/{{img}}" alt="">
    </li>
</script>
<script src="./js/index.js">
</script>


</html>
body {
    margin: 0;
    color: #3c3c3c;
    -webkit-font-smoothing: antialiased;
    font-size: 12px;
    line-height: 1.5;
}

h1,
h2,
h3,
h4,
h5,
h6,
p,
ul,
li {
    margin: 0;
    padding: 0;
}

ul {
    list-style: none;
}

ul,
li,
div {
    box-sizing: border-box;
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    -o-box-sizing: border-box;
    -ms-box-sizing: border-box;
}

img {
    width: 100%;
    height: 100%;
}

.clearfix::after,
::before {
    content: '';
    display: table;
    clear: both;
}

.cover {
    min-width: 1200px;
}

.student-album {
    width: 1200px;
    margin: 80px auto;
}

.album-title {
    height: 100px;
    text-align: center;
}

.album-title h1 {
    position: relative;
    height: 65px;
    font-size: 35px;
    color: #000;
}

.album-title h1::before,
.album-title h1::after {
    content: "";
    position: absolute;
    top: 25px;
    width: 50px;
    height: 2px;
    background-color: #000;
}

.album-title h1::before {
    left: 340px;
}

.album-title h1::after {
    right: 340px;
}

.album-title p {
    font-size: 20px;
}

.student-album .list-item {
    position: relative;
    float: left;
    width: 216px;
    height: 216px;
    margin: 30px 30px 0 0;
    border-radius: 50%;
    overflow: hidden;
}

.student-album .list-item:nth-child(5),
.student-album .list-item:nth-child(10){
    margin-right: 0;
}

.student-album .list-item .mask {
    position: absolute;
    bottom: -60px;
    left: 0;
    width: 100%;
    background-color: rgba(0, 0, 0, .6);
    color: #fff;
    text-align: center;
    transition: bottom .2s ease-in-out;
}

.student-album .list-item:hover .mask {
    bottom: 0;
}

子元素宽度+边距总和超过父元素的宽度总和解决方法:
1.将最后一个元素的边距去掉
a.nth-child(n)
b.给需要去掉边距的元素加一个类名: -> css margin0;
2.将父元素的宽度加大
例如子元素的宽度总和1230 父元素设置1240px
红:1240;
image.png

window.onload = function(){
    render();
}

function render() {
    //字符串数据
    var jsonData = document.getElementById('J_data').innerHTML,
        //渲染的数据模板
        tpl = document.getElementById('J_tpl').innerHTML,
        //字符串数据转json
        data = JSON.parse(jsonData),
        len = data.length,
        // 渲染后插入的列表
        oList = document.getElementsByClassName('js-list')[0],
        list = '',
        item;

    for (var i = 0; i < len; i++) {
        item = data[i];
        list += setTplToHTML(tpl, regTpl, {
            career: item.career,
            city: item.city,
            salary: item.salary,
            img: item.img
        })
    }
    // 循坏完成将数据填充进oList里列表
    oList.innerHTML = list;
}

// 需要渲染的数据项
function dataObj(data) {
    return {
        career: data.career,
        city: data.city,
        salary: data.salary,
        img: data.img
    }
}

//  tpl:渲染模板,regExp:正则替换规则,opt数组中的每一项
function setTplToHTML(tpl, regExp, opt) {
    return tpl.replace(regExp(), function (node, key) {
        // console.log(node, key);
        return opt[key];
    })
}

// 正则替换规则
function regTpl() {
    return new RegExp(/{{(.*?)}}/, 'gim');
}