文章分段效果类似于:
-moz-column-count:4; -webkit-column-count:4; column-count:4;
文章分段效果类似于:
-moz-column-count:4; -webkit-column-count:4; column-count:4;
HTML:
<p>4月13日消息,据台湾媒体报道,32岁的孙燕姿(Sng Ee Tze)和后天将满34岁的荷兰籍印度尼西亚男友纳迪姆(Nadim Van Der Ros)交往5年,曾说过"有空就结婚"的她,果然趁着宣传期尾声,于3月31日在新加坡登记注册了!昨消息传开,她未否认,仅说会选择适当时间公布喜讯,所属"美妙音乐"则表示她个性低调,婚礼只会邀请双方亲友,也不会透露细节,但据新加坡可靠消息指出,婚宴订在5月初。</p> <button id="button">选中一些文字,然后点击本按钮</button>
JS代码:
var oBtn = document.getElementById("button");
oBtn.onclick = function() {
var userSelection, text;
if (window.getSelection) {
//现代浏览器
userSelection = window.getSelection();
} else if (document.selection) {
//IE浏览器 考虑到Opera,应该放在后面
userSelection = document.selection.createRange();
}
if (!(text = userSelection.text)) { //IE支持有text属性来获取值
text = userSelection.toString(); //现代浏览器有toString()获取值
}
alert(text);
};
注意:火狐不支持input textarea 这些输入框的文本字符串选中获取,只能获取到选中在div p span的上的文本字符串上
效果:http://www.zhangxinxu.com/study/201104/get-selection-text.html
文字的选中功能是不太常用的功能,多出现在文本编辑器中,或是文本域之类的光标处理上。所以呢,使用的一些属性也并不是常见的。在IE浏览器下使用的是createTextRange而Firefox/chrome等现代浏览器下使用的是setSelectionRange。
假设文本域对象的名称是obj,则在IE及非IE浏览器下实现指定文字选中的代码如下:
IE浏览器下:
var range = obj.createTextRange();
range.moveStart("character", 开始序号);
range.moveEnd("character", 结束序号);
range.select();
非IE浏览器下:
obj.setSelectionRange(开始序号, 结束序号); obj.focus();
所以,为了在各个浏览器下都能实现效果,我们需要将上面的两段代码组合一下,结果如下:
if(obj.createTextRange){//IE浏览器
var range = obj.createTextRange();
range.moveEnd("character",结束序号);
range.moveStart("character", 起始序号);
range.select();
}else{//非IE浏览器
obj.setSelectionRange(起始序号, 结束序号);
obj.focus();
}
代码进一步封装:
https://sdeno.com/wp-content/uploads/2016/11/text_select.html
http://www.zhangxinxu.com/wordpress/?p=755
前端自动化工具现在是五花八门,例举:grunt、gulp、webpack、yeoman、Bower还有百度的fis。东西多但是大致的功能就是帮我们减少一些重复性的工作。这里重点就结合下gulp,如果对grunt感兴趣可以参考《grunt入门教程》,网上都说gulp比grunt优秀其实它们的用法感觉也差不多。
将以下内容保存为gulpfile.js
var gulp = require('gulp');
var cssmin = require('gulp-minify-css'); //压缩,删除注释、换行,合并选择器
var cssver = require('gulp-make-css-url-version'); //为css的url背景图片添加mdb5,防止缓存
var concat = require('gulp-concat');//合并css、js
var uglify = require('gulp-uglify'); //js压缩
var notify = require('gulp-notify'); //任务执行成功提示
var htmlmin = require('gulp-htmlmin');//对html页面压缩处理
var postcss = require('gulp-postcss'); //自动添加css前缀
var autoprefixer = require('autoprefixer-core');//自动添加css前缀
var rev = require('gulp-rev-append'); //为html的js、css添加版本号
var cheerio = require('gulp-cheerio'); //操作html的dom,目的合并多个js或者css链接
var useref = require('gulp-useref'); //将html中多个link和script各自合并成一个
var del = require('del'); //删除文件
var gulpif = require('gulp-if');
var imageMin = require('gulp-imagemin'); //图片压缩
var babel = require("gulp-babel");
var fileinclude = require('gulp-file-include');
var runSequence = require('run-sequence'); //同步执行
gulp.task('fileinclude', function() {
// 适配page中所有文件夹下的所有html,排除page下的include文件夹中html
gulp.src(['view/**/*.html'])
.pipe(fileinclude({
prefix: '@@',
basepath: '@file'
}))
.pipe(gulp.dest('src'))
.on('end', function () {
gulp.src('src/*.html')
.pipe(useref())
.pipe(gulpif('*.js', babel({presets: ['es2015']})))
.pipe(gulpif('*.js', uglify()))
.pipe(gulpif('*.css', cssmin({
advanced: false,//类型:Boolean 默认:true [是否开启高级优化(合并选择器等)]
compatibility: 'ie7',//保留ie7及以下兼容写法 类型:String 默认:''or'*' [启用兼容模式; 'ie7':IE7兼容模式,'ie8':IE8兼容模式,'*':IE9+兼容模式]
keepBreaks: false,//类型:Boolean 默认:false [是否保留换行]
keepSpecialComments: '*'//保留所有特殊前缀 当你用autoprefixer生成的浏览器前缀,如果不加这个参数,有可能将会删除你的部分前缀
})))
.pipe(gulpif('*.css',postcss([ autoprefixer({ browsers: ["> 0%"] }) ])))
.pipe(gulpif('*.css',cssver()))
.pipe(gulpif('*.html',htmlmin({
removeComments: true,//清除HTML注释
collapseWhitespace: true,//压缩HTML
collapseBooleanAttributes: true,//省略布尔属性的值 <input checked="true"/> ==> <input />
removeEmptyAttributes: true,//删除所有空格作属性值 <input id="" /> ==> <input />
removeScriptTypeAttributes: true,//删除<script>的type="text/javascript"
removeStyleLinkTypeAttributes: true,//删除<style>和<link>的type="text/css"
minifyJS: true,//压缩页面JS
minifyCSS: true//压缩页面CSS
})))
.pipe(gulpif('*.html',rev()))
//.pipe(gulpif('*.html',cheerio(function ($, file) {
// $('link').eq(0).remove();
// $('head').append('<link rel="stylesheet" href="css/css.min.css?rev='+Math.random()+'">');
// $('script').eq(0).remove();
// $('head').append('<script src="js/all.min.js?rev='+Math.random()+'"></script>');
//})))
.pipe(gulp.dest('dist'))
});
});
//把独立的js复制到dist/js的根目录下
gulp.task('copy', function() {
gulp.src('src/js/*.js')
.pipe(gulp.dest('dist/js'))
});
//图片压缩
gulp.task('img', function () {
gulp.src('src/images/*.*')
.pipe(imageMin({progressive: true}))
.pipe(gulp.dest('dist/images'));
console.log('33333333333');
});
//为此任务命名为watch
// gulp.task('watch',function(){
// gulp.watch('src/**/*.css',['sync']); //在css目录下的所有文件夹的后缀是css的文件,一旦修改就自动执行testCssmin任务
// gulp.watch('src/**/*.js',['sync']);
// });
//修改view目录下的html就自动在src根目录下生成html
gulp.task('watch_html',function(){
gulp.watch('view/**/*.html',['fileinclude']); //在css目录下的所有文件夹的后缀是css的文件,一旦修改就自动执行testCssmin任务
});
//gulp的默认执行的任务就是watch任务
//gulp.task('default',['testCssmin','js','html','watch'], function() {
// // 将你的默认的任务代码放在这
//});
gulp.task('default',['fileinclude','img','copy'], function() {
// 将你的默认的任务代码放在这
});
在命令环境中直接输入:gulp,就能到达以下效果:
按先后顺序依次执行fileinclude、 img 、copy
———————————————以下是本人的前端自动化构建包—————————————————————-

链接: https://pan.baidu.com/s/1Qcd69Vb9i9At2lZIXN3D7g 提取码: m9i7
https://sdeno.com/wp-content/uploads/2017/09/gulp.rar
使用步骤:
1,解压目录后执行: npm install
2,编辑html文件在view目录,推荐开启监听view目录里面的html变化后自动生成更新html到src根目录下
———————————————API学习—————————————————————-
通配符路径匹配示例:
“src/a.js”:指定具体文件;
“*”:匹配所有文件 例:src/*.js(包含src下的所有js文件);
“**”:匹配0个或多个子文件夹 例:src/**/*.js(包含src的0个或多个子文件夹下的js文件);
“{}”:匹配多个属性 例:src/{a,b}.js(包含a.js和b.js文件) src/*.{jpg,png,gif}(src下的所有jpg/png/gif文件);
“!”:排除文件 例:!src/a.js(不包含src下的a.js文件);
案例:
var gulp = require('gulp'),
less = require('gulp-less');
gulp.task('testLess', function () {
//gulp.src('less/test/style.less')
gulp.src(['less/**/*.less','!less/{extend,page}/*.less'])
.pipe(less())
.pipe(gulp.dest('./css'));
});
gulp.task(name[, deps], fn)
说明:task定义一个gulp任务;
name: 类型(必填):String 指定任务的名称(不应该有空格);
deps: 类型(可选):StringArray,该任务依赖的任务(注意:被依赖的任务需要返回当前任务的事件流,请参看下面示例);
fn: 类型(必填):Function 该任务调用的插件操作;
gulp.task('testLess', function () {
return gulp.src(['less/style.less']) //这里要注意,添加了return
.pipe(less())
.pipe(gulp.dest('./css'));
});
gulp.task('minicss', ['testLess'], function () { //执行完testLess任务后再执行minicss任务
gulp.src(['css/*.css'])
.pipe(minifyCss())
.pipe(gulp.dest('./dist/css'));
});
gulp.watch(glob [, opts], tasks) or gulp.watch(glob [, opts, cb])
说明:watch方法是用于监听文件变化,文件一修改就会执行指定的任务;
glob: 需要处理的源文件匹配符路径。类型(必填):String or StringArray;
opts: 类型(可选):Object 具体参看https://github.com/shama/gaze;
tasks: 类型(必填):StringArray 需要执行的任务的名称数组;
cb(event): 类型(可选):Function 每个文件变化执行的回调函数;
gulp.task('watch1', function () {
gulp.watch('less/**/*.less', ['testLess']);
});
gulp.task('watch2', function () {
gulp.watch('js/**/*.js', function (event) {
console.log('File ' + event.path + ' was ' + event.type + ', running tasks...');
});
});
http://www.ydcss.com/archives/424
类似的还有pm2,《node.js网站发布工具模块—pm2》
Github地址:https://github.com/nodejitsu/forever
// 记得加-g,forever要求安装到全局环境下
sudo npm install forever -g
// 1. 简单的启动
forever start app.js
// 2. 指定forever信息输出文件,当然,默认它会放到~/.forever/forever.log
forever start -l forever.log app.js
// 3. 指定app.js中的日志信息和错误日志输出文件,
// -o 就是console.log输出的信息,-e 就是console.error输出的信息
forever start -o out.log -e err.log app.js
// 4. 追加日志,forever默认是不能覆盖上次的启动日志,
// 所以如果第二次启动不加-a,则会不让运行
forever start -l forever.log -a app.js
// 5. 监听当前文件夹下的所有文件改动
forever start -w app.js
forever list
// 1. 监听当前文件夹下的所有文件改动(不太建议这样)
forever start -w app.js
// 1. 停止所有运行的node App
forever stopall
// 2. 停止其中一个node App
forever stop app.js
// 当然还可以这样
// forever list 找到对应的uid,然后:
forever stop uid
重启操作跟停止操作保持一致。
// 1. 启动所有
forever restartall
http://blog.csdn.net/jbboy/article/details/35281225