Javascript – 更改边框宽度而不移动周围元素。
我有以下HTML:
Hover:
Text Text Text
以下JS在hover时更改边框大小:
$('.Size').hover( function() { $(this).css('borderWidth', '5px'); }, function() { $(this).css('borderWidth', '1px'); });
问题是它通过将边框宽度添加到元素的总宽度来移动元素。 对此有何建议?
当我这样做并且我想要相同的+ border -movement结果时,我喜欢这样做:
function() { $(this).css('borderWidth', '7px'); $(this).css('margin', '-7px'); });
负利润带来了一切。
您还可以将样式压缩为对象,并在一个.css()调用中传递它们:
$(this).css( {borderWidth: '7px', margin: '-7px'} );
将元素的宽度和高度更改为边框宽度更改量的两倍( 实时演示 ):
$('.Size').hover( function() { $(this).css('borderWidth', '5px'); $(this).css('width', parseFloat($(this).css('width')) - 8 + 'px'); $(this).css('height', parseFloat($(this).css('height')) - 8 + 'px'); }, function() { $(this).css('borderWidth', '1px'); $(this).css('width', parseFloat($(this).css('width')) + 8 + 'px'); $(this).css('height', parseFloat($(this).css('height')) + 8 + 'px'); });
注意:这仅在边框宽度,宽度和高度使用相同的长度单位时才有效。 如果使用“px”以外的单位,请相应更改。
如果从边框中减去,则可以添加到填充,反之亦然。
您可以使用“outline”而不是border来浏览器支持就可以了。
是的,添加一个position: relative; left: -5px;
position: relative; left: -5px;
正确定位。
使用相同数量的像素减小边距,增加边框宽度
将宽度减少两倍的边框增加..
$('.Size').hover( function() { var width = parseInt($(this).css('width')); $(this).css('borderWidth', '5px').css({width:width-8}); }, function() { var width = parseInt($(this).css('width')); $(this).css('borderWidth', '1px').css({width:width+8}); })
看看http://jsfiddle.net/rBrZL/
您可以使用与扩大边框相同的金额来减少边距。
如果为hover样式指定CSS类,则只需添加和删除类,而不是向元素添加内联样式。 这样,所有CSS都在样式表中,而不是分散在代码中,这使得它更容易维护。
我重写了代码以使用样式表而不是所有那些内联样式:
CSS:
.Size { margin: 10px; border: 1px solid #90A4AF; text-align: center; position: relative; } .Size.Small { float: left; height: 600px; width:160px; } .Size.Medium { float: left; height: 280px; width: 336px; } .Size.Large { height: 90px; width: 728px; } .Size > div { position: absolute; top: 50%; text-align: center; } .Size.Hover { margin: 6px; border-width: 5px; }
HTML:
Hover:
Text Text Text
使用Javascript:
$('.Size').hover( function() { $(this).addClass('Hover'); }, function() { $(this).removeClass('Hover'); } );
注意: id
不应以数字开头,例如160x600
。