JSFiddle - React, Tailwind, and code Playground

HTML

<h1 class="get-latest-update">
    <a href="javascript:;">获取最近更新</a>
</h1>

<div class="img-items"></div>

<script type="text/template" id="img-item-tpl">
	<div class="img-item" style="flex-grow: {{width}}; width: {{width}}px;">
		<a href="#/img/{{id}}" style="padding-top: {{paddingTop}}%;">
        	<img data-src="{{src}}" src="{{src}}" width="100%" height="100%">
        </a>
    </div>
</script>

SCSS

body {
    background-color: #f2f2f2;
}

.get-latest-update {
    font-size: 20px;
    cursor: pointer;
    
    > a {
        color: #0183fd;
        text-decoration: none;
    }
}

.img-items {
    display: flex;
    flex-wrap: wrap;
    overflow: hidden;
}

.img-item {
    margin-right: 10px;
    margin-bottom: 10px;
    background-color: #fff;
    box-shadow: 0 0 10px #ddd;
    
    > a {
        position: relative;
        display: block;
        width: 100%;
    }
    
    img {
        position: absolute;
        top: 0;
        left: 0;
        width: 100%;
        height: 100%;
    }
}

JavaScript

// 事件绑定
function addEvent(elem, type, handler) {
    elem.addEventListener(type, handler, false);
}

function qs(selector) {
    return document.querySelector(selector);
}

function qsa(selectors) {
    return document.querySelectorAll(selectors);
}

// 函数节流,频繁操作中间隔 delay 的时间才处理一次
function throttle(fn, delay) {
    delay = delay || 200;

    var timer = null;
    // 每次滚动初始的标识
    var timestamp = 0;

    return function () {
        var arg = arguments;
        var now = Date.now();

        // 设置开始时间
        if (timestamp === 0) {
            timestamp = now;
        }

        clearTimeout(timer);
        timer = null;

        // 已经到了delay的一段时间,进行处理
        if (now - timestamp >= delay) {
            fn.apply(this, arg);
            timestamp = now;
        }
        // 添加定时器,确保最后一次的操作也能处理
        else {
            timer = setTimeout(function () {
                fn.apply(this, arg);
                // 恢复标识
                timestamp = 0;
            }, delay);
        }
    }
}

// 获取随机数
function getRandom(min, max) {
	return Math.round(Math.random() * (max - min + 1) + min);
}

// 构造图片数据
function createMockImgs(num) {
	var imgs = [];
    
    // 图片宽高数据范围
    var width = {
    	min: 50,
        max: 200
    };
    
    var height = {
    	min: 150,
        max: 300
    };
    
    // 图片源
    var imgSrcBase = [
        'http://www.deskcar.com/desktop/movietv/2009/2009227225145/',
        'http://www.deskcar.com/desktop/fengjing/2017418153624/',
        'http://www.deskcar.com/desktop/fengjing/2017418153624/',
        'http://www.deskcar.com/desktop/fengjing/2017418153624/',
        'http://www.deskcar.com/desktop/fengjing/2017418153624/',
        'http://www.deskcar.com/desktop/else/20161228125639/',
        'http://www.deskcar.com/desktop/fengjing/2017418153446/'
    ];
    
    // 图片预定义的高度
    var baseHeight = 200;
    
    for (var i = 1; i <= num; ++i) {
    	var w = getRandom(width.min, width.max);
        var h = getRandom(height.min, height.max);
       ...