在编写CSS时,是否有一个特定的规则或指南应该用于决定何时使用margin以及何时使用padding?
我有div(父)包含另一个div(孩子).Parent是body没有特定CSS样式的第一个元素.当我设置
.child
{
margin-top: 10px;
}
Run Code Online (Sandbox Code Playgroud)
最终的结果是我的孩子的顶部仍然与父母对齐.我的父母向下移动10px,而不是让孩子向下移动10px.
我的目标DOCTYPE是XHTML Transitional.
我在这里错过了什么?
编辑1
我的父母需要有严格定义的尺寸,因为它的背景必须从上到下显示在它下面(像素完美).因此,设置垂直边距是不行的.
编辑2
此行为在FF,IE和CR上是相同的.
在这个,这个和这个线程我试图找到如何在单个视图上设置边距的答案.但是,我想知道是否有更简单的方法.我会解释为什么我宁愿不想使用这种方法:
我有一个自定义Button,扩展了Button.如果背景设置为默认背景以外的其他内容(通过调用setBackgroundResource(int id)或setBackgroundDrawable(Drawable d)),我希望边距为0.如果我这样称呼:
public void setBackgroundToDefault() {
backgroundIsDefault = true;
super.setBackgroundResource(android.R.drawable.btn_default);
// Set margins somehow
}
Run Code Online (Sandbox Code Playgroud)
我希望边距重置为-3dp(我已经在这里阅读如何从像素转换为dp,所以一旦我知道如何在px中设置边距,我就可以自己管理转换).但是因为这是在CustomButton类中调用的,所以父级可以从LinearLayout变为TableLayout,而我宁愿不让他得到他的父级并检查该父级的实例.我想,这也将是非常无形的.
另外,在调用时(使用LayoutParams)parentLayout.addView(myCustomButton, newParams),我不知道这是否将它添加到正确的位置(但是没有尝试过),比如一行五的中间按钮.
问题:除了使用LayoutParams之外,还有更简单的方法以编程方式设置单个按钮的边距吗?
编辑:我知道LayoutParams方式,但我想要一个避免处理每个不同容器类型的解决方案:
ViewGroup.LayoutParams p = this.getLayoutParams();
if (p instanceof LinearLayout.LayoutParams) {
LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams)p;
if (_default) lp.setMargins(mc.oml, mc.omt, mc.omr, mc.omb);
else lp.setMargins(mc.ml, mc.mt, mc.mr, mc.mb);
this.setLayoutParams(lp);
}
else if (p instanceof RelativeLayout.LayoutParams) {
RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams)p;
if (_default) lp.setMargins(mc.oml, …Run Code Online (Sandbox Code Playgroud) 我尝试在另一个div内的div上添加边距值.一切正常,除了最高值,它似乎被忽略了.但为什么?
我的期望:

我得到了什么:

码:
#outer {
width: 500px;
height: 200px;
background: #FFCCCC;
margin: 50px auto 0 auto;
display: block;
}
#inner {
background: #FFCC33;
margin: 50px 50px 50px 50px;
padding: 10px;
display: block;
}Run Code Online (Sandbox Code Playgroud)
<div id="outer">
<div id="inner">
Hello world!
</div>
</div>Run Code Online (Sandbox Code Playgroud)
W3Schools没有解释为什么保证金的行为方式.
我有两个内嵌块div元素,它们是相同的,彼此相邻.然而,尽管边距设置为0,但两个div之间似乎有一个4像素的神秘空间.没有父div影响它们 - 发生了什么?
CSS
#container
{
display:inline-block;
position:relative;
background:rgb(255,100,0);
margin:0px;
width:40%;
height:100px;
}
Run Code Online (Sandbox Code Playgroud)

这就是我想要的样子:

我正在尝试使用Java(而不是XML)创建一个LinearLayout,其中的按钮可以填充屏幕并具有边距.这是没有边距的代码:
LinearLayout buttonsView = new LinearLayout(this);
buttonsView.setOrientation(LinearLayout.VERTICAL);
for (int r = 0; r < 6; ++r) {
Button btn = new Button(this);
btn.setText("A");
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT); // Verbose!
lp.weight = 1.0f; // This is critical. Doesn't work without it.
buttonsView.addView(btn, lp);
}
ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT);
setContentView(buttonsView, lp);
Run Code Online (Sandbox Code Playgroud)
这样工作正常,但你怎么给按钮边距,所以它们之间有空间?我尝试过使用LinearLayout.MarginLayoutParams,但是没有weight成员,所以没有用.如果你lp在它的构造函数中传递它也不起作用.
这不可能吗?因为它确实看起来,并且它不会是第一个Android布局任务,你只能用XML做.
我有一个SVG,我试图以div为中心.div的宽度为900px.SVG的宽度为400px.SVG的margin-left和margin-right设置为auto.不起作用,它只是表现为左边距为0(默认值).
有人知道我的错误吗?
有没有办法完全禁用边缘折叠?我发现的唯一解决方案(名称为"uncollapsing")需要使用1px边框或1px填充.我发现这是不可接受的:无关的像素使计算变得复杂,没有充分的理由.是否有更合理的方法来禁用此边距折叠?
我想ImageView用边距为我的布局添加未知数量的视图.在XML中,我可以layout_margin像这样使用:
<ImageView android:layout_margin="5dip" android:src="@drawable/image" />
有ImageView.setPadding(),但没有ImageView.setMargin().我认为这是顺利的ImageView.setLayoutParams(LayoutParams),但不确定该提供什么.
有人知道吗?