简体   繁体   English

自动换行:分解不起作用。 draggable元素中的文本溢出问题

[英]Word-wrap: break-down not working. Text overflow issue in draggable element

Please help to solve this issue. 请帮忙解决这个问题。 Currently I have a div, that is draggable and the text inside is editable. 目前我有一个div,它是可拖动的,里面的文本是可编辑的。 And here the user can change the text size using input type range. 在这里,用户可以使用输入类型范围更改文本大小。

Is it possible to hide the letters of text-canvas, so that letters coming beyond the border of the image-canvas div and reach the col-sm-8 ? 是否可以隐藏文字画布的字母,以便字母超出图像画布div的边界并到达col-sm-8

Here when the user writes text without space, then that word go beyond the col-sm-8 . 这里当用户没有空格地写文本时,那个单词超出了col-sm-8 How to solve this? 怎么解决这个? I use overflow:hidden and word-wrap:breakdown , but it's not working. 我使用overflow:hiddenword-wrap:breakdown ,但它不起作用。 在此输入图像描述

 function submit_button() { /* ....Image upload function.. */ } $(".text-canvas").draggable({ containment: ".imageupload", create: function() { $("#text-canvas ").css("width ", 'auto'); }, drag: function() { $("#text-canvas ").css("width ", 'auto'); }, start: function() { $("#text-canvas ").css("width ", 'auto'); }, stop: function() { $("#text-canvas ").css("width ", 'auto'); } }); $("#fontsize").on("change", function() { var v = $(this).val(); $('.text-canvas').css('font-size', v + 'px'); }); 
 .text-canvas { z-index: 1; position: absolute; } .imageupload { z-index: -1; } 
 <script src="//code.jquery.com/jquery-1.10.2.js"></script> <script src="//code.jquery.com/ui/1.11.4/jquery-ui.js"></script> <div class="col-sm-4"> <div name="anotherdiv"> <input type="range" min="12" max="54" id="fontsize"> </div> </div> <div class="col-sm-8"> <div class="parent-canvas"> <div class="text-canvas" id="text-canvas" contenteditable="true"> my text </div> <div class="image-canvas"> <div class="imageupload" onclick="submit_button()"> <img src="img.png"> </div> </div> </div> </div> 

Then I used .text-canvas{ word-break: break-all; } 然后我用.text-canvas{ word-break: break-all; } .text-canvas{ word-break: break-all; } . .text-canvas{ word-break: break-all; } Now the text is not going outside of the col-sm-8 but it is still going outside of the image-div. 现在文本不会出现在col-sm-8之外,但它仍然会出现在image-div之外。

在此输入图像描述

UPDATE :currently I solved the issue by using padding-right:10% . 更新 :目前我通过使用padding-right:10%解决了这个问题padding-right:10% But I don't think is a good method. 但我认为这不是一个好方法。 Please suggest a correct method. 请提出正确的方法。

Solution: 解:

You need to use the following properties in your .parent-canvas class: 您需要在.parent-canvas类中使用以下属性:

.parent-canvas {
  display: inline-block; /* Display inline but retain the block-level characteristics */
  overflow: hidden; /* Hide the text if it overflows the container */
  position: relative; /* Text is removed from the normal flow with absolute position, use this to contain it */
}

After this you have two options, using word-break or max-width in your .text-canvas class: 在此之后,您有两个选项,在.text-canvas类中使用word-breakmax-width

.text-canvas {
  word-break: break-all;
}

Code Snippet: 代码片段:

 function submit_button() { /* ....Image upload function.. */ } $(".text-canvas").draggable({ containment: ".imageupload", create: function() { $("#text-canvas ").css("width ", 'auto'); }, drag: function() { $("#text-canvas ").css("width ", 'auto'); }, start: function() { $("#text-canvas ").css("width ", 'auto'); }, stop: function() { $("#text-canvas ").css("width ", 'auto'); } }); $("#fontsize").on("change", function() { var v = $(this).val(); $('.text-canvas').css('font-size', v + 'px'); }); 
 .text-canvas { z-index: 1; position: absolute; } .imageupload { z-index: -1; } .parent-canvas { display: inline-block; overflow: hidden; position: relative; } .text-canvas { word-break: break-all; } .image-canvas img { vertical-align: middle; } 
 <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" /> <script src="//code.jquery.com/jquery-1.10.2.js"></script> <script src="//code.jquery.com/ui/1.11.4/jquery-ui.js"></script> <div class="col-sm-4"> <div name="anotherdiv"> <input type="range" min="12" max="54" id="fontsize"> </div> </div> <div class="col-sm-8"> <div class="parent-canvas"> <div class="text-canvas" id="text-canvas" contenteditable="true"> my text </div> <div class="image-canvas"> <div class="imageupload" onclick="submit_button()"> <img src="http://placehold.it/100x100"> </div> </div> </div> </div> 

or 要么

.text-canvas {
  max-width: 100%;
}

Code Snippet: 代码片段:

 function submit_button() { /* ....Image upload function.. */ } $(".text-canvas").draggable({ containment: ".imageupload", create: function() { $("#text-canvas ").css("width ", 'auto'); }, drag: function() { $("#text-canvas ").css("width ", 'auto'); }, start: function() { $("#text-canvas ").css("width ", 'auto'); }, stop: function() { $("#text-canvas ").css("width ", 'auto'); } }); $("#fontsize").on("change", function() { var v = $(this).val(); $('.text-canvas').css('font-size', v + 'px'); }); 
 .text-canvas { z-index: 1; position: absolute; } .imageupload { z-index: -1; } .parent-canvas { display: inline-block; overflow: hidden; position: relative; } .text-canvas { max-width: 100%; } .image-canvas img { vertical-align: middle; } 
 <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" /> <script src="//code.jquery.com/jquery-1.10.2.js"></script> <script src="//code.jquery.com/ui/1.11.4/jquery-ui.js"></script> <div class="col-sm-4"> <div name="anotherdiv"> <input type="range" min="12" max="54" id="fontsize"> </div> </div> <div class="col-sm-8"> <div class="parent-canvas"> <div class="text-canvas" id="text-canvas" contenteditable="true"> my text </div> <div class="image-canvas"> <div class="imageupload" onclick="submit_button()"> <img src="http://placehold.it/100x100"> </div> </div> </div> </div> 


You can also use both if you like, they do not interfere with one another: 如果您愿意,也可以同时使用它们,它们不会相互干扰:

.text-canvas {
  word-break: break-all;
  max-width: 100%;
}

Code Snippet: 代码片段:

 function submit_button() { /* ....Image upload function.. */ } $(".text-canvas").draggable({ containment: ".imageupload", create: function() { $("#text-canvas ").css("width ", 'auto'); }, drag: function() { $("#text-canvas ").css("width ", 'auto'); }, start: function() { $("#text-canvas ").css("width ", 'auto'); }, stop: function() { $("#text-canvas ").css("width ", 'auto'); } }); $("#fontsize").on("change", function() { var v = $(this).val(); $('.text-canvas').css('font-size', v + 'px'); }); 
 .text-canvas { z-index: 1; position: absolute; } .imageupload { z-index: -1; } .parent-canvas { display: inline-block; overflow: hidden; position: relative; } .text-canvas { word-break: break-all; max-width: 100%; } .image-canvas img { vertical-align: middle; } 
 <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" /> <script src="//code.jquery.com/jquery-1.10.2.js"></script> <script src="//code.jquery.com/ui/1.11.4/jquery-ui.js"></script> <div class="col-sm-4"> <div name="anotherdiv"> <input type="range" min="12" max="54" id="fontsize"> </div> </div> <div class="col-sm-8"> <div class="parent-canvas"> <div class="text-canvas" id="text-canvas" contenteditable="true"> ttttttttttttttttttttttttttttttttttttttt </div> <div class="image-canvas"> <div class="imageupload" onclick="submit_button()"> <img src="http://placehold.it/100x100"> </div> </div> </div> </div> 


jsFiddle 的jsfiddle


TESTS: 测试:

Windows 10 (64 bit): Windows 10(64位):

  • Chrome 54.0.2840.71 m 镀铬54.0.2840.71米
  • FireFox 49.0.2 FireFox 49.0.2
  • Edge 25.10586.0.0 Edge 25.10586.0.0

IOS 10.1: IOS 10.1:

  • Iphone 6 Safari Mobile Iphone 6 Safari Mobile

Possible UX Improvement: 可能的UX改进:

In my opinion, a little bit of user experience improvement, at least for Chrome and FF, could be adding the property cursor: grab; 在我看来,一点点的用户体验改进,至少对于Chrome和FF来说,可能会添加属性cursor: grab; and cursor: grabbing; cursor: grabbing; to let the user know it's a draggable element. 让用户知道它是一个可拖动的元素。

I didn't know it was a draggable item after I posted this answer. 我发布这个答案后,我不知道这是一个可拖动的项目。 I guess I didn't pay real attention to whole question... people tend to interact with things fast. 我想我并没有真正关注整个问题......人们倾向于快速地与事物互动。

You will need to decide if the cursor: text; 你需要决定是否cursor: text; is better than having the grab and grabbing ones. grab grabbing更好。

Properties added to jQuery draggable classes: 添加到jQuery可拖动类的属性:

.ui-draggable {
  cursor: -webkit-grab;
  cursor: grab;
}
.ui-draggable-dragging {
  cursor: -webkit-grabbing;
  cursor: grabbing;
}

Code Snippet: 代码片段:

 function submit_button() { /* ....Image upload function.. */ } $(".text-canvas").draggable({ containment: ".imageupload", create: function() { $("#text-canvas ").css("width ", 'auto'); }, drag: function() { $("#text-canvas ").css("width ", 'auto'); }, start: function() { $("#text-canvas ").css("width ", 'auto'); }, stop: function() { $("#text-canvas ").css("width ", 'auto'); } }); $("#fontsize").on("change", function() { var v = $(this).val(); $('.text-canvas').css('font-size', v + 'px'); }); 
 .text-canvas { z-index: 1; position: absolute; } .imageupload { z-index: -1; } .parent-canvas { display: inline-block; overflow: hidden; position: relative; } .text-canvas { word-break: break-all; max-width: 100%; } .image-canvas img { vertical-align: middle; } .ui-draggable { cursor: -webkit-grab; cursor: grab; } .ui-draggable-dragging { cursor: -webkit-grabbing; cursor: grabbing; } 
 <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" /> <script src="//code.jquery.com/jquery-1.10.2.js"></script> <script src="//code.jquery.com/ui/1.11.4/jquery-ui.js"></script> <div class="col-sm-4"> <div name="anotherdiv"> <input type="range" min="12" max="54" id="fontsize"> </div> </div> <div class="col-sm-8"> <div class="parent-canvas"> <div class="text-canvas" id="text-canvas" contenteditable="true"> my text </div> <div class="image-canvas"> <div class="imageupload" onclick="submit_button()"> <img src="http://placehold.it/100x100"> </div> </div> </div> </div> 


Notes: 笔记:

  • To remove the unwanted space under the img element, use the property vertical-align: middle; 要删除img元素下不需要的空间,请使用属性vertical-align: middle; .

EDIT: 编辑:

To prevent the text from overflowing vertically when font-size is increased, you need to set height: auto; 为了防止文字在增加font-size时垂直溢出,你需要设置height: auto; to the .text-canvas class. .text-canvas类。

You can do this in different ways, one could be doing this: 你可以用不同的方式做到这一点,可以这样做:

$("#fontsize").on("change", function() {
  var v = $(this).val();
  $('.text-canvas').css({
    'font-size': v + 'px',
    'height': 'auto'
  });
});

This will set the auto value overriding the one set by jQuery UI. 这将设置auto值覆盖jQuery UI设置的值。

In the demo, the image is quite small and the font-size can get too big, making its container dimensions exceed its parent's, make sure to control that in production. 在演示中,图像非常小,字体大小可能太大,使其容器尺寸超过其父级,确保在生产中控制它。

Code Snippet: 代码片段:

 function submit_button() { /* ....Image upload function.. */ } $(".text-canvas").draggable({ containment: ".imageupload", create: function() { $("#text-canvas ").css("width ", 'auto'); }, drag: function() { $("#text-canvas ").css("width ", 'auto'); }, start: function() { $("#text-canvas ").css("width ", 'auto'); }, stop: function() { $("#text-canvas ").css("width ", 'auto'); } }); $("#fontsize").on("change", function() { var v = $(this).val(); $('.text-canvas').css({ 'font-size': v + 'px', 'height': 'auto' }); }); 
 .text-canvas { z-index: 1; position: absolute; } .imageupload { z-index: -1; } .parent-canvas { display: inline-block; overflow: hidden; position: relative; } .text-canvas { word-break: break-all; max-width: 100%; } .image-canvas img { vertical-align: middle; } .ui-draggable { cursor: -webkit-grab; cursor: grab; } .ui-draggable-dragging { cursor: -webkit-grabbing; cursor: grabbing; } 
 <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" /> <script src="//code.jquery.com/jquery-1.10.2.js"></script> <script src="//code.jquery.com/ui/1.11.4/jquery-ui.js"></script> <div class="col-sm-4"> <div name="anotherdiv"> <input type="range" min="12" max="54" id="fontsize"> </div> </div> <div class="col-sm-8"> <div class="parent-canvas"> <div class="text-canvas" id="text-canvas" contenteditable="true"> my text </div> <div class="image-canvas"> <div class="imageupload" onclick="submit_button()"> <img src="http://placehold.it/100x100"> </div> </div> </div> </div> 


Set the dimensions of .parent-canvas to be the same as the image, then use overflow: hidden and position-relative to contain the absolutely positioned text. .parent-canvas的尺寸设置为与图像相同,然后使用overflow: hiddenposition-relative来包含绝对定位的文本。

.parent-canvas {
  width: 300px;
  height: 200px;
  overflow: hidden;
  position: relative;
}

 function submit_button() { /* ....Image upload function.. */ } $(".text-canvas").draggable({ containment: ".imageupload", create: function() { $("#text-canvas ").css("width ", 'auto'); }, drag: function() { $("#text-canvas ").css("width ", 'auto'); }, start: function() { $("#text-canvas ").css("width ", 'auto'); }, stop: function() { $("#text-canvas ").css("width ", 'auto'); } }); $("#fontsize").on("change", function() { var v = $(this).val(); $('.text-canvas').css('font-size', v + 'px'); }); 
 .parent-canvas { width: 300px; height: 200px; overflow: hidden; position: relative; } .text-canvas { z-index: 1; position: absolute; } .imageupload { z-index: -1; } 
 <script src="//code.jquery.com/jquery-1.10.2.js"></script> <script src="//code.jquery.com/ui/1.11.4/jquery-ui.js"></script> <div class="col-sm-4"> <div name="anotherdiv"> <input type="range" min="12" max="54" id="fontsize"> </div> </div> <div class="col-sm-8"> <div class="parent-canvas"> <div class="text-canvas" id="text-canvas" contenteditable="true"> my text </div> <div class="image-canvas"> <div class="imageupload" onclick="submit_button()"> <img src="http://placehold.it/300x200"> </div> </div> </div> </div> 

You need https://developer.mozilla.org/en-US/docs/Web/CSS/word-break 你需要https://developer.mozilla.org/en-US/docs/Web/CSS/word-break

word-break: break-all; 

 function submit_button() { /* ....Image upload function.. */ } $(".text-canvas").draggable({ containment: ".imageupload", create: function() { $("#text-canvas ").css("width ", 'auto'); }, drag: function() { $("#text-canvas ").css("width ", 'auto'); }, start: function() { $("#text-canvas ").css("width ", 'auto'); }, stop: function() { $("#text-canvas ").css("width ", 'auto'); } }); $("#fontsize").on("change", function() { var v = $(this).val(); $('.text-canvas').css('font-size', v + 'px'); }); 
 .text-canvas { z-index: 1; position: absolute; word-break: break-all; } .imageupload { z-index: -1; } .parent-canvas { position: relative; } 
 <script src="//code.jquery.com/jquery-1.10.2.js"></script> <script src="//code.jquery.com/ui/1.11.4/jquery-ui.js"></script> <div class="col-sm-4"> <div name="anotherdiv"> <input type="range" min="12" max="54" id="fontsize"> </div> </div> <div class="col-sm-8"> <div class="parent-canvas"> <div class="text-canvas" id="text-canvas" contenteditable="true"> my text </div> <div class="image-canvas"> <div class="imageupload" onclick="submit_button()"> <img src="img.png"> </div> </div> </div> </div> 

use text-overflow: ellipsis; 使用text-overflow: ellipsis; or text-overflow: clip; text-overflow: clip; it will hide the overflow text. 它会隐藏溢出文本。

 function submit_button() { /* ....Image upload function.. */ } $(".text-canvas").draggable({ containment: ".imageupload", create: function() { $("#text-canvas ").css("width ", 'auto'); }, drag: function() { $("#text-canvas ").css("width ", 'auto'); }, start: function() { $("#text-canvas ").css("width ", 'auto'); }, stop: function() { $("#text-canvas ").css("width ", 'auto'); } }); $("#fontsize").on("change", function() { var v = $(this).val(); $('.text-canvas').css('font-size', v + 'px'); }); 
 .text-canvas { z-index: 1; position: absolute; text-overflow: clip;/*ellipsis,initial*/ white-space: nowrap; overflow: hidden; width:3em;/*image div width*/ } .imageupload { z-index: -1; } 
 <script src="//code.jquery.com/jquery-1.10.2.js"></script> <script src="//code.jquery.com/ui/1.11.4/jquery-ui.js"></script> <div class="col-sm-4"> <div name="anotherdiv"> <input type="range" min="12" max="54" id="fontsize"> </div> </div> <div class="col-sm-8"> <div class="parent-canvas"> <div class="text-canvas" id="text-canvas" contenteditable="true"> my text </div> <div class="image-canvas"> <div class="imageupload" onclick="submit_button()"> <img src="img.png"> </div> </div> </div> </div> 

For parent 对于父母

.parent-canvas{
  display: inline-block;  
  overflow: hidden;
  position: relative;
}

For Child (text-canvas) 对于儿童(文字画布)

.text-canvas {
  word-break: break-all;
}

Demo 演示

-Added background color for better demo purposes - 增加背景颜色以获得更好的演示目的

-Immediate font size change - 修改字体大小

 function submit_button() { /* ....Image upload function.. */ } $(".text-canvas").draggable({ containment: ".imageupload", create: function() { $("#text-canvas ").css("width ", 'auto'); }, drag: function() { $("#text-canvas ").css("width ", 'auto'); }, start: function() { $("#text-canvas ").css("width ", 'auto'); }, stop: function() { $("#text-canvas ").css("width ", 'auto'); } }); $("#fontsize").on("input change", function() { var v = $(this).val(); $('.text-canvas').css('font-size', v + 'px'); }); 
 .text-canvas { z-index: 1; position: absolute; word-break: break-all; } .imageupload { z-index: -1; } .col-sm-6 { background: red; } .c {padding: 5px;} .parent-canvas{ background: orange; display: inline-block; overflow: hidden; position: relative; } .text-canvas { background: yellow; min-width: 10px; } 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script> <link href="https://cdnjs.cloudflare.com/ajax/libs/jquery-ui-bootstrap/0.5pre/assets/css/bootstrap.min.css" rel="stylesheet"/> <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet"/> <div class="c col-sm-2"> <div name="anotherdiv" style="display:flex"> <div>8px</div> <input type="range" min="8" max="30" id="fontsize"> <div>30px</div> </div> </div> <div class="c col-sm-12"></div> <div class="c col-sm-6"> <div class="parent-canvas"> <div class="text-canvas" id="text-canvas" contenteditable="true"> my text </div> <div class="image-canvas"> <div class="imageupload" onclick="submit_button()"> <img src="http://lorempixel.com/150/150/"> </div> </div> </div> </div> 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM