node

node

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。
javascript/jQuery

javascript/jQuery

一种直译式脚本语言,是一种动态类型、弱类型、基于原型的语言,内置支持类型。
MongoDB

MongoDB

MongoDB 是一个基于分布式文件存储的数据库
openstack

openstack

OpenStack是一个由NASA(美国国家航空航天局)和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目。
VUE

VUE

一套构建用户界面的渐进式框架。与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计。
bootstrap

bootstrap

Bootstrap is the most popular HTML, CSS, and JS framework for developing responsive, mobile first projects on the web.
HTML

HTML

超文本标记语言,标准通用标记语言下的一个应用。
CSS/SASS/SCSS/Less

CSS/SASS/SCSS/Less

层叠样式表(英文全称:Cascading Style Sheets)是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等文件样式的计算机语言。
PHP

PHP

PHP(外文名:PHP: Hypertext Preprocessor,中文名:“超文本预处理器”)是一种通用开源脚本语言。语法吸收了C语言、Java和Perl的特点,利于学习,使用广泛,主要适用于Web开发领域。PHP 独特的语法混合了C、Java、Perl以及PHP自创的语法。它可以比CGI或者Perl更快速地执行动态网页。用PHP做出的动态页面与其他的编程语言相比,PHP是将程序嵌入到HTML(标准通用标记语言下的一个应用)文档中去执行,执行效率比完全生成HTML标记的CGI要高许多;PHP还可以执
每天进步一点点

每天进步一点点

乌法把门的各累笑寂静
求职招聘

求职招聘

猎头招聘专用栏目
Python

Python

一种解释型、面向对象、动态数据类型的高级程序设计语言。

less 基础css类(v1.1)

CSS/SASS/SCSS/LESSlopo1983 发表了文章 • 0 个评论 • 2067 次浏览 • 2017-06-23 13:27 • 来自相关话题

/*httpimg*/
@bgimg: "https://qmarket.bj.bcebos.com/PB150703.jpg";
/*颜色变量*/
@ces: @cbl; //颜色网站基础色
@cun: transparent; //透明背景
@cwh: rgb(255, 255, 255); //白色
/*flat 推荐颜色*/
/*http://bsfans.com/fc/index.html*/
@cor: rgb(230, 126, 34); //橙色
@cor1: rgb(211, 84, 0);
@cbl: rgb(52, 152, 219); //蓝色
@cbl1: rgb(41, 128, 185);
@cgr: rgb(46, 204, 113); //绿色
@cgr1: rgb(39, 174, 96);
@cye: rgb(241, 196, 15); //黄色
@cye1: rgb(243, 156, 18);
@cre: rgb(231, 76, 60); //红色
@cre1: rgb(192, 57, 43);
@cgy: rgb(236, 240, 241); //灰色
@cgy1: rgb(189, 195, 199);
@cbla: rgb(0,0,0); //黑色
//
/*文字颜色*/
@cc: rgb(68,68,68); //文字主要颜色
@cc1: rgb(46,46,46); //文字主要颜色
@cc2: rgb(153,153,153); //文字主要颜色
@cc3: rgb(51,51,51); //文字主要颜色
@cc4: rgb(246,246,246); //黑色背景颜色
/*背景色*/
@bgc: rgb(34, 34, 34);
@bgcc: rgb(21, 33, 47);
@bgc1: rgb(241, 241, 241);
@bgc2: rgb(238,238,238);
@bgc3: rgb(70,69,83);
@bgc4: rgb(54, 62, 75);
//
@cbsw: rgb(252, 248, 227);
//
/*边框颜色*/
@bdrc: rgb(225, 225, 225); //边框颜色
/*自定义颜色占位*/
@nbgc:rgb(47,64,80);
@nbg:rgb(41,56,70);
@idc: rgba(255,255,255,.5);
/* */
/*其他常用变量*/
/*文字*/
@ffmix: "Helvetica Neue",Helvetica,Arial,"Microsoft Yahei","Hiragino Sans GB","Heiti SC","WenQuanYi Micro Hei",sans-serif;
//
@rem: 14px; //
@hack: ~"\9"; //
@mpb: 15px; //基础单位
//常用class配置
.bgcw{
background-color: @cwh;
}
.bgcb{
background-color: @cbla;
}
.bgce{
background-color: @ces;
}
.bgc(@c){
background-color: @c;
}
//....
.db{
display: block;
}
.dn{
display: none;
}
.dib{
display: inline-block;
}
.di{
display: inline;
}
//....
.pr{
position: relative;
}
.ps{
position: absolute;
}
.pf{
position: fixed;
}
//边框控制
.bdr(@w:1px, @s:solid, @cr:@bdrc) {
border: @w @s @cr;
}
.bdrt(@w:1px, @s:solid, @cr:@bdrc) {
border-top: @w @s @cr;
}
.bdrr(@w:1px, @s:solid, @cr:@bdrc) {
border-right: @w @s @cr;
}
.bdrb(@w:1px, @s:solid, @cr:@bdrc) {
border-bottom: @w @s @cr;
}
.bdrl(@w:1px, @s:solid, @cr:@bdrc) {
border-left: @w @s @cr;
}
//内外边距控制
.mg(@a:@mpb) {
margin: @a;
}
.mgt(@a:@mpb) {
margin-top: @a;
}
.mgr(@a:@mpb) {
margin-right: @a;
}
.mgb(@a:@mpb) {
margin-bottom: @a;
}
.mgl(@a:@mpb) {
margin-left: @a;
}
.pd(@a:@mpb) {
padding: @a;
}
.pdt(@a:@mpb) {
padding-top: @a;
}
.pdr(@a:@mpb) {
padding-right: @a;
}
.pdb(@a:@mpb) {
padding-bottom: @a;
}
.pdl(@a:@mpb) {
padding-left: @a;
}
//clear
.clear {
&:after,
&:before {
content: "";
display: table;
}
&:after {
clear: both;
}
}
.cp{
cursor: pointer;
}
//居中
.amid {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%,-50%);
-webkit-transform: translate(-50%,-50%);
-ms-transform: translate(-50%,-50%);
}
.flmm {
display: flex;
display: -webkit-flex;
justify-content: center;
align-items: center;
}
/**
* animation
*/
.key (@prefix, @name, @content) when (@prefix=def) {
@keyframes @name {
@content();
}
}
.key (@prefix, @name, @content) when (@prefix=moz) {
@-moz-keyframes @name {
@content();
}
}
.key (@prefix, @name, @content) when (@prefix=o) {
@-o-keyframes @name {
@content();
}
}
.key (@prefix, @name, @content) when (@prefix=webkit) {
@-webkit-keyframes @name {
@content();
}
}
.key (@prefix, @name, @content) when (@prefix=all) {
.key(moz,@name,@content);
.key(o,@name,@content);
.key(webkit,@name,@content);
.key(def,@name,@content);
}
//trandorm
.trf(@content) {
-webkit-transform: @content;
-moz-transform: @content;
-ms-transform: @content;
-o-transform: @content;
transform: @content;
}
//animation
.ani(@n:ani, @t:1s, @t2:.5s, @fn:ease-in-out, @i:infinite, @dur:alternate) {
animation: @n @t @t2 @fn @i @dur;
-webkit-animation: @n @t @t2 @fn @i @dur;
-o-animation: @n @t @t2 @fn @i @dur;
-moz-animation: @n @t @t2 @fn @i @dur;
}
//过度
.trs(@t:.5s, @b: ease-in-out) {
transition: all @t @b;
-webkit-transition: all @t @b;
-ms-transition: all @t @b;
}
//去除设置
.unbg {
background: transparent;
}
.unbdr {
border-radius: 0;
}
.unbd {
border: none;
}
.unbs {
box-shadow: none;
-webkit-box-shadow: none;
-ms-box-shadow: none;
}
.unst {
padding-left: 0;
list-style: none;
}
.list-inline {
.unst;
> li {
display: inline-block;
padding-right: 5px;
padding-left: 5px;
}
}
.unl {
text-decoration: none;
}
//杂项
.round {
border-radius: 50%;
}
.ohd {
overflow: hidden;
}
.ohy{
overflow-y: auto;
}
.ohx{
overflow-x: auto;
}
//文字方向控制
.tac {
text-align: center;
}
.tal {
text-align: left;
}
.tar {
text-align: right;
}
.taj {
text-align: justify;
}
//
.textoh {
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
}
.blod {
font-weight: bolder;
}
//flex center
.fc {
display: -webkit-box;
display: -ms-flexbox;
display: -webkit-flex;
display: flex;
-webkit-box-pack: center;
-ms-flex-pack: center;
-webkit-justify-content: center;
justify-content: center;
-webkit-box-align: center;
-ms-flex-align: center;
-webkit-align-items: center;
align-items: center;
}
.mask {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
}
//iconfont 建议使用强大的iconfont
.iconfont {
font-family: "iconfont" !important;
font-size: 16px;
font-style: normal;
-webkit-font-smoothing: antialiased;
position: relative;
display: inline-block;
top: 1px;
}
//loop

.col-loop(@n, @i:@cgy1) when (@i=<@n) {
.col-xs-@{i} {
.pdl(0);
.pdr(0);
}
.col-loop(@n,(@i+1));
}

//extend
.abs {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
}
.ffull{
position: fixed;
top: 0;
left: 0;
bottom: 0;
right: 0;
line-height: 100vh;
}
.scroll {
&::-webkit-scrollbar-track {
width: 3px;
background-color: @cgy;
}
&::-webkit-scrollbar {
width: 3px;
height: @mpb;
background-color: @ces;
}
&::-webkit-scrollbar-thumb {
background-color: @ces;
}
} 查看全部
/*httpimg*/
@bgimg: "https://qmarket.bj.bcebos.com/PB150703.jpg";
/*颜色变量*/
@ces: @cbl; //颜色网站基础色
@cun: transparent; //透明背景
@cwh: rgb(255, 255, 255); //白色
/*flat 推荐颜色*/
/*http://bsfans.com/fc/index.html*/
@cor: rgb(230, 126, 34); //橙色
@cor1: rgb(211, 84, 0);
@cbl: rgb(52, 152, 219); //蓝色
@cbl1: rgb(41, 128, 185);
@cgr: rgb(46, 204, 113); //绿色
@cgr1: rgb(39, 174, 96);
@cye: rgb(241, 196, 15); //黄色
@cye1: rgb(243, 156, 18);
@cre: rgb(231, 76, 60); //红色
@cre1: rgb(192, 57, 43);
@cgy: rgb(236, 240, 241); //灰色
@cgy1: rgb(189, 195, 199);
@cbla: rgb(0,0,0); //黑色
//
/*文字颜色*/
@cc: rgb(68,68,68); //文字主要颜色
@cc1: rgb(46,46,46); //文字主要颜色
@cc2: rgb(153,153,153); //文字主要颜色
@cc3: rgb(51,51,51); //文字主要颜色
@cc4: rgb(246,246,246); //黑色背景颜色
/*背景色*/
@bgc: rgb(34, 34, 34);
@bgcc: rgb(21, 33, 47);
@bgc1: rgb(241, 241, 241);
@bgc2: rgb(238,238,238);
@bgc3: rgb(70,69,83);
@bgc4: rgb(54, 62, 75);
//
@cbsw: rgb(252, 248, 227);
//
/*边框颜色*/
@bdrc: rgb(225, 225, 225); //边框颜色
/*自定义颜色占位*/
@nbgc:rgb(47,64,80);
@nbg:rgb(41,56,70);
@idc: rgba(255,255,255,.5);
/* */
/*其他常用变量*/
/*文字*/
@ffmix: "Helvetica Neue",Helvetica,Arial,"Microsoft Yahei","Hiragino Sans GB","Heiti SC","WenQuanYi Micro Hei",sans-serif;
//
@rem: 14px; //
@hack: ~"\9"; //
@mpb: 15px; //基础单位
//常用class配置
.bgcw{
background-color: @cwh;
}
.bgcb{
background-color: @cbla;
}
.bgce{
background-color: @ces;
}
.bgc(@c){
background-color: @c;
}
//....
.db{
display: block;
}
.dn{
display: none;
}
.dib{
display: inline-block;
}
.di{
display: inline;
}
//....
.pr{
position: relative;
}
.ps{
position: absolute;
}
.pf{
position: fixed;
}
//边框控制
.bdr(@w:1px, @s:solid, @cr:@bdrc) {
border: @w @s @cr;
}
.bdrt(@w:1px, @s:solid, @cr:@bdrc) {
border-top: @w @s @cr;
}
.bdrr(@w:1px, @s:solid, @cr:@bdrc) {
border-right: @w @s @cr;
}
.bdrb(@w:1px, @s:solid, @cr:@bdrc) {
border-bottom: @w @s @cr;
}
.bdrl(@w:1px, @s:solid, @cr:@bdrc) {
border-left: @w @s @cr;
}
//内外边距控制
.mg(@a:@mpb) {
margin: @a;
}
.mgt(@a:@mpb) {
margin-top: @a;
}
.mgr(@a:@mpb) {
margin-right: @a;
}
.mgb(@a:@mpb) {
margin-bottom: @a;
}
.mgl(@a:@mpb) {
margin-left: @a;
}
.pd(@a:@mpb) {
padding: @a;
}
.pdt(@a:@mpb) {
padding-top: @a;
}
.pdr(@a:@mpb) {
padding-right: @a;
}
.pdb(@a:@mpb) {
padding-bottom: @a;
}
.pdl(@a:@mpb) {
padding-left: @a;
}
//clear
.clear {
&:after,
&:before {
content: "";
display: table;
}
&:after {
clear: both;
}
}
.cp{
cursor: pointer;
}
//居中
.amid {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%,-50%);
-webkit-transform: translate(-50%,-50%);
-ms-transform: translate(-50%,-50%);
}
.flmm {
display: flex;
display: -webkit-flex;
justify-content: center;
align-items: center;
}
/**
* animation
*/
.key (@prefix, @name, @content) when (@prefix=def) {
@keyframes @name {
@content();
}
}
.key (@prefix, @name, @content) when (@prefix=moz) {
@-moz-keyframes @name {
@content();
}
}
.key (@prefix, @name, @content) when (@prefix=o) {
@-o-keyframes @name {
@content();
}
}
.key (@prefix, @name, @content) when (@prefix=webkit) {
@-webkit-keyframes @name {
@content();
}
}
.key (@prefix, @name, @content) when (@prefix=all) {
.key(moz,@name,@content);
.key(o,@name,@content);
.key(webkit,@name,@content);
.key(def,@name,@content);
}
//trandorm
.trf(@content) {
-webkit-transform: @content;
-moz-transform: @content;
-ms-transform: @content;
-o-transform: @content;
transform: @content;
}
//animation
.ani(@n:ani, @t:1s, @t2:.5s, @fn:ease-in-out, @i:infinite, @dur:alternate) {
animation: @n @t @t2 @fn @i @dur;
-webkit-animation: @n @t @t2 @fn @i @dur;
-o-animation: @n @t @t2 @fn @i @dur;
-moz-animation: @n @t @t2 @fn @i @dur;
}
//过度
.trs(@t:.5s, @b: ease-in-out) {
transition: all @t @b;
-webkit-transition: all @t @b;
-ms-transition: all @t @b;
}
//去除设置
.unbg {
background: transparent;
}
.unbdr {
border-radius: 0;
}
.unbd {
border: none;
}
.unbs {
box-shadow: none;
-webkit-box-shadow: none;
-ms-box-shadow: none;
}
.unst {
padding-left: 0;
list-style: none;
}
.list-inline {
.unst;
> li {
display: inline-block;
padding-right: 5px;
padding-left: 5px;
}
}
.unl {
text-decoration: none;
}
//杂项
.round {
border-radius: 50%;
}
.ohd {
overflow: hidden;
}
.ohy{
overflow-y: auto;
}
.ohx{
overflow-x: auto;
}
//文字方向控制
.tac {
text-align: center;
}
.tal {
text-align: left;
}
.tar {
text-align: right;
}
.taj {
text-align: justify;
}
//
.textoh {
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
}
.blod {
font-weight: bolder;
}
//flex center
.fc {
display: -webkit-box;
display: -ms-flexbox;
display: -webkit-flex;
display: flex;
-webkit-box-pack: center;
-ms-flex-pack: center;
-webkit-justify-content: center;
justify-content: center;
-webkit-box-align: center;
-ms-flex-align: center;
-webkit-align-items: center;
align-items: center;
}
.mask {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
}
//iconfont 建议使用强大的iconfont
.iconfont {
font-family: "iconfont" !important;
font-size: 16px;
font-style: normal;
-webkit-font-smoothing: antialiased;
position: relative;
display: inline-block;
top: 1px;
}
//loop

.col-loop(@n, @i:@cgy1) when (@i=<@n) {
.col-xs-@{i} {
.pdl(0);
.pdr(0);
}
.col-loop(@n,(@i+1));
}

//extend
.abs {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
}
.ffull{
position: fixed;
top: 0;
left: 0;
bottom: 0;
right: 0;
line-height: 100vh;
}
.scroll {
&::-webkit-scrollbar-track {
width: 3px;
background-color: @cgy;
}
&::-webkit-scrollbar {
width: 3px;
height: @mpb;
background-color: @ces;
}
&::-webkit-scrollbar-thumb {
background-color: @ces;
}
}

vue-form(vue表单验证插件 vue2.2+) 使用指南

VUElopo1983 发表了文章 • 0 个评论 • 3694 次浏览 • 2017-06-13 10:40 • 来自相关话题

vue-form 是一个在vue 中用于表单验证的插件 目前版本为4.1.1 ??Form validation for?Vue.js 2.2+
官网地址:https://github.com/fergaldoyle/vue-form
1.安装import VueForm from 'vue-form';
// install globally
Vue.use(VueForm);
Vue.use(VueForm, options);
// or use the mixin ...
mixins: [VueForm]
...
mixins: [new VueForm(options)]
...
2.案例
使用bootstrap样式的案例?https://jsfiddle.net/fergal_doyle/zfqt4yhq/
密码验证的案例https://jsfiddle.net/fergal_doyle/9rn5kLkw/
3.使用方法
template: <vue-form :state="formstate" @submit.prevent="onSubmit">

<validate tag="label">
<span>Name *</span>
<input v-model="model.name" required name="name" />

<field-messages name="name">
<div>Success!</div>
<div slot="required">Name is a required field</div>
</field-messages>
</validate>

<validate tag="label">
<span>Email</span>
<input v-model="model.email" name="email" type="email" required />

<field-messages name="email">
<div slot="required">Email is a required field</div>
<div slot="email">Email is not valid</div>
</field-messages>
</validate>

<button type="submit">Submit</button>
</vue-form>
scriptdata(){
return{
formstate: {},
model: { name: '', email: 'invalid-email' } },
}
methods: {
onSubmit: function () {
if(this.formstate.$invalid) {
// alert user and exit early
return;
}
// otherwise submit form
}
}
vue 中可直接通过FormData的方式提交数据 要获取该表单的所有数据 可给vue-form 添加ref属性来获取?let def = this.$refs.sendinfo.$el;
验证信 息显示
该插件使用field-messages标签来定义验证正确和错误的文字或其他形式的提示内容
show 表示表单在何种状态下开始验证 vue-form 内置有$dirty,?$dirty && $touched,?$dirty || $touched,?$touched || $submitted
示例:<field-messages name="name" show="$dirty && $touched">
<div slot="errorKeyA">Error message A</div>
<div slot="errorKeyB">Error message B</div>
</field-messages>
使用scope template<field-messages name="fieldName">
<span>Success</span>
<template slot="required" scope="state">
<span v-if="state.$touched || state.$submitted">Name is a required field</span>
</template>
<template slot="errorKeyB" scope="state">
<span v-if="state.$touched || state.$dirty">Error message B</span>
</template>
</field-messages>
vue-form Validators
默认自带验证类型type="email"
type="url"
type="number"
required
minlength
maxlength
pattern
min (for type="number")
max (for type="number")
使用方法<!-- static validators -->
<validate>
<input type="email" name="email" v-model="model.email" required />
</validate>
<validate>
<input type="text" name="name" v-model="model.name" maxlength="25" minlength="5" />
</validate>

<!-- bound validators -->
<validate>
<input type="email" name="email" v-model="model.email" :required="isRequired" />
</validate>
<validate>
<input type="text" name="name" v-model="model.name" :maxlength="maxLen" :minlength="minLen" />
</validate>
自定义验证
你可以全局或者局部注册自定义验证
全部注册var options = {
validators: {
'my-custom-validator': function (value, attrValue, vnode) {
// return true to set input as $valid, false to set as $invalid
return value === 'custom';
}
}
}

Vue.use(VueForm, options);
// or
mixins: [new VueForm(options)]<validate>
<input v-model="something" name="something" my-custom-validator />
</validate>局部注册<validate :custom="{customValidator: customValidator}">
<input v-model="something" name="something" />
</validate>// ...
methods: {
customValidator: function (value) {
// return true to set input as $valid, false to set as $invalid
return value === 'custom';
}
}
// ...Async 验证methods: {
debounced: _.debounce(function (value, resolve, reject) {
fetch('https://httpbin.org/get').then(function(response){
resolve(response.isValid);
});
}, 500),
customValidator (value) {
return new Promise((resolve, reject) => {
this.debounced(value, resolve, reject);
});
}
}重置验证<vue-form ref="form" :state="formstate">

resetState: function () {
this.formstate._reset();
// or
this.$refs.form.reset();
}
未完待续..... 查看全部

vue-form 是一个在vue 中用于表单验证的插件 目前版本为4.1.1 ??Form validation for?Vue.js 2.2+


官网地址:https://github.com/fergaldoyle/vue-form


1.安装
import VueForm from 'vue-form'; 
// install globally
Vue.use(VueForm);
Vue.use(VueForm, options);
// or use the mixin ...
mixins: [VueForm]
...
mixins: [new VueForm(options)]
...

2.案例
使用bootstrap样式的案例?https://jsfiddle.net/fergal_doyle/zfqt4yhq/
密码验证的案例https://jsfiddle.net/fergal_doyle/9rn5kLkw/
3.使用方法
template:
  <vue-form :state="formstate" @submit.prevent="onSubmit">

<validate tag="label">
<span>Name *</span>
<input v-model="model.name" required name="name" />

<field-messages name="name">
<div>Success!</div>
<div slot="required">Name is a required field</div>
</field-messages>
</validate>

<validate tag="label">
<span>Email</span>
<input v-model="model.email" name="email" type="email" required />

<field-messages name="email">
<div slot="required">Email is a required field</div>
<div slot="email">Email is not valid</div>
</field-messages>
</validate>

<button type="submit">Submit</button>
</vue-form>

script
data(){
return{
formstate: {},
model: { name: '', email: 'invalid-email' } },
}
methods: {
onSubmit: function () {
if(this.formstate.$invalid) {
// alert user and exit early
return;
}
// otherwise submit form
}
}

vue 中可直接通过FormData的方式提交数据 要获取该表单的所有数据 可给vue-form 添加ref属性来获取?let def = this.$refs.sendinfo.$el;


验证信 息显示
该插件使用field-messages标签来定义验证正确和错误的文字或其他形式的提示内容
show 表示表单在何种状态下开始验证 vue-form 内置有$dirty,?$dirty && $touched,?$dirty || $touched,?$touched || $submitted
示例:
<field-messages name="name" show="$dirty && $touched">
<div slot="errorKeyA">Error message A</div>
<div slot="errorKeyB">Error message B</div>
</field-messages>

使用scope template
<field-messages name="fieldName">
<span>Success</span>
<template slot="required" scope="state">
<span v-if="state.$touched || state.$submitted">Name is a required field</span>
</template>
<template slot="errorKeyB" scope="state">
<span v-if="state.$touched || state.$dirty">Error message B</span>
</template>
</field-messages>

vue-form Validators
默认自带验证类型
type="email"
type="url"
type="number"
required
minlength
maxlength
pattern
min (for type="number")
max (for type="number")

使用方法
<!-- static validators -->
<validate>
<input type="email" name="email" v-model="model.email" required />
</validate>
<validate>
<input type="text" name="name" v-model="model.name" maxlength="25" minlength="5" />
</validate>

<!-- bound validators -->
<validate>
<input type="email" name="email" v-model="model.email" :required="isRequired" />
</validate>
<validate>
<input type="text" name="name" v-model="model.name" :maxlength="maxLen" :minlength="minLen" />
</validate>

自定义验证
你可以全局或者局部注册自定义验证
全部注册
var options = {
validators: {
'my-custom-validator': function (value, attrValue, vnode) {
// return true to set input as $valid, false to set as $invalid
return value === 'custom';
}
}
}

Vue.use(VueForm, options);
// or
mixins: [new VueForm(options)]
<validate>
<input v-model="something" name="something" my-custom-validator />
</validate>
局部注册
<validate :custom="{customValidator: customValidator}">
<input v-model="something" name="something" />
</validate>
// ...
methods: {
customValidator: function (value) {
// return true to set input as $valid, false to set as $invalid
return value === 'custom';
}
}
// ...
Async 验证
methods: {
debounced: _.debounce(function (value, resolve, reject) {
fetch('https://httpbin.org/get').then(function(response){
resolve(response.isValid);
});
}, 500),
customValidator (value) {
return new Promise((resolve, reject) => {
this.debounced(value, resolve, reject);
});
}
}
重置验证
<vue-form ref="form" :state="formstate">

resetState: function () {
this.formstate._reset();
// or
this.$refs.form.reset();
}

未完待续.....

svg动画库 vivus.js

javascript/jQuerylopo1983 发表了文章 • 0 个评论 • 2665 次浏览 • 2017-05-27 02:12 • 来自相关话题

vivus.js 是一个用于操作简单svg动画的js库,它不依赖任何的js库。目前版本为0.4.1
?
一、安装
官网地址:https://github.com/maxwellito/vivus
CNPM:cnpm install vivusBowerbower install vivusCDN(该cdn 的版本为0.4.0)<script src="https://cdn.bootcss.com/vivus/ ... gt%3B?
Vivus 提供一个免费的在线的svg动画生成工具(online的) 地址为:instant
二。?Animations
?
vivus 动画有三种 Delayed、Sync、OneByOne(默认:Delayed)
















?三、原则
?
1.vivus 是基于strokeDashoffset来进行动画的
2.svg中的circle,rect,line和polyline慎用
3.所有的svg都必须有描边属性 不能有fill(你可以用css 来进行fill 动画 svg 支持css3部分动画)
4.不要有隐藏路径 和 text 元素
?
四、使用
?
内联svg<svg id="my-svg">
<path...>
<path...>
<path...>
</svg>

<script>
new Vivus('my-svg', {duration: 200}, myCallback);
</script>object标签载入<object id="my-svg" type="image/svg+xml" data="link/to/my.svg"></object>

<script>
new Vivus('my-svg', {duration: 200}, myCallback);
</script><div id="my-div"></div>

<script>
new Vivus('my-div', {duration: 200, file: 'link/to/my.svg'}, myCallback);
</script>
创建object是会根据其父级来定大小
如果你需要定义这个object的大小 需要在onReady回调中定义new Vivus('my-div-id', {
file: 'link/to/my.svg'
onReady: function (myVivus) {
// `el` property is the SVG element
myVivus.el.setAttribute('height', 'auto');
}
});
用css3实现svg fill 动画/* Style */
#mySVG * {
fill-opacity: 0;
transition: fill-opacity 1s;
}

#mySVG.finished * {
fill-opacity: 1;
}/* JavaScript */
new Vivus('mySVG', {}, function (obj) {
obj.el.classList.add('finished');
})
五、选项参数列表
https://github.com/maxwellito/vivus#option-list
六、方法
https://github.com/maxwellito/vivus#methodsvar myVivus = new Vivus('my-svg-id');
myVivus
.stop()
.reset()
.play(2)var myVivus = new Vivus('my-svg-id');
myVivus.play(1, function() {
// called after the animation completes
})

// alternativly if you leave the speed param blank and use the default, you
// can pass the callback as the first parameter like so.
myVivus.play(function() {
// called after the animation completes
})七、贝塞尔函数类型设置
默认:EASE, EASE_IN, EASE_OUT, EASE_OUT_BOUNCE用法new Vivus('my-svg-id', {
type: 'delayed',
duration: 200,
animTimingFunction: Vivus.EASE
}, myCallback);demo地址:demo 查看全部
vivus.js 是一个用于操作简单svg动画的js库,它不依赖任何的js库。目前版本为0.4.1
?
一、安装
官网地址:https://github.com/maxwellito/vivus
CNPM:
cnpm install vivus
Bower
bower install vivus
CDN(该cdn 的版本为0.4.0)
<script src="https://cdn.bootcss.com/vivus/ ... gt%3B
?

Vivus 提供一个免费的在线的svg动画生成工具(online的) 地址为:instant


二。?Animations
?
vivus 动画有三种 Delayed、Sync、OneByOne(默认:Delayed)

68747470733a2f2f7261772e6769746875622e636f6d2f6d617877656c6c69746f2f76697675732f6d61737465722f6173736574732f64656c617965642e706e67.png


68747470733a2f2f7261772e6769746875622e636f6d2f6d617877656c6c69746f2f76697675732f6d61737465722f6173736574732f73796e632e706e67.png


68747470733a2f2f7261772e6769746875622e636f6d2f6d617877656c6c69746f2f76697675732f6d61737465722f6173736574732f6f6e6542794f6e652e706e67.png


?三、原则
?
1.vivus 是基于strokeDashoffset来进行动画的
2.svg中的circle,rect,line和polyline慎用
3.所有的svg都必须有描边属性 不能有fill(你可以用css 来进行fill 动画 svg 支持css3部分动画)
4.不要有隐藏路径 和 text 元素
?
四、使用
?
内联svg
<svg id="my-svg">
<path...>
<path...>
<path...>
</svg>

<script>
new Vivus('my-svg', {duration: 200}, myCallback);
</script>
object标签载入
<object id="my-svg" type="image/svg+xml" data="link/to/my.svg"></object>

<script>
new Vivus('my-svg', {duration: 200}, myCallback);
</script>
<div id="my-div"></div>

<script>
new Vivus('my-div', {duration: 200, file: 'link/to/my.svg'}, myCallback);
</script>

创建object是会根据其父级来定大小
如果你需要定义这个object的大小 需要在onReady回调中定义

new Vivus('my-div-id', {
file: 'link/to/my.svg'
onReady: function (myVivus) {
// `el` property is the SVG element
myVivus.el.setAttribute('height', 'auto');
}
});


用css3实现svg fill 动画

/* Style */
#mySVG * {
fill-opacity: 0;
transition: fill-opacity 1s;
}

#mySVG.finished * {
fill-opacity: 1;
}
/* JavaScript */
new Vivus('mySVG', {}, function (obj) {
obj.el.classList.add('finished');
})


五、选项参数列表
https://github.com/maxwellito/vivus#option-list
六、方法
https://github.com/maxwellito/vivus#methods
var myVivus = new Vivus('my-svg-id');
myVivus
.stop()
.reset()
.play(2)
var myVivus = new Vivus('my-svg-id');
myVivus.play(1, function() {
// called after the animation completes
})

// alternativly if you leave the speed param blank and use the default, you
// can pass the callback as the first parameter like so.
myVivus.play(function() {
// called after the animation completes
})
七、贝塞尔函数类型设置
默认:
EASE, EASE_IN, EASE_OUT, EASE_OUT_BOUNCE
用法
new Vivus('my-svg-id', {
type: 'delayed',
duration: 200,
animTimingFunction: Vivus.EASE
}, myCallback);
demo地址:demo

lockr.js 本地储存 localStorage操作js库

javascript/jQuerylopo1983 发表了文章 • 0 个评论 • 4465 次浏览 • 2017-05-24 23:51 • 来自相关话题

一个本地储存操作js库,他真的很小,压缩版的甚至<2kb,你可以用类似api的方式来对本地存储进行操作。

1.如何安装lockrbower install lockrcnpm i lockr --save你还可以点击在那遥远的地方直接下载使用<script src="/path/lockr.js" type="text/javascript"></script>
2.API 介绍
Lockr.prefix?- String
?
设置一个字符串用于标记相关的值Lockr.prefix = 'lockr';
Lockr.set('username', 'Coyote');
localStorage.getItem('username');
localStorage.getItem('lockr_username');




Lockr.set?- :?[ key, value ]?{String, Number, Array or Object}
给本地储存写入值Lockr.set('username', 'Coyote'); // String
Lockr.set('user_id', 12345); // number
Lockr.set('users', [{name: 'John Doe', age: 18}, {name: 'Jane Doe', age: 19}]);




Lockr.get?- :?[ key ?/ ?hash_key , 默认值 ]
读取本地储存的值,如果获取到的数值为null/undefined ?则返回设置的默认值Lockr.get('username');
> "Coyote"

Lockr.get('user_id');
> 12345

Lockr.get('users');
> [{name: 'John Doe', age: 18}, {name: 'Jane Doe', age: 19}]

Lockr.get('score', 0):
> 0
//不存在返回设置的默认值0
Lockr.set('score', 3):
Lockr.get('score', 0):
> 3




Lockr.rm?- arguments:?[ key ]?{String}
从本地储存中移除相关数据Lockr.set('username', 'Coyote');
Lockr.get('username');
> "Coyote"
Lockr.rm('username');
Lockr.get('username');
> undefined




Lockr.sadd?- arguments?[ key, value ]{String, Number, Array or Object}
给hash key添加指定值(持续添加类似push 但具备set 自动过滤重复)Lockr.sadd("wat", 1); // [1]
Lockr.sadd("wat", 2); // [1, 2]
Lockr.sadd("wat", 1); // [1, 2]




Lockr.sismember?- arguments?[ key, value ]
判断某hash key 是否包含某个值 ?返回Boolean true falseLockr.sadd("wat", 1);
Lockr.sismember("wat", 1); // true
Lockr.sismember("wat", 2); // false




Lockr.smembers?- arguments?[ key ]
返回hash key下的值Lockr.sadd("wat", 42);
Lockr.sadd("wat", 1337);
Lockr.smembers("wat"); // [42, 1337]




Lockr.srem?- arguments?[ key, value ]
移除hash key下的指定数值Lockr.sadd("wat", 1);
Lockr.sadd("wat", 2);
Lockr.srem("wat", 1);
Lockr.smembers("wat"); // [2]




Lockr.getAll?- arguments:?null
获取所有数据生成多维数组Lockr.getAll();
> ["Coyote", 12345, [{name: 'John Doe', age: 18}, {name: 'Jane Doe', age: 19}]]获取所有数据生成json数据Lockr.getAll(true);
> [{"username": "Coyote"}, {"user_id": 12345}, {"users": [{name: 'John Doe', age: 18}, {name: 'Jane Doe', age: 19}]}]




Lockr.flush()?- arguments:?null
清空本地储存所有数据localStorage.length;
> 3
Lockr.flush();
localStorage.length;
> 0 查看全部
lockr.png

一个本地储存操作js库,他真的很小,压缩版的甚至<2kb,你可以用类似api的方式来对本地存储进行操作。

1.如何安装lockr
bower install lockr
cnpm i lockr --save
你还可以点击在那遥远的地方直接下载使用
<script src="/path/lockr.js" type="text/javascript"></script>

2.API 介绍

Lockr.prefix?- String


?
设置一个字符串用于标记相关的值
Lockr.prefix = 'lockr';
Lockr.set('username', 'Coyote');
localStorage.getItem('username');
localStorage.getItem('lockr_username');

line.jpg

Lockr.set?- :?[ key, value ]?{String, Number, Array or Object}


给本地储存写入值
Lockr.set('username', 'Coyote'); // String
Lockr.set('user_id', 12345); // number
Lockr.set('users', [{name: 'John Doe', age: 18}, {name: 'Jane Doe', age: 19}]);

line.jpg

Lockr.get?- :?[ key ?/ ?hash_key , 默认值 ]


读取本地储存的值,如果获取到的数值为null/undefined ?则返回设置的默认值
Lockr.get('username');
> "Coyote"

Lockr.get('user_id');
> 12345

Lockr.get('users');
> [{name: 'John Doe', age: 18}, {name: 'Jane Doe', age: 19}]

Lockr.get('score', 0):
> 0
//不存在返回设置的默认值0
Lockr.set('score', 3):
Lockr.get('score', 0):
> 3

line.jpg

Lockr.rm?- arguments:?[ key ]?{String}


从本地储存中移除相关数据
Lockr.set('username', 'Coyote');
Lockr.get('username');
> "Coyote"
Lockr.rm('username');
Lockr.get('username');
> undefined

line.jpg

Lockr.sadd?- arguments?[ key, value ]{String, Number, Array or Object}


给hash key添加指定值(持续添加类似push 但具备set 自动过滤重复)
Lockr.sadd("wat", 1); // [1]
Lockr.sadd("wat", 2); // [1, 2]
Lockr.sadd("wat", 1); // [1, 2]

line.jpg

Lockr.sismember?- arguments?[ key, value ]


判断某hash key 是否包含某个值 ?返回Boolean true false
Lockr.sadd("wat", 1);
Lockr.sismember("wat", 1); // true
Lockr.sismember("wat", 2); // false

line.jpg

Lockr.smembers?- arguments?[ key ]


返回hash key下的值
Lockr.sadd("wat", 42);
Lockr.sadd("wat", 1337);
Lockr.smembers("wat"); // [42, 1337]

line.jpg

Lockr.srem?- arguments?[ key, value ]


移除hash key下的指定数值
Lockr.sadd("wat", 1);
Lockr.sadd("wat", 2);
Lockr.srem("wat", 1);
Lockr.smembers("wat"); // [2]

line.jpg

Lockr.getAll?- arguments:?null


获取所有数据生成多维数组
Lockr.getAll();
> ["Coyote", 12345, [{name: 'John Doe', age: 18}, {name: 'Jane Doe', age: 19}]]
获取所有数据生成json数据
Lockr.getAll(true);
> [{"username": "Coyote"}, {"user_id": 12345}, {"users": [{name: 'John Doe', age: 18}, {name: 'Jane Doe', age: 19}]}]

line.jpg

Lockr.flush()?- arguments:?null


清空本地储存所有数据
localStorage.length;
> 3
Lockr.flush();
localStorage.length;
> 0

vue前后端分离解决

VUEyangyulu 发表了文章 • 0 个评论 • 2536 次浏览 • 2017-05-19 16:12 • 来自相关话题

看了很多vue的项目,基本都是用mock来做模拟数据,实际开发中,对于与实际接口的交互,就成了很大的阻碍。本demo以实际的后端接口做交互。前端用vue-cli脚手架加上elementUI组件,后端用基于Java的springmvc+mybatis+mysql+shiro的一个权限管理的demo。 查看全部
看了很多vue的项目,基本都是用mock来做模拟数据,实际开发中,对于与实际接口的交互,就成了很大的阻碍。本demo以实际的后端接口做交互。前端用vue-cli脚手架加上elementUI组件,后端用基于Java的springmvc+mybatis+mysql+shiro的一个权限管理的demo。

移动端页面开发总结(三)

HTMLboloog 发表了文章 • 0 个评论 • 1710 次浏览 • 2017-05-09 15:37 • 来自相关话题

CSS reset
@charset "utf-8";
html{
-webkit-text-size-adjust:none;
-webkit-user-select:none;
-webkit-touch-callout: none;
font-family: Microsoft YaHei,'宋体' , Tahoma, Helvetica, Arial, "\5b8b\4f53", sans-serif;
font-size:24px;
}
body,h1,h2,h3,h4,h5,h6,p,dl,dd,ul,ol,pre,form,input,textarea,th,td,select{
margin:0;
padding:0;
font-weight: normal;
}
a,button,input,textarea,select{
background: none;
-webkit-tap-highlight-color:rgba(255,0,0,0);
outline:none;
-webkit-appearance:none;
}
ol,ul{
list-style:none;
}
a{
text-decoration:none;
}
img{
border:none;
text-decoration: none;
}
table{
border-collapse:collapse;
border-spacing: 0;
}
textarea{
resize:none;
overflow:auto;
}
清除浮动
.clearfix{
zoom:1;
}
.clearfix:after {
clear:both;
display:block;
height:0;
content:"";
visibility:hidden;
}
禁止换行 超出文本用省略号代替
.no-wrap-ellipsis{
white-space:nowrap;
overflow:hidden;
text-overflow:ellipsis;
}
使文本文字两端对齐
.text-justify{
text-align:justify;
text-justify:inter-ideograph;
}
CSS判断横屏竖屏
@media screen and (orientation: portrait) {
/*竖屏 css*/
}
@media screen and (orientation: landscape) {
/*横屏 css*/
}
?取消长按复制 获取长按复制
.text-nocopy {
-webkit-touch-callout:none;
-webkit-user-select:none;
-khtml-user-select:none;
-moz-user-select:none;
-ms-user-select:none;
user-select:none;
}
.text-copy{
-webkit-touch-callout:text;
-webkit-user-select:text;
-moz-user-select:text;
-ms-user-select:text;
user-select:text;
}
?
?
?
? 查看全部
CSS reset
@charset "utf-8";
html{
-webkit-text-size-adjust:none;
-webkit-user-select:none;
-webkit-touch-callout: none;
font-family: Microsoft YaHei,'宋体' , Tahoma, Helvetica, Arial, "\5b8b\4f53", sans-serif;
font-size:24px;
}
body,h1,h2,h3,h4,h5,h6,p,dl,dd,ul,ol,pre,form,input,textarea,th,td,select{
margin:0;
padding:0;
font-weight: normal;
}
a,button,input,textarea,select{
background: none;
-webkit-tap-highlight-color:rgba(255,0,0,0);
outline:none;
-webkit-appearance:none;
}
ol,ul{
list-style:none;
}
a{
text-decoration:none;
}
img{
border:none;
text-decoration: none;
}
table{
border-collapse:collapse;
border-spacing: 0;
}
textarea{
resize:none;
overflow:auto;
}

清除浮动
.clearfix{ 
zoom:1;
}
.clearfix:after {
clear:both;
display:block;
height:0;
content:"";
visibility:hidden;
}

禁止换行 超出文本用省略号代替
.no-wrap-ellipsis{ 
white-space:nowrap;
overflow:hidden;
text-overflow:ellipsis;
}

使文本文字两端对齐
.text-justify{ 
text-align:justify;
text-justify:inter-ideograph;
}

CSS判断横屏竖屏
@media screen and (orientation: portrait) {
/*竖屏 css*/
}
@media screen and (orientation: landscape) {
/*横屏 css*/
}

?取消长按复制 获取长按复制
.text-nocopy {
-webkit-touch-callout:none;
-webkit-user-select:none;
-khtml-user-select:none;
-moz-user-select:none;
-ms-user-select:none;
user-select:none;
}
.text-copy{
-webkit-touch-callout:text;
-webkit-user-select:text;
-moz-user-select:text;
-ms-user-select:text;
user-select:text;
}

?
?
?
?

移动端页面开发总结(二)

HTMLboloog 发表了文章 • 0 个评论 • 1779 次浏览 • 2017-05-09 14:55 • 来自相关话题

CSS的样式技巧?
?
1、禁止ios和android用户选中文字
html{-webkit-user-select:none;}
2、禁止ios长按时触发系统的菜单,禁止ios&android长按时下载图片
html{-webkit-touch-callout: none;}
3、webkit去除表单元素的默认样式
input{-webkit-appearance:none;}
4、修改webkit表单输入框placeholder的样式
input::-webkit-input-placeholder{color:#123456;}
input:focus::-webkit-input-placeholder{color:#654321;}
5、去除android设备下面的 a/button/input标签被点击时产生的边框 & 去除ios a标签被点击时产生的半透明灰色背景
a,button,input{-webkit-tap-highlight-color:rgba(255,0,0,0);}
6、ios使用-webkit-text-size-adjust禁止调整字体大小
body{-webkit-text-size-adjust: 100%!important;}
7、android 上去掉语音输入按钮
input::-webkit-input-speech-button {display: none;}
8、定义字体
font-family:'\5FAE\8F6F\96C5\9ED1',tahoma,'\5b8b\4f53',"Helvetica Neue",Helvetica,Arial,sans-serif;
? 查看全部
CSS的样式技巧?
?
1、禁止ios和android用户选中文字
html{-webkit-user-select:none;}

2、禁止ios长按时触发系统的菜单,禁止ios&android长按时下载图片
html{-webkit-touch-callout: none;}

3、webkit去除表单元素的默认样式
input{-webkit-appearance:none;}

4、修改webkit表单输入框placeholder的样式
input::-webkit-input-placeholder{color:#123456;}
input:focus::-webkit-input-placeholder{color:#654321;}

5、去除android设备下面的 a/button/input标签被点击时产生的边框 & 去除ios a标签被点击时产生的半透明灰色背景
a,button,input{-webkit-tap-highlight-color:rgba(255,0,0,0);}

6、ios使用-webkit-text-size-adjust禁止调整字体大小
body{-webkit-text-size-adjust: 100%!important;}

7、android 上去掉语音输入按钮
input::-webkit-input-speech-button {display: none;}

8、定义字体
font-family:'\5FAE\8F6F\96C5\9ED1',tahoma,'\5b8b\4f53',"Helvetica Neue",Helvetica,Arial,sans-serif;

?

移动端页面开发总结(一)

HTMLboloog 发表了文章 • 0 个评论 • 1796 次浏览 • 2017-05-09 14:39 • 来自相关话题

meta标签的相关知识
?1、移动端页面设置视口宽度等于设备宽度,并禁止缩放。
<meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no" />
?2、移动端页面设置视口宽度等于定宽(如750px),并禁止缩放,常用于微信浏览器页面。
<meta name="viewport" content="width=750, user-scalable=no, target-densitydpi=device-dpi">
3、禁止将页面中的数字识别为电话号码
<meta name="format-detection" content="telephone=no" />
4、忽略Android平台中对邮箱地址的识别
<meta name="format-detection" content="email=no" />
5、当网站添加到主屏幕快速启动方式,可隐藏地址栏,仅针对ios的safari
<meta name="apple-mobile-web-app-capable" content="yes" />
6、将网站添加到主屏幕快速启动方式,仅针对ios的safari顶端状态条的样式
<meta name="apple-mobile-web-app-status-bar-style" content="black" />
html5 viewport模板
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=no" name="viewport">
<meta content="yes" name="apple-mobile-web-app-capable">
<meta content="black" name="apple-mobile-web-app-status-bar-style">
<meta content="telephone=no" name="format-detection">
<meta content="email=no" name="format-detection">
<title>Document</title>
</head>
<body>
content...
</body>
</html>
?
?
?
?
? 查看全部
meta标签的相关知识
?1、移动端页面设置视口宽度等于设备宽度,并禁止缩放。
<meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no" />

?2、移动端页面设置视口宽度等于定宽(如750px),并禁止缩放,常用于微信浏览器页面。
<meta name="viewport" content="width=750, user-scalable=no, target-densitydpi=device-dpi">

3、禁止将页面中的数字识别为电话号码
<meta name="format-detection" content="telephone=no" />

4、忽略Android平台中对邮箱地址的识别
<meta name="format-detection" content="email=no" />

5、当网站添加到主屏幕快速启动方式,可隐藏地址栏,仅针对ios的safari
<meta name="apple-mobile-web-app-capable" content="yes" />

6、将网站添加到主屏幕快速启动方式,仅针对ios的safari顶端状态条的样式
<meta name="apple-mobile-web-app-status-bar-style" content="black" />

html5 viewport模板
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=no" name="viewport">
<meta content="yes" name="apple-mobile-web-app-capable">
<meta content="black" name="apple-mobile-web-app-status-bar-style">
<meta content="telephone=no" name="format-detection">
<meta content="email=no" name="format-detection">
<title>Document</title>
</head>
<body>
content...
</body>
</html>

?
?
?
?
?

Bootstrap+Masonry+imagesLoaded 快速实现瀑布流

bootstrap3.xlopo1983 发表了文章 • 0 个评论 • 2344 次浏览 • 2017-05-04 16:53 • 来自相关话题

html
<div id="masonry" class="container-fluid">

<div class="thumbnail">
<div class="imgs">
<img src="" />
</div>
<div class="caption">
<div class="title"></div>
<div class="content">

</div>
</div>
</div>

</div>css
<script>
$(function() {

var masonryNode = $('#masonry');
masonryNode.imagesLoaded(function(){
masonryNode.masonry({
itemSelector: '.thumbnail',
isFitWidth: true
});
});


});
</script>// 首先将新元素添加到页面容器中

masonryNode.append(newItems);
// 等待新元素中的图片加载完毕
newItems.imagesLoaded(function(){

// 调用瀑布流布局的appended方法
masonryNode.masonry('appended', newItems);
});$(window).scroll(function() {

if($(document).height() - $(window).height() - $(document).scrollTop() < 10) {

if(!imagesLoading) {
appendToMasonry();
}

}

});masonry官网 查看全部
html
<div id="masonry" class="container-fluid">

<div class="thumbnail">
<div class="imgs">
<img src="" />
</div>
<div class="caption">
<div class="title"></div>
<div class="content">

</div>
</div>
</div>

</div>
css
<script>
$(function() {

var masonryNode = $('#masonry');
masonryNode.imagesLoaded(function(){
masonryNode.masonry({
itemSelector: '.thumbnail',
isFitWidth: true
});
});


});
</script>
// 首先将新元素添加到页面容器中

masonryNode.append(newItems);
// 等待新元素中的图片加载完毕
newItems.imagesLoaded(function(){

// 调用瀑布流布局的appended方法
masonryNode.masonry('appended', newItems);
});
$(window).scroll(function() {

if($(document).height() - $(window).height() - $(document).scrollTop() < 10) {

if(!imagesLoading) {
appendToMasonry();
}

}

});
masonry官网

jQuery 瀑布流可以这样写

javascript/jQueryboloog 发表了文章 • 0 个评论 • 1805 次浏览 • 2017-05-04 09:56 • 来自相关话题

瀑布流实现原理
?
固定每一个item的宽度根据父级绝对定位js计算每一行可以排列几个 (父级总宽度 / item)= 排列个数写一个空数组 循环保存每一行的下标高度循环所有item获取当前行最小的高度和索引,改变当前的left和top会用到left的值就是当前索引*item的宽度top的值就是当前索引的高度计算完以后重置当前索引的高度elHeight[minIndex]+= 当前的高度,依次循环就可以了浏览器缩放时添加一个resize再从第三部重新计算宽度,然后循环数据,调整样式
?
实例代码
?
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Waterfall flow</title>
<style>
*{
margin: 0;
padding: 0;
}
body {
font-family: "Droid Serif","Helvetica Neue",Helvetica,Arial,sans-serif;
font-size: 14px;
}
.clearfix:after{
content: "";
display: block;
clear: both;
}
input,button,select,textarea{
outline:none;border: none;
}
a{
text-decoration: none;
}
ul,li{
list-style: none;
}
img{
border: none;
}
.wrap {
position: relative;
min-width: 440px;
width: 90%;
margin: 0 auto;
}
.item {
width: 200px;
margin: 10px;
position: absolute;
transition: all .6s ease-out;
font-size: 50px;
color: #fff;
text-align: center;
}
</style>
</head>
<body>
<div class="wrap"></div>
<script src="https://cdn.bootcss.com/jquery ... gt%3B
<script>
var WaterFall = {
init: function(){
// 添加 item 盒子
this.addItem();
// 添加好盒子就开始布局
this.layout();
// 改变窗口时执行
this.resize();
},
addItem: function(){
var wrap = $('.wrap');
// 生成30个div 随机高度 和 颜色
var item = '';
for (var i = 0; i < 30; i++) {
item +='<div class="item" style="height:'+parseInt(Math.random() * 100 + 230)+'px;background-color:'+this.getRandColor()+'">'+i+'</div>';
}
wrap.append(item);
},
layout: function(){
var elHeight = [];
// 计算每一行可以存放几个 item 总宽 / item宽度
var countWidth = Math.floor( $('.wrap').width() / $('.item').width());
// 初始化添加 第一行高度的下标
for (var i = 0; i < countWidth; i++) {
elHeight[i] = 0;
}
// 循环 所有item
$('.item').each(function(index, el) {
// apply 传入数组 取得最小的高度
var minValue = Math.min.apply(null, elHeight);
console.log(minValue)
// 然后获取当前高度的索引
var minIndex = elHeight.indexOf(minValue)
// 修改当前的top 和 left
$(this).css({
top: elHeight[minIndex], // 获取当前索引对应的高度
left: $(this).outerWidth(true) * minIndex // 当前的left值为 索引 * 宽度(位于第几个)
})
// 当前索引的高度 += 当前 item 的高度 (比如计算第二排高度时, 就等于上一个的 top + 当前的高度)elHeight[0] += 90 下一次高度就为90
elHeight[minIndex] += $(this).outerHeight(true);
});
},
resize: function(){
$(window).resize(function() {
WaterFall.layout();
});
},
getRandColor: function(){
var str = '1234567890abcdef';
var colorStr = '#';
for(var i =0; i < 6; i++){
colorStr += str[ Math.floor(Math.random() * str.length) ];
}
return colorStr;
}
}
WaterFall.init(); // 执行
</script>
</body>
</html>
在线查看
?
总结

瀑布流布局实现了,在数据多的情况下没有做分页加载数据,后续会补充。
?
? 查看全部
瀑布流实现原理
?
  • 固定每一个item的宽度
  • 根据父级绝对定位
  • js计算每一行可以排列几个 (父级总宽度 / item)= 排列个数
  • 写一个空数组 循环保存每一行的下标高度
  • 循环所有item获取当前行最小的高度和索引,改变当前的left和top会用到
  • left的值就是当前索引*item的宽度
  • top的值就是当前索引的高度
  • 计算完以后重置当前索引的高度elHeight[minIndex]+= 当前的高度,依次循环就可以了
  • 浏览器缩放时添加一个resize再从第三部重新计算宽度,然后循环数据,调整样式

?
实例代码
?
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Waterfall flow</title>
<style>
*{
margin: 0;
padding: 0;
}
body {
font-family: "Droid Serif","Helvetica Neue",Helvetica,Arial,sans-serif;
font-size: 14px;
}
.clearfix:after{
content: "";
display: block;
clear: both;
}
input,button,select,textarea{
outline:none;border: none;
}
a{
text-decoration: none;
}
ul,li{
list-style: none;
}
img{
border: none;
}
.wrap {
position: relative;
min-width: 440px;
width: 90%;
margin: 0 auto;
}
.item {
width: 200px;
margin: 10px;
position: absolute;
transition: all .6s ease-out;
font-size: 50px;
color: #fff;
text-align: center;
}
</style>
</head>
<body>
<div class="wrap"></div>
<script src="https://cdn.bootcss.com/jquery ... gt%3B
<script>
var WaterFall = {
init: function(){
// 添加 item 盒子
this.addItem();
// 添加好盒子就开始布局
this.layout();
// 改变窗口时执行
this.resize();
},
addItem: function(){
var wrap = $('.wrap');
// 生成30个div 随机高度 和 颜色
var item = '';
for (var i = 0; i < 30; i++) {
item +='<div class="item" style="height:'+parseInt(Math.random() * 100 + 230)+'px;background-color:'+this.getRandColor()+'">'+i+'</div>';
}
wrap.append(item);
},
layout: function(){
var elHeight = [];
// 计算每一行可以存放几个 item 总宽 / item宽度
var countWidth = Math.floor( $('.wrap').width() / $('.item').width());
// 初始化添加 第一行高度的下标
for (var i = 0; i < countWidth; i++) {
elHeight[i] = 0;
}
// 循环 所有item
$('.item').each(function(index, el) {
// apply 传入数组 取得最小的高度
var minValue = Math.min.apply(null, elHeight);
console.log(minValue)
// 然后获取当前高度的索引
var minIndex = elHeight.indexOf(minValue)
// 修改当前的top 和 left
$(this).css({
top: elHeight[minIndex], // 获取当前索引对应的高度
left: $(this).outerWidth(true) * minIndex // 当前的left值为 索引 * 宽度(位于第几个)
})
// 当前索引的高度 += 当前 item 的高度 (比如计算第二排高度时, 就等于上一个的 top + 当前的高度)elHeight[0] += 90 下一次高度就为90
elHeight[minIndex] += $(this).outerHeight(true);
});
},
resize: function(){
$(window).resize(function() {
WaterFall.layout();
});
},
getRandColor: function(){
var str = '1234567890abcdef';
var colorStr = '#';
for(var i =0; i < 6; i++){
colorStr += str[ Math.floor(Math.random() * str.length) ];
}
return colorStr;
}
}
WaterFall.init(); // 执行
</script>
</body>
</html>

在线查看
?
总结

瀑布流布局实现了,在数据多的情况下没有做分页加载数据,后续会补充。
?
?