您好!欢迎访问家园网-www.jy.wang!

家园网

关于鼠标点击图片的问题,松开后和点击后的效果对比

网络 作者:本站 点击:

原来的html:


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>比较各浮动的区别</title>
    <link href="css/css.css" type="text/css" rel="stylesheet">
</head>
<body>
<div class="cont">
    <p>当前表情包的浮动属性为none,当鼠标滑过本行文字时,浮动状态为left,而单击文字时,则浮动状态为right,快试一试吧*_*</p>
    <div><img src="img/cry.png" alt=""></div>
    <div><img src="img/amazed.png" alt=""></div>
    <div><img src="img/awkward.png" alt=""></div>
    <div><img src="img/laugh.png" alt=""></div>
</div>
</body>
</html>


原来的css是:

@charset "utf-8";
/*css document*/
.cont {                     /*设置页面的整体样式*/
    background: rgb(225, 255, 255);                     /*设置页面的背景颜色*/
    width: 800px;                     /*设置页面的整体宽度*/
    height: 520px;                     /*设置页面的整体高度*/
    margin: 0 auto;                     /*设置页面的整体外边距*/
}
p {                     /*设置提示文字的样式*/
    background: #ff0;                     /*设置提示文字的背景颜色*/
    font-size: 20px;                     /*设置字体的大小*/
    line-height: 30px;                     /*设置设置行高*/
}
img {                     /*设置表情图片的样式*/
    height: 100px;                     /*设置图片统一高度*/
    width: 100px;                     /*设置图片同意宽度*/
}
.cont:hover.cont div {                     /*当鼠标放置在整体div上时,图片div的样式*/
    float: left;                     /*设置浮动为左浮动*/
}
.cont:active.cont div {                     /*当鼠标单击整体div上时,图片div的样式*/
    float: right;                     /*设置浮动为右浮动*/
}


问题:

代码在运行过程中,鼠标按住才向右浮动,一松开又回去了。如何让他点击后向右并且不动了?


解决方案:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>比较各浮动的区别</title>
    <link href="css/css.css" type="text/css" rel="stylesheet">
    <style>
        /* 添加这个新样式 */
        .cont.clicked div {
            float: right !important; /* 点击后保持右浮动 */
        }
    </style>
</head>
<body>
<div id="container">
    <p>当前表情包的浮动属性为none,当鼠标滑过本行文字时,浮动状态为left,而单击文字时,则浮动状态为right,快试一试吧*_*</p>
    <div><img src="img/cry.png" alt=""></div>
    <div><img src="img/amazed.png" alt=""></div>
    <div><img src="img/awkward.png" alt=""></div>
    <div><img src="img/laugh.png" alt=""></div>
</div>
<script>
    // 获取容器元素
    const container = document.getElementById('container');
    
    // 点击时添加/移除 clicked 类
    container.addEventListener('click', function(e) {
        // 如果点击的是图片区域
        if (e.target.tagName === 'IMG' || e.target.tagName === 'DIV') {
            this.classList.toggle('clicked');
        }
    });
    
    // 鼠标移入时保持原有的hover效果
    container.addEventListener('mouseenter', function() {
        this.classList.remove('clicked');
    });
    
    // 鼠标移出时如果是点击状态,恢复点击状态
    container.addEventListener('mouseleave', function() {
        // hover效果会自动移除,不需要额外处理
    });
</script>
</body>
</html>

或者修改你的CSS文件:

@charset "utf-8";
/*css document*/
.cont {                     /*设置页面的整体样式*/
    background: rgb(225, 255, 255);                     /*设置页面的背景颜色*/
    width: 800px;                     /*设置页面的整体宽度*/
    height: 520px;                     /*设置页面的整体高度*/
    margin: 0 auto;                     /*设置页面的整体外边距*/
}
p {                     /*设置提示文字的样式*/
    background: #ff0;                     /*设置提示文字的背景颜色*/
    font-size: 20px;                     /*设置字体的大小*/
    line-height: 30px;                     /*设置设置行高*/
}
img {                     /*设置表情图片的样式*/
    height: 100px;                     /*设置图片统一高度*/
    width: 100px;                     /*设置图片同意宽度*/
}
.cont:hover.cont div {                     /*当鼠标放置在整体div上时,图片div的样式*/
    float: left;                     /*设置浮动为左浮动*/
}
/* 修改这里:移除 :active 样式 */
/*.cont:active.cont div {                     
    float: right;                    
}*/
/* 添加这个类用于保持点击状态 */
.cont.clicked div {
    float: right !important;
}
/* 可选:当容器被点击时,暂时移除hover效果 */
.cont.clicked:hover div {
    float: right !important;
}

更完整的解决方案(如果需要恢复初始状态):

<script>
    let isClicked = false;
    const container = document.getElementById('container');
    const images = container.querySelectorAll('img');
    
    // 点击图片区域切换状态
    container.addEventListener('click', function(e) {
        if (e.target.tagName === 'IMG' || 
            e.target.tagName === 'DIV' && e.target !== this.querySelector('p')) {
            isClicked = !isClicked;
            if (isClicked) {
                this.classList.add('clicked');
            } else {
                this.classList.remove('clicked');
            }
        }
    });
    
    // 双击恢复初始状态(可选)
    container.addEventListener('dblclick', function() {
        this.classList.remove('clicked');
        isClicked = false;
    });
</script>


这样修改后:

  1. 鼠标滑过:图片左浮动(原来的:hover效果)

  2. 点击图片区域:图片右浮动并保持

  3. 再次点击:恢复到左浮动状态(可选)

  4. 双击:完全恢复初始状态(可选)

这样就能实现你要的"点击后保持右浮动"效果了!


按开始的解决方案是可以的,请详细讲解一下这段代码:

<script>
    // 获取容器元素
    const container = document.getElementById('container');
    
    // 点击时添加/移除 clicked 类
    container.addEventListener('click', function(e) {
        // 如果点击的是图片区域
        if (e.target.tagName === 'IMG' || e.target.tagName === 'DIV') {
            this.classList.toggle('clicked');
        }
    });
    
    // 鼠标移入时保持原有的hover效果
    container.addEventListener('mouseenter', function() {
        this.classList.remove('clicked');
    });
    
    // 鼠标移出时如果是点击状态,恢复点击状态
    container.addEventListener('mouseleave', function() {
        // hover效果会自动移除,不需要额外处理
    });
</script>


我来详细解释这段代码的每一部分:

1. 获取容器元素

const container = document.getElementById('container');


  • getElementById('container'):通过元素的ID获取DOM元素

  • 需要给HTML中的div添加ID:<div class="cont" id="container">

  • const:声明一个常量变量container

2. 点击事件监听器

container.addEventListener('click', function(e) {
    // 如果点击的是图片区域
    if (e.target.tagName === 'IMG' || e.target.tagName === 'DIV') {
        this.classList.toggle('clicked');
    }
});

详细解析:

  • addEventListener('click', ...):为container元素添加点击事件监听

  • function(e):事件处理函数,e是事件对象

  • e.target:触发事件的原始元素(实际被点击的元素)

  • tagName:获取元素的标签名,返回大写字符串(如'IMG'、'DIV')

  • e.target.tagName === 'IMG' || e.target.tagName === 'DIV'

    • 判断点击的是图片(<img>)还是div容器

    • || 是逻辑或运算符

  • this.classList.toggle('clicked')

    • this:指向container元素(因为使用了普通函数)

    • classList:元素的class属性列表

    • toggle('clicked'):如果元素有'clicked'类就移除,没有就添加

3. 鼠标移入事件

container.addEventListener('mouseenter', function() {
    this.classList.remove('clicked');
});
  • mouseenter:鼠标进入元素时触发

  • remove('clicked'):移除'clicked'类

  • 作用:鼠标移入时,清除点击状态,恢复hover效果

4. 鼠标移出事件

container.addEventListener('mouseleave', function() {
    // hover效果会自动移除,不需要额外处理
});
  • mouseleave:鼠标离开元素时触发

  • 这里不需要写代码,因为CSS的:hover伪类会自动处理

完整的工作流程:

初始状态:

/* 没有clicked类,只有cont类 */
<div class="cont" id="container">...</div>

第一步:鼠标移入(hover)

用户鼠标移入 → 触发mouseenter事件 → 移除clicked类(如果有)
            ↓
         CSS生效
            ↓
.cont:hover.cont div { float: left; }  ← 图片左浮动

第二步:点击图片

用户点击图片 → 触发click事件 → e.target是IMG → toggle('clicked')
            ↓
 添加clicked类
            ↓
<div class="cont clicked" id="container">...</div>
            ↓
      CSS生效
            ↓
.cont.clicked div { float: right !important; } ← 图片右浮动并保持

第三步:再次点击图片

用户再次点击 → toggle('clicked') → 移除clicked类
            ↓
<div class="cont" id="container">...</div>
            ↓
  如果没有hover,图片恢复默认
  如果鼠标还在上面,触发:hover效果(左浮动)

可能需要调整的问题:

问题:当前逻辑中,鼠标移入就会移除点击状态,这可能不是你想要的效果。


修改建议

// 方案A:点击后保持状态,鼠标移入不移除
container.addEventListener('click', function(e) {
    if (e.target.tagName === 'IMG' || e.target.tagName === 'DIV') {
        this.classList.toggle('clicked');
    }
});
// 移除或注释掉mouseenter事件,这样点击状态会一直保持
// container.addEventListener('mouseenter', function() {
//     this.classList.remove('clicked');
// });


或者方案B:更精确的控制

container.addEventListener('click', function(e) {
    // 点击图片或图片容器时切换状态
    if (e.target.tagName === 'IMG' || 
        (e.target.tagName === 'DIV' && e.target.parentElement === this)) {
        this.classList.toggle('clicked');
    }
});
// 鼠标移入p标签时不移除clicked状态
container.addEventListener('mouseenter', function(e) {
    // 只有当鼠标移入的不是图片区域时才移除clicked
    if (e.target.tagName === 'P') {
        this.classList.remove('clicked');
    }
});


这样就能实现:

  1. 点击图片 → 右浮动并保持

  2. 再次点击 → 恢复

  3. 鼠标移入文字区域 → 可以清除状态(可选)

标签: