公共的函数封装有问题,一直显示对象初始化的问题,不知道怎么改
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>显示与隐藏</title>
<link rel='stylesheet' type='text/css' href='show-hide.css' />
<script type="text/javascript" src='jquery.min.js'></script>
</head>
<style>
* {
margin: 0;
padding: 0;
}
body {
width: 200px;
margin: 0 auto;
}
.btn {
width: 100px;
height: 30px;
}
/* visibility 属性规定元素是否可见。即使不可见的元素也会占据页面上的空间。
请使用 "display" 属性来创建不占据页面空间的不可见元素。
visibility规定元素的内容是否显示;而display规定元素本身的现实方式,可以决定元素本身是否可见。 */
#box {
display:none;
/* visibility:hidden;
opacity:0; */
width: 200px;
height: 200px;
/* border: #333 solid 1px; */
background:red;
}
/* 为box添加了transition但是并没有出现动画,因为 */
.transition{
transition:all 0.5s;
}
/* 哪个元素要用淡出动画就添加这个class名,js中显示时移除这个fadeout类名,隐藏时添加这个fadeout */
.fadeOut{
visibility:hidden !important;
opacity:0 !important;
}
/* 上下卷帘通过改变垂直高度来实现动画 */
.sliderUpDownCollapse{
height:0 !important;
/* 如果使用者没有设置高度,而是用padding来填充,动画也没法实现 */
padding-top:0 !important;
padding-bottom:0 !important;
/* 优先级的问题,虽然这里设置了高,但是如果元素本身的id也设置了,动画了无法实现,加上important */
}
.slideLeftRightCollapse{
width:0 !important;
/* 如果使用者没有设置高度,而是用padding来填充,动画也没法实现 */
padding-left:0 !important;
padding-right:0 !important;
}
</style>
<body>
<button id='btn-show' class='btn'>显示</button><button id='btn-hide' class='btn'>隐藏</button>
<div id='box' class=''></div>
<script type="text/javascript" src='show-hide.js'></script>
<script type="text/javascript" src='show-hide2.js'></script>
<script type="text/javascript" src='show-hide3.js'></script>
<script>
function init($ele, hiddenCallback) { //元素初始化
if ($ele.is(':hidden')) {
$ele.data('status', 'hidden');
}
if (typeof hiddenCallback === 'function') {
hiddenCallback();
// $ele.addClass('fadeOut');
} else {
$ele.data('status', 'shown');
}
}
function show($ele, callback) { //show公共部分
if ($ele.data('status') === 'show') return;
if ($ele.data('status') === 'shown') return;
$ele.data('status', 'show').trigger('show');
callback();
}
function hide($ele, callback) { //hide公共部分
if ($ele.data('status') === 'hide') return;
if ($ele.data('status') === 'hidden') return;
$ele.data('status', 'hide');
callback();
}
var js = { //init\show\hide的判断之前已经封装好了,不同的回调函数调用就行
_init: function ($ele, hiddenCallback) { //公共初始状态
$ele.removeClass('transition'); //如果在HTML标签中设置css动画样式,js就不能政策执行了
init($ele, hiddenCallback);
},
_show: function ($ele, mode) { //公共show
show($ele, function () { //回调函数
$ele.stop()[mode](function () { //这里的stop相当于css方法中的off
$ele.data('status', 'shown').trigger('shown');
});
})
},
_hide: function ($ele, mode) { //公共hide
hide($ele, function () { //回调函数
$ele.stop()[mode](function () {
$ele.data('status', 'hidden').trigger('hidden');
})
})
},
fadeSlideUpDown: { //封装后的代码
init: function ($ele) {
js._customInit($ele, {
'opacity': 0,
'height': 0,
'padding-left': 0,
'padding-right': 0
})
//用一个对象保存css中的属性
},
show: function ($ele) {
js._customShow($ele);
},
hide: function ($ele) {
js._customHide($ele, {
'height': 0,
'opacity': 0,
'padding-top': 0,
'padding-down': 0
});
},
},
// // e、fades+lideLeftRight
fadeSlideLeftRight: { //封装的
init: function ($ele) {
js.custom_Init($ele, {
'opacity': 0,
'width': 0,
'padding-left': 0,
'padding-right': 0
})
},
show: function ($ele) {
js._customShow($ele);
},
hide: function ($ele) {
js._customHide($ele, {
'width': 0,
'opacity': 0,
'padding-top': 0,
'padding-down': 0
});
},
},
//jQuery中没有的样式的公共的函数封装
_customInit = function ($ele, options) {
var styles = {};
for (var p in options) {
styles[p] = $ele.css('p');
$ele.data('styles', styles); //data自定义style,将上面定义的styles传给定义的styles
js._init($ele, function () {
$ele.css(options);
})
};
},
_customShow = function ($ele, styles) {
show($ele, function () { //回调最外层公共的show
var styles = $ele.data('styles');
$ele.show();
$ele.stop().animate(styles, function () { //动画完毕后的状态
$ele.data('status', 'shown').trigger('shown');
});
})
},
_customHide = function ($ele, options) {
hide($ele, function () {
$ele.stop().animate(options, function () {
$ele.data('status', 'hideen').trigger('hidden');
});
});
}
}
var $box = $('#box');
js.fadeSlideLeftRight.init($box);
$('#btn-show').on('click', function () {
js.fadeSlideLeftRight.show($box);
});
$('#btn-hide').on('click', function () {
js.fadeSlideLeftRight.hide($box);
})
</script>
</body>
</html>
封装的一层套一层有些屡不清楚了,组件化意思就是将源代码公共的部分提取,用回调函数回调公共部分,在不同样式你写不同于其他样式的代码,公共的部分大家都可区调用,的这个意思吗?这种一层一层的关系怎么屡?回调函数怎么调?感觉很混乱!老师能介绍好的思路方法吗?
另外在实际工作中,是否我们自己写这种组件化的代码?
正在回答
老铁,你说的没毛病,组件化就是为了后期开发方便而封装的,相当于个小接口吧。
你这代码中后面定义方法的时候怎么用的等于啊,
还有p是变量,不能变成字符串属性。我给你修改了下:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>显示与隐藏</title> <link rel='stylesheet' type='text/css' href='show-hide.css' /> <script type="text/javascript" src='js/jquery.js'></script> </head> <style> * { margin: 0; padding: 0; } body { width: 200px; margin: 0 auto; } .btn { width: 100px; height: 30px; } /* visibility 属性规定元素是否可见。即使不可见的元素也会占据页面上的空间。 请使用 "display" 属性来创建不占据页面空间的不可见元素。 visibility规定元素的内容是否显示;而display规定元素本身的现实方式,可以决定元素本身是否可见。 */ #box { display:none; /* visibility:hidden; opacity:0; */ width: 200px; height: 200px; /* border: #333 solid 1px; */ background:red; } /* 为box添加了transition但是并没有出现动画,因为 */ .transition{ transition:all 0.5s; } /* 哪个元素要用淡出动画就添加这个class名,js中显示时移除这个fadeout类名,隐藏时添加这个fadeout */ .fadeOut{ visibility:hidden !important; opacity:0 !important; } /* 上下卷帘通过改变垂直高度来实现动画 */ .sliderUpDownCollapse{ height:0 !important; /* 如果使用者没有设置高度,而是用padding来填充,动画也没法实现 */ padding-top:0 !important; padding-bottom:0 !important; /* 优先级的问题,虽然这里设置了高,但是如果元素本身的id也设置了,动画了无法实现,加上important */ } .slideLeftRightCollapse{ width:0 !important; /* 如果使用者没有设置高度,而是用padding来填充,动画也没法实现 */ padding-left:0 !important; padding-right:0 !important; } </style> <body> <button id='btn-show' class='btn'>显示</button><button id='btn-hide' class='btn'>隐藏</button> <div id='box' class=''></div> <script type="text/javascript" src='show-hide.js'></script> <script type="text/javascript" src='show-hide2.js'></script> <script type="text/javascript" src='show-hide3.js'></script> <script> function init($ele, hiddenCallback) { //元素初始化 if ($ele.is(':hidden')) { $ele.data('status', 'hidden'); } if (typeof hiddenCallback === 'function') { hiddenCallback(); // $ele.addClass('fadeOut'); } else { $ele.data('status', 'shown'); } } function show($ele, callback) { //show公共部分 if ($ele.data('status') === 'show') return; if ($ele.data('status') === 'shown') return; $ele.data('status', 'show').trigger('show'); callback(); } function hide($ele, callback) { //hide公共部分 if ($ele.data('status') === 'hide') return; if ($ele.data('status') === 'hidden') return; $ele.data('status', 'hide'); callback(); } var js = { //init\show\hide的判断之前已经封装好了,不同的回调函数调用就行 _init: function($ele, hiddenCallback) { //公共初始状态 $ele.removeClass('transition'); //如果在HTML标签中设置css动画样式,js就不能政策执行了 init($ele, hiddenCallback); }, _show: function($ele, mode) { //公共show show($ele, function() { //回调函数 $ele.stop()[mode](function() { //这里的stop相当于css方法中的off $ele.data('status', 'shown').trigger('shown'); }); }) }, _hide: function($ele, mode) { //公共hide hide($ele, function() { //回调函数 $ele.stop()[mode](function() { $ele.data('status', 'hidden').trigger('hidden'); }) }) }, fadeSlideUpDown: { //封装后的代码 init: function($ele) { js._customInit($ele, { 'opacity': 0, 'height': 0, 'padding-left': 0, 'padding-right': 0 }) //用一个对象保存css中的属性 }, show: function($ele) { js._customShow($ele); }, hide: function($ele) { js._customHide($ele, { 'height': 0, 'opacity': 0, 'padding-top': 0, 'padding-down': 0 }); }, }, // // e、fades+lideLeftRight fadeSlideLeftRight: { //封装的 init: function($ele) { // js.custom_Init($ele, { js._customInit($ele, { 'opacity': 0, 'width': 0, 'padding-left': 0, 'padding-right': 0 }) }, show: function($ele) { js._customShow($ele); }, hide: function($ele) { js._customHide($ele, { 'width': 0, 'opacity': 0, 'padding-top': 0, 'padding-down': 0 }); }, }, //jQuery中没有的样式的公共的函数封装 // _customInit = function($ele, options) { _customInit: function($ele, options) { var styles = {}; for (var p in options) { // styles[p] = $ele.css('p'); styles[p] = $ele.css(p); } console.log(styles) $ele.data('styles', styles); //data自定义style,将上面定义的styles传给定义的styles js._init($ele, function() { $ele.css(options); }) }, // _customShow = function($ele, styles) { _customShow: function($ele, styles) { show($ele, function() { //回调最外层公共的show var styles = $ele.data('styles'); $ele.show(); $ele.stop().animate(styles, function() { //动画完毕后的状态 $ele.data('status', 'shown').trigger('shown'); }); }) }, // _customHide = function($ele, options) { _customHide: function($ele, options) { hide($ele, function() { $ele.stop().animate(options, function() { $ele.data('status', 'hideen').trigger('hidden'); }); }); } } var $box = $('#box'); js.fadeSlideLeftRight.init($box); $('#btn-show').on('click', function() { js.fadeSlideLeftRight.show($box); }); $('#btn-hide').on('click', function() { js.fadeSlideLeftRight.hide($box); }) </script> </body> </html>
你试试行不行,jquery地址换成你原来的就行,我给改了。
在实际开发中一般用第三方插件比较多,用其他人写好的,踩过坑的。不过还得看公司的要求,就想要封装公司自己小组件的话,只能一点一点的开发了。
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星