- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在做一个移动页面/广告,在图片顶部有 4-5 个小信息框。触摸时,一个框将展开并显示有关图像该部分的文本。当触摸下一个框时,它将展开,而另一个当前展开的框将恢复为默认值。我需要保持它的重量很轻,所以我一直在玩一个使用 :target 伪类的纯 CSS 版本。除了预期的页面跳转到顶部之外,它工作得很好。
<body>
<div class="page">
<a id="button1" href="#button1">
btn1
</a>
<a id="button2" href="#button2">
btn2
</a>
<a id="button3" href="#button3">
btn3
</a>
<a id="button4" href="#button4">
btn3
</a>
</div>
</body>
为了避免不需要的页面跳转,我得出结论,我需要使用 Javascript 通过点击事件来控制它。虽然它很小,但 jQuery 库会占用我可用的 kB,所以不是一个选项。我花了几天时间在网上浏览解决方案来实现某种删除/添加类功能,但无济于事。我设法分别展开和关闭盒子,但是当所有盒子同时打开时,它会留下一团糟。我意识到我必须以某种方式让它删除扩展类的任何当前实例,但是如何?
<body>
<div class="page">
<div class="box1">
</div>
<div class="box2">
</div>
</div>
</body>
js:
var hasClass = function (elem, className) {
return new RegExp(' ' + className + ' ').test(' ' + elem.className + ' ');
}
var addClass = function (elem, className) {
if (!hasClass(elem, className)) {
elem.className += ' ' + className;
}
}
var removeClass = function (elem, className) {
var newClass = ' ' + elem.className.replace( /[\t\r\n]/g, ' ') + ' ';
if (hasClass(elem, className)) {
while (newClass.indexOf(' ' + className + ' ') >= 0 ) {
newClass = newClass.replace(' ' + className + ' ', ' ');
}
elem.className = newClass.replace(/^\s+|\s+$/g, '');
}
}
// Boxes Functions
if ( 'querySelector' in document && 'addEventListener' in window ) {
var box1items = document.querySelectorAll('.box1');
var box2items = document.querySelectorAll('.box2');
[].forEach.call(box1items, function (box1) {
box1.addEventListener('click', function(e) {
if ( hasClass(box1, 'box1stage2') ) {
removeClass(box1, 'box1stage2');
}
else {
addClass(box1, 'box1stage2');
}
}
)
});
[].forEach.call(box2items, function (box2) {
box2.addEventListener('click', function(e) {
if ( hasClass(box2, 'box2stage2') ) {
removeClass(box2, 'box2stage2');
}
else {
addClass(box2, 'box2stage2');
}
}
)
});
}
最佳答案
我试了一下你帖子中的最后一个 fiddle ,将它和我的一些样板代码结合起来。它将允许任意数量的任何特定类别的框,并在打开新框时关闭任何具有相同类别的框。
我确实注意到您的 css 对于 box1stage2 和 box2stage2 是相同的 - 除非您希望能够专门针对项目,否则您可以使用单个 boxStage2 类 - 但是,这将消除控制哪些框属于组的能力和最终它会影响同时打开盒子的数量。在我的演示中,您可以同时打开每个 box1 和 box2 中的 1 个。尝试打开第三个盒子将关闭已经打开的具有相同类别的盒子。另外,请注意,为了方便起见,我已经注释掉了绝对定位——我不想制定更多的 css 规则来定位和定位额外的框。我还删除了您的一些代码,发现它过于冗长且难以阅读。请特别注意我对函数 forEachNode 的使用——它基本上为您提供了 nodeLists 上的 forEach 功能——而不仅仅是数组。也许这是个人喜好,也许比这更有值(value),你得问问别人。
代码:
<!DOCTYPE html>
<html>
<head>
<script>
/////////////////////////////////////////////////////////////
//// U n u s e d i n t h i s s a m p l e
/////////////////////////////////////////////////////////////
function byId(e){return document.getElementById(e);}
function newEl(tag){return document.createElement(tag);}
function newTxt(txt){return document.createTextNode(txt);}
/////////////////////////////////////////////////////////////
//// R e q u i r e d b y t h i s s a m p l e
/////////////////////////////////////////////////////////////
function toggleClass(element, newStr)
{
var index=element.className.indexOf(newStr);
if ( index == -1)
element.className += ' '+newStr;
else
{
if (index != 0)
newStr = ' '+newStr;
element.className = element.className.replace(newStr, '');
}
}
function forEachNode(nodeList, func)
{
var i, n = nodeList.length;
for (i=0; i<n; i++)
{
func(nodeList[i], i, nodeList);
}
}
window.addEventListener('load', mInit, false);
function mInit()
{
// Boxes Functions
if ( 'querySelector' in document && 'addEventListener' in window )
{
var box1Items = document.querySelectorAll('.box1');
var box2Items = document.querySelectorAll('.box2');
forEachNode(box1Items, addBox1EvtListeners);
forEachNode(box2Items, addBox2EvtListeners);
}
function addBox1EvtListeners(elem, index, list)
{
elem.addEventListener('click', onBox1_click, false);
}
function addBox2EvtListeners(elem, index, list)
{
elem.addEventListener('click', onBox2_click, false);
}
}
var hasClass = function (elem, className) {
return new RegExp(' ' + className + ' ').test(' ' + elem.className + ' ');
}
var addClass = function (elem, className) {
if (!hasClass(elem, className)) {
elem.className += ' ' + className;
}
}
var removeClass = function (elem, className) {
var newClass = ' ' + elem.className.replace( /[\t\r\n]/g, ' ') + ' ';
if (hasClass(elem, className)) {
while (newClass.indexOf(' ' + className + ' ') >= 0 ) {
newClass = newClass.replace(' ' + className + ' ', ' ');
}
elem.className = newClass.replace(/^\s+|\s+$/g, '');
}
}
function onBox1_click(e)
{
var box1Elems = document.getElementsByClassName('box1');
var clickedBox = this;
forEachNode(box1Elems, remClass1);
toggleClass(this, 'box1stage2');
function remClass1(elem, index, nodeList)
{
if (elem != clickedBox)
removeClass(elem, 'box1stage2');
}
}
function onBox2_click(e)
{
var box2Elems = document.getElementsByClassName('box2');
var clickedBox = this;
forEachNode(box2Elems, remClass2);
toggleClass(this, 'box2stage2');
function remClass2(elem, index, nodeList)
{
if (elem != clickedBox)
removeClass(elem, 'box2stage2');
}
}
</script>
<style>
.page {
position:relative;
top:0px;
left:0px;
width:580px;
height:500px;
background:#CCCCCC;
}
.box1 {
/*
position:absolute;
top:250px;
left:85px;
*/
width:40px;
height:40px;
border-radius:5px;
background:rgba(0,0,0,0.5);
-webkit-transition: All 0.4s ease;
}
.box1stage2 {
width:200px;
height:100px;
background:rgba(0,0,0,0.85);
-webkit-transition: All 0.4s ease;
}
.box2 {
/*
position:absolute;
top:200px;
left:230px;
*/
width:40px;
height:40px;
border-radius:5px;
background:rgba(0,0,0,0.5);
-webkit-transition: All 0.4s ease;
}
.box2stage2 {
width:200px;
height:100px;
background:rgba(0,0,0,0.85);
-webkit-transition: All 0.4s ease;
}
</style>
</head>
<body>
<div class="page">
<div class="box1">
</div>
<div class="box2">
</div>
<div class="box1">
</div>
<div class="box2">
</div>
</div>
</body>
</html>
关于javascript - 纯 Javascript 的 CSS 转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21497876/
我正在尝试将一个字符串逐个字符地复制到另一个字符串中。目的不是复制整个字符串,而是复制其中的一部分(我稍后会为此做一些条件......) 但我不知道如何使用迭代器。 你能帮帮我吗? std::stri
我想将 void 指针转换为结构引用。 结构的最小示例: #include "Interface.h" class Foo { public: Foo() : mAddress((uint
这有点烦人:我有一个 div,它从窗口的左上角开始过渡,即使它位于文档的其他任何位置。我试过 usign -webkit-transform-origin 但没有成功,也许我用错了。有人可以帮助我吗?
假设,如果将 CSS3 转换/转换/动画分配给 DOM 元素,我是否可以检测到该过程的状态? 我想这样做的原因是因为我正在寻找类似过渡链的东西,例如,在前一个过渡之后运行一个过渡。 最佳答案 我在 h
最近我遇到了“不稳定”屏幕,这很可能是由 CSS 转换引起的。事实上,它只发生在 Chrome 浏览器 上(可能还有 Safari,因为一些人也报告了它)。知道如何让它看起来光滑吗?此外,您可能会注意
我正在开发一个简单的 slider ,它使用 CSS 过渡来为幻灯片设置动画。我用一些基本样式和一些 javascript 创建了一支笔 here .注意:由于 Codepen 使用 Prefixfr
我正在使用以下代码返回 IList: public IList FindCodesByCountry(string country) { var query =
如何设计像这样的操作: 计算 转化 翻译 例如:从“EUR”转换为“CNY”金额“100”。 这是 /convert?from=EUR&to=CNY&amount=100 RESTful 吗? 最佳答
我使用 jquery 组合了一个图像滚动器,如下所示 function rotateImages(whichHolder, start) { var images = $('#' +which
如何使用 CSS (-moz-transform) 更改一个如下所示的 div: 最佳答案 你可以看看Mozilla Developer Center .甚至还有例子。 但是,在我看来,您的具体示例不
我需要帮助我正在尝试在选中和未选中的汉堡菜单上实现动画。我能够为菜单设置动画,但我不知道如何在转换为 0 时为左菜单动画设置动画 &__menu { transform: translateX(
我正在为字典格式之间的转换而苦苦挣扎:我正在尝试将下面的项目数组转换为下面的结果数组。本质上是通过在项目第一个元素中查找重复项,然后仅在第一个参数不同时才将文件添加到结果集中。 var items:[
如果我有两个定义相同的结构,那么在它们之间进行转换的最佳方式是什么? struct A { int i; float f; }; struct B { int i; float f; }; void
我编写了一个 javascript 代码,可以将视口(viewport)从一个链接滑动到另一个链接。基本上一切正常,你怎么能在那里看到http://jsfiddle.net/DruwJ/8/ 我现在的
我需要将文件上传到 meteor ,对其进行一些图像处理(必要时进行图像转换,从图像生成缩略图),然后将其存储在外部图像存储服务器(s3)中。这应该尽可能快。 您对 nodejs 图像处理库有什么建议
刚开始接触KDB+,有一些问题很难从Q for Mortals中得到。 说,这里 http://code.kx.com/wiki/JB:QforMortals2/casting_and_enumera
我在这里的一个项目中使用 JSF 1.2 和 IceFaces 1.8。 我有一个页面,它基本上是一大堆浮点数字段的大编辑网格。这是通过 inputText 实现的页面上的字段指向具有原始值的值对象
ScnMatrix4 是一个 4x4 矩阵。我的问题是什么矩阵行对应于位置(ScnVector3),旋转(ScnVector4),比例(ScnVector3)。第 4 行是空的吗? 编辑: 我玩弄了
恐怕我是 Scala 新手: 我正在尝试根据一些简单的逻辑将 Map 转换为新 Map: val postVals = Map("test" -> "testing1", "test2" -> "te
输入: This is sample 1 This is sample 2 输出: ~COLOR~[Green]This is sample 1~COLOR~[Red]This is sam
我是一名优秀的程序员,十分优秀!