# Bad value “virtual” for attribute “wrap” on element “textarea”.

> Canonical HTML version: https://rocketvalidator.com/html-validation/bad-value-virtual-for-attribute-wrap-on-element-textarea
> Attribution: Rocket Validator (https://rocketvalidator.com)
> License: CC BY 4.0 (https://creativecommons.org/licenses/by/4.0/)

The `wrap` attribute on a `<textarea>` controls how text is wrapped when the form is submitted. The value `"virtual"` was used by some older browsers (notably early versions of Netscape and Internet Explorer) as a proprietary alternative to what the HTML Standard now calls `"soft"`. Since `"virtual"` was never part of any formal HTML specification, the W3C validator correctly rejects it as an invalid value.

The HTML Standard defines only two valid values for `wrap`:

- **`soft`** (the default): The text is visually wrapped in the browser for display purposes, but no actual line break characters are inserted into the submitted form data. The server receives the text as continuous lines.
- **`hard`**: The browser inserts carriage return + line feed (CRLF) characters at the visual wrap points when the form is submitted, so the server receives the text with hard line breaks. When using `wrap="hard"`, you **must** also specify the `cols` attribute so the browser knows where the wrap points are.

Since `"virtual"` was functionally identical to `"soft"`, replacing it is straightforward. If you omit the `wrap` attribute altogether, the browser defaults to soft wrapping, which gives you the same behavior.

### Why this matters

Using non-standard attribute values can lead to unpredictable behavior across browsers. While most modern browsers will likely fall back to soft wrapping when they encounter an unrecognized `wrap` value, this is not guaranteed by any specification. Sticking to valid values ensures consistent, cross-browser behavior and keeps your markup standards-compliant.

### How to fix it

1. **Replace `wrap="virtual"` with `wrap="soft"`** for an explicit equivalent.
2. **Remove the `wrap` attribute entirely** if you want the default soft wrapping behavior.
3. **Use `wrap="hard"` with a `cols` attribute** if you actually need hard line breaks inserted on submission.

## Examples

### ❌ Invalid: using the non-standard `"virtual"` value

```html
<form>
  <label for="msg">Message</label>
  <textarea id="msg" name="msg" wrap="virtual"></textarea>
</form>
```

This triggers the error: **Bad value "virtual" for attribute "wrap" on element "textarea".**

### ✅ Fixed: using `wrap="soft"` (equivalent to `"virtual"`)

```html
<form>
  <label for="msg">Message</label>
  <textarea id="msg" name="msg" wrap="soft"></textarea>
</form>
```

### ✅ Fixed: omitting `wrap` entirely (defaults to `"soft"`)

```html
<form>
  <label for="msg">Message</label>
  <textarea id="msg" name="msg"></textarea>
</form>
```

Since `"soft"` is the default, removing the attribute produces identical behavior and cleaner markup.

### ✅ Fixed: using `wrap="hard"` with `cols`

If you need the submitted text to include line breaks at wrap points, use `wrap="hard"` and specify `cols`:

```html
<form>
  <label for="msg">Message</label>
  <textarea id="msg" name="msg" wrap="hard" cols="60" rows="6"></textarea>
</form>
```

Note that `cols` is required when using `wrap="hard"`. Omitting it will trigger a separate validation error.

### Other legacy values to watch for

The value `"virtual"` isn't the only non-standard `wrap` value from the early web. You may also encounter `wrap="physical"` (the legacy equivalent of `"hard"`) or `wrap="off"` (which disabled wrapping). Neither is valid in modern HTML. Replace `"physical"` with `"hard"` (and add `cols`), and replace `"off"` by removing the attribute and using CSS (`white-space: nowrap;` or `overflow-wrap: normal;`) to control visual wrapping if needed.
