【问题标题】:Hover effect like facebook像facebook一样的悬停效果
【发布时间】:2013-02-26 01:10:28
【问题描述】:

我确实创建了一个像这样的<li>

<li>
<input type="checkbox" value="<?php echo $value; ?>" id="form_friend_<?php echo $value; ?>" name="form[friend][]" />
<img id="img_friend_<?php echo $value; ?>" src="">
<label for="form_friend_<?php echo $value;?>" ><?php echo $label;?></label>
</li>

我怎样才能像facebook那样为每个朋友做悬停效果呢?

单元格中的任何地方,例如Allen Yee,我可以激活他向他发送请求。我怎样才能用我的&lt;li&gt; 实现它?

更新

在头:

<script type="text/javascript">
var lis = document.getElementsByTagName('li');

for( var i = 0, l = lis.length; i < l; i++ ) {
lis[i].onclick = function() {

    var c = this.getElementsByTagName('input')[0];

    if ( c.checked )
        c.checked = false;
    else
        c.checked = true;
};
}
<script>

在正文中:

<li >
  <input type="checkbox" value="1" id="form_friend_1" name="form[friend][]" />
  <img id="img_friend_1" src="">    <label for="form_friend_1" >My name</label>
</li> 

【问题讨论】:

    标签: css hover


    【解决方案1】:

    如果您希望li 内的所有内容都触发checkbox 被选中,则应将所有内容放入label 元素内。

    <li>
        <label for="form_friend_<?php echo $value;?>" >
            <input type="checkbox" value="<?php echo $value; ?>" id="form_friend_<?php echo $value; ?>" name="form[friend][]" />
            <img id="img_friend_<?php echo $value; ?>" src="">
            <?php echo $label;?>
        </label>
    </li>
    

    在这种情况下,您甚至不需要label 上的for 属性,因为label 将应用于其中的任何表单控件(inputselect 等) .

    如果您想在 li 悬停时更改其内部元素的样式,可以使用名为 :hoverpseudo-class

    例如:

    li:hover {
        background: #000;
    }
    

    它会在li 元素悬停时改变它的背景。

    更新

    由于您使用的框架不允许您将所有li 的内容包装在label 元素中,我建议您使用javascript 解决方案。

    这是一个简单的例子:

    window.onload = function() {
    
        var lis = document.getElementsByTagName('li');
    
        for( var i = 0, l = lis.length; i < l; i++ ) {
            lis[i].onclick = function(e) {
    
                e = e || window.event;
                var el = e.target || e.srcElement;
    
                if ( el.nodeName == 'INPUT' ) return;
    
                var c = this.getElementsByTagName('input')[0];
    
                if ( c.checked ) {
                    c.checked = false;
                    this.style.background = 'white';
                } else {
                    c.checked = true;
                    this.style.background = 'blue';
                }
    
                return false;
            };
        }
    }
    

    上面的代码将获取所有li元素的列表,当点击这些元素时,将获得其中的第一个input标签并验证它是否被选中,如果是,它将被取消选中,否则它将被检查。此外,它还为每种情况设置了背景颜色。

    此脚本模拟checkbox 类型的input 如果被包裹在label 元素中会如何表现。

    更新 2

    正如您在下面的评论中指出的那样,checkbox 无法正常工作。这是因为发生了Event Bubbling。 Stackoverflow 中也有几个topics 对它的含义进行了深入的解释。

    我更新了上面的 sn-p 以更正 checkbox 功能。

    jsFiddle

    希望对你有帮助。

    【讨论】:

    • 哦,这行得通,但我不能用你的例子。因为 symfony2 先渲染输入类型复选框再渲染标签,所以我不能把它放在标签里面。
    • @Gunnar,javascript 是一种选择吗?
    • 再次感谢!非常酷,实际上很容易。我真的需要仔细研究一下javascript!
    • 嗨,@Gunnar。是的,我知道为什么,这是我的错,对不起。请看一下更新答案。
    • @Gunnar,您能否查看更新后的答案?在事件处理程序的末尾添加了return false
    【解决方案2】:

    您可以在 css 和 JQuery 中制作悬停效果。在 CSS 中,你可以使用 '#idname:hover' 或 '.classname:hover'。在 JQuery 中,您可以使用:

    $('selector that you select').hover(function(){
    

    });

    【讨论】:

    • 这听起来很有趣,但我真的不明白。
    • 我假设您想在悬停时更改每个框的背景。如果选择 CSS 方式,可以写成:“.box:hover{background:#FFF;}”。如果选择JQuery方式,可以写成 $('.box').hover(function(){$('.box).css('background-color','#FFF'});
    • 不,我想选中该框。当我悬停时,背景会发生变化,但是如何单击选择字段?
    • 你可以用 JQuery 来做。代码将如下所示:$('.box').click(function)(){$(this).css('background-color','red');});。然而,这是一张单程票。如果单击其中一个框,它将更改其背景,但是当您再次单击它时,它将保持不变。如果你想在每次点击时切换背景颜色,你可以在定义一个改变背景颜色的 CSS 类之后使用 JQuery 的 toggleclass() 函数。
    • 我想切换背景并激活复选框。
    猜你喜欢
    • 2020-01-13
    • 1970-01-01
    • 2014-05-25
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    • 2017-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多