我在我的网站上有一个包含所有内容的部分,但是我想要一个带有隐藏内容的“侧边栏”在按下外部按钮时从左侧顺利出现。在没有jQuery的情况下切换HTML元素的类
CSS过渡可以处理平滑没有问题,并且jQuery toggle()
可以在类之间切换以将隐藏的div移入和移出屏幕。
如何在不使用jQuery的情况下获得相同的效果?
我在我的网站上有一个包含所有内容的部分,但是我想要一个带有隐藏内容的“侧边栏”在按下外部按钮时从左侧顺利出现。在没有jQuery的情况下切换HTML元素的类
CSS过渡可以处理平滑没有问题,并且jQuery toggle()
可以在类之间切换以将隐藏的div移入和移出屏幕。
如何在不使用jQuery的情况下获得相同的效果?
您可以通过CSS3只实现它:
<label for="showblock">Show Block</label>
<input type="checkbox" id="showblock" />
<div id="block">
Hello World
</div>
而CSS部分:
#block {
background: yellow;
height: 0;
overflow: hidden;
transition: height 300ms linear;
}
label {
cursor: pointer;
}
#showblock {
display: none;
}
#showblock:checked + #block {
height: 40px;
}
的魔术是隐藏checkbox
和CSS的:checked
选择。
这是完美的!甚至没有任何js!如果可以的话,我会多次赞扬这个答案:D我喜欢这个解决方案!它比我能想象到的最简单的js更好!你先生,赢得5000个互联网,但因为我没有15 +代表无法赞成,我只是给你这个,希望它可以让你的脸上带着微笑; https://www.youtube.com/watch?v=V-1gjOKKoRY – KittenCodings 2014-08-28 08:44:00
一个字:辉煌! – 2014-08-28 08:51:39
纯HTML + CSS,太棒了! +1 – fbiazi 2015-08-31 11:54:43
如果你感到快乐,只支持更现代的浏览器,您可以切换使用classList.toggle()函数的类:
var element = document.getElementById('sidebar');
var trigger = document.getElementById('js-toggle-sidebar'); // or whatever triggers the toggle
trigger.addEventListener('click', function(e) {
e.preventDefault();
element.classList.toggle('sidebar-active'); // or whatever your active class is
});
这应该做你需要的一切 - 如果你有一个以上的触发我建议使用document.querySelectorAll(selector)
。
希望帮助
他很高兴只支持现代浏览器,因为正如他提到的那样,他正在使用css3转换。 – blex 2014-08-28 08:20:45
够公平,切换! :) – 2014-08-28 08:25:42
所以有一个简单的方法来切换没有jQuery的类!这太棒了,谢谢! :D – KittenCodings 2014-08-28 08:31:18
你可以使用JavaScript(jQuery的没有)和类ID得到任何元素的属性: element.className 所以有这样的一个函数:
更新: 因为这正成为一种有点流行我更新了功能,使其更好。
function toggleClass(element, toggleClass){
var currentClass = element.className;
var newClass;
if(currentClass.split(" ").indexOf(toggleClass) > -1){ //has class
newClass = currentClass.replace(new RegExp('\\b'+toggleClass+'\\b','g'),"")
}else{
newClass = currentClass + " " + toggleClass;
}
element.className = newClass.trim();
}
啊......很好,我可以做得比我原先打算使用的还要多,非常感谢:) – KittenCodings 2014-08-28 08:33:52
你知道“newClass”变量不会是本地的吗? – 2017-05-14 14:28:12
很好的答案!请将函数内的第一行更改为'var currentClass = element.className || ''处理空类属性:) – ymz 2017-07-03 13:39:25
function init() {
animateCSS(document.getElementById("slide"), 250, {
left: function (timePercent, frame) {
var endPoint = 128,
startPoint = 0,
pathLength = endPoint - startPoint,
base = 64, //slope of the curve
currentPos = Math.floor(startPoint + (Math.pow(base, timePercent) - 1)/(base - 1) * pathLength);
return currentPos + "px";
}
}, function (element) {
element.style.left = "128px";
});
};
var JobType = function() {
if (!(this instanceof JobType)) {
return new JobType(arguments[0]);
};
var arg = arguments[0];
this.fn = arg["fn"];
this.delay = arg["delay"];
this.startTime = arg["startTime"];
this.comment = arg["comment"];
this.elapsed = 0;
};
function JobManager() {
if (!(this instanceof JobManager)) {
return new JobManager();
};
var instance;
JobManager = function() {
return instance;
};
JobManager.prototype = this;
instance = new JobManager();
instance.constructor = JobManager;
var jobQueue = [];
var startedFlag = false;
var inProcess = false;
var currentJob = null;
var timerID = -1;
var start = function() {
if (jobQueue.length) {
startedFlag = true;
currentJob = jobQueue.shift();
var startOver = currentJob.delay - ((new Date()).getTime() - currentJob.startTime);
timerID = setTimeout(function() {
inProcess = true;
currentJob.fn();
if (jobQueue.length) {
try {
while ((jobQueue[0].delay - ((new Date()).getTime() - currentJob.startTime)) <= 0) {
currentJob = jobQueue.shift();
currentJob.fn();
};
}
catch (e) { };
}
inProcess = false;
start();
}, (startOver > 0 ? startOver : 0));
}
else {
startedFlag = false;
timerID = -1;
};
};
instance.add = function (newJob) {
if (newJob instanceof JobType) {
stopCurrent();
var jobQueueLength = jobQueue.length;
if (!jobQueueLength) {
jobQueue.push(newJob);
}
else {
var currentTime = (new Date()).getTime(),
insertedFlag = false;
for (var i = 0; i < jobQueueLength; i++) {
var tempJob = jobQueue[i],
tempJobElapsed = currentTime - tempJob["startTime"],
tempJobDelay = tempJob["delay"] - tempJobElapsed;
tempJob["elapsed"] = tempJobElapsed;
if (newJob["delay"] <= tempJobDelay) {
if (!insertedFlag) {
jobQueue.splice(i, 0, newJob);
insertedFlag = true;
}
};
if (i === (jobQueueLength - 1)) {
if (!insertedFlag) {
jobQueue.push(newJob);
insertedFlag = true;
}
}
};
};
if ((!startedFlag) && (!inProcess)) {
start();
};
return true;
}
else {
return false;
};
};
var stopCurrent = function() {
if (timerID >= 0) {
if (!inProcess) {
clearTimeout(timerID);
timerID = -1;
if (currentJob) {
jobQueue.unshift(currentJob);
};
};
startedFlag = false;
};
};
return instance;
};
function animateCSS(element, duration, animation, whendone) {
var frame = 0,
elapsedTime = 0,
timePercent = 0,
startTime = new Date().getTime(),
endTime = startTime + duration,
fps = 0,
averageRenderTime = 1000,
normalRenderTime = 1000/25,
myJobManager = JobManager();
var inQueue = myJobManager.add(JobType({
"fn": displayNextFrame,
"delay": 0,
"startTime": (new Date).getTime(),
"comment": "start new animation"
}));
function playFrame() {
for (var cssprop in animation) {
try {
element.style[cssprop] = animation[cssprop].call(element, timePercent, frame);
} catch (e) { }
};
};
function displayNextFrame() {
elapsedTime = (new Date().getTime()) - startTime;
timePercent = elapsedTime/duration;
if (elapsedTime >= duration) {
playFrame();
if (whendone) {
whendone(element);
};
return;
};
playFrame();
frame++;
averageRenderTime = elapsedTime/frame;
fps = 1000/averageRenderTime;
inQueue = myJobManager.add(JobType({
"fn": displayNextFrame,
"delay": (fps < 15 ? 0 : normalRenderTime - averageRenderTime),
"startTime": (new Date).getTime(),
"comment": frame
}));
}
};
(function() {
if (this.addEventListener) {
this.addEventListener("load", init, false)
}
else {
window.onload = init;
}
}());
http://jsfiddle.net/Greck_geek/aw2rtu30/ – Greck 2014-08-28 08:32:05
哇,只是..哇,谢谢! :D – KittenCodings 2014-08-28 08:36:25
// By Plain Javascript
// this code will work on most of browsers.
function hasClass(ele, clsName) {
var el = ele.className;
el = el.split(' ');
if(el.indexOf(clsName) > -1){
var cIndex = el.indexOf(clsName);
el.splice(cIndex, 1);
ele.className = " ";
el.forEach(function(item, index){
ele.className += " " + item;
})
}
else {
el.push(clsName);
ele.className = " ";
el.forEach(function(item, index){
ele.className += " " + item;
})
}
}
var btn = document.getElementById('btn');
var ele = document.getElementById('temp');
btn.addEventListener('click', function(){
hasClass(ele, 'active')
})
关于codepen的示例视图http://codepen.io/kaushik/pen/ObXZqV – 2016-11-16 06:10:36
http://vanilla-js.com/ – joews 2014-08-28 08:15:53
@joews他说没有的jQuery,反正,[这](http://css-tricks.com/controlling-css-animations-transitions -javascript /)可能对你有帮助 – Yaje 2014-08-28 08:17:28
20+那些没有jQuery无法工作的JavaScript专家远离javascript专家 – 2014-08-28 08:21:07