⑴ 前端制作遮罩与蒙版
概念上两者非常容易混淆,但完成的效果是一样的,需记住哪个是无色抠取,哪个是黑色抠除。
再者还有个裁剪,只是做裁切,没有对半透明情况的处理。
这样一说就知道,本文阅读起来可能是会有点乱的。
那么前端方法中 如何实现 ,又各 有哪些应用场景 呢?
比较容易搜到的,也是用得最多的,强得一批。
现在是只有遮罩功能的, mask 指定的是下层形状,本元素及其所有子级为上层图案。
<small>以后的发展可能会通过 mask-composite 实现蒙版,小期待一下吧。</small>
遮罩嘛,即有色就显示,无色则隐藏。
rgba(0,0,0,0)、tranpsarent,png 图片中的透明 或 无色 就抠除。
mask 和 background 的设置非常类似,也可以缩写:
mask-image / mask-repeat / mask-position / mask-size / mask-origin / mask-clip
mask-image 也和 background-image 一样支持 url, gradient,image-set,element 等等。
举几个栗子:
至于剩下的 mask-mode / mask-type / mask-composite 浏览器支持还不太妙,暂可以不考虑。
但功能上却是强大,需要更多了解还请自行翻阅 文档 。
PS: 兼容性 方面虽然一片红,IE 什么的抛弃掉,实验下来其实还不错。写上 -webkit-mask 基本都能用。
PPS:firefox 中动画时 mask-size 小于 100% 会不显示,但定值可以,原因不知。
个人有点莫名的习惯,不管做什么效果,都会往 SVG 上想一想,可能源于它强大的功能吧。
相比 html+css 多了很多特性,如路径/线条的设置/诸多滤镜/视图限定等;
相比 canvas 多了一些 dom 上的便捷操作,如事件。
SVG 可以用 mask 来实现 蒙版 ,用 clipPath 来实现 裁剪 (下文会讲)。
区分一下,svg mask 为蒙版,白色为显示;css mask 为遮罩,有色为显示。
mask 蒙版内可以包裹透明图片或文字。
但使用蒙版的元素,却莫名不能是 image,这就很完蛋呀,有待研究。
如果 css 的 mask 适用于图片和渐变等的话,那 background-clip:text 就适用于文字。
字面意思,将背景裁切成文字范围。
另外,background-clip 还可以设 content-box,也是不错的功能,
默认 padding-box,border-box 有上边框不被修改的 BUG。
注: 兼容性 上,明文规定要加 -webkit-。顺便抛弃 IE。
很多文章误以为是 text-fill-color 实现了遮罩功能,其实是 background-clip:text 呀!
clip 在 canvas 中本来的作用是切一块画布独立出来。
拿来做遮罩效果也是可以的,但并非真的遮罩,只是裁剪,因为它不是按有色无色来判断显示的。
还可以用 beginPath, lineTo 等线条操作来形成图形。
注:fillRect 和 strokeRect 是无法被切出来的,要用 rect。
注:为了避免影响其他地方,用 save 和 restore 包起来就行了。
注:文字遮罩用 clip 是无法实现的。
修改 canvas 的渲染规则。比如后写的盖住前面的,改成后写的放到低层之类的。
这些规则中有一个 source-in,就能实现 遮罩 (按黑白色来判断显隐)。
如果你用的 strokeRect 和 fillText 那绘制出来的也是相应效果哟。
如果前者是半透明的,覆盖的后者渲染出来也会是半透明的。
如果前者是半透明的 PNG 图片,覆盖的后者出来的也会是半透明,强无敌。
注:globalCompositeOperation 的默认值是 source-over,用完了别忘了改回来,不然会影响后续操作。
全部规则效果一览: https://foreverz133.github.io/demos/single/globalCompositeOperation.html
其中有一些可以拿出来提一下,挺好玩的。
source-in:交叉的部分渲染后者
destination-in:交叉的部分渲染前者
destination-out:去掉交叉的部分
destination-over:后者放至下层
主要还是以裁剪为主,裁剪当然是不会根据形状的颜色什么的来判断显隐的咯。
css 的 clip-path 是老版属性 clip 的改良版,clip 必须绝对定位,且只有矩形还只能 px。
clip-path 则支持方形/圆形/椭圆形/多边形,单位也更丰富。
我觉得 clip-path 和 border-radius 一样,改个图片或者盒子的样式又方便又爽。
但也不一样,因为是裁剪,像 border 呀子级内容呀什么的也是会被剪掉的,hover 也还是原来的尺寸。
比如盖一层镂空的五角星显示背景色呀,盖一层镂空的字呀什么的
假 DEMO: https://foreverz133.github.io/demos/single/star.html
这应该就是名副其实的遮挡层了吧,与本文其实毫无关系。
但可能你会在你不了解 mask 或需要兼容时用到。
例子: http://www.zhangxinxu.com/wordpress/2016/03/better-black-mask-guide-overlay-method/
除此之外,radial-gradient 可以完成部分类似功能,比如圆形的镂空,位置和大小设置相较也更方便。
shape-outside 仅能算作是高级版 float 扩展,也与本文毫无关系。
只是因为既然写了 clip-path 那 shape-outside 就提一下,避免有理解错误。
注:shape-outside 得是浮动元素时才有效。
注:它能设的值和 clip-path 基本一致
它并不会改变本身什么东西,形状不会变,border 等也还是原来的样子,还得结合 clip-path 来用。
它只是让其他与其贴边的元素有了一个不一样的贴边效果。
PS: 兼容性 吧,怎么说呢,回退到方形影响应该不大。
虽然 clip-path 又不像 border-radius 可以加边框阴影什么的,但其实 polygon 多边形可以有高级玩法,
比如: https://codepen.io/airen/pen/VPKQxb
文档 显示以后会支持 url 和 element 等,那就很方便了呀。顺便再期待一下 shape-inside 的出现。
你思考一下 css 的 mask / background-clip / clip-path 和 shape-outside 的使用场景,这其实很有意思。
遮罩是有色的部分显示图案,蒙版是白色的部分显示图案,裁剪只是裁成这个形状,三者的实际妙用在本文中并没有深入书写,仅算是梳理其功能和明确其区别。
还请大佬们多多分享此方面的巧妙案例咯,让小弟也开开眼。
⑵ 使用Ant Design Vue 做一个常用的修改对话框
使用Ant Design Vue 做一个常用的修改对话框
Ant Design Vue 官网: https://www.antdv.com/docs/vue/introce-cn/
首先我们需要有一个图1的前端界面,其次我们点击图1“修改”按钮的时候,弹出有遮罩层的一个对话框并在对话框中回显我们图一的“转账金额”和“到账时间”的数据;当我们点击对话框的“修改按钮时,则向后台服务器发起一个修改请求,在填写金额的同时使用正则进行校验
由上图可知,第一行和第二行格式一样,都是一个标题一个内容,所以我们采用一个自定义组件来达到一个通用性的效果
⑶ element-ui中的dialog如何去掉遮罩层
element ui是基于vue的一套前端可视化组件库,其dialog下的modal属性是一个布尔值,需要使用v-bind指令进行监听,试试在前面加个“:”试试
:modal='false' 这样写
⑷ 前端遮罩层作用
遮罩层的作用就是将层后面的内容都遮住,覆盖全屏。
⑸ 前端开发中常用到的js特效有哪些
HTML5 DOM 选择器
// querySelector() 返回匹配到的第一个元素var item = document.querySelector('.item');console.log(item);// querySelectorAll() 返回匹配到的所有元素,是一个nodeList集合var items = document.querySelectorAll('.item');console.log(items[0]);1234567
阻止默认行为
// 原生jsdocument.getElementById('btn').addEventListener('click', function (event) { event = event || window.event; if (event.preventDefault){ // w3c方法 阻止默认行为
event.preventDefault();
} else{ // ie 阻止默认行为
event.returnValue = false;
}
}, false);// jQuery$('#btn').on('click', function (event) { event.preventDefault();
});1234567891011121314151617
阻止冒泡
// 原生jsdocument.getElementById('btn').addEventListener('click', function (event) { event = event || window.event; if (event.stopPropagation){ // w3c方法 阻止冒泡
event.stopPropagation();
} else{ // ie 阻止冒泡
event.cancelBubble = true;
}
}, false);// jQuery$('#btn').on('click', function (event) { event.stopPropagation();
});1234567891011121314151617
鼠标滚轮事件
$('#content').on("mousewheel DOMMouseScroll", function (event) {
// chrome & ie || // firefox
var delta = (event.originalEvent.wheelDelta && (event.originalEvent.wheelDelta > 0 ? 1 : -1)) || (event.originalEvent.detail && (event.originalEvent.detail > 0 ? -1 : 1));
if (delta > 0) {
// 向上滚动
console.log('mousewheel top');
} else if (delta < 0) { // 向下滚动
console.log('mousewheel bottom');
}
});123456789101112
检测浏览器是否支持svg
function isSupportSVG() {
var SVG_NS = 'http://www.w3.org/2000/svg'; return !!document.createElementNS &&!!document.createElementNS(SVG_NS, 'svg').createSVGRect;
}
// 测试console.log(isSupportSVG());1234567
检测浏览器是否支持canvas
function isSupportCanvas() {
if(document.createElement('canvas').getContext){ return true;
}else{ return false;
}
}// 测试,打开谷歌浏览器控制台查看结果console.log(isSupportCanvas());12345678910
检测是否是微信浏览器
function isWeiXinClient() {
var ua = navigator.userAgent.toLowerCase();
if (ua.match(/MicroMessenger/i)=="micromessenger") {
return true;
} else {
return false;
}
}// 测试alert(isWeiXinClient());1234567891011
jQuery 获取鼠标在图片上的坐标
$('#myImage').click(function(event){
//获取鼠标在图片上的坐标
console.log('X:' + event.offsetX+'\n Y:' + event.offsetY);
//获取元素相对于页面的坐标
console.log('X:'+$(this).offset().left+'\n Y:'+$(this).offset().top);
});1234567
验证码倒计时代码
<!-- dom --><input id="send" type="button" value="发送验证码">12
// 原生js版本var times = 60, // 临时设为60秒
timer = null;
document.getElementById('send').onclick = function () {
// 计时开始
timer = setInterval(function () {
times--; if (times <= 0) {
send.value = '发送验证码';
clearInterval(timer);
send.disabled = false;
times = 60;
} else {
send.value = times + '秒后重试';
send.disabled = true;
}
}, 1000);
}
// jQuery版本var times = 60,
timer = null;
$('#send').on('click', function () {
var $this = $(this); // 计时开始
timer = setInterval(function () {
times--; if (times <= 0) {
$this.val('发送验证码');
clearInterval(timer);
$this.attr('disabled', false);
times = 60;
} else {
$this.val(times + '秒后重试');
$this.attr('disabled', true);
}
}, 1000);
});2122
常用的一些正则表达式
//匹配字母、数字、中文字符
/^([A-Za-z0-9]|[\u4e00-\u9fa5])*$/
//验证邮箱
/^\w+@([0-9a-zA-Z]+[.])+[a-z]{2,4}$/
//验证手机号
/^1[3|5|8|7]\d{9}$/
//验证URL
/^http:\/\/.+\./
//验证身份证号码
/(^\d{15}$)|(^\d{17}([0-9]|X|x)$)/
//匹配中文字符的正则表达式
/[\u4e00-\u9fa5]/
//匹配双字节字符(包括汉字在内)
/[^\x00-\xff]/
js时间戳、毫秒格式化
function formatDate(now) {
var y = now.getFullYear(); var m = now.getMonth() + 1; // 注意js里的月要加1
var d = now.getDate(); var h = now.getHours();
var m = now.getMinutes();
var s = now.getSeconds(); return y + "-" + m + "-" + d + " " + h + ":" + m + ":" + s;
}
var nowDate = new Date(2016, 5, 13, 19, 18, 30, 20);
console.log(nowDate.getTime()); // 获得当前毫秒数: 1465816710020console.log(formatDate(nowDate));123456789101112131415
js限定字符数(注意:一个汉字算2个字符)
<input id="txt" type="text">//字符串截取function getByteVal(val, max) {
var returnValue = ''; var byteValLen = 0; for (var i = 0; i < val.length; i++) { if (val[i].match(/[^\x00-\xff]/ig) != null) byteValLen += 2; else byteValLen += 1; if (byteValLen > max) break;
returnValue += val[i];
} return returnValue;
}
$('#txt').on('keyup', function () {
var val = this.value; if (val.replace(/[^\x00-\xff]/g, "**").length > 14) { this.value = getByteVal(val, 14);
}
});12345678910111213141516171819
js判断是否移动端及浏览器内核
var browser = {
versions: function() {
var u = navigator.userAgent;
return {
trident: u.indexOf('Trident') > -1, //IE内核
presto: u.indexOf('Presto') > -1, //opera内核
webKit: u.indexOf('AppleWebKit') > -1, //苹果、谷歌内核
gecko: u.indexOf('Firefox') > -1, //火狐内核Gecko
mobile: !!u.match(/AppleWebKit.*Mobile.*/), //是否为移动终端
ios: !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/), //ios
android: u.indexOf('Android') > -1 || u.indexOf('Linux') > -1, //android
iPhone: u.indexOf('iPhone') > -1 , //iPhone
iPad: u.indexOf('iPad') > -1, //iPad
webApp: u.indexOf('Safari') > -1 //Safari
};
}
}
if (browser.versions.mobile() || browser.versions.ios() || browser.versions.android() || browser.versions.iPhone() || browser.versions.iPad()) {
alert('移动端');
}21
之前我用过一个检测客户端的库 觉得挺好用的,也推荐给大家 叫 device.js,大家可以 Googel 或 网络
GItHub仓库地址:https://github.com/matthewhudson/device.js
getBoundingClientRect() 获取元素位置
//它返回一个对象,其中包含了left、right、top、bottom四个属性var myDiv = document.getElementById('myDiv');var x = myDiv.getBoundingClientRect().left;
var y = myDiv.getBoundingClientRect().top;
// 相当于jquery的: $(this).offset().left、$(this).offset().top // js的:this.offsetLeft、this.offsetTop123456
HTML5全屏
function fullscreen(element) {
if (element.requestFullscreen) {
element.requestFullscreen();
} else if (element.mozRequestFullScreen) {
element.mozRequestFullScreen();
} else if (element.webkitRequestFullscreen) {
element.webkitRequestFullscreen();
} else if (element.msRequestFullscreen) {
element.msRequestFullscreen();
}}
fullscreen(document.documentElement);12345678910111213
⑹ 前端开发 实现可滑动遮罩层,位置在底部占据总屏幕1/3,宽度充满屏幕。
<style type="text/css">
#zhe{
width:100%;
height:245px;
background-color:red;
position:fixed;
top:410px;
left:0px;
}
</style>
</head>
<body>
<div id="zhe" class=""></div>
<img src="images/1.jpg" width="" height="" border="0" alt="">
<img src="images/2.jpg" width="" height="" border="0" alt="">
<img src="images/3.jpg" width="" height="" border="0" alt="">
<img src="images/4.jpg" width="" height="" border="0" alt="">
<img src="images/5.jpg" width="" height="" border="0" alt="">
<img src="images/6.jpg" width="" height="" border="0" alt="">
</body>
主要是给上面这个div一个固定定位fixed 就会当你下拉滚动条时 他还是固定在下面不动的
⑺ 前端移动端开发,滑动时怎么禁止阴影层下的屏幕滚动
前端移动端开发,在页面中打开了一个层,同时打开一个遮罩层,滚动这个层时 下面的页面也会跟着滚动,禁止下面那个页面的滚动, 只滚动当前的层。
打开弹层时body的touchmove事件addEventListener增加阻止默认行为的事件,关闭弹层时removeEventListener;
阻止touchstart事件的默认行为,在vue下@touchstart.prevent,在弹出层和底层元素之间曾加一层遮罩;
⑻ bootstrap使用模态框当弹出两层的时候,遮罩层会把原有的透明度减少。
每个模态窗会生成一个class为"modal-backdrop"的遮罩。在模态窗第一次显示时为这个模态窗的遮罩层设置一个id。例如:
$modal.modal({show: true,backdrop: 'static'});
$('.modal-backdrop').each(function() {
$(this).attr('id', 'id_' + Math.random());
});
⑼ .net core savechanges 网络不好情况下,如何防止用户连击重复提交数据
1、前端提交处理显示遮罩层,如果后台无返回则显示提交中,直到后台返回成功才进行遮罩层的取消
2、后台可以进行唯一标识符的判定比如名称是否一样等等来进行重复提交数据的更新或者丢企
⑽ 前端页面加载后,整个页面都是白色,而且按钮位置处还可以点击,按f12进入开发模式后,页面就正常了
看看控制台有没有报错,检查一下是不是设置了遮罩层