textareaの異常な形状?


273

通常、textareaは次のように長方形または正方形です。

通常のテキストエリア

しかし、たとえば次のようなカスタム形状のテキストエリアが必要です。

カスタムシェイプのテキストエリア

これはどのようにして可能ですか?


45
次の3年間、最も使い古されたWebロープへようこそ!
l0b0 2013

24
まったく関係ありません。これをどのような状況で使用する予定ですか。つまり、これが役立つシナリオを実際に理解することはできないので、それにインスピレーションを与えたいと思います。
user98085 2013

23
誰も重大な問題を見逃しています<div>テキストを格納するためにを使用することは良い解決策ではありません。これは設計に役立つ場合があり、読み取り専用テキスト(これはの目的を完全に無効にするcontenteditable)でも許容される可能性がありますが、ユーザーからのテキスト入力には適しいません。div(contenteditableの場合でも)は、通常のフォーム要素のような標準の入力要素ではないため、divのように扱われ、クラッシュした場合にその内容がブラウザーに保存されません。divを使用すると、データが失われます。この例を参照してください。
Synetech

3
実際には、これは「解決される問題の最小限の理解を示した」として閉じられるべきである
Mr. Alien

9
では、垂直スクロールバーをどこに表示しますか?
Rob W

回答:


262

前書き

まず、他の投稿で提案されている多くの解決策があります。これは現在(2013年)、CSS3プロパティを必要としないため、最も多くのブラウザーと互換性があるものだと思います。ただし、このメソッドは、をサポートしていないブラウザでは機能しません contentdeditable。注意してください。

divを使用したソリューション contenteditable

@Getzで提案されているように、divをで使用し、contenteditableいくつかのdivでそれを形作ることができます。次に、メインdivの左上と右上に浮かぶ2つのブロックの例を示します。

Firefox 28での結果

ご覧のとおり、投稿でリクエストしたのと同じ結果が必要な場合は、境界線を少し再生する必要があります。メインdivには、すべての側に青い境界線があります。次に、赤いブロックを貼り付けてメインdivの上部の境界線を非表示にする必要があります。特定の側(右ブロックの場合は下と左、左の場合は下と右)にのみ境界を適用する必要があります。

その後、たとえば「送信」ボタンがトリガーされたときに、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
私は問題を見ません。これにbackground-color:whiteを設定することが可能です:jsfiddle.net/qgfP6/6。しかし、背景を設定する必要があります。そうしないと、悪いことが起こりました:jsfiddle.net/qgfP6/7(親コンテナーの境界線が表示されます...)
Maxime Lorant

1
ただし、より多くのdivを必要とする回避策があります。透明で境界線のない親要素で、境界線と背景のあるdivが重なり合っており、目的の効果を作成するためにdivが埋め込まれています。
Qwerty、

@MaximeLorant私はそれらbad thingsだけについて話していました。これらは、私がたずねた状況と、フィドルで何をしたかの副作用です。しかし、それは確かに本当に良い解決策です。明確にしてくれてありがとう。
Rajesh Paul

1
素晴らしい答え!そして、ここで、2つのテキスト領域を密接に使用して、コンテンツを2つに分割したコンテンツに沿って何かを提案します。
Zarathuztra、2013

115

近い将来、いわゆるcss-shapesを使用してこれを実現できます。contenteditable属性をtrue組み合わせてに設定したdivは、css-shapesテキスト領域をあらゆる種類の形状にすることができます。

現在、Chrome Canaryはすでにをサポートし ていますcss-shapes。css-shapesで可能な例は次のとおりです。

ここに画像の説明を入力してください

ここでは、ポリゴンシェイプを使用してテキストフローを定義しています。textareaに必要な形状に一致するように2つのポリゴンを作成できるはずです。

詳細について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/enable/

.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

これを見ただけで、これは応答性を得るための悪夢になります。
ダミアーノ・セレント


23

2つのコーナーの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

20

CSSリージョンでこれを行うこともできます

リージョンを使用すると、CSSプロパティを使用してコンテンツを既存のスタイル付きコンテナに流し込み、ページ上の位置に関係なく、選択したコンテナの順序を指定できます。

(ウェブプラットフォーム)

ここに画像の説明を入力してください

[現在、WebKit Nightly、Safari 6.1 +、iOS7でサポートされており、フラグを有効にすると、ChromeとOperaですでに使用可能:enable-experimental-web-platform-features- caniuseWeb Platform ]

FIDDLE

したがって、テキストを2つの領域に流すことによってそのtextarea形状を作成し、コンテンツに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

確かに... Unfortunetly、それは、Firefox(さえアルファ上)と、他人にまだ動作、およびベンダープレフィックスの悪臭を持っている:(しかし、この方法は面白いですし、いくつかのヶ月/年で使用する必要がありません。
マキシムロラント

css領域、css形状、cssフィルター...他に何があるかik
Muhammad Umer

@MuhammadUmer ... cssの除外
Danield、2013

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

それは不可能です。textareaは通常、長方形または正方形のボックスであり、ここに入力できます。

ただし、そのようなものを作成するには、2つのtextareaを使用して、指定した幅と高さを指定します。そうでなければ私はそれが起こるとは思わない!

2番目の方法は、編集可能な要素を作成することです。

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

コードは次のとおりです。

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

これを使用して、任意の要素を編集可能にすることができます!あなたはそれに寸法を与えることができ、それはうまくいきます!あなたはちょうどtextareaとしてそれを取得します。

リファレンス:https : //developer.mozilla.org/en-US/docs/Web/Guide/HTML/Content_Editable


3
いや、違うよ。彼もdivtextareaの代わりにs を使いました。textareaは形に変更できないためです!:) @Markasoftwareですから、この回答に反対投票するのは間違いです!..これは彼と同じ答えなので。ここに存在しない唯一のものは、その形状で編集可能なdivを作成するための画像とコードです!
Afzaal Ahmad Zeeshan 2013

何?ああ、兄弟よ、あなたが私を何の理由もなく投票したいなら、あなたは大歓迎です!私の回答は9:58に投稿されました:彼は10:10に回答を投稿しました:/私はこの質問に最初に答えました.. @ Markasoftware コードを提供しなかったからといって、私はあまり賛成していません。Howver、私は... TOP 3回答で答えを掲載
AfzaalアフマドZeeshan

lol実際に「最も古い」タブに移動すると、答えが2番目に古いことが示されます
markasoftware

あまり賛成されていないからです!私はいつでもここで活動していますので、最近投稿するにはどうすればよいですか?そして、これは簡単な答えでした。では、反対票を削除していただけますか?:)
Afzaal Ahmad Zeeshan 2013

5

CSS形状contenteditableこれと組み合わせると、Webkitブラウザーで実行できます。

最初にフラグを有効にする必要があります:enable-experimental-web-platform-features

次に、Webkitブラウザーを再起動し、このFIDDLEを確認してください。

この方法は、標準以外の形状でも機能します。

マークアップ

 <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それが今日の標準のようになったことを理解していますよね?この場合、アドビが形状の提案を考え出し、Webkitはこれをこれまでに実装した最初のものです。Editor's Draftが11月のものであることを考えると、これはおそらくプロプライエタリな拡張機能とは言えないでしょう。ご存知のとおり、後でより広く実装および標準化されるでしょう。それまでの間、Webkitを使用していないユーザーは四角形を取得します。(それでも、Firefoxには依然としてbox-sizing。のプレフィックスが必要です。)
millimoose 2013

5

Google Web Designerツール使用して、複雑な形状を作成できます。HTML5-canvas and CSS

さらに、これらの図形の内部にテキストを入力するための入力ツールのような他のツールが表示されます。

出力ファイルには多くのコードが含まれているため、以下を使用して作成されたサンプルデモのフィドルを提供します Google Web Designerツールます

FIDDLE DEMO >>


1
フィドルはクローム31.0 / Windows 7の上の私のための仕事(=テキストは編集できません)ない
イルマリKaronen

@IlmariKaronen =テキストは編集できません??? 本当に得られなかった。編集可能にする必要性は何ですか?
Prasanth KC

5
質問は<textarea>(つまり編集可能なテキストのボックス)のようなものを求めますが、長方形ではありません。「編集可能」な部分がなければ、ここでの課題はほとんどありません。HTML2.0でフローティングイメージが導入されて以来、HTMLでフローテキストを作成してきました。
Ilmari Karonen 2013

コンテンツの編集可能なプロパティで更新されたフィドル。コンテナ内のテキストが編集可能になりました。
Prasanth KC

デモでは、1つのテキスト全体ではなく、2つの異なるテキストを編集できます。Chrome 31で
Nicolas Barbulesco 2013

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;
    }
    }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.