CSS在移动设备上将父宽度设置为0时,子溢出

Posted

技术标签:

【中文标题】CSS在移动设备上将父宽度设置为0时,子溢出【英文标题】:CSS When setting parent width to 0 on mobile, children overflow 【发布时间】:2020-04-24 04:50:20 【问题描述】:

我有一个联系人部分,它通过将父级的宽度从 0% 设置为 30% 来滑出,

var contact_toggle = true;
$('#contactus').click(function()
if(contact_toggle)

$('#contact_cont').animate(
    width: '30%'
);
else
$('#contact_cont').animate(
    width: '0%'
);

contact_toggle = !contact_toggle;
);

在桌面上这工作正常,

但在移动设备上,孩子们,孩子们的孩子们向右溢出:

这是一个小提琴:https://jsfiddle.net/wolfiestew/pfvwezLu/

要明白我的意思,打开 chrome 上的响应测试器到水平 iphone。

<style>
.contact
position:absolute;
z-index: 10000;
margin-top:2%;
overflow-x:hidden;

.contact input
    border: 2px solid #dadada;
    color: white;
    height:30px;
    border-radius:7px;
    margin-bottom: 5vh; 
    color: white;
    width:200px;
    font-size:9pt;
    font-family:roboto;
    background-color:rgb(20,21,26);

.contact label
margin-right: 10px;
font-family:roboto;
margin-left:1vw;
color: white;

bodyoverflow:hidden;
.contact input:focus  
    outline: none;
    border-color: #9ecaed;
    box-shadow: 0 0 10px #9ecaed;

.contact_buttons
bottom: 1vh;
display: flex;
flex-direction: row;
justify-content: space-evenly;
width:100%;

</style>
<script>
var contact_toggle = true;
$('#contactus').click(function()
if(contact_toggle)
$('#contact_cont').animate(
    width: '30%'
);
else
$('#contact_cont').animate(
    width: '0%'
);

contact_toggle = !contact_toggle;
);

</script>
<html>
<div id='contactus'  style='background-color:blue;position:absolute;left:5vh;bottom:5vh;width:50px;height:50px;z-index:100;'>click me</div>
<div id='contact_cont' style='position:absolute;top:0px;right:0px;background-color:rgb(31,32,41);width:0%;height:100%;z-index:10000;'>
<div id='contact_container' class='contact'>
<p style='font-size:17pt;margin-left:30px;'>
Contact Us
</p>
<label>Name</label>
<input id='name' type='text' value=' ' style='margin-left:23px;'>
<br>
<label>Surname</label>
<input id='surname' type='text' value=' '>
<br>
<label>Phone</label>
<input id='phone' type='text' value=' ' style='margin-left:18px;'>
<br>
<label>Email</label>
<input id='email' type='text' value=' ' style='margin-left:23px;'>
<br>
<label>Company</label>
<input id='company' type='text' value=' ' style='margin-left:-3px';
<br>
<label>Address</label>
<input id='address' type='text' value=' ' style='margin-left:5px;'>
<br>
<br>
<div id='submit_details' class='button' style='position:relative;margin-left:10vw;margin-top:6vh;'>Submit</div>

<span id='contact_buttons' class='contact_buttons' style='margin:5vh auto;'>

</span>
</div>
</div>
</html>

【问题讨论】:

我建议编辑您的问题以显示更多代码并更好地解释“向右溢出”的含义 - 例如联系表单会导致页面宽度为 130% 还是您只是在谈论子元素本身的布局?您尝试实现的目标的小提琴和模型也将非常有帮助。 jsfiddle.net/wolfiestew/pfvwezLu 您需要在此处在您的问题中发布minimal reproducible example,而不是指向您的网站或任何第三方网站的链接。 您的#company 输入元素缺少右括号 【参考方案1】:

overflow-x: hidden 添加到您将width 设置为0 的元素。

【讨论】:

还是同样的问题【参考方案2】:

我会将接触部分设置为固定宽度,最大宽度为 100vw(以确保其不比屏幕宽)并简单地切换类,在我的情况下为 .active,并使用 transform:translateX() 推开不活动时的屏幕。

$('#contactus').click(function() 
  $("#contact_cont").toggleClass("active");
);
.contact 
  position: absolute;
  z-index: 10000;
  margin-top: 2%;


.contact input 
  border: 2px solid #dadada;
  color: white;
  height: 30px;
  border-radius: 7px;
  margin-bottom: 5vh;
  color: white;
  width: 200px;
  font-size: 9pt;
  font-family: roboto;
  background-color: rgb(20, 21, 26);


.contact label 
  margin-right: 10px;
  font-family: roboto;
  margin-left: 1vw;
  color: white;


body 
  overflow: hidden;


.contact input:focus 
  outline: none;
  border-color: #9ecaed;
  box-shadow: 0 0 10px #9ecaed;


.contact_buttons 
  bottom: 1vh;
  display: flex;
  flex-direction: row;
  justify-content: space-evenly;
  width: 100%;


#contact_cont 
  position: absolute;
  top: 0px;
  right: 0px;
  background-color: rgb(31, 32, 41);
  width: 320px;
  max-width: 100vw;
  height: 100%;
  z-index: 10000;
  transform: translateX(100%);
  transition: 250ms;
  overflow: auto;


#contact_cont.active 
  transform: translateX(0);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id='contactus' style='background-color:blue;position:absolute;left:5vh;bottom:5vh;width:50px;height:50px;z-index:100;'>click me</div>
<div id='contact_cont'>
  <div id='contact_container' class='contact'>
    <p style='font-size:17pt;margin-left:30px;'>
      Contact Us
    </p>
    <label>Name</label>
    <input id='name' type='text' value=' ' style='margin-left:23px;'>
    <br>
    <label>Surname</label>
    <input id='surname' type='text' value=' '>
    <br>
    <label>Phone</label>
    <input id='phone' type='text' value=' ' style='margin-left:18px;'>
    <br>
    <label>Email</label>
    <input id='email' type='text' value=' ' style='margin-left:23px;'>
    <br>
    <label>Company</label>
    <input id='company' type='text' value=' ' style='margin-left:-3px;'> <br>
    <label>Address</label>
    <input id='address' type='text' value=' ' style='margin-left:5px;'>
    <br>
    <br>
    <div id='submit_details' class='button' style='position:relative;margin-left:10vw;margin-top:6vh;'>Submit</div>

    <span id='contact_buttons' class='contact_buttons' style='margin:5vh auto;'>

</span>
  </div>
</div>

您还应该考虑将margin-left 从输入中删除。也许将标签和输入包装在一起并使用 flexbox 进行对齐。

【讨论】:

【参考方案3】:

发现唯一有效的是,不过谢谢!

 $("#contact_cont").css('display','hidden');
var contact_toggle = true;
$('#contactus').click(function()
 if(contact_toggle)
  $("#contact_cont").css('display','inline');
 $("#contact_cont").css('width','0px');
  $("#contact_cont").animate(width:'30%');
  else
   $("#contact_cont").css('width','30%');
  $("#contact_cont").animate(width:'0px');
    $("#contact_cont").css('display','hidden');
  
  contact_toggle = !contact_toggle;
);

【讨论】:

以上是关于CSS在移动设备上将父宽度设置为0时,子溢出的主要内容,如果未能解决你的问题,请参考以下文章

css 在移动视图上将子类别网格设置为每行3个

桌面和移动设备之间的 css 正文宽度变化

移动端页面尺寸之一倍图二倍图三倍图

css设置时父元素随子元素margin值移动

CSS - 高度坍塌和外边距溢出问题及解决方法

仅使用 CSS 将父宽度设置为等于子总宽度?