文本区域的形状不正常?


273

通常,文本区域是矩形或正方形,如下所示:

通常的文本区域

但是我想要一个自定义形状的文本区域,例如:

自定义形状的文本区域

这怎么可能?


45
欢迎使用未来三年使用率最高的Web trope!
l0b0 2013年

24
完全无关:请问您打算在哪个上下文中使用它?我的意思是,我无法真正找到一个有用的方案,因此我希望从中得到一些启发。
user98085 2013年

23
每个人都缺少一个关键问题。使用a <div>来存储文本不是一个好的解决方案。它可能有助于设计,甚至对于只读文本来说是可以接受的(这完全违背了的目的contenteditable),但是对于来自用户的文本输入来说却不是很好。div(即使是可内容编辑的div)也不像普通的form元素那样是标准输入元素,因此,不会将其视为一个,因此如果发生崩溃,浏览器将不会保存其内容。使用div会导致数据丢失。请参阅此示例
Synetech 2013年

3
实际上,应该以“对所解决的问题有最低程度的了解”来解决问题
Alien先生

9
那么,您想在哪里看到垂直滚动条?
罗伯W

Answers:


262

介绍

首先,在其他职位中提出了许多解决方案。我认为目前(2013年)可以与数量最多的浏览器兼容,因为它不需要任何CSS3属性。但是,该方法不适用于不支持的浏览器 contentdeditable,请小心。

div解决方案 contenteditable

正如@Getz所建议的那样,您可以使用div contenteditable并在其上加上一些div的形状。这是一个示例,其中两个块浮在主div的左上角和右上角:

Firefox 28的结果

如您所见,如果您想要与帖子中请求的结果相同的结果,则必须对边界进行一些操作。主div的每一侧都有蓝色边框。接下来,必须粘贴红色块以隐藏主div的顶部边框,并且您只需要在特定边上对其应用边框(右侧块的底部和左侧,左侧块的右侧和底部)。

之后,例如,当触发“ Submit ”按钮时,您可以通过Javascript获取内容。我想你也可以处理CSS(其余font-sizecolor等等):)

完整代码示例

.block_left {
  background-color: red;
  height: 70px;
  width: 100px;
  float: left;
  border-right: 2px solid blue;
  border-bottom: 2px solid blue;
}

.block_right {
  background-color: red;
  height: 70px;
  width: 100px;
  float: right;
  border-left: 2px solid blue;
  border-bottom: 2px solid blue;
}

.div2 {
  background-color: white;
  font-size: 1.5em;
  border: 2px solid blue;
}

.parent {
  height: 300px;
  width: 500px;
}
<div class="parent">
  <div class="block_left"></div>
  <div class="block_right"></div>
  <div class="div2" contenteditable="true">
    "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut..."
  </div>
</div>


1
很好的解决方案,但有一个错误:You can't apply a border color for the editable section keeping the two corner div's background-color:white。是不是 仍然会赢。+1
Rajesh Paul

3
我没看到问题。可以在jsfiddle.net/qgfP6/6上设置background-color:white 。但是,您必须设置背景,否则会发生不好的事情:jsfiddle.net/qgfP6/7(您可以看到父容器的边框...)
Maxime Lorant 2013年

1
不过,有一种解决方法需要更多的div。透明,无边界的parrent元素填充有具有边框和背景的重叠div以及带有填充div的div,以创建所需的效果。
Qwerty

@MaximeLorant我只是在讲这些bad things。那将是我刚刚询问的情况的副作用,以及您在小提琴中所做的事情。但这当然是一个非常好的解决方案。感谢您的澄清。
拉杰什·保罗

1
辉煌的答案!在这里,我将建议使用两个文本区域并在两者之间拆分内容的方式来提出一些建议。
Zarathuztra

115

在不久的将来,我们可以使用所谓的方法css-shapes来实现这一目标。用一个DIV contenteditable属性设置为true联合css-shapes可以使文本区域的任何一种形状。

目前,Chrome Canary已经支持 css-shapes。一个使用css-shapes的示例是:

在此处输入图片说明

在这里,他们使用多边形来定义文本流。应该可以创建两个多边形来匹配您的文本区域所需的形状。

有关更多信息,请css-shapes参见:http : //sarasoueidan.com/blog/css-shapes/

要在Chrome Canary中启用CSS形状:

  1. 将chrome:// flags /#enable-experimental-web-platform-features复制并粘贴到地址栏中,然后按Enter。
  2. 点击该部分中的“启用”链接。
  3. 点击浏览器窗口底部的“立即重新启动”按钮。

    来自:http : //html.adobe.com/webplatform/zh_CN/

.container {
  overflow: hidden;
  shape-inside: polygon(200.67px 198.00px, 35.33px 198.47px, 34.67px 362.47px, 537.00px 362.74px, 535.67px 196.87px, 388.33px 197.00px, 386.67px 53.53px, 201.33px 53.53px);
  font-size: 0.8em;
}
/** for red border **/

.container:before {
  content: '';
  position: absolute;
  top: 8px;
  left: 8px;
  width: 190px;
  height: 190px;
  background-color: white;
  border-right: 1px solid red;
  border-bottom: 1px solid red;
}
.container:after {
  content: '';
  position: absolute;
  top: 8px;
  right: 8px;
  width: 190px;
  height: 190px;
  background-color: white;
  border-left: 1px solid red;
  border-bottom: 1px solid red;
}
<div class="container" contenteditable="true">
  Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque convallis diam lacus, id lacinia quam interdum quis. Ut vitae dignissim lorem, nec lobortis turpis. Fusce non fringilla nulla, eu blandit urna. Nulla facilisi. Nunc tristique, mauris vitae
  tincidunt egestas, eros metus dapibus sapien, quis tincidunt sem dui ac purus. Morbi lobortis, quam sit amet consequat aliquam, elit mi rutrum erat, id tempus turpis turpis et sem. Vivamus tempor mollis porttitor. Sed elementum nisl sit amet sapien
  auctor imperdiet. Sed suscipit convallis nisi, in dignissim risus placerat suscipit. Sed vel lorem eu massa vulputate pretium. Nulla eget dolor sed elit gravida condimentum non vel lorem. Vivamus pretium, augue sed aliquet ultricies, neque nibh porttitor
  libero, a tristique elit mi eu nibh. Vestibulum erat arcu, condimentum eleifend adipiscing ut, euismod eu libero. In pharetra iaculis lorem, at consectetur nisi faucibus eu.

</div>

使用以下方法创建的多边形:http//betravis.github.io/shape-tools/polygon-drawing/

结果

在此处输入图片说明

http://jsfiddle.net/A8cPj/1/


小提琴和榜样对我不起作用。文本在多边形下方,并保持隐藏在其下方。我测试了Chromium 49,Firefox 44
deathangel908

刚刚看到这一点,这将是使其获得响应的噩梦。
达米亚诺·塞伦

62

内容编辑可能有可能吗?

它不是文本区域,但是如果您成功创建具有此形状的div,则它可以工作。

我认为仅文本区域是不可能的...

一个小例子:http : //jsfiddle.net/qgfP6/5/

<div contenteditable="true">
</div>

23

您可以使用具有两个角落div的contenteditable div:

<div style="border:1px blue solid ; width: 200px; height: 200px;" contenteditable="true">
  <div style="float:left; width:50px; height: 50px; border: 1px solid blue" contenteditable="false"></div>
  <div style="float:right; width:50px; height: 50px;  border: 1px solid blue" contenteditable="false"></div>
  hello world, hello worldsdf asdf asdf sdf asdf asdf
</div>

需要更多的JS工作来处理所有不同的用例。但是基础就在那里。
Gidon 2013年

20

您也可以使用CSS区域执行此操作

使用Regions,您可以使用CSS属性将内容流到现有样式的容器中,指定您选择的任何容器顺序,无论它们在页面上的位置如何。

(网络平台)

在此处输入图片说明

[当前在WebKit Nightly,Safari 6.1+和iOS7中受支持,并且在启用以下标记后已可在chrome和Opera中使用:enable-experimental-web-platform-features- caniuseWeb平台 ]

小提琴

因此,您可以通过使文本在2个区域中流动来使文本区域具有形状,并通过在内容上添加contenteditable来对其进行编辑。

标记

<div id="box-a" class="region"></div>
<div id="box-b" class="region"></div>
<div id="content" contenteditable>text here</div>

(相关)CSS

#content {
     -ms-flow-into: article;
    -webkit-flow-into: article;
}

.region {
    -ms-flow-from: article;
    -webkit-flow-from: article;
    box-sizing: border-box;
    position: absolute;
    width: 200px;
    height: 200px;
    padding: 0 1px;
    margin: auto;
    left:0;right:0;
    border: 2px solid lightBlue;
}

#box-a {
    top: 10px;
    background: #fff;
    z-index: 1;
    border-bottom: none;
}

#box-b {
    top: 210px;
    width: 400px;
    overflow: auto;
    margin-top: -2px;
}

结果:

在此处输入图片说明

有关区域的更多信息-这是一个很好的文章:CSS3区域:HTML和CSS3的丰富页面布局


1
真好!尽管几乎不受支持(大多数用户不想获得chrome canary并启用实验性标志才能使用网站),但这绝对是“应”完成的方式
markasoftware 2013年

事实上......偏偏它还没有在Firefox(即使在阿尔法)等人的作品,并有供应商前缀的臭味:(但这种方法很有趣,而且在某些月/年使用。
马克西姆Lorant

CSS区域,CSS形状,CSS过滤器...还有什么其他ik
Muhammad Umer 2013年

@MuhammadUmer ... CSS排除
Danield

18

框中的一长行文本会将光标放到中间边缘以下,我似乎无法解决。

**[Fiddle Diddle][1]**

    #wrap {
        overflow: hidden;
    }
    #inner {
        height: 350px;
        width: 500px;
        border: 1px solid blue;
    }
    #textContent {
        word-wrap: break-word;
        word-break: break-all;
        white-space: pre-line;
    }
    #left, #right {
        height: 50%;
        width: 25%;
        margin-top: -1px;
        padding: 0;
        border: 1px solid blue;
        border-top-color: white;
        margin-bottom: 5px;
    }
    #right {
        margin-left: 5px;
        float: right;
        margin-right: -1px;
        border-right-color: white;
    }
    #left {
        margin-right: 5px;
        float: left;
        margin-left: -1px;
        border-left-color: white;
    }
<div id="wrap">
  <div id="inner">
     <div id="left"></div>
     <div id="right"></div>
     <span id="textContent" contenteditable>The A B Cs</span>
  </div>
</div>

[1]: http://jsfiddle.net/yKSZV/

8

不可能的父亲!文本区域通常是矩形或方形框,您可以在其中输入。

但是,要进行类似的操作,可以使用2个textarea,然后为它们指定宽度和高度。否则我认为它不会发生!

第二种方法是制作一个可编辑的元素。

http://jsfiddle.net/afzaal_ahmad_zeeshan/at2ke/

代码是:

<div contenteditable="true">
   This text can be edited by the user.
</div>

使用此功能,您可以使任何元素都可编辑!您可以为其赋予尺寸,它将起作用!您将获得它作为文本区域。

参考:https : //developer.mozilla.org/zh-CN/docs/Web/Guide/HTML/Content_Editable


3
不你错了。甚至他用divs代替textarea。因为无法将textarea修改为形状!:) @Markasoftware因此,您对这个答案不满意!..因为这和他的答案一样。这里唯一不存在的是图像和使该形状具有可编辑div的代码!
Afzaal Ahmad Zeeshan

什么?哦,兄弟,如果您想无缘无故地拒绝我投票,我们将非常欢迎您!我的答案发布于:9:58他的答案发布于10:10:/我是第一个回答这个问题的人。@ Markasoftware您可以自己去看看时间。我不仅仅因为没有提供代码而大受好评。Howver,我张贴的答案在TOP 3应答者..
Afzaal艾哈迈德Zeeshan

大声笑实际上当我转到“最旧的”选项卡时,它表明您的回答是第二个最古老的
markasoftware 2013年

这是因为事实,它并没有得到很大的支持!我每次都在这里活跃,所以我最近怎么发布?这是一个简单的回答。那么,您能否删除下注?:)
Afzaal Ahmad Zeeshan 2013年

5

如果您将CSS形状contenteditable此结合,则可以在Webkit浏览器中完成。

首先,您必须启用该标志:enable-experimental-web-platform-features

然后重新启动您的Webkit浏览器,然后检查此内容

该方法也适用于非标准形状。

标记

 <div class="shape" contenteditable="true">
    <p>
     Text here
    </p>
  </div>

的CSS

.shape{
  -webkit-shape-inside: polygon(71.67px 204.00px,75.33px 316.47px,323.67px 315.47px,321.17px 196.00px,245.96px 197.88px,244.75px 87.76px,132.33px 87.53px,132.50px 202.26px);
  shape-inside: polygon(71.67px 204.00px,75.33px 316.47px,323.67px 315.47px,321.17px 196.00px,245.96px 197.88px,244.75px 87.76px,132.33px 87.53px,132.50px 202.26px);
  width: 400px;
  height: 400px;
  text-align: justify;
  margin: 0 auto;
}

那么我到底是怎么得到多边形的呢?

转到此网站并制作您自己的自定义形状!

有关启用标志的注意事项:(从此处开始

要启用形状,区域和混合模式:

将chrome:// flags /#enable-experimental-web-platform-features复制并粘贴到地址栏中,然后按Enter。点击该部分中的“启用”链接。点击浏览器窗口底部的“立即重新启动”按钮。


4
+1(有据可查,结构化的解决方案),无论是否为标准。
rolfl 2013年

3
@kinokijuf您确实意识到这是当今的标准,对吗?在这种情况下,Adobe提出了形状建议,而Webkit迄今为止是第一个实施它的人。鉴于编辑草稿是从11月开始的,因此这可能不能称为专有扩展,对于您所知的所有内容,最终将在以后得到更广泛的实施和标准化。同时,非Webkit用户将获得一个矩形,这很重要。(哎呀,Firefox仍然需要一个前缀box-sizing。)
millimoose 2013年

5

您可以使用Google Web设计器工具使用来创建复杂的形状HTML5-canvas and CSS

此外,您还将获得其他工具,例如键入工具,以在这些形状内输入文本。

由于输出文件包含很多代码,因此提供了使用Google Web Designer工具创建的示例演示的小技巧。

现场演示>>


1
小提琴不工作对我来说(=文本是不可编辑)在Chrome 31.0 / Windows 7中
ILMARI Karonen

@IlmariKaronen =文本不可编辑???真的我没明白。有什么需要使其可编辑的?
Prasanth KC 2013年

5
该问题要求输入类似<textarea>(即,一盒可编辑的文本)的内容,但形状不是矩形。如果没有“可编辑”部分,这里的挑战就很少-自从在HTML 2.0中引入浮动图像以来,人们就一直在用HTML处理流文本。
Ilmari Karonen 2013年

小提琴更新了内容可编辑的属性。现在,容器内的文本是可编辑的。
Prasanth KC 2013年

在演示中,我可以编辑2种不同的文本,而不是1种全文。在Chrome 31
萨科Barbulesco

1

如果出于某种原因,您确实需要支持没有 contenteditable可以通过使用事件在JavaScript中执行相同的操作,尽管这是一个非常麻烦的解决方法。

伪代码:

focused=false;
when user clicks the div
    {
    focused=true;
    }
when user clicks outside the div
    {
    focused=false;
    }
when user presses a key
    {
    if (focused)
    {
    add character of key to div.innerHTML;
    }
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.