Используйте внешний CSS для стилизации раздела страницы с помощью Laravel View Composer - PullRequest
0 голосов
/ 28 июня 2019

Я пытаюсь использовать внешний CSS для стилизации раздела моей страницы - в частности, раздела формы моей страницы регистрации. Я использую по умолчанию app.css, который поставляется с Laravel. Тем не менее, я не хочу включать app.css в мой заголовок HTML, поскольку это дает мне нежелательный эффект на других частях страницы. Поэтому я хочу, чтобы он стилизовал только мои HTML-формы на странице.

В настоящее время я использовал методы asset() или HTML::style(), подобные этим, в разделе формы:

@section('form')
<style> @import "{{ asset('css/app.css') }}"; </style>
<form>...</form>
@endsection

OR

@section('form')
{{ HTML::style('css/app.css') }}
<form>...</form>
@endsection

Оба метода правильно загружают стиль, но влияют на всю страницу, а не только на элементы формы.

Я попытался использовать класс ViewComposer, чтобы решить эту проблему, установив переменную в ViewComposer для моего желаемого стиля - возвращая его только тогда, когда я запрашиваю требуемое представление:

class ViewComposer
{
  public function compose(View $view)
  {
    $data = [];
    switch($view->getName())
    {
      ...
      case 'sections.register':
        $this->data = ['style'=>"<style> @import \"". asset('css/app.css') . "\"; </style>"];
        break;
    }

    return $view->with($this->data);
  }
}

Однако, когда я рендерим вложенное представление sections.register, я получаю переменную стиля следующим образом:

@section('form')
{{ $style ?? '' }}
<form>...</form>
@endsection

вывод в браузере не анализируется как css, а отображается как есть:

<style> @import "{{ asset('css/app.css') }}"; </style>

Итак, есть ли способ, которым я могу анализировать внешние CSS только для данного раздела представления на html-странице, и это может быть достигнуто с помощью класса ViewComposer?

UPDATE: Я пробовал несколько вещей и использовал это:

@section('form')
{!! $style ?? '' !!}
<form>...</form>
@endsection

CSS анализируется, но все еще применяется ко всей странице. Мне все еще нужно, чтобы он применялся только к разделу формы.

Ответы [ 2 ]

1 голос
/ 28 июня 2019

1. Один из вариантов - скопировать только нужный вам CSS, вставить его в пользовательский CSS и создать другой макет для этого представления.Но это может быть утомительной работой, как вы сказали.

2. Другой вариант - добавить префикс к файлу app.css.Есть программное обеспечение, которое может сделать это , вот учебник. Так что, если вы добавите префикс целого файла css, например: .laravel-app, тогда вы можете обернуть все, что вы хотели бы, чтобы его стилизовал app.css, например:это:

<div class="laravel-app">
<!-- Everything in here will be styled by app.css -->
</div>

Это поможет вам в долгосрочной перспективе с вашим проектом.

0 голосов
/ 30 июня 2019

Прежде всего, импорт или загрузка css для каждого вида будет негативно влиять на производительность приложения. Таким образом, использование View Composer для загрузки в css не рекомендуется. Я взял реплику от ответа Дениса Черича , хотя на первый взгляд это было неясно.

Кроме того, принятый ответ на этот пост немного прояснил ситуацию.

Правильный способ добиться этого - использовать препроцессор css. Популярные из них less и sass. Я использовал sass, потому что он в настоящее время принят Laravel.

Я установил sass на свой компьютер с Windows, следуя инструкциям здесь .

Создайте новый scss файл: app-custom.scss в той же папке, что и app.css.

Изменить app-custom.scss, используя вложенный импорт:

.app-form
{
    @import 'app';
}

Создать app-custom.css с помощью команды sass в командной строке Windows:

sass app-custom.scss app-custom.css

Измените класс вашей формы на app-form:

@section('form')
<form class='app-form'>...</form>
@endsection

Включить app-custom.css в заголовок, используя тег ссылки:

<head>
    <link href="{{ asset('css/app-custom.css') }}" rel="stylesheet">
</head>

и все готово.

СОВЕТ : если вы хотите использовать стиль в app.css для нескольких отдельных разделов вашей страницы, вы все равно можете добиться этого из одного scss файла. Просто включите классы каждого раздела в ваш файл scss следующим образом:

.section-1, .section-2, .section-3
{
    @import 'app';
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...